hud initialization fixes

This commit is contained in:
Arnaud Jamin
2023-10-07 01:57:42 -04:00
parent b18e62cd02
commit 3e6288c955
23 changed files with 363 additions and 88 deletions
+122 -11
View File
@@ -1,7 +1,9 @@
#include "CogSamplePlayerController.h"
#include "CogDebugLogMacros.h"
#include "CogDefines.h"
#include "CogSampleCharacter.h"
#include "CogSampleLogCategories.h"
#include "CogSampleTargetAcquisition.h"
#include "Net/UnrealNetwork.h"
@@ -12,7 +14,6 @@
#include "CogEngineReplicator.h"
#endif //USE_COG
//--------------------------------------------------------------------------------------------------------------------------
ACogSamplePlayerController::ACogSamplePlayerController()
{
@@ -31,14 +32,115 @@ void ACogSamplePlayerController::BeginPlay()
}
//--------------------------------------------------------------------------------------------------------------------------
void ACogSamplePlayerController::AcknowledgePossession(APawn* P)
void ACogSamplePlayerController::OnPossess(APawn* InPawn)
{
Super::AcknowledgePossession(P);
COG_LOG_OBJECT(LogCogPossession, ELogVerbosity::Verbose, this, TEXT(""));
if (ACogSampleCharacter* PossessedCharacter = Cast<ACogSampleCharacter>(P))
ACogSampleCharacter* OldControlledCharacter = Cast<ACogSampleCharacter>(GetPawn());
//----------------------------------------------------------------------------------------------------------
// Case of pawn was possessed too early by the server before a join complete
//----------------------------------------------------------------------------------------------------------
if (InPawn != nullptr && InPawn->Controller != nullptr)
{
PossessedCharacter->OnAcknowledgePossession(this);
COG_LOG_OBJECT(LogCogPossession, ELogVerbosity::Warning, this, TEXT("Asking %s to possess pawn %s more than once. Pawn will be restarted! Should call Unpossess first if possible."), *GetNameSafe(this), *GetNameSafe(InPawn));
InPawn->Controller->UnPossess();
}
Super::OnPossess(InPawn);
if (InPawn != nullptr)
{
//on server, the pawn are not possessed on begin play callback, need to do it here.
if (IsLocalController())
{
SetControlRotation(InPawn->GetActorRotation());
}
}
ControlledCharacter = Cast<ACogSampleCharacter>(InPawn);
if (InitialControlledCharacter == nullptr)
{
InitialControlledCharacter = ControlledCharacter;
}
OnControlledCharacterChanged.Broadcast(this, ControlledCharacter.Get(), OldControlledCharacter);
}
//--------------------------------------------------------------------------------------------------------------------------
void ACogSamplePlayerController::AcknowledgePossession(APawn* NewPawn)
{
COG_LOG_OBJECT(LogCogPossession, ELogVerbosity::Verbose, this, TEXT(""));
ACogSampleCharacter* OldControlledCharacter = Cast<ACogSampleCharacter>(AcknowledgedPawn);
Super::AcknowledgePossession(NewPawn);
if (InitialControlledCharacter == nullptr)
{
InitialControlledCharacter = Cast<ACogSampleCharacter>(NewPawn);
}
if (ControlledCharacter != nullptr)
{
ControlledCharacter->AcknowledgeUnpossession();
}
ControlledCharacter = Cast<ACogSampleCharacter>(NewPawn);
ControlledCharacter->AcknowledgePossession(this);
OnControlledCharacterChanged.Broadcast(this, ControlledCharacter.Get(), OldControlledCharacter);
}
//--------------------------------------------------------------------------------------------------------------------------
void ACogSamplePlayerController::ControlCharacter(ACogSampleCharacter* NewCharacter)
{
if (NewCharacter == nullptr || GetPawn() == NewCharacter)
{
return;
}
//-------------------------------------------------------------------------------------------
// Unplug the current controller so it doesn't conflict with the newly assigned controller
//-------------------------------------------------------------------------------------------
AController* OldController = NewCharacter->GetController();
if (OldController != nullptr)
{
COG_LOG_OBJECT(LogCogPossession, ELogVerbosity::Verbose, this, TEXT("%s unpossess %s"), *GetNameSafe(OldController), *GetNameSafe(NewCharacter));
OldController->UnPossess();
}
//-------------------------------------------------------------------------------------------
// We will need to replug the initial controller of the character we currently control
//-------------------------------------------------------------------------------------------
ACogSampleCharacter* OldCharacter = Cast<ACogSampleCharacter>(GetPawn());
//-------------------------------------------------------------------------------------------
// Unpossess before possession to prevent a warning
//-------------------------------------------------------------------------------------------
COG_LOG_OBJECT(LogCogPossession, ELogVerbosity::Verbose, this, TEXT("%s unpossess %s"), *GetNameSafe(this), *GetNameSafe(GetPawn()));
UnPossess();
COG_LOG_OBJECT(LogCogPossession, ELogVerbosity::Verbose, this, TEXT("%s possess %s"), *GetNameSafe(this), *GetNameSafe(NewCharacter));
Possess(NewCharacter);
//-------------------------------------------------------------------------------------------
// Replug the initial controller on the old character. For example, replug the initial
// AI controller of an AI when the player finishes controlling it. This needs to be done
// after the Possess call.
//-------------------------------------------------------------------------------------------
if (OldCharacter != nullptr && OldCharacter->InitialController != nullptr && OldCharacter->InitialController != this)
{
COG_LOG_OBJECT(LogCogPossession, ELogVerbosity::Verbose, this, TEXT("%s possess %s"), *GetNameSafe(OldCharacter->InitialController), *GetNameSafe(OldCharacter));
OldCharacter->InitialController->Possess(OldCharacter);
}
}
//--------------------------------------------------------------------------------------------------------------------------
void ACogSamplePlayerController::ResetControlledPawn()
{
ControlCharacter(InitialControlledCharacter.Get());
}
//--------------------------------------------------------------------------------------------------------------------------
@@ -46,13 +148,22 @@ void ACogSamplePlayerController::Tick(float DeltaSeconds)
{
Super::Tick(DeltaSeconds);
if (TargetAcquisition != nullptr)
{
TArray<AActor*> TagretToIgnore;
FCogSampleTargetAcquisitionResult Result;
TargetAcquisition->FindBestTarget(this, TagretToIgnore, nullptr, true, FVector2D::ZeroVector, false, Result);
SetTarget(Result.Target);
TickTargeting(DeltaSeconds);
}
//--------------------------------------------------------------------------------------------------------------------------
void ACogSamplePlayerController::TickTargeting(float DeltaSeconds)
{
if (TargetAcquisition == nullptr)
{
SetTarget(nullptr);
return;
}
TArray<AActor*> TagretToIgnore;
FCogSampleTargetAcquisitionResult Result;
TargetAcquisition->FindBestTarget(this, TagretToIgnore, nullptr, true, FVector2D::ZeroVector, false, Result);
SetTarget(Result.Target);
}
//--------------------------------------------------------------------------------------------------------------------------