Skip to content
Snippets Groups Projects

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

Merged David Gilbert requested to merge feature/replication_improvements into dev/5.4
2 files
+ 18
36
Compare changes
  • Side-by-side
  • Inline

Files

@@ -65,34 +65,23 @@ void ARWTHVRPawn::NotifyControllerChanged()
@@ -65,34 +65,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 +99,10 @@ void ARWTHVRPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponen
@@ -110,6 +99,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 +118,7 @@ void ARWTHVRPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponen
@@ -125,6 +118,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())
@@ -257,7 +251,6 @@ void ARWTHVRPawn::MulticastAddDCSyncComponent_Implementation()
@@ -257,7 +251,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 +278,8 @@ void ARWTHVRPawn::AttachDCRAtoPawn()
@@ -285,8 +278,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 +302,6 @@ void ARWTHVRPawn::SetupMotionControllerSources()
@@ -309,13 +302,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,
Loading