// Copyright (c) 2026 Reignance Studios. MIT License, see LICENSE. #pragma once #include "CoreMinimal.h" #include "ActiveGameplayEffectHandle.h" #include "GKLGameplayAbility.h" #include "GKLSampleAbilities.generated.h" /* * Five samples, each showing one multiplayer pattern. Subclass them in Blueprint to tune numbers. * * Jump LocalPredicted, stamina cost, movement already predicted by the CharacterMovementComponent * Heal LocalPredicted, mana cost + cooldown, effect on self predicted with the activation's key * Strike LocalPredicted cost/cooldown, damage applied by the server only * Regen ServerOnly passive, starts when granted, infinite periodic effect * Death ServerOnly, triggered by Event.Death from the AttributeSet */ /** Ability.Jump: 10 stamina. */ UCLASS() class GASKITLITE_API UGKLAbility_Jump : public UGKLGameplayAbility { GENERATED_BODY() public: UGKLAbility_Jump(); virtual bool CanActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayTagContainer* SourceTags = nullptr, const FGameplayTagContainer* TargetTags = nullptr, FGameplayTagContainer* OptionalRelevantTags = nullptr) const override; virtual void ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData) override; }; /** Ability.Heal: 25 mana, 6 s cooldown, +30 health. */ UCLASS() class GASKITLITE_API UGKLAbility_Heal : public UGKLGameplayAbility { GENERATED_BODY() public: UGKLAbility_Heal(); virtual void ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData) override; protected: UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "GASKit Lite|Heal") float HealAmount = 30.f; }; /** Ability.Strike: 15 stamina, 0.8 s cooldown, 20 damage to every ASC in a sphere in front of the avatar. */ UCLASS() class GASKITLITE_API UGKLAbility_Strike : public UGKLGameplayAbility { GENERATED_BODY() public: UGKLAbility_Strike(); virtual void ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData) override; protected: UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "GASKit Lite|Strike") float DamageAmount = 20.f; /** Distance from the avatar to the sphere centre, in cm. */ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "GASKit Lite|Strike") float Range = 150.f; UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "GASKit Lite|Strike") float Radius = 80.f; }; /** Ability.Passive.Regen: +10 stamina and +2 mana per second while alive. */ UCLASS() class GASKITLITE_API UGKLAbility_Regen : public UGKLGameplayAbility { GENERATED_BODY() public: UGKLAbility_Regen(); virtual void OnGiveAbility(const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilitySpec& Spec) override; virtual void ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData) override; virtual void EndAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, bool bReplicateEndAbility, bool bWasCancelled) override; private: FActiveGameplayEffectHandle RegenHandle; }; /** Ability.Death: cancels other abilities, adds State.Dead, tells the character. */ UCLASS() class GASKITLITE_API UGKLAbility_Death : public UGKLGameplayAbility { GENERATED_BODY() public: UGKLAbility_Death(); virtual void ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData) override; };