第一次提交

This commit is contained in:
不明不惑
2026-03-03 01:23:02 +08:00
commit 3e434877e8
1053 changed files with 102411 additions and 0 deletions

View File

@@ -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);
// ...
}

View File

@@ -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);
}
}