99#include " Engine/Engine.h" // GEngine
1010#include " GameFramework/Pawn.h"
1111#include " GameFramework/PlayerState.h"
12+ #include " GameFramework/PlayerController.h"
13+ #include " Engine/LocalPLayer.h"
14+ #include " Engine/GameInstance.h"
1215#include " NavigationSystem.h"
1316#include " RoomData.h"
1417#include " Room.h"
@@ -442,8 +445,8 @@ void ADungeonGeneratorBase::UpdatePlayerRooms()
442445continue ;
443446
444447// Using their UniqueID to be reliable even when players join or leave
445- const FUniqueNetIdRepl& UniqueID = Controller->PlayerState ->GetUniqueId ();
446- if (!UniqueID. IsValid () )
448+ int32 PlayerID = Controller->PlayerState ->GetPlayerId ();
449+ if (PlayerID <= 0 )
447450continue ;
448451
449452APawn* Player = GetVisibilityPawn (Controller);
@@ -453,17 +456,17 @@ void ADungeonGeneratorBase::UpdatePlayerRooms()
453456const FTransform& Transform = UseGeneratorTransform () ? GetTransform () : FTransform::Identity;
454457FBox WorldPlayerBox = ActorUtils::GetActorBoundingBoxForRooms (Player, Transform);
455458
456- FPlayerRooms& PlayerRoom = PlayerRooms.FindOrAdd (UniqueID );
459+ FPlayerRooms& PlayerRoom = PlayerRooms.FindOrAdd (PlayerID );
457460auto PreviousRoomList (PlayerRoom.CurrentRooms );
458461PlayerRoom.Roll ();
459- FindElementsWithBoundsTest (*Octree, WorldPlayerBox, [this , &PlayerRoom, & UniqueID ](const FDungeonOctreeElement& Element) {
462+ FindElementsWithBoundsTest (*Octree, WorldPlayerBox, [this , &PlayerRoom, &PlayerID ](const FDungeonOctreeElement& Element) {
460463PlayerRoom.AddCurrentRoom (Element.Room );
461- Element.Room ->SetPlayerInside (UniqueID , true );
464+ Element.Room ->SetPlayerInside (PlayerID , true );
462465});
463466
464467for (URoom* Room : PlayerRoom.OldRooms )
465468{
466- Room->SetPlayerInside (UniqueID , false );
469+ Room->SetPlayerInside (PlayerID , false );
467470}
468471
469472// Both sets are equal if each set is included in the other
@@ -475,14 +478,6 @@ void ADungeonGeneratorBase::UpdatePlayerRooms()
475478
476479void ADungeonGeneratorBase::UpdateRoomVisibility ()
477480{
478- // Get local player controller
479- // @TODO: Extend to support splitscreen / multiple local players?
480- FUniqueNetIdRepl UniqueID = ActorUtils::GetPlayerUniqueId (GetWorld (), 0 );
481-
482- FPlayerRooms* PlayerRoom = PlayerRooms.Find (UniqueID);
483- if (!PlayerRoom)
484- return ;
485-
486481const bool bIsOcclusionEnabled = Dungeon::OcclusionCulling ();
487482const uint32 OcclusionDistance = Dungeon::OcclusionDistance ();
488483bool bForceUpdate = false ;
@@ -504,13 +499,37 @@ void ADungeonGeneratorBase::UpdateRoomVisibility()
504499if (!bIsOcclusionEnabled)
505500return ;
506501
502+ TSet<URoom*> OldRooms;
503+ TSet<URoom*> CurrentRooms;
504+ bool bHasChanged = false ;
505+
506+ UGameInstance* GameInstance = GetWorld ()->GetGameInstance ();
507+ for (const ULocalPlayer* LocalPlayer : GameInstance->GetLocalPlayers ())
508+ {
509+ APlayerController* Controller = LocalPlayer->PlayerController ;
510+ if (!IsValid (Controller))
511+ continue ;
512+
513+ APlayerState* State = Controller->PlayerState ;
514+ if (!IsValid (State))
515+ continue ;
516+
517+ FPlayerRooms* PlayerRoom = PlayerRooms.Find (State->GetPlayerId ());
518+ if (!PlayerRoom)
519+ continue ;
520+
521+ OldRooms.Append (PlayerRoom->OldRooms );
522+ CurrentRooms.Append (PlayerRoom->CurrentRooms );
523+ bHasChanged |= PlayerRoom->bHasChanged ;
524+ }
525+
507526// Save performance by not updating room visibilities if the player rooms haven't changed.
508- if (!(bForceUpdate || PlayerRoom-> bHasChanged ))
527+ if (!(bForceUpdate || bHasChanged))
509528return ;
510529
511530TSet<URoom*> VisibleRooms;
512- UDungeonGraph::TraverseRooms (PlayerRoom-> CurrentRooms , &VisibleRooms, OcclusionDistance, [](URoom* room, uint32 distance) { room->SetVisible (true ); });
513- UDungeonGraph::TraverseRooms (PlayerRoom-> OldRooms , nullptr , OcclusionDistance, [&VisibleRooms](URoom* room, uint32 distance) { room->SetVisible (VisibleRooms.Contains (room)); });
531+ UDungeonGraph::TraverseRooms (CurrentRooms, &VisibleRooms, OcclusionDistance, [](URoom* room, uint32 distance) { room->SetVisible (true ); });
532+ UDungeonGraph::TraverseRooms (OldRooms, nullptr , OcclusionDistance, [&VisibleRooms](URoom* room, uint32 distance) { room->SetVisible (VisibleRooms.Contains (room)); });
514533}
515534
516535void ADungeonGeneratorBase::UpdateRoomRelevancy ()
0 commit comments