Add server authority checks for networking safety

- PerceptionComponent: omniscient TActorIterator only runs with HasAuthority()
- PersonalityComponent: ApplyReaction and ForceState gate replicated CurrentState writes to server only

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
j.foucher 2026-03-31 18:24:55 +02:00
parent d6325b373d
commit b60086d107
2 changed files with 14 additions and 1 deletions

View File

@ -280,7 +280,8 @@ AActor* UPS_AI_Behavior_PerceptionComponent::GetHighestThreatActor(
const AAIController* OwnerAIC = Cast<AAIController>(GetOwner()); const AAIController* OwnerAIC = Cast<AAIController>(GetOwner());
const APawn* OwnerPawn = OwnerAIC ? OwnerAIC->GetPawn() : nullptr; const APawn* OwnerPawn = OwnerAIC ? OwnerAIC->GetPawn() : nullptr;
if (OwnerPawn) // Only run on server — TActorIterator results differ on clients
if (OwnerPawn && OwnerPawn->HasAuthority())
{ {
const EPS_AI_Behavior_TargetType TopPriority = TargetPriority[0]; const EPS_AI_Behavior_TargetType TopPriority = TargetPriority[0];
const UPS_AI_Behavior_Settings* Settings = GetDefault<UPS_AI_Behavior_Settings>(); const UPS_AI_Behavior_Settings* Settings = GetDefault<UPS_AI_Behavior_Settings>();

View File

@ -132,6 +132,12 @@ EPS_AI_Behavior_State UPS_AI_Behavior_PersonalityComponent::EvaluateReaction() c
EPS_AI_Behavior_State UPS_AI_Behavior_PersonalityComponent::ApplyReaction() EPS_AI_Behavior_State UPS_AI_Behavior_PersonalityComponent::ApplyReaction()
{ {
// Only server can change replicated state
if (!GetOwner() || !GetOwner()->HasAuthority())
{
return CurrentState;
}
const EPS_AI_Behavior_State NewState = EvaluateReaction(); const EPS_AI_Behavior_State NewState = EvaluateReaction();
if (NewState != CurrentState) if (NewState != CurrentState)
{ {
@ -151,6 +157,12 @@ EPS_AI_Behavior_State UPS_AI_Behavior_PersonalityComponent::ApplyReaction()
void UPS_AI_Behavior_PersonalityComponent::ForceState(EPS_AI_Behavior_State NewState) void UPS_AI_Behavior_PersonalityComponent::ForceState(EPS_AI_Behavior_State NewState)
{ {
// Only server can change replicated state
if (!GetOwner() || !GetOwner()->HasAuthority())
{
return;
}
if (NewState != CurrentState) if (NewState != CurrentState)
{ {
const EPS_AI_Behavior_State OldState = CurrentState; const EPS_AI_Behavior_State OldState = CurrentState;