Skip to content
Snippets Groups Projects
Commit 6fcb7e2a authored by David Gilbert's avatar David Gilbert :bug:
Browse files

Merge branch 'feature/replication_improvements' into 'dev/5.4'

feature(replication, pawn): Adds (initial) different way to attach DCRA to...

See merge request !93
parents 82703c70 4ce55f1c
No related branches found
No related tags found
1 merge request!93feature(replication, pawn): Adds (initial) different way to attach DCRA to...
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include "Engine/LocalPlayer.h" #include "Engine/LocalPlayer.h"
#include "GameFramework/PlayerController.h" #include "GameFramework/PlayerController.h"
#include "ILiveLinkClient.h" #include "ILiveLinkClient.h"
#include "InputMappingContext.h"
#include "Core/RWTHVRPlayerState.h" #include "Core/RWTHVRPlayerState.h"
#include "Kismet/GameplayStatics.h" #include "Kismet/GameplayStatics.h"
#include "Logging/StructuredLog.h" #include "Logging/StructuredLog.h"
...@@ -65,34 +66,23 @@ void ARWTHVRPawn::NotifyControllerChanged() ...@@ -65,34 +66,23 @@ void ARWTHVRPawn::NotifyControllerChanged()
{ {
Super::NotifyControllerChanged(); Super::NotifyControllerChanged();
UE_LOG(Toolkit, Display, // Try and use PlayerType for this:
TEXT("ARWTHVRPawn: Player Controller has changed, trying to change DCRA attachment if possible..."));
// Only do this for all local controlled pawns if (HasAuthority())
if (IsLocallyControlled())
{ {
UE_LOG(Toolkit, Display, UE_LOG(Toolkit, Display,
TEXT("ARWTHVRPawn: Player Controller has changed for local pawn, trying to change DCRA attachment if " TEXT("ARWTHVRPawn: Player Controller has changed, trying to change DCRA attachment if possible..."));
"possible...")); if (const ARWTHVRPlayerState* State = GetPlayerState<ARWTHVRPlayerState>())
// Only do this for the primary node or when we're running in standalone
if (URWTHVRUtilities::IsRoomMountedMode() &&
(URWTHVRUtilities::IsPrimaryNode() || GetNetMode() == NM_Standalone))
{ {
UE_LOG(Toolkit, Display, const EPlayerType Type = State->GetPlayerType();
TEXT("ARWTHVRPawn: We're the primary node, we want the DCRA attached to our pawn."));
// If we are also the authority (standalone or listen server), directly attach it to us. // Only cluster types are valid here as they are set on connection.
// If we are not (client), ask the server to do it. // For all other player types this is a race condition
if (HasAuthority()) if (Type == EPlayerType::nDisplayPrimary || GetNetMode() == NM_Standalone)
{ {
UE_LOG(Toolkit, Display, TEXT("ARWTHVRPawn: We have authority, do the attachment.")); UE_LOGFMT(Toolkit, Display, "ARWTHVRPawn: Attaching DCRA to Pawn {Pawn}.", GetName());
AttachDCRAtoPawn(); AttachDCRAtoPawn();
} }
else
{
UE_LOG(Toolkit, Display, TEXT("ARWTHVRPawn: We don't have authority, ask the sercer to attach."));
ServerAttachDCRAtoPawnRpc();
}
} }
} }
} }
...@@ -110,6 +100,10 @@ void ARWTHVRPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponen ...@@ -110,6 +100,10 @@ void ARWTHVRPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponen
return; return;
} }
UE_LOGFMT(Toolkit, Display, "SetupPlayerInputComponent: Player Controller is valid, setting up input for {Pawn}",
GetName());
// Set the control rotation of the PC to zero again. There is a small period of 2 frames where, when the pawn gets // Set the control rotation of the PC to zero again. There is a small period of 2 frames where, when the pawn gets
// possessed, the PC takes on the rotation of the VR Headset ONLY WHEN SPAWNING ON A CLIENT. Reset the rotation here // possessed, the PC takes on the rotation of the VR Headset ONLY WHEN SPAWNING ON A CLIENT. Reset the rotation here
// such that bUseControllerRotationYaw=true does not pass the wrong yaw value to the pawn initially. There is // such that bUseControllerRotationYaw=true does not pass the wrong yaw value to the pawn initially. There is
...@@ -125,6 +119,7 @@ void ARWTHVRPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponen ...@@ -125,6 +119,7 @@ void ARWTHVRPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponen
const EPlayerType Type = State->GetPlayerType(); const EPlayerType Type = State->GetPlayerType();
// Don't do anything with the type if it's been set to clustertype or anything. // Don't do anything with the type if it's been set to clustertype or anything.
// This is already being done when connecting to the server.
const bool bClusterType = Type == EPlayerType::nDisplayPrimary || Type == EPlayerType::nDisplaySecondary; const bool bClusterType = Type == EPlayerType::nDisplayPrimary || Type == EPlayerType::nDisplaySecondary;
if (!bClusterType && URWTHVRUtilities::IsHeadMountedMode()) if (!bClusterType && URWTHVRUtilities::IsHeadMountedMode())
...@@ -149,10 +144,17 @@ void ARWTHVRPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponen ...@@ -149,10 +144,17 @@ void ARWTHVRPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponen
} }
// bind the current mapping contexts // bind the current mapping contexts
for (const auto& Mapping : InputMappingContexts) for (const auto Mapping : InputMappingContexts)
{
if (Mapping && IsValid(Mapping))
{ {
AddInputMappingContext(PlayerController, Mapping); AddInputMappingContext(PlayerController, Mapping);
} }
else
{
UE_LOGFMT(Toolkit, Warning, "ARWTHVRPawn::SetupPlayerInputComponent: InputMappingContext was invalid!");
}
}
} }
UInputComponent* ARWTHVRPawn::GetPlayerInputComponent() { return ActivePlayerInputComponent; } UInputComponent* ARWTHVRPawn::GetPlayerInputComponent() { return ActivePlayerInputComponent; }
...@@ -257,7 +259,6 @@ void ARWTHVRPawn::MulticastAddDCSyncComponent_Implementation() ...@@ -257,7 +259,6 @@ void ARWTHVRPawn::MulticastAddDCSyncComponent_Implementation()
#endif #endif
} }
// Todo rewrite this in some other way or attach it differently, this is horrible
// Executed on the server only: Finds and attaches the CaveSetup Actor, which contains the DCRA to the Pawn. // Executed on the server only: Finds and attaches the CaveSetup Actor, which contains the DCRA to the Pawn.
// It is only executed on the server because attachments are synced to all clients, but not from client to server. // It is only executed on the server because attachments are synced to all clients, but not from client to server.
void ARWTHVRPawn::AttachDCRAtoPawn() void ARWTHVRPawn::AttachDCRAtoPawn()
...@@ -285,8 +286,8 @@ void ARWTHVRPawn::AttachDCRAtoPawn() ...@@ -285,8 +286,8 @@ void ARWTHVRPawn::AttachDCRAtoPawn()
"No CaveSetup Actor found which can be attached to the Pawn! This won't work on the Cave."); "No CaveSetup Actor found which can be attached to the Pawn! This won't work on the Cave.");
} }
if (HasAuthority()) // Should always be the case here, but double check // if (HasAuthority()) // Should always be the case here, but double check
MulticastAddDCSyncComponent(); // MulticastAddDCSyncComponent();
} }
void ARWTHVRPawn::SetupMotionControllerSources() void ARWTHVRPawn::SetupMotionControllerSources()
...@@ -309,13 +310,6 @@ void ARWTHVRPawn::SetupMotionControllerSources() ...@@ -309,13 +310,6 @@ void ARWTHVRPawn::SetupMotionControllerSources()
RightHand->SetTrackingMotionSource(MotionControllerSourceRight); RightHand->SetTrackingMotionSource(MotionControllerSourceRight);
} }
// Requests the server to perform the attachment, as only the server can sync this to all the other clients.
void ARWTHVRPawn::ServerAttachDCRAtoPawnRpc_Implementation()
{
// We're on the server here - attach the actor to the pawn.
AttachDCRAtoPawn();
}
void ARWTHVRPawn::SetCameraOffset() const void ARWTHVRPawn::SetCameraOffset() const
{ {
// this also incorporates the BaseEyeHeight, if set as static offset, // this also incorporates the BaseEyeHeight, if set as static offset,
......
...@@ -103,10 +103,6 @@ protected: ...@@ -103,10 +103,6 @@ protected:
/* Replicated functionality */ /* Replicated functionality */
/* Ask the server to attach the DCRA to the correct pawn */
UFUNCTION(Reliable, Server)
void ServerAttachDCRAtoPawnRpc();
/* Add a sync component to all instances of this pawn */ /* Add a sync component to all instances of this pawn */
UFUNCTION(Reliable, NetMulticast) UFUNCTION(Reliable, NetMulticast)
void MulticastAddDCSyncComponent(); void MulticastAddDCSyncComponent();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment