// 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 HiddenCeiling; /** Plancher epaissi par ce sous-systeme, et ses valeurs d'origine (a remettre quand la piece redevient interieure). */ TWeakObjectPtr ThickenedFloor; FVector FloorExtent = FVector::ZeroVector; FVector FloorLocation = FVector::ZeroVector; TEnumAsByte FloorMobility = EComponentMobility::Movable; /** S-F4b : decors exterieurs mis en Pawn Ignore par ce sous-systeme (rendus en Pawn Block a la sortie). */ TArray> IgnoredDecor; /** Variante facades : decors fnt_ext laisses solides (collision complexe), memorises pour ne journaliser qu'une fois. */ TArray> SolidDecor; float DecorScanDelay = 0.f; /** S-F5 : personnes trouvees enfoncees, derniere position et nombre d'examens consecutifs sans mouvement. */ TMap, TPair> SunkPersons; /** S-F5m : personnes enfoncees pour lesquelles aucun point n'a abouti, deja journalisees (une ligne par episode). */ TSet> 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, 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; };