2022-05-23 18:41:30 +00:00
// Copyright Epic Games, Inc. All Rights Reserved.
# include "LyraPawn.h"
2022-09-13 07:18:28 +00:00
# include "Containers/Array.h"
# include "Containers/UnrealString.h"
# include "Delegates/Delegate.h"
2022-05-23 18:41:30 +00:00
# include "GameFramework/Controller.h"
2022-09-13 07:18:28 +00:00
# include "Logging/LogCategory.h"
# include "Logging/LogMacros.h"
# include "LyraLogChannels.h"
# include "Misc/AssertionMacros.h"
# include "Net/UnrealNetwork.h"
# include "Templates/Casts.h"
# include "Trace/Detail/Channel.h"
# include "UObject/ObjectPtr.h"
# include "UObject/UObjectBaseUtility.h"
class FLifetimeProperty ;
class UObject ;
2022-05-23 18:41:30 +00:00
ALyraPawn : : ALyraPawn ( const FObjectInitializer & ObjectInitializer )
: Super ( ObjectInitializer )
{
}
void ALyraPawn : : GetLifetimeReplicatedProps ( TArray < FLifetimeProperty > & OutLifetimeProps ) const
{
Super : : GetLifetimeReplicatedProps ( OutLifetimeProps ) ;
DOREPLIFETIME ( ThisClass , MyTeamID ) ;
}
void ALyraPawn : : PreInitializeComponents ( )
{
Super : : PreInitializeComponents ( ) ;
}
void ALyraPawn : : EndPlay ( const EEndPlayReason : : Type EndPlayReason )
{
Super : : EndPlay ( EndPlayReason ) ;
}
void ALyraPawn : : PossessedBy ( AController * NewController )
{
const FGenericTeamId OldTeamID = MyTeamID ;
Super : : PossessedBy ( NewController ) ;
// Grab the current team ID and listen for future changes
if ( ILyraTeamAgentInterface * ControllerAsTeamProvider = Cast < ILyraTeamAgentInterface > ( NewController ) )
{
MyTeamID = ControllerAsTeamProvider - > GetGenericTeamId ( ) ;
ControllerAsTeamProvider - > GetTeamChangedDelegateChecked ( ) . AddDynamic ( this , & ThisClass : : OnControllerChangedTeam ) ;
}
ConditionalBroadcastTeamChanged ( this , OldTeamID , MyTeamID ) ;
}
void ALyraPawn : : UnPossessed ( )
{
AController * const OldController = Controller ;
// Stop listening for changes from the old controller
const FGenericTeamId OldTeamID = MyTeamID ;
if ( ILyraTeamAgentInterface * ControllerAsTeamProvider = Cast < ILyraTeamAgentInterface > ( OldController ) )
{
ControllerAsTeamProvider - > GetTeamChangedDelegateChecked ( ) . RemoveAll ( this ) ;
}
Super : : UnPossessed ( ) ;
// Determine what the new team ID should be afterwards
MyTeamID = DetermineNewTeamAfterPossessionEnds ( OldTeamID ) ;
ConditionalBroadcastTeamChanged ( this , OldTeamID , MyTeamID ) ;
}
void ALyraPawn : : SetGenericTeamId ( const FGenericTeamId & NewTeamID )
{
if ( GetController ( ) = = nullptr )
{
if ( HasAuthority ( ) )
{
const FGenericTeamId OldTeamID = MyTeamID ;
MyTeamID = NewTeamID ;
ConditionalBroadcastTeamChanged ( this , OldTeamID , MyTeamID ) ;
}
else
{
UE_LOG ( LogLyraTeams , Error , TEXT ( " You can't set the team ID on a pawn (%s) except on the authority " ) , * GetPathNameSafe ( this ) ) ;
}
}
else
{
UE_LOG ( LogLyraTeams , Error , TEXT ( " You can't set the team ID on a possessed pawn (%s); it's driven by the associated controller " ) , * GetPathNameSafe ( this ) ) ;
}
}
FGenericTeamId ALyraPawn : : GetGenericTeamId ( ) const
{
return MyTeamID ;
}
FOnLyraTeamIndexChangedDelegate * ALyraPawn : : GetOnTeamIndexChangedDelegate ( )
{
return & OnTeamChangedDelegate ;
}
void ALyraPawn : : OnControllerChangedTeam ( UObject * TeamAgent , int32 OldTeam , int32 NewTeam )
{
const FGenericTeamId MyOldTeamID = MyTeamID ;
MyTeamID = IntegerToGenericTeamId ( NewTeam ) ;
ConditionalBroadcastTeamChanged ( this , MyOldTeamID , MyTeamID ) ;
}
void ALyraPawn : : OnRep_MyTeamID ( FGenericTeamId OldTeamID )
{
ConditionalBroadcastTeamChanged ( this , OldTeamID , MyTeamID ) ;
}