87 lines
5.3 KiB
C++
87 lines
5.3 KiB
C++
// Portage UE 5.5 - lot L7l (ERR-036, amelioration : defaut deja present en 4.27).
|
|
//
|
|
// Chaque lieu est construit par l'acteur Room (GI.Room) dont la racine prend l'echelle Z de la ligne 1 du
|
|
// .lpworld : 0,2 a 0,4 en interieur, 0,01 pour les 7 lieux exterieurs. Le plafond WallT (Z relatif 2040,
|
|
// sans collision) suit cette echelle : en exterieur il se trouve a ~20 cm au-dessus du sol et, vu de la
|
|
// camera, devient un "sol blanc" qui cache les pieds et le bas des meubles (releve L7l_releve3).
|
|
//
|
|
// Ce sous-systeme masque WallT tant que l'echelle Z de la racine de Room est inferieure au seuil, et le
|
|
// rend de nouveau visible des que la piece redevient interieure (seulement s'il l'a lui-meme masque).
|
|
// Aucun Blueprint ni asset n'est modifie ; sans Room ou sans WallT, il ne fait rien.
|
|
//
|
|
// Lot STG (S-F4, B-SOL / B-DEPL) : le plancher des personnages est Room.Box (BoxComponent, type d'objet Vehicle, demi-
|
|
// hauteur 64), seul objet du lieu que leur capsule ne traverse pas. L'echelle Z 0,01 l'ecrase a 1,28 cm : une capsule
|
|
// posee trop bas par les Blueprints (SetActorLocation sans balayage) n'en ressort pas, reste enfoncee et ne marche plus
|
|
// (mesure M1, STG-M1-ANALYSE.md). En exterieur, ce sous-systeme rend a Box l'epaisseur d'un interieur (echelle 0,2 :
|
|
// 25,6 cm) sans changer la hauteur de son dessus, puis remet ses valeurs d'origine quand la piece redevient interieure.
|
|
//
|
|
// Lot STG (S-F4b) : cela ne suffisait pas. Depuis CHG-145 les objets de Room bloquent les personnages, et la collision simple
|
|
// d'un decor exterieur (fnt_ext*, ex. la rue fnt_ext001) est un volume qui les emprisonne ("stuck", penetration 121,6 cm ;
|
|
// STG-SF4b-DIAG.md). En exterieur, ces decors passent en Pawn Ignore (comme avant CHG-145), puis repassent en Pawn Block a la
|
|
// sortie. LPShowCoupleSubsystem les remet en Block le temps d'une scene de couple et les rend ensuite.
|
|
//
|
|
// Lot STG (S-F5) : au bord de la rue, standIdle pose des passants (SetActorLocation sans balayage) sur des points du navmesh
|
|
// plus bas que le pave ; ils restent enfonces jusqu'aux hanches (STG-COMMUN3-ANALYSE.md, point 1). En exterieur, une personne
|
|
// visible, immobile sur 3 examens, hors meuble, hors scene et hors sexe, dont le bas de capsule est a plus de 15 cm sous le
|
|
// dessus de Room.Box, est relevee sur le premier sol que sa capsule rencontre en descendant (sinon sur Box).
|
|
// S-F5j : le joueur aussi (place au bord par standIdle, STG-SF5b-DIAG.md), avec en plus : aucune touche de marche enfoncee,
|
|
// aucun menu ni boite de scene a l'ecran, et 4 examens immobiles (1,5 s).
|
|
// S-F5k : si une autre personne visible est a moins de 50 cm (deux passants poses au meme bord), la personne relevee est
|
|
// ecartee de 50 cm le long du grand axe de la piece, du cote oppose a l'autre (sinon de l'autre cote, sinon sur place).
|
|
// Variante facades (COMMUN-6) : S-F4b ne bascule plus un decor dont la collision est deja complexe (CTF_UseComplexAsSimple :
|
|
// le pave et les facades, sans volume piege) ; il reste solide.
|
|
|
|
#pragma once
|
|
|
|
#include "CoreMinimal.h"
|
|
#include "Containers/Ticker.h"
|
|
#include "Engine/EngineTypes.h"
|
|
#include "Subsystems/GameInstanceSubsystem.h"
|
|
#include "LPOutdoorRoomSubsystem.generated.h"
|
|
|
|
class AActor;
|
|
class UBoxComponent;
|
|
class UPrimitiveComponent;
|
|
class USceneComponent;
|
|
|
|
UCLASS()
|
|
class LIFEPLAY_API ULPOutdoorRoomSubsystem : public UGameInstanceSubsystem
|
|
{
|
|
GENERATED_BODY()
|
|
|
|
public:
|
|
virtual void Initialize(FSubsystemCollectionBase& Collection) override;
|
|
virtual void Deinitialize() override;
|
|
|
|
private:
|
|
bool Tick(float DeltaTime);
|
|
void UpdateFloor(UBoxComponent* Floor, bool bOutdoor);
|
|
void RestoreFloor();
|
|
void IgnoreOutdoorDecor(const AActor* Room);
|
|
void RestoreDecor();
|
|
void LiftSunkPersons(const AActor* Room, const UBoxComponent* Floor);
|
|
|
|
FTSTicker::FDelegateHandle TickHandle;
|
|
/** Plafond masque par ce sous-systeme (a rendre visible quand la piece redevient interieure). */
|
|
TWeakObjectPtr<USceneComponent> HiddenCeiling;
|
|
/** Plancher epaissi par ce sous-systeme, et ses valeurs d'origine (a remettre quand la piece redevient interieure). */
|
|
TWeakObjectPtr<UBoxComponent> ThickenedFloor;
|
|
FVector FloorExtent = FVector::ZeroVector;
|
|
FVector FloorLocation = FVector::ZeroVector;
|
|
TEnumAsByte<EComponentMobility::Type> FloorMobility = EComponentMobility::Movable;
|
|
/** S-F4b : decors exterieurs mis en Pawn Ignore par ce sous-systeme (rendus en Pawn Block a la sortie). */
|
|
TArray<TWeakObjectPtr<UPrimitiveComponent>> IgnoredDecor;
|
|
/** Variante facades : decors fnt_ext laisses solides (collision complexe), memorises pour ne journaliser qu'une fois. */
|
|
TArray<TWeakObjectPtr<UPrimitiveComponent>> SolidDecor;
|
|
float DecorScanDelay = 0.f;
|
|
/** S-F5 : personnes trouvees enfoncees, derniere position et nombre d'examens consecutifs sans mouvement. */
|
|
TMap<TWeakObjectPtr<AActor>, TPair<FVector, int32>> SunkPersons;
|
|
/** S-F5m : personnes enfoncees pour lesquelles aucun point n'a abouti, deja journalisees (une ligne par episode). */
|
|
TSet<TWeakObjectPtr<AActor>> UnplacedLogged;
|
|
/** S-F5p : derniere position vue de chaque personne (une personne absente ou qui a saute de plus de 50 cm vient d'etre posee). */
|
|
TMap<TWeakObjectPtr<AActor>, FVector> LastPositions;
|
|
/** S-F5p : echelle de la piece exterieure en cours (un changement ouvre une fenetre de balayage rapide) et temps restant. */
|
|
FVector OutdoorScale = FVector::ZeroVector;
|
|
float FastScanTime = 0.f;
|
|
int32 LiftCount = 0;
|
|
};
|