// Lot STM1 (STM1-SPEC-03 ยง 2.6, pilote O-B) : pose en jeu du maillage d'eau d'une ville. // // Les cartes StreetMap n'ont pas d'eau (STM1-CART-03) ; en mode carte par defaut, le sol de pave de MapMarkers recouvre les // fleuves. Ce sous-systeme pose /Game/Heavy/StreetMap/Water/ (cree par le commandlet LPBuildCityWater) sur l'acteur // de la carte, 2 cm au-dessus du plan de pave (composant Plane de MapMarkers, Z lu en jeu) ; visible aussi en mode classique. // Lecture seule du GameInstance par reflexion (GI.StreetMapStatic) : aucun Blueprint ni GI modifie. Ville sans asset d'eau : // composant masque. Une ligne [LPCity] (LogLPCity) a chaque pose. Present aussi en Shipping (rendu du jeu). // STM1-SPEC-08 (O2, option D) : masque aussi, a l'echelle 0, les maisons generiques (House*, Skyscraper*) de MapMarkers // posees aux centres de /Game/Heavy/StreetMap/Water/_Mask ; arbres et jeeps non touches ; indices conserves. #pragma once #include "CoreMinimal.h" #include "Containers/Ticker.h" #include "Subsystems/GameInstanceSubsystem.h" #include "LPCityWaterSubsystem.generated.h" class AActor; class ULPCityWaterMask; class UStaticMeshComponent; UCLASS() class LIFEPLAY_API ULPCityWaterSubsystem : public UGameInstanceSubsystem { GENERATED_BODY() public: virtual void Initialize(FSubsystemCollectionBase& Collection) override; virtual void Deinitialize() override; private: bool Tick(float DeltaTime); /** Pose ou masque l'eau pour le maillage de carte courant. */ void UpdateWater(AActor* Street, UStaticMeshComponent* MapComp); /** Z monde du plan de pave de MapMarkers ; false si introuvable (acteur pas encore cree). */ bool FindPlaneZ(const UWorld* World, double& OutZ) const; /** STM1-SPEC-08 (O2) : charge le masque _Mask de la carte courante (ou le vide). */ void LoadMask(const FString& City); /** STM1-SPEC-08 (O2) : masque (echelle 0) les maisons generiques de MapMarkers posees aux centres du masque. */ void HideHousesInWater(UStaticMeshComponent* MapComp, bool bForce); FTSTicker::FDelegateHandle TickHandle; /** Maillage de carte deja traite (chemin), pour ne poser qu'au changement. */ FString LastMapMesh; /** Pose faite avec le repli de hauteur : a corriger des que le plan de MapMarkers apparait. */ bool bUsedFallbackZ = false; /** Secondes passees a attendre le plan avant le repli. */ double WaitPlaneSeconds = 0.0; UPROPERTY(Transient) TObjectPtr WaterComponent; /** Masque de la carte courante (nul si la ville n'en a pas). */ UPROPERTY(Transient) TObjectPtr Mask; /** Centres du masque ranges par case de 1 m (indice dans Mask->Centers). */ TMultiMap MaskCells; /** Nombre total d'instances de maisons a la derniere passe (nouvelle passe s'il change). */ int32 LastHouseInstances = -1; /** Dernier temoin ecrit (pour n'ecrire qu'au changement). */ FString LastMaskReport; };