// Copyright (c) 2026 Reignance Studios. MIT License, see LICENSE. #pragma once #include "CoreMinimal.h" #include "Abilities/GameplayAbility.h" #include "GKLGameplayAbility.generated.h" class AGKLCharacter; /** * Base ability: LocalPredicted, instanced per actor, blocked while State.Dead. * * Cost and cooldown are set as numbers on the ability, not as one effect asset per ability: * - StaminaCost / ManaCost feed UGKLCostEffect through SetByCaller. * - CooldownDuration feeds UGKLCooldownEffect; CooldownTags are added to it at runtime and * returned from GetCooldownTags, so CheckCooldown blocks activation while they are present. * Both effects are applied with ApplyGameplayEffectSpecToOwner, which carries the activation's * prediction key: the owning client sees the cost and cooldown immediately. */ UCLASS(Abstract) class GASKITLITE_API UGKLGameplayAbility : public UGameplayAbility { GENERATED_BODY() public: UGKLGameplayAbility(); virtual UGameplayEffect* GetCostGameplayEffect() const override; virtual UGameplayEffect* GetCooldownGameplayEffect() const override; virtual const FGameplayTagContainer* GetCooldownTags() const override; virtual bool CheckCost(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, FGameplayTagContainer* OptionalRelevantTags = nullptr) const override; virtual void ApplyCost(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo) const override; virtual void ApplyCooldown(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo) const override; protected: UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "GASKit Lite|Cost") float StaminaCost = 0.f; UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "GASKit Lite|Cost") float ManaCost = 0.f; /** Seconds. 0 = no cooldown. */ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "GASKit Lite|Cooldown") float CooldownDuration = 0.f; /** Granted while on cooldown, e.g. Cooldown.Heal. Required when CooldownDuration > 0. */ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "GASKit Lite|Cooldown") FGameplayTagContainer CooldownTags; /** The avatar as a GASKit Lite character, or null. */ UFUNCTION(BlueprintPure, Category = "GASKit Lite") AGKLCharacter* GetLiteCharacter() const; /** Adds an identity tag (Ability.Heal...). Constructor only. Wraps the 5.5 AbilityTags change. */ void AddAbilityTag(const FGameplayTag& Tag); private: mutable FGameplayTagContainer TempCooldownTags; };