Bind HUD status to GAS and player state

This commit is contained in:
2026-04-26 20:20:32 +08:00
parent 7f3d9cd989
commit c4f185736f
5 changed files with 521 additions and 6 deletions

View File

@@ -10,6 +10,7 @@
#include "Class/PHYClassComponent.h"
#include "Class/PHYClassSettings.h"
#include "GGA_AbilitySystemComponent.h"
#include "Net/UnrealNetwork.h"
APHYPlayerState::APHYPlayerState(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
@@ -28,7 +29,69 @@ APHYPlayerState::APHYPlayerState(const FObjectInitializer& ObjectInitializer)
ClassComponent->SetClassTag(GetDefault<UPHYClassSettings>()->DefaultPlayerClassTag);
}
void APHYPlayerState::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME(ThisClass, PlayerLevel);
DOREPLIFETIME(ThisClass, Experience);
DOREPLIFETIME(ThisClass, ExperienceForNextLevel);
}
UAbilitySystemComponent* APHYPlayerState::GetAbilitySystemComponent() const
{
return AbilitySystemComponent;
}
void APHYPlayerState::SetPlayerLevel(const int32 NewLevel)
{
SetProgression(NewLevel, Experience, ExperienceForNextLevel);
}
void APHYPlayerState::SetExperience(const int32 NewExperience)
{
SetProgression(PlayerLevel, NewExperience, ExperienceForNextLevel);
}
void APHYPlayerState::AddExperience(const int32 DeltaExperience)
{
SetExperience(Experience + DeltaExperience);
}
void APHYPlayerState::SetExperienceForNextLevel(const int32 NewExperienceForNextLevel)
{
SetProgression(PlayerLevel, Experience, NewExperienceForNextLevel);
}
void APHYPlayerState::SetProgression(const int32 NewLevel, const int32 NewExperience, const int32 NewExperienceForNextLevel)
{
if (!HasAuthority())
{
return;
}
const int32 ClampedLevel = FMath::Max(1, NewLevel);
const int32 ClampedExperience = FMath::Max(0, NewExperience);
const int32 ClampedExperienceForNextLevel = FMath::Max(1, NewExperienceForNextLevel);
if (PlayerLevel == ClampedLevel && Experience == ClampedExperience && ExperienceForNextLevel == ClampedExperienceForNextLevel)
{
return;
}
PlayerLevel = ClampedLevel;
Experience = ClampedExperience;
ExperienceForNextLevel = ClampedExperienceForNextLevel;
BroadcastProgressionChanged();
}
void APHYPlayerState::OnRep_Progression()
{
BroadcastProgressionChanged();
}
void APHYPlayerState::BroadcastProgressionChanged()
{
OnProgressionChanged.Broadcast(PlayerLevel, Experience, ExperienceForNextLevel);
}