diff --git a/Source/ZMMO/Game/Modes/ZeusPlayerState.cpp b/Source/ZMMO/Game/Modes/ZeusPlayerState.cpp index 7e87c8c..3497c4e 100644 --- a/Source/ZMMO/Game/Modes/ZeusPlayerState.cpp +++ b/Source/ZMMO/Game/Modes/ZeusPlayerState.cpp @@ -1,9 +1,13 @@ #include "ZeusPlayerState.h" +#include "AbilitySystemComponent.h" #include "Components/ActorComponent.h" #include "Misc/ConfigCacheIni.h" #include "Net/UnrealNetwork.h" #include "ZMMO.h" +#include "ZeusAbilitySystemComponent.h" +#include "ZeusAttributeSet.h" +#include "ZeusGASComponent.h" AZeusPlayerState::AZeusPlayerState() { @@ -98,3 +102,32 @@ void AZeusPlayerState::SetCharInfo(const FString& InCharName, const FString& InG CharName = InCharName; GuildName = InGuildName; } + +UAbilitySystemComponent* AZeusPlayerState::GetAbilitySystemComponent() const +{ + // ASC vive como subobject do UZeusGASComponent (que esta no Component + // Registry). UE5 GAS nodes BP ("Get Ability System Component", "Apply + // Gameplay Effect To Target", etc.) chamam isto via IAbilitySystemInterface. + // O retorno e o ponteiro upcastado pra UAbilitySystemComponent (base) — + // mas em runtime e' UZeusAbilitySystemComponent (cast tipado via + // GetZeusAbilitySystemComponent abaixo). + return GetZeusAbilitySystemComponent(); +} + +UZeusAbilitySystemComponent* AZeusPlayerState::GetZeusAbilitySystemComponent() const +{ + if (UZeusGASComponent* GAS = GetZeusComponent()) + { + return GAS->AbilitySystemComponent.Get(); + } + return nullptr; +} + +UZeusAttributeSet* AZeusPlayerState::GetZeusAttributeSet() const +{ + if (UZeusGASComponent* GAS = GetZeusComponent()) + { + return GAS->AttributeSet.Get(); + } + return nullptr; +} diff --git a/Source/ZMMO/Game/Modes/ZeusPlayerState.h b/Source/ZMMO/Game/Modes/ZeusPlayerState.h index aed645d..c548e64 100644 --- a/Source/ZMMO/Game/Modes/ZeusPlayerState.h +++ b/Source/ZMMO/Game/Modes/ZeusPlayerState.h @@ -1,5 +1,6 @@ #pragma once +#include "AbilitySystemInterface.h" #include "CoreMinimal.h" #include "GameFramework/PlayerState.h" #include "Templates/SubclassOf.h" @@ -7,6 +8,8 @@ class FLifetimeProperty; class UActorComponent; +class UZeusAbilitySystemComponent; +class UZeusAttributeSet; /** * PlayerState do MMO. Pattern UE5 idiomatico: o GameMode atribui @@ -45,13 +48,36 @@ class UActorComponent; * ou o helper `GetZeusComponent()`. */ UCLASS(Config = Game, BlueprintType) -class ZMMO_API AZeusPlayerState : public APlayerState +class ZMMO_API AZeusPlayerState : public APlayerState, public IAbilitySystemInterface { GENERATED_BODY() public: AZeusPlayerState(); + // === IAbilitySystemInterface (UE5 GAS) === + // + // Padrao Lyra: PlayerState implementa a interface; o ASC vive como + // subobject do UZeusGASComponent (Component Registry). Isso permite que + // qualquer Actor que receba este PlayerState resolva o ASC via cast + // pra IAbilitySystemInterface OU via node BP "Get Ability System + // Component" (que faz o mesmo internamente). + // + // Acesso BP: "Get Ability System Component" + pin do PlayerState. + // Acesso C++: `Cast(PlayerState)->GetAbilitySystemComponent()`. + virtual UAbilitySystemComponent* GetAbilitySystemComponent() const override; + + /// Versao tipada do ASC custom — retorna direto UZeusAbilitySystemComponent + /// (os 12 overrides que falam com o servidor custom via opcodes ZeusNetwork). + /// Prefira este sobre o getter da interface no BP — evita cast + expoe a API + /// do ASC custom (RequestActivateAbility, etc.). + UFUNCTION(BlueprintPure, Category = "Zeus|GAS") + UZeusAbilitySystemComponent* GetZeusAbilitySystemComponent() const; + + /// Helper BP-friendly pro AttributeSet tipado (template C++ nao expoe pra BP). + UFUNCTION(BlueprintPure, Category = "Zeus|GAS") + UZeusAttributeSet* GetZeusAttributeSet() const; + // === Identidade publica === // // Todos os campos publicos sao Replicated — hoje o cliente UE5 roda em