mirror of
https://github.com/Ed94/Cog.git
synced 2026-06-13 08:02:23 -07:00
hud initialization fixes
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user