// © 2024 Long Ly. All rights reserved. Any unauthorized use, reproduction, or distribution of this trademark is strictly prohibited and may result in legal action. #include "ModularGameplayActors/OLSModularPlayerState.h" #include "AbilitySystem/OLSAbilitySystemComponent.h" #include "Components/GameFrameworkComponentManager.h" #include "Components/PlayerStateComponent.h" AOLSModularPlayerState::AOLSModularPlayerState(const FObjectInitializer& objectInitializer) : Super(objectInitializer) { // Create ability system component, and set it to be explicitly replicated AbilitySystemComponent = CreateDefaultSubobject(TEXT("AbilitySystemComponent")); AbilitySystemComponent->SetIsReplicated(true); SetNetUpdateFrequency(100.f); } void AOLSModularPlayerState::PreInitializeComponents() { Super::PreInitializeComponents(); UGameFrameworkComponentManager::AddGameFrameworkComponentReceiver(this); } void AOLSModularPlayerState::BeginPlay() { UGameFrameworkComponentManager::SendGameFrameworkComponentExtensionEvent(this, UGameFrameworkComponentManager::NAME_GameActorReady); Super::BeginPlay(); } void AOLSModularPlayerState::EndPlay(const EEndPlayReason::Type EndPlayReason) { UGameFrameworkComponentManager::RemoveGameFrameworkComponentReceiver(this); Super::EndPlay(EndPlayReason); } void AOLSModularPlayerState::PostInitProperties() { Super::PostInitProperties(); if (AbilitySystemComponent) { //@Todo replace this log by our custom log. UE_LOG(LogTemp, Verbose, TEXT("PostInitProperties for %s - Setting up ASC Replication Mode to: %d"), *GetName(), ReplicationMode); AbilitySystemComponent->SetReplicationMode(ReplicationMode); } } void AOLSModularPlayerState::Reset() { Super::Reset(); TArray modularComponents; GetComponents(modularComponents); for (UPlayerStateComponent* component : modularComponents) { component->Reset(); } } UAbilitySystemComponent* AOLSModularPlayerState::GetAbilitySystemComponent() const { return AbilitySystemComponent; } void AOLSModularPlayerState::CopyProperties(APlayerState* playerState) { Super::CopyProperties(playerState); TInlineComponentArray playerStateComponents; GetComponents(playerStateComponents); for (UPlayerStateComponent* sourceComponent : playerStateComponents) { if (UPlayerStateComponent* targetComp = Cast(static_cast(FindObjectWithOuter(playerState, sourceComponent->GetClass(), sourceComponent->GetFName())))) { sourceComponent->CopyProperties(targetComp); } } }