// Portage UE 5.5 - voir LPOutdoorRoomSubsystem.h #include "LPOutdoorRoomSubsystem.h" #include "Components/SceneComponent.h" #include "Engine/GameInstance.h" #include "GameFramework/Actor.h" #include "LifePlay.h" #include "UObject/UnrealType.h" namespace { // Interieurs : 0,2 a 0,4 ; exterieurs : 0,01. Le seuil laisse une marge des deux cotes. constexpr double OutdoorScaleZ = 0.05; const FName RoomPropertyName(TEXT("Room")); const FName CeilingPropertyName(TEXT("WallT")); template T* GetObjectProperty(const UObject* Container, FName Name) { const FObjectPropertyBase* Prop = Container ? CastField(Container->GetClass()->FindPropertyByName(Name)) : nullptr; return Prop ? Cast(Prop->GetObjectPropertyValue_InContainer(Container)) : nullptr; } } void ULPOutdoorRoomSubsystem::Initialize(FSubsystemCollectionBase& Collection) { Super::Initialize(Collection); TickHandle = FTSTicker::GetCoreTicker().AddTicker(FTickerDelegate::CreateUObject(this, &ULPOutdoorRoomSubsystem::Tick)); } void ULPOutdoorRoomSubsystem::Deinitialize() { FTSTicker::GetCoreTicker().RemoveTicker(TickHandle); Super::Deinitialize(); } bool ULPOutdoorRoomSubsystem::Tick(float DeltaTime) { const AActor* Room = GetObjectProperty(GetGameInstance(), RoomPropertyName); USceneComponent* Root = IsValid(Room) ? Room->GetRootComponent() : nullptr; USceneComponent* Ceiling = IsValid(Room) ? GetObjectProperty(Room, CeilingPropertyName) : nullptr; // Plafond masque precedemment mais qui n'est plus celui de la piece courante : le rendre. if (HiddenCeiling.IsValid() && HiddenCeiling.Get() != Ceiling) { HiddenCeiling->SetHiddenInGame(false); HiddenCeiling.Reset(); } if (!Root || !Ceiling) { return true; } const bool bOutdoor = Root->GetRelativeScale3D().Z < OutdoorScaleZ; if (bOutdoor && !Ceiling->bHiddenInGame) { Ceiling->SetHiddenInGame(true); HiddenCeiling = Ceiling; UE_LOG(LogLifePlay, Log, TEXT("Piece exterieure (echelle Z %.3f) : plafond WallT masque"), Root->GetRelativeScale3D().Z); } else if (!bOutdoor && HiddenCeiling.Get() == Ceiling) { Ceiling->SetHiddenInGame(false); HiddenCeiling.Reset(); UE_LOG(LogLifePlay, Log, TEXT("Piece interieure (echelle Z %.3f) : plafond WallT rendu visible"), Root->GetRelativeScale3D().Z); } return true; }