73 lines
2.9 KiB
C
73 lines
2.9 KiB
C
|
|
// 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/<Ville> (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/<Ville>_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 <Ville>_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<UStaticMeshComponent> WaterComponent;
|
||
|
|
|
||
|
|
/** Masque de la carte courante (nul si la ville n'en a pas). */
|
||
|
|
UPROPERTY(Transient)
|
||
|
|
TObjectPtr<ULPCityWaterMask> Mask;
|
||
|
|
|
||
|
|
/** Centres du masque ranges par case de 1 m (indice dans Mask->Centers). */
|
||
|
|
TMultiMap<FIntPoint, int32> 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;
|
||
|
|
};
|