第一次提交
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
// Copyright 2025 https://yuewu.dev/en All Rights Reserved.
|
||||
|
||||
#include "Team/GCS_CombatTeamAgentComponent.h"
|
||||
#include "GCS_LogChannels.h"
|
||||
#include "GameFramework/Controller.h"
|
||||
#include "GameFramework/Pawn.h"
|
||||
#include "GenericTeamAgentInterface.h"
|
||||
#include "Net/UnrealNetwork.h"
|
||||
#include "Net/Core/PushModel/PushModel.h"
|
||||
|
||||
// Sets default values for this component's properties
|
||||
UGCS_CombatTeamAgentComponent::UGCS_CombatTeamAgentComponent()
|
||||
{
|
||||
// Set this component to be initialized when the game starts, and to be ticked every frame. You can turn these features
|
||||
// off to improve performance if you don't need them.
|
||||
PrimaryComponentTick.bCanEverTick = false;
|
||||
SetIsReplicatedByDefault(true);
|
||||
// ...
|
||||
}
|
||||
|
||||
void UGCS_CombatTeamAgentComponent::GetLifetimeReplicatedProps(TArray<class FLifetimeProperty>& OutLifetimeProps) const
|
||||
{
|
||||
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
|
||||
|
||||
FDoRepLifetimeParams SharedParams;
|
||||
SharedParams.bIsPushBased = true;
|
||||
|
||||
DOREPLIFETIME_WITH_PARAMS_FAST(ThisClass, CombatTeamId, SharedParams);
|
||||
}
|
||||
|
||||
FGCS_CombatTeamIdChangedSignature* UGCS_CombatTeamAgentComponent::GetOnTeamIdChangedDelegate()
|
||||
{
|
||||
return &OnTeamIdChangedEvent;
|
||||
}
|
||||
|
||||
FGenericTeamId UGCS_CombatTeamAgentComponent::GetCombatTeamId_Implementation() const
|
||||
{
|
||||
return CombatTeamId;
|
||||
}
|
||||
|
||||
void UGCS_CombatTeamAgentComponent::SetCombatTeamId_Implementation(FGenericTeamId NewTeamId)
|
||||
{
|
||||
if (GetOwner()->HasAuthority())
|
||||
{
|
||||
const FGenericTeamId OldTeamID = CombatTeamId;
|
||||
|
||||
MARK_PROPERTY_DIRTY_FROM_NAME(ThisClass, CombatTeamId, this);
|
||||
CombatTeamId = NewTeamId;
|
||||
if (bAssignTeamIdToController)
|
||||
{
|
||||
if (APawn* Pawn = Cast<APawn>(GetOwner()))
|
||||
{
|
||||
if (IGenericTeamAgentInterface* AgentInterface = Cast<IGenericTeamAgentInterface>(Pawn->GetController()))
|
||||
{
|
||||
AgentInterface->SetGenericTeamId(NewTeamId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ConditionalBroadcastTeamChanged(this, OldTeamID, NewTeamId);
|
||||
}
|
||||
else
|
||||
{
|
||||
UE_LOG(LogGCS, Error, TEXT("Cannot set team for %s on non-authority"), *GetPathName(this));
|
||||
}
|
||||
}
|
||||
|
||||
void UGCS_CombatTeamAgentComponent::OnRep_CombatTeamId(FGenericTeamId OldTeamID)
|
||||
{
|
||||
ConditionalBroadcastTeamChanged(this, OldTeamID, CombatTeamId);
|
||||
}
|
||||
|
||||
// Called when the game starts
|
||||
void UGCS_CombatTeamAgentComponent::BeginPlay()
|
||||
{
|
||||
Super::BeginPlay();
|
||||
|
||||
// ...
|
||||
}
|
||||
|
||||
// Called every frame
|
||||
void UGCS_CombatTeamAgentComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
|
||||
{
|
||||
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
|
||||
|
||||
// ...
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
// Copyright 2025 https://yuewu.dev/en All Rights Reserved.
|
||||
|
||||
|
||||
#include "Team/GCS_CombatTeamAgentInterface.h"
|
||||
|
||||
#include "GCS_LogChannels.h"
|
||||
|
||||
|
||||
// Add default functionality here for any IGCS_CombatTeamAgentInterface functions that are not pure virtual.
|
||||
void IGCS_CombatTeamAgentInterface::SetCombatTeamId_Implementation(FGenericTeamId NewTeamId)
|
||||
{
|
||||
if (IGenericTeamAgentInterface* TeamAgentInterface = Cast<IGenericTeamAgentInterface>(_getUObject()))
|
||||
{
|
||||
TeamAgentInterface->SetGenericTeamId(NewTeamId);
|
||||
}
|
||||
}
|
||||
|
||||
FGenericTeamId IGCS_CombatTeamAgentInterface::GetCombatTeamId_Implementation() const
|
||||
{
|
||||
if (IGenericTeamAgentInterface* TeamAgentInterface = Cast<IGenericTeamAgentInterface>(_getUObject()))
|
||||
{
|
||||
return TeamAgentInterface->GetGenericTeamId();
|
||||
}
|
||||
|
||||
return FGenericTeamId::NoTeam;
|
||||
}
|
||||
|
||||
void IGCS_CombatTeamAgentInterface::ConditionalBroadcastTeamChanged(TScriptInterface<IGCS_CombatTeamAgentInterface> This, FGenericTeamId OldTeamID, FGenericTeamId NewTeamID)
|
||||
{
|
||||
if (OldTeamID != NewTeamID)
|
||||
{
|
||||
UObject* ThisObj = This.GetObject();
|
||||
UE_LOG(LogGCS, Verbose, TEXT("[%s] %s assigned team %d"), *GetClientServerContextString(ThisObj), *GetPathNameSafe(ThisObj), NewTeamID.GetId());
|
||||
This.GetInterface()->GetTeamChangedDelegateChecked().Broadcast(ThisObj, OldTeamID, NewTeamID);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user