第一次提交
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
// Copyright 2025 https://yuewu.dev/en All Rights Reserved.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "GameplayAbilitySpec.h"
|
||||
#include "Abilities/GameplayAbility.h"
|
||||
#include "GGA_AbilityCost.generated.h"
|
||||
|
||||
/**
|
||||
* Base class for defining costs associated with a gameplay ability (e.g., ammo, charges).
|
||||
* 定义与游戏技能相关成本的基类(例如弹药、次数)。
|
||||
*/
|
||||
UCLASS(Blueprintable, DefaultToInstanced, EditInlineNew, Abstract)
|
||||
class GENERICGAMEPLAYABILITIES_API UGGA_AbilityCost : public UObject
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
public:
|
||||
/**
|
||||
* Constructor for the ability cost.
|
||||
* 技能成本构造函数。
|
||||
*/
|
||||
UGGA_AbilityCost()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the ability cost can be afforded.
|
||||
* 检查是否能支付技能成本。
|
||||
* @param Ability The gameplay ability. 游戏技能。
|
||||
* @param Handle The ability spec handle. 技能句柄。
|
||||
* @param ActorInfo The actor info. Actor信息。
|
||||
* @param OptionalRelevantTags Tags for failure reasons (optional, output). 失败原因标签(可选,输出)。
|
||||
* @return True if the cost can be paid, false otherwise. 如果成本可支付则返回true,否则返回false。
|
||||
*/
|
||||
virtual bool CheckCost(const UGameplayAbility* Ability, const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, FGameplayTagContainer* OptionalRelevantTags) const;
|
||||
|
||||
/**
|
||||
* Applies the ability cost to the target.
|
||||
* 将技能成本应用于目标。
|
||||
* @param Ability The gameplay ability. 游戏技能。
|
||||
* @param Handle The ability spec handle. 技能句柄。
|
||||
* @param ActorInfo The actor info. Actor信息。
|
||||
* @param ActivationInfo The activation info. 激活信息。
|
||||
*/
|
||||
virtual void ApplyCost(const UGameplayAbility* Ability, const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo);
|
||||
|
||||
/**
|
||||
* Checks if the cost should only be applied on a successful hit.
|
||||
* 检查成本是否仅在成功命中时应用。
|
||||
* @return True if the cost applies only on hit, false otherwise. 如果成本仅在命中时应用则返回true,否则返回false。
|
||||
*/
|
||||
bool ShouldOnlyApplyCostOnHit() const { return bOnlyApplyCostOnHit; }
|
||||
|
||||
protected:
|
||||
/**
|
||||
* Blueprint event for checking the ability cost.
|
||||
* 检查技能成本的蓝图事件。
|
||||
* @param Ability The gameplay ability. 游戏技能。
|
||||
* @param Handle The ability spec handle. 技能句柄。
|
||||
* @param ActorInfo The actor info. Actor信息。
|
||||
* @param OptionalRelevantTags Tags for failure reasons. 失败原因标签。
|
||||
* @return True if the cost can be paid, false otherwise. 如果成本可支付则返回true,否则返回false。
|
||||
*/
|
||||
UFUNCTION(BlueprintImplementableEvent, Category=Costs, meta=(DisplayName="Check Cost"))
|
||||
bool BlueprintCheckCost(const UGameplayAbility* Ability, const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo& ActorInfo,
|
||||
const FGameplayTagContainer& OptionalRelevantTags) const;
|
||||
|
||||
/**
|
||||
* Blueprint event for applying the ability cost.
|
||||
* 应用技能成本的蓝图事件。
|
||||
* @param Ability The gameplay ability. 游戏技能。
|
||||
* @param Handle The ability spec handle. 技能句柄。
|
||||
* @param ActorInfo The actor info. Actor信息。
|
||||
* @param ActivationInfo The activation info. 激活信息。
|
||||
*/
|
||||
UFUNCTION(BlueprintImplementableEvent, Category=Costs, meta=(DisplayName="Apply Cost"))
|
||||
void BlueprintApplyCost(const UGameplayAbility* Ability, const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo& ActorInfo, const FGameplayAbilityActivationInfo& ActivationInfo);
|
||||
|
||||
/**
|
||||
* Determines if the cost applies only on a successful hit.
|
||||
* 确定成本是否仅在成功命中时应用。
|
||||
*/
|
||||
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category=Costs)
|
||||
bool bOnlyApplyCostOnHit = false;
|
||||
};
|
||||
@@ -0,0 +1,321 @@
|
||||
// Copyright 2025 https://yuewu.dev/en All Rights Reserved.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "ActiveGameplayEffectHandle.h"
|
||||
#include "Engine/DataAsset.h"
|
||||
#include "AttributeSet.h"
|
||||
#include "GameplayTagContainer.h"
|
||||
#include "GameplayAbilitySpecHandle.h"
|
||||
#include "GGA_AbilitySet.generated.h"
|
||||
|
||||
DECLARE_LOG_CATEGORY_EXTERN(LogGGA_AbilitySet, Log, All)
|
||||
|
||||
class UGameplayEffect;
|
||||
class UGameplayAbility;
|
||||
class UGAbilitySystemComponent;
|
||||
class UObject;
|
||||
|
||||
/**
|
||||
* Struct for granting gameplay abilities in an ability set.
|
||||
* 用于在技能集赋予游戏技能的结构体。
|
||||
*/
|
||||
USTRUCT(BlueprintType)
|
||||
struct GENERICGAMEPLAYABILITIES_API FGGA_AbilitySet_GameplayAbility
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
/**
|
||||
* The gameplay ability class to grant.
|
||||
* 要赋予的技能类。
|
||||
*/
|
||||
UPROPERTY(EditAnywhere, Category = "GGA", BlueprintReadWrite, meta=(AllowAbstract=false))
|
||||
TSoftClassPtr<UGameplayAbility> Ability = nullptr;
|
||||
|
||||
/**
|
||||
* The level of the ability to grant.
|
||||
* 要赋予的技能等级。
|
||||
*/
|
||||
UPROPERTY(EditAnywhere, Category = "GGA", BlueprintReadWrite)
|
||||
int32 AbilityLevel = 1;
|
||||
|
||||
/**
|
||||
* The input ID for activating/cancelling the ability.
|
||||
* 用于激活/取消技能的输入ID。
|
||||
*/
|
||||
UPROPERTY(EditAnywhere, Category = "GGA", BlueprintReadWrite)
|
||||
int32 InputID = -1;
|
||||
|
||||
/**
|
||||
* Dynamic tags to add to the ability.
|
||||
* 添加到技能的动态标签。
|
||||
*/
|
||||
UPROPERTY(EditAnywhere, Category = "GGA", BlueprintReadWrite)
|
||||
FGameplayTagContainer DynamicTags;
|
||||
|
||||
#if WITH_EDITORONLY_DATA
|
||||
/**
|
||||
* Generates an editor-friendly name.
|
||||
* 生成编辑器友好的名称。
|
||||
*/
|
||||
void MakeEditorFriendlyName();
|
||||
|
||||
/**
|
||||
* Editor-friendly name for the ability.
|
||||
* 技能的编辑器友好名称。
|
||||
*/
|
||||
UPROPERTY(VisibleAnywhere, Category=AlwaysHidden, Meta=(EditCondition=False, EditConditionHides))
|
||||
FString EditorFriendlyName;
|
||||
|
||||
/**
|
||||
* Toggles whether the ability is granted (editor-only, for debugging).
|
||||
* 切换是否赋予技能(仅编辑器,用于调试)。
|
||||
*/
|
||||
UPROPERTY(EditAnywhere, Category = "GGA")
|
||||
bool bAbilityEnabled{true};
|
||||
#endif
|
||||
};
|
||||
|
||||
/**
|
||||
* Struct for granting gameplay effects in an ability set.
|
||||
* 用于在技能集赋予游戏效果的结构体。
|
||||
*/
|
||||
USTRUCT(BlueprintType)
|
||||
struct GENERICGAMEPLAYABILITIES_API FGGA_AbilitySet_GameplayEffect
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
/**
|
||||
* The gameplay effect class to grant.
|
||||
* 要赋予的效果类。
|
||||
*/
|
||||
UPROPERTY(EditDefaultsOnly, Category = "GGA")
|
||||
TSoftClassPtr<UGameplayEffect> GameplayEffect = nullptr;
|
||||
|
||||
/**
|
||||
* The level of the gameplay effect to grant.
|
||||
* 要赋予的效果等级。
|
||||
*/
|
||||
UPROPERTY(EditDefaultsOnly, Category = "GGA")
|
||||
float EffectLevel = 1.0f;
|
||||
|
||||
#if WITH_EDITORONLY_DATA
|
||||
/**
|
||||
* Generates an editor-friendly name.
|
||||
* 生成编辑器友好的名称。
|
||||
*/
|
||||
void MakeEditorFriendlyName();
|
||||
|
||||
/**
|
||||
* Editor-friendly name for the effect.
|
||||
* 效果的编辑器友好名称。
|
||||
*/
|
||||
UPROPERTY(VisibleAnywhere, Category=AlwaysHidden, Meta=(EditCondition=False, EditConditionHides))
|
||||
FString EditorFriendlyName;
|
||||
|
||||
/**
|
||||
* Toggles whether the effect is granted (editor-only, for debugging).
|
||||
* 切换是否赋予效果(仅编辑器,用于调试)。
|
||||
*/
|
||||
UPROPERTY(EditAnywhere, Category = "GGA")
|
||||
bool bEffectEnabled{true};
|
||||
#endif
|
||||
};
|
||||
|
||||
/**
|
||||
* Struct for granting attribute sets in an ability set.
|
||||
* 用于在技能集赋予属性集的结构体。
|
||||
*/
|
||||
USTRUCT(BlueprintType)
|
||||
struct GENERICGAMEPLAYABILITIES_API FGGA_AbilitySet_AttributeSet
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
/**
|
||||
* The attribute set class to grant.
|
||||
* 要赋予的属性集类。
|
||||
*/
|
||||
UPROPERTY(EditDefaultsOnly, Category = "GGA")
|
||||
TSoftClassPtr<UAttributeSet> AttributeSet;
|
||||
|
||||
#if WITH_EDITORONLY_DATA
|
||||
/**
|
||||
* Generates an editor-friendly name.
|
||||
* 生成编辑器友好的名称。
|
||||
*/
|
||||
void MakeEditorFriendlyName();
|
||||
|
||||
/**
|
||||
* Editor-friendly name for the attribute set.
|
||||
* 属性集的编辑器友好名称。
|
||||
*/
|
||||
UPROPERTY(VisibleAnywhere, Category=AlwaysHidden, Meta=(EditCondition=False, EditConditionHides))
|
||||
FString EditorFriendlyName;
|
||||
|
||||
/**
|
||||
* Toggles whether the attribute set is granted (editor-only, for debugging).
|
||||
* 切换是否赋予属性集(仅编辑器,用于调试)。
|
||||
*/
|
||||
UPROPERTY(EditAnywhere, Category = "GGA")
|
||||
bool bAttributeSetEnabled{true};
|
||||
#endif
|
||||
};
|
||||
|
||||
/**
|
||||
* Struct for storing handles to granted abilities, effects, and attribute sets.
|
||||
* 存储已赋予的技能、效果和属性集句柄的结构体。
|
||||
*/
|
||||
USTRUCT(BlueprintType)
|
||||
struct GENERICGAMEPLAYABILITIES_API FGGA_AbilitySet_GrantedHandles
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
/**
|
||||
* Adds an ability spec handle.
|
||||
* 添加技能句柄。
|
||||
* @param Handle The ability spec handle. 技能句柄。
|
||||
*/
|
||||
void AddAbilitySpecHandle(const FGameplayAbilitySpecHandle& Handle);
|
||||
|
||||
/**
|
||||
* Adds a gameplay effect handle.
|
||||
* 添加游戏效果句柄。
|
||||
* @param Handle The gameplay effect handle. 游戏效果句柄。
|
||||
*/
|
||||
void AddGameplayEffectHandle(const FActiveGameplayEffectHandle& Handle);
|
||||
|
||||
/**
|
||||
* Adds an attribute set.
|
||||
* 添加属性集。
|
||||
* @param Set The attribute set to add. 要添加的属性集。
|
||||
*/
|
||||
void AddAttributeSet(UAttributeSet* Set);
|
||||
|
||||
/**
|
||||
* Removes granted items from an ability system component.
|
||||
* 从技能系统组件移除已赋予的项。
|
||||
* @param ASC The ability system component. 技能系统组件。
|
||||
*/
|
||||
void TakeFromAbilitySystem(UAbilitySystemComponent* ASC);
|
||||
|
||||
protected:
|
||||
/**
|
||||
* Handles to granted abilities.
|
||||
* 已赋予的技能句柄。
|
||||
*/
|
||||
UPROPERTY(BlueprintReadOnly, Category="GGA")
|
||||
TArray<FGameplayAbilitySpecHandle> AbilitySpecHandles;
|
||||
|
||||
/**
|
||||
* Handles to granted gameplay effects.
|
||||
* 已赋予的游戏效果句柄。
|
||||
*/
|
||||
UPROPERTY(BlueprintReadOnly, Category="GGA")
|
||||
TArray<FActiveGameplayEffectHandle> GameplayEffectHandles;
|
||||
|
||||
/**
|
||||
* Pointers to granted attribute sets.
|
||||
* 已赋予的属性集指针。
|
||||
*/
|
||||
UPROPERTY()
|
||||
TArray<TObjectPtr<UAttributeSet>> GrantedAttributeSets;
|
||||
};
|
||||
|
||||
/**
|
||||
* Data asset for granting gameplay abilities, effects, and attribute sets.
|
||||
* 用于赋予游戏技能、效果和属性集的数据资产。
|
||||
*/
|
||||
UCLASS(BlueprintType, Const)
|
||||
class GENERICGAMEPLAYABILITIES_API UGGA_AbilitySet : public UPrimaryDataAsset
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
public:
|
||||
/**
|
||||
* Constructor for the ability set.
|
||||
* 技能集构造函数。
|
||||
*/
|
||||
UGGA_AbilitySet(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());
|
||||
|
||||
/**
|
||||
* Grants the ability set to an ability system component.
|
||||
* 将技能集赋予技能系统组件。
|
||||
* @param ASC The ability system component. 技能系统组件。
|
||||
* @param OutGrantedHandles Handles for granted items (output). 已赋予项的句柄(输出)。
|
||||
* @param SourceObject Optional source object. 可选的源对象。
|
||||
* @param OverrideLevel Optional level override. 可选的等级覆盖。
|
||||
*/
|
||||
void GiveToAbilitySystem(UAbilitySystemComponent* ASC, FGGA_AbilitySet_GrantedHandles* OutGrantedHandles, UObject* SourceObject = nullptr, int32 OverrideLevel = -1) const;
|
||||
|
||||
/**
|
||||
* Grants an ability set to an ability system component (static).
|
||||
* 将技能集赋予技能系统组件(静态)。
|
||||
* @param AbilitySet The ability set to grant. 要赋予的技能集。
|
||||
* @param ASC The ability system component. 技能系统组件。
|
||||
* @param SourceObject Optional source object. 可选的源对象。
|
||||
* @param OverrideLevel Optional level override. 可选的等级覆盖。
|
||||
* @return Handles for granted items. 已赋予项的句柄。
|
||||
*/
|
||||
UFUNCTION(BlueprintCallable, Category = "GGA|AbilitySet", BlueprintAuthorityOnly)
|
||||
static FGGA_AbilitySet_GrantedHandles GiveAbilitySetToAbilitySystem(TSoftObjectPtr<UGGA_AbilitySet> AbilitySet, UAbilitySystemComponent* ASC, UObject* SourceObject, int32 OverrideLevel = -1);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "GGA|AbilitySet", BlueprintAuthorityOnly)
|
||||
static TArray<FGGA_AbilitySet_GrantedHandles> GiveAbilitySetsToAbilitySystem(TArray<TSoftObjectPtr<UGGA_AbilitySet>> AbilitySets, UAbilitySystemComponent* ASC, UObject* SourceObject,
|
||||
int32 OverrideLevel = -1);
|
||||
|
||||
/**
|
||||
* Removes granted ability sets from an ability system component.
|
||||
* 从技能系统组件移除已赋予的技能集。
|
||||
* @param GrantedHandles Handles for granted items. 已赋予项的句柄。
|
||||
* @param ASC The ability system component. 技能系统组件。
|
||||
*/
|
||||
UFUNCTION(BlueprintCallable, Category = "GGA|AbilitySet", BlueprintAuthorityOnly)
|
||||
static void TakeAbilitySetFromAbilitySystem(UPARAM(ref)
|
||||
FGGA_AbilitySet_GrantedHandles& GrantedHandles, UAbilitySystemComponent* ASC);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "GGA|AbilitySet", BlueprintAuthorityOnly)
|
||||
static void TakeAbilitySetsFromAbilitySystem(UPARAM(ref)
|
||||
TArray<FGGA_AbilitySet_GrantedHandles>& GrantedHandles, UAbilitySystemComponent* ASC);
|
||||
|
||||
protected:
|
||||
/**
|
||||
* Gameplay abilities to grant.
|
||||
* 要赋予的游戏技能。
|
||||
*/
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "GGA|AbilitySet", meta=(TitleProperty=EditorFriendlyName, NoElementDuplicate))
|
||||
TArray<FGGA_AbilitySet_GameplayAbility> GrantedGameplayAbilities;
|
||||
|
||||
/**
|
||||
* Gameplay effects to grant.
|
||||
* 要赋予的游戏效果。
|
||||
*/
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "GGA|AbilitySet", meta=(TitleProperty=EditorFriendlyName, NoElementDuplicate))
|
||||
TArray<FGGA_AbilitySet_GameplayEffect> GrantedGameplayEffects;
|
||||
|
||||
/**
|
||||
* Attribute sets to grant.
|
||||
* 要赋予的属性集。
|
||||
*/
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "GGA|AbilitySet", meta=(TitleProperty=EditorFriendlyName, NoElementDuplicate))
|
||||
TArray<FGGA_AbilitySet_AttributeSet> GrantedAttributes;
|
||||
|
||||
#if WITH_EDITOR
|
||||
/**
|
||||
* Pre-save processing for editor.
|
||||
* 编辑器预保存处理。
|
||||
*/
|
||||
virtual void PreSave(FObjectPreSaveContext SaveContext) override;
|
||||
|
||||
/**
|
||||
* Handles property changes in the editor.
|
||||
* 处理编辑器中的属性更改。
|
||||
*/
|
||||
virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;
|
||||
|
||||
/**
|
||||
* Handles chain property changes in the editor.
|
||||
* 处理编辑器中的链式属性更改。
|
||||
*/
|
||||
virtual void PostEditChangeChainProperty(FPropertyChangedChainEvent& PropertyChangedEvent) override;
|
||||
#endif
|
||||
};
|
||||
@@ -0,0 +1,452 @@
|
||||
// Copyright 2025 https://yuewu.dev/en All Rights Reserved.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "GGA_AbilitySystemEnumLibrary.h"
|
||||
#include "GGA_AbilitySystemStructLibrary.h"
|
||||
#include "GGA_GameplayAbilityInterface.h"
|
||||
#include "Tickable.h"
|
||||
#include "Abilities/GameplayAbility.h"
|
||||
#include "GGA_GameplayAbility.generated.h"
|
||||
|
||||
class UGGA_AbilityCost;
|
||||
|
||||
DECLARE_STATS_GROUP(TEXT("GameplayAbility"), STATGROUP_GameplayAbility, STATCAT_Advanced)
|
||||
|
||||
/**
|
||||
* Extended gameplay ability class for custom functionality.
|
||||
* 扩展的游戏技能类,提供自定义功能。
|
||||
*/
|
||||
UCLASS(Abstract)
|
||||
class GENERICGAMEPLAYABILITIES_API UGGA_GameplayAbility : public UGameplayAbility, public FTickableGameObject, public IGGA_GameplayAbilityInterface
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
friend class UGGA_AbilitySystemComponent;
|
||||
|
||||
public:
|
||||
/**
|
||||
* Constructor for the gameplay ability.
|
||||
* 游戏技能构造函数。
|
||||
*/
|
||||
UGGA_GameplayAbility(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());
|
||||
|
||||
/**
|
||||
* Updates the ability each frame.
|
||||
* 每帧更新技能逻辑。
|
||||
* @param DeltaTime Time since last frame. 自上一帧以来的时间。
|
||||
*/
|
||||
virtual void Tick(float DeltaTime) override;
|
||||
|
||||
/**
|
||||
* Retrieves the stat ID for performance tracking.
|
||||
* 获取用于性能跟踪的统计ID。
|
||||
* @return The stat ID. 统计ID。
|
||||
*/
|
||||
virtual TStatId GetStatId() const override;
|
||||
|
||||
/**
|
||||
* Checks if the ability can be ticked.
|
||||
* 检查技能是否可被Tick。
|
||||
* @return True if tickable, false otherwise. 如果可Tick则返回true,否则返回false。
|
||||
*/
|
||||
virtual bool IsTickable() const override;
|
||||
|
||||
/**
|
||||
* Blueprint event for per-frame ability updates.
|
||||
* 每帧技能更新的蓝图事件。
|
||||
* @param DeltaTime Time since last frame. 自上一帧以来的时间。
|
||||
*/
|
||||
UFUNCTION(BlueprintNativeEvent, Category = "GGA|Ability")
|
||||
void AbilityTick(float DeltaTime);
|
||||
virtual void AbilityTick_Implementation(float DeltaTime);
|
||||
|
||||
/**
|
||||
* Checks if the input bound to this ability is pressed.
|
||||
* 检查绑定到此技能的输入是否被按下。
|
||||
* @return True if the input is pressed, false otherwise. 如果输入被按下则返回true,否则返回false。
|
||||
*/
|
||||
UFUNCTION(BlueprintCallable, Category = "GGA|Ability|Input")
|
||||
virtual bool IsInputPressed() const;
|
||||
|
||||
/**
|
||||
* Retrieves the controller associated with this ability.
|
||||
* 获取与此技能相关的控制器。
|
||||
* @return The controller. 控制器。
|
||||
*/
|
||||
UFUNCTION(BlueprintCallable, Category = "GGA|Ability")
|
||||
virtual AController* GetControllerFromActorInfo() const;
|
||||
|
||||
/**
|
||||
* Retrieves the activation group for this ability.
|
||||
* 获取此技能的激活组。
|
||||
* @return The activation group. 激活组。
|
||||
*/
|
||||
virtual EGGA_AbilityActivationGroup GetActivationGroup() const override { return ActivationGroup; }
|
||||
|
||||
/**
|
||||
* Sets the activation group for this ability.
|
||||
* 设置此技能的激活组。
|
||||
* @param NewGroup The new activation group. 新激活组。
|
||||
*/
|
||||
virtual void SetActivationGroup(EGGA_AbilityActivationGroup NewGroup) override;
|
||||
|
||||
/**
|
||||
* Attempts to activate the ability on spawn.
|
||||
* 尝试在生成时激活技能。
|
||||
* @param ActorInfo The actor info. Actor信息。
|
||||
* @param Spec The ability spec. 技能规格。
|
||||
*/
|
||||
virtual void TryActivateAbilityOnSpawn(const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilitySpec& Spec) const override;
|
||||
|
||||
/**
|
||||
* Handles ability activation failure.
|
||||
* 处理技能激活失败。
|
||||
* @param FailedReason The reason for failure. 失败原因。
|
||||
*/
|
||||
virtual void HandleActivationFailed(const FGameplayTagContainer& FailedReason) const override;
|
||||
|
||||
/**
|
||||
* Checks if an effect container exists for a given tag.
|
||||
* 检查是否存在指定标签的效果容器。
|
||||
* @param ContainerTag The container tag to check. 要检查的容器标签。
|
||||
* @return True if the container exists, false otherwise. 如果容器存在则返回true,否则返回false。
|
||||
*/
|
||||
UFUNCTION(BlueprintCallable, BlueprintPure, Category = "GGA|Ability|EffectContainer")
|
||||
virtual bool HasEffectContainer(FGameplayTag ContainerTag);
|
||||
|
||||
/**
|
||||
* Creates an effect container spec from the effect container map.
|
||||
* 从效果容器映射创建效果容器规格。
|
||||
* @param ContainerTag The container tag. 容器标签。
|
||||
* @param EventData The event data. 事件数据。
|
||||
* @param OverrideGameplayLevel Optional gameplay level override. 可选的游戏等级覆盖。
|
||||
* @return The effect container spec. 效果容器规格。
|
||||
*/
|
||||
UFUNCTION(BlueprintCallable, Category = "GGA|Ability|EffectContainer", meta = (AutoCreateRefTerm = "EventData"))
|
||||
virtual FGGA_GameplayEffectContainerSpec MakeEffectContainerSpec(FGameplayTag ContainerTag, const FGameplayEventData& EventData, int32 OverrideGameplayLevel = -1);
|
||||
|
||||
/**
|
||||
* Applies an effect container by creating and applying its spec.
|
||||
* 通过创建并应用规格来应用效果容器。
|
||||
* @param ContainerTag The container tag. 容器标签。
|
||||
* @param EventData The event data. 事件数据。
|
||||
* @param OverrideGameplayLevel Optional gameplay level override. 可选的游戏等级覆盖。
|
||||
* @return Array of active gameplay effect handles. 激活的游戏效果句柄数组。
|
||||
*/
|
||||
UFUNCTION(BlueprintCallable, Category = "GGA|Ability|EffectContainer", meta = (AutoCreateRefTerm = "EventData"))
|
||||
virtual TArray<FActiveGameplayEffectHandle> ApplyEffectContainer(FGameplayTag ContainerTag, const FGameplayEventData& EventData, int32 OverrideGameplayLevel = -1);
|
||||
|
||||
protected:
|
||||
/**
|
||||
* Prepares the ability for activation.
|
||||
* 为技能激活做准备。
|
||||
* @param Handle The ability spec handle. 技能句柄。
|
||||
* @param ActorInfo The actor info. Actor信息。
|
||||
* @param ActivationInfo The activation info. 激活信息。
|
||||
* @param OnGameplayAbilityEndedDelegate Delegate for ability end. 技能结束委托。
|
||||
* @param TriggerEventData Optional trigger event data. 可选的触发事件数据。
|
||||
*/
|
||||
virtual void PreActivate(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo,
|
||||
FOnGameplayAbilityEnded::FDelegate* OnGameplayAbilityEndedDelegate, const FGameplayEventData* TriggerEventData = nullptr) override;
|
||||
|
||||
/**
|
||||
* Ends the ability.
|
||||
* 结束技能。
|
||||
* @param Handle The ability spec handle. 技能句柄。
|
||||
* @param ActorInfo The actor info. Actor信息。
|
||||
* @param ActivationInfo The activation info. 激活信息。
|
||||
* @param bReplicateEndAbility Whether to replicate ability end. 是否复制技能结束。
|
||||
* @param bWasCancelled Whether the ability was cancelled. 技能是否被取消。
|
||||
*/
|
||||
virtual void EndAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, bool bReplicateEndAbility,
|
||||
bool bWasCancelled) override;
|
||||
|
||||
/**
|
||||
* Blueprint event for handling ability activation failure.
|
||||
* 处理技能激活失败的蓝图事件。
|
||||
* @param FailedReason The reason for failure. 失败原因。
|
||||
*/
|
||||
UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category="Ability")
|
||||
void OnActivationFailed(const FGameplayTagContainer& FailedReason) const;
|
||||
|
||||
/**
|
||||
* Checks if the ability can be activated.
|
||||
* 检查技能是否可以激活。
|
||||
* @param Handle The ability spec handle. 技能句柄。
|
||||
* @param ActorInfo The actor info. Actor信息。
|
||||
* @param SourceTags Optional source tags. 可选的源标签。
|
||||
* @param TargetTags Optional target tags. 可选的目标标签。
|
||||
* @param OptionalRelevantTags Optional relevant tags (output). 可选的相关标签(输出)。
|
||||
* @return True if the ability can be activated, false otherwise. 如果技能可激活则返回true,否则返回false。
|
||||
*/
|
||||
virtual bool CanActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayTagContainer* SourceTags,
|
||||
const FGameplayTagContainer* TargetTags, FGameplayTagContainer* OptionalRelevantTags) const override;
|
||||
|
||||
/**
|
||||
* Sets whether the ability can be canceled.
|
||||
* 设置技能是否可被取消。
|
||||
* @param bCanBeCanceled Whether the ability can be canceled. 技能是否可取消。
|
||||
*/
|
||||
virtual void SetCanBeCanceled(bool bCanBeCanceled) override;
|
||||
|
||||
/**
|
||||
* Called when the ability is granted to the ability system component.
|
||||
* 技能被授予技能系统组件时调用。
|
||||
* @param ActorInfo The actor info. Actor信息。
|
||||
* @param Spec The ability spec. 技能规格。
|
||||
*/
|
||||
virtual void OnGiveAbility(const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilitySpec& Spec) override;
|
||||
|
||||
/**
|
||||
* Blueprint event for when the ability is granted.
|
||||
* 技能被授予时的蓝图事件。
|
||||
*/
|
||||
UFUNCTION(BlueprintImplementableEvent, Category = "Ability", DisplayName = "On Give Ability")
|
||||
void K2_OnGiveAbility();
|
||||
|
||||
/**
|
||||
* Called when the ability is removed from the ability system component.
|
||||
* 技能从技能系统组件移除时调用。
|
||||
* @param ActorInfo The actor info. Actor信息。
|
||||
* @param Spec The ability spec. 技能规格。
|
||||
*/
|
||||
virtual void OnRemoveAbility(const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilitySpec& Spec) override;
|
||||
|
||||
/**
|
||||
* Blueprint event for when the ability is removed.
|
||||
* 技能移除时的蓝图事件。
|
||||
*/
|
||||
UFUNCTION(BlueprintImplementableEvent, Category = "Ability", DisplayName = "On Remove Ability")
|
||||
void K2_OnRemoveAbility();
|
||||
|
||||
/**
|
||||
* Called when the avatar is set for the ability.
|
||||
* 技能的化身设置时调用。
|
||||
* @param ActorInfo The actor info. Actor信息。
|
||||
* @param Spec The ability spec. 技能规格。
|
||||
*/
|
||||
virtual void OnAvatarSet(const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilitySpec& Spec) override;
|
||||
|
||||
/**
|
||||
* Blueprint event for when the avatar is set.
|
||||
* 化身设置时的蓝图事件。
|
||||
*/
|
||||
UFUNCTION(BlueprintImplementableEvent, Category = "Ability", DisplayName = "On Avatar Set")
|
||||
void K2_OnAvatarSet();
|
||||
|
||||
/**
|
||||
* Checks if the ability should activate for a given network role.
|
||||
* 检查技能是否应为特定网络角色激活。
|
||||
* @param Role The network role. 网络角色。
|
||||
* @return True if the ability should activate, false otherwise. 如果技能应激活则返回true,否则返回false。
|
||||
*/
|
||||
virtual bool ShouldActivateAbility(ENetRole Role) const override;
|
||||
|
||||
/**
|
||||
* Blueprint event for checking if the ability should activate for a network role.
|
||||
* 检查技能是否应为网络角色激活的蓝图事件。
|
||||
* @param Role The network role. 网络角色。
|
||||
* @return True if the ability should activate, false otherwise. 如果技能应激活则返回true,否则返回false。
|
||||
*/
|
||||
UFUNCTION(BlueprintNativeEvent, Category = "Ability", DisplayName = "Should Activate Ability")
|
||||
bool K2_ShouldActivateAbility(ENetRole Role) const;
|
||||
|
||||
/**
|
||||
* Handles input press for the ability.
|
||||
* 处理技能的输入按下。
|
||||
* @param Handle The ability spec handle. 技能句柄。
|
||||
* @param ActorInfo The actor info. Actor信息。
|
||||
* @param ActivationInfo The activation info. 激活信息。
|
||||
*/
|
||||
virtual void InputPressed(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo) override;
|
||||
|
||||
/**
|
||||
* Blueprint event for handling input press.
|
||||
* 处理输入按下的蓝图事件。
|
||||
* @param Handle The ability spec handle. 技能句柄。
|
||||
* @param ActorInfo The actor info. Actor信息。
|
||||
* @param ActivationInfo The activation info. 激活信息。
|
||||
*/
|
||||
UFUNCTION(BlueprintImplementableEvent, Category = "Ability|Input", meta=(DisplayName="On Input Pressed"))
|
||||
void K2_OnInputPressed(const FGameplayAbilitySpecHandle Handle, FGameplayAbilityActorInfo ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo);
|
||||
|
||||
/**
|
||||
* Handles input release for the ability.
|
||||
* 处理技能的输入释放。
|
||||
* @param Handle The ability spec handle. 技能句柄。
|
||||
* @param ActorInfo The actor info. Actor信息。
|
||||
* @param ActivationInfo The activation info. 激活信息。
|
||||
*/
|
||||
virtual void InputReleased(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo) override;
|
||||
|
||||
/**
|
||||
* Blueprint event for handling input release.
|
||||
* 处理输入释放的蓝图事件。
|
||||
* @param Handle The ability spec handle. 技能句柄。
|
||||
* @param ActorInfo The actor info. Actor信息。
|
||||
* @param ActivationInfo The activation info. 激活信息。
|
||||
*/
|
||||
UFUNCTION(BlueprintImplementableEvent, Category = "Ability|Input", meta=(DisplayName="On Input Released"))
|
||||
void K2_OnInputReleased(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo);
|
||||
|
||||
/**
|
||||
* Checks if the ability cost can be paid.
|
||||
* 检查是否能支付技能成本。
|
||||
* @param Handle The ability spec handle. 技能句柄。
|
||||
* @param ActorInfo The actor info. Actor信息。
|
||||
* @param OptionalRelevantTags Optional relevant tags (output). 可选的相关标签(输出)。
|
||||
* @return True if the cost can be paid, false otherwise. 如果成本可支付则返回true,否则返回false。
|
||||
*/
|
||||
virtual bool CheckCost(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, OUT FGameplayTagContainer* OptionalRelevantTags = nullptr) const override;
|
||||
|
||||
/**
|
||||
* Blueprint event for checking the ability cost.
|
||||
* 检查技能成本的蓝图事件。
|
||||
* @param Handle The ability spec handle. 技能句柄。
|
||||
* @param ActorInfo The actor info. Actor信息。
|
||||
* @return True if the cost can be paid, false otherwise. 如果成本可支付则返回true,否则返回false。
|
||||
*/
|
||||
UFUNCTION(BlueprintNativeEvent, Category = "Ability|Cost", meta=(DisplayName="On Check Cost"))
|
||||
bool K2_OnCheckCost(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo& ActorInfo) const;
|
||||
virtual bool K2_OnCheckCost_Implementation(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo& ActorInfo) const;
|
||||
|
||||
/**
|
||||
* Applies the ability cost.
|
||||
* 应用技能成本。
|
||||
* @param Handle The ability spec handle. 技能句柄。
|
||||
* @param ActorInfo The actor info. Actor信息。
|
||||
* @param ActivationInfo The activation info. 激活信息。
|
||||
*/
|
||||
virtual void ApplyCost(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo) const override;
|
||||
|
||||
/**
|
||||
* Retrieves the gameplay effect for the ability cost.
|
||||
* 获取技能成本的游戏效果。
|
||||
* @return The gameplay effect class. 游戏效果类。
|
||||
*/
|
||||
virtual UGameplayEffect* GetCostGameplayEffect() const override;
|
||||
|
||||
/**
|
||||
* Blueprint event for retrieving the cost gameplay effect.
|
||||
* 获取成本游戏效果的蓝图事件。
|
||||
* @return The gameplay effect class. 游戏效果类。
|
||||
*/
|
||||
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Ability|Cost", meta=(DisplayName="Get Cost Gameplay Effect"))
|
||||
TSubclassOf<UGameplayEffect> K2_GetCostGameplayEffect() const;
|
||||
|
||||
/**
|
||||
* Blueprint event for applying additional ability costs.
|
||||
* 应用额外技能成本的蓝图事件。
|
||||
* @param Handle The ability spec handle. 技能句柄。
|
||||
* @param ActorInfo The actor info. Actor信息。
|
||||
* @param ActivationInfo The activation info. 激活信息。
|
||||
*/
|
||||
UFUNCTION(BlueprintNativeEvent, Category = "Ability|Cost", meta=(DisplayName="On Apply Cost"))
|
||||
void K2_OnApplyCost(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo& ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo) const;
|
||||
virtual void K2_OnApplyCost_Implementation(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo& ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo) const;
|
||||
|
||||
/**
|
||||
* Applies ability tags to a gameplay effect spec.
|
||||
* 将技能标签应用于游戏效果规格。
|
||||
* @param Spec The gameplay effect spec. 游戏效果规格。
|
||||
* @param AbilitySpec The ability spec. 技能规格。
|
||||
*/
|
||||
virtual void ApplyAbilityTagsToGameplayEffectSpec(FGameplayEffectSpec& Spec, FGameplayAbilitySpec* AbilitySpec) const override;
|
||||
|
||||
/**
|
||||
* Checks if the ability satisfies tag requirements.
|
||||
* 检查技能是否满足标签要求。
|
||||
* @param AbilitySystemComponent The ability system component. 技能系统组件。
|
||||
* @param SourceTags Optional source tags. 可选的源标签。
|
||||
* @param TargetTags Optional target tags. 可选的目标标签。
|
||||
* @param OptionalRelevantTags Optional relevant tags (output). 可选的相关标签(输出)。
|
||||
* @return True if requirements are satisfied, false otherwise. 如果满足要求则返回true,否则返回false。
|
||||
*/
|
||||
virtual bool DoesAbilitySatisfyTagRequirements(const UAbilitySystemComponent& AbilitySystemComponent, const FGameplayTagContainer* SourceTags, const FGameplayTagContainer* TargetTags,
|
||||
FGameplayTagContainer* OptionalRelevantTags) const override;
|
||||
|
||||
protected:
|
||||
/**
|
||||
* Defines the activation group for the ability.
|
||||
* 定义技能的激活组。
|
||||
*/
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Ability")
|
||||
EGGA_AbilityActivationGroup ActivationGroup;
|
||||
|
||||
/**
|
||||
* Additional costs required to activate the ability.
|
||||
* 激活技能所需的额外成本。
|
||||
*/
|
||||
UPROPERTY(EditDefaultsOnly, Instanced, Category = "Costs")
|
||||
TArray<TObjectPtr<UGGA_AbilityCost>> AdditionalCosts;
|
||||
|
||||
/**
|
||||
* Loose tags applied to the owner while the ability is active.
|
||||
* 技能激活时应用于所有者的松散标签。
|
||||
*/
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="Tags")
|
||||
TArray<FGGA_GameplayTagCount> ActivationOwnedLooseTags;
|
||||
|
||||
/**
|
||||
* Map of gameplay effect containers, each associated with a tag.
|
||||
* 游戏效果容器映射,每个容器与一个标签关联。
|
||||
*/
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "GameplayEffects", meta=(ForceInlineRow))
|
||||
TMap<FGameplayTag, FGGA_GameplayEffectContainer> EffectContainerMap;
|
||||
|
||||
/**
|
||||
* Enables ticking for instanced-per-actor abilities when active.
|
||||
* 为每演员实例化的技能启用Tick,仅在技能激活时有效。
|
||||
*/
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "Ability")
|
||||
bool bEnableTick;
|
||||
|
||||
#pragma region Net
|
||||
|
||||
public:
|
||||
/**
|
||||
* Attempts to activate the ability with batched RPCs.
|
||||
* 尝试使用批处理RPC激活技能。
|
||||
* @param InAbilityHandle The ability handle. 技能句柄。
|
||||
* @param EndAbilityImmediately Whether to end the ability immediately. 是否立即结束技能。
|
||||
* @return True if activation was successful, false otherwise. 如果激活成功则返回true,否则返回false。
|
||||
*/
|
||||
virtual bool BatchRPCTryActivateAbility(FGameplayAbilitySpecHandle InAbilityHandle, bool EndAbilityImmediately) override;
|
||||
|
||||
/**
|
||||
* Ends the ability externally.
|
||||
* 外部结束技能。
|
||||
*/
|
||||
virtual void ExternalEndAbility() override;
|
||||
|
||||
/**
|
||||
* Sends target data to the server from the predicting client.
|
||||
* 从预测客户端向服务器发送目标数据。
|
||||
* @note This call will create a prediction key. 此调用会创建一个预测Key。
|
||||
* @param TargetData The target data to send. 要发送的目标数据。
|
||||
*/
|
||||
UFUNCTION(BlueprintCallable, Category = "Ability|Net")
|
||||
virtual void SendTargetDataToServer(const FGameplayAbilityTargetDataHandle& TargetData);
|
||||
|
||||
#pragma endregion
|
||||
|
||||
#pragma region DataValidation
|
||||
#if WITH_EDITOR
|
||||
/**
|
||||
* Validates data in the editor.
|
||||
* 在编辑器中验证数据。
|
||||
* @param Context The data validation context. 数据验证上下文。
|
||||
* @return The validation result. 验证结果。
|
||||
*/
|
||||
virtual EDataValidationResult IsDataValid(FDataValidationContext& Context) const override;
|
||||
|
||||
/**
|
||||
* Pre-save processing for editor.
|
||||
* 编辑器预保存处理。
|
||||
*/
|
||||
virtual void PreSave(FObjectPreSaveContext SaveContext) override;
|
||||
#endif
|
||||
#pragma endregion
|
||||
};
|
||||
@@ -0,0 +1,77 @@
|
||||
// Copyright 2025 https://yuewu.dev/en All Rights Reserved.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "GGA_AbilitySystemEnumLibrary.h"
|
||||
#include "Abilities/GameplayAbilityTypes.h"
|
||||
#include "UObject/Interface.h"
|
||||
#include "GGA_GameplayAbilityInterface.generated.h"
|
||||
|
||||
/**
|
||||
* Interface for gameplay abilities to integrate with GGA_AbilitySystemComponent.
|
||||
* 与GGA_AbilitySystemComponent集成的游戏技能接口。
|
||||
*/
|
||||
UINTERFACE(MinimalAPI, BlueprintType, meta=(CannotImplementInterfaceInBlueprint))
|
||||
class UGGA_GameplayAbilityInterface : public UInterface
|
||||
{
|
||||
GENERATED_BODY()
|
||||
};
|
||||
|
||||
/**
|
||||
* Implementation class for gameplay ability interface.
|
||||
* 游戏技能接口的实现类。
|
||||
*/
|
||||
class GENERICGAMEPLAYABILITIES_API IGGA_GameplayAbilityInterface
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
public:
|
||||
/**
|
||||
* Retrieves the activation group for the ability.
|
||||
* 获取技能的激活组。
|
||||
* @return The activation group. 激活组。
|
||||
*/
|
||||
UFUNCTION(BlueprintCallable, Category="Ability")
|
||||
virtual EGGA_AbilityActivationGroup GetActivationGroup() const = 0;
|
||||
|
||||
/**
|
||||
* Sets the activation group for the ability.
|
||||
* 设置技能的激活组。
|
||||
* @param NewGroup The new activation group. 新激活组。
|
||||
*/
|
||||
UFUNCTION(BlueprintCallable, Category="Ability")
|
||||
virtual void SetActivationGroup(EGGA_AbilityActivationGroup NewGroup) = 0;
|
||||
|
||||
/**
|
||||
* Attempts to activate the ability on spawn.
|
||||
* 尝试在生成时激活技能。
|
||||
* @param ActorInfo The actor info. Actor信息。
|
||||
* @param Spec The ability spec. 技能规格。
|
||||
*/
|
||||
virtual void TryActivateAbilityOnSpawn(const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilitySpec& Spec) const = 0;
|
||||
|
||||
/**
|
||||
* Handles ability activation failure.
|
||||
* 处理技能激活失败。
|
||||
* @param FailureReason The reason for failure. 失败原因。
|
||||
*/
|
||||
virtual void HandleActivationFailed(const FGameplayTagContainer& FailureReason) const = 0;
|
||||
|
||||
/**
|
||||
* Attempts to activate the ability with batched RPCs.
|
||||
* 尝试使用批处理RPC激活技能。
|
||||
* @param InAbilityHandle The ability handle. 技能句柄。
|
||||
* @param EndAbilityImmediately Whether to end the ability immediately. 是否立即结束技能。
|
||||
* @return True if activation was successful, false otherwise. 如果激活成功则返回true,否则返回false。
|
||||
*/
|
||||
UFUNCTION(BlueprintCallable, Category = "Ability|Net")
|
||||
virtual bool BatchRPCTryActivateAbility(FGameplayAbilitySpecHandle InAbilityHandle, bool EndAbilityImmediately) = 0;
|
||||
|
||||
/**
|
||||
* Ends the ability externally.
|
||||
* 外部结束技能。
|
||||
*/
|
||||
UFUNCTION(BlueprintCallable, Category="Ability")
|
||||
virtual void ExternalEndAbility() = 0;
|
||||
};
|
||||
Reference in New Issue
Block a user