// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "Abilities/GameplayAbility.h" #include "LyraGameplayAbility.generated.h" class ULyraAbilitySystemComponent; class ALyraPlayerController; class ALyraCharacter; class ULyraHeroComponent; class ULyraCameraMode; class ULyraAbilityCost; class ILyraAbilitySourceInterface; /** * ELyraAbilityActivationPolicy * * Defines how an ability is meant to activate. */ UENUM(BlueprintType) enum class ELyraAbilityActivationPolicy : uint8 { // Try to activate the ability when the input is triggered. OnInputTriggered, // Continually try to activate the ability while the input is active. WhileInputActive, // Try to activate the ability when an avatar is assigned. OnSpawn }; /** * ELyraAbilityActivationGroup * * Defines how an ability activates in relation to other abilities. */ UENUM(BlueprintType) enum class ELyraAbilityActivationGroup : uint8 { // Ability runs independently of all other abilities. Independent, // Ability is canceled and replaced by other exclusive abilities. Exclusive_Replaceable, // Ability blocks all other exclusive abilities from activating. Exclusive_Blocking, MAX UMETA(Hidden) }; /** Failure reason that can be used to play an animation montage when a failure occurs */ USTRUCT(BlueprintType) struct FLyraAbilityMontageFailureMessage { GENERATED_BODY() public: UPROPERTY(BlueprintReadWrite) APlayerController* PlayerController = nullptr; // All the reasons why this ability has failed UPROPERTY(BlueprintReadWrite) FGameplayTagContainer FailureTags; UPROPERTY(BlueprintReadWrite) UAnimMontage* FailureMontage = nullptr; }; /** * ULyraGameplayAbility * * The base gameplay ability class used by this project. */ UCLASS(Abstract, HideCategories = Input, Meta = (ShortTooltip = "The base gameplay ability class used by this project.")) class ULyraGameplayAbility : public UGameplayAbility { GENERATED_BODY() friend class ULyraAbilitySystemComponent; public: ULyraGameplayAbility(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get()); UFUNCTION(BlueprintCallable, Category = "Lyra|Ability") ULyraAbilitySystemComponent* GetLyraAbilitySystemComponentFromActorInfo() const; UFUNCTION(BlueprintCallable, Category = "Lyra|Ability") ALyraPlayerController* GetLyraPlayerControllerFromActorInfo() const; UFUNCTION(BlueprintCallable, Category = "Lyra|Ability") AController* GetControllerFromActorInfo() const; UFUNCTION(BlueprintCallable, Category = "Lyra|Ability") ALyraCharacter* GetLyraCharacterFromActorInfo() const; UFUNCTION(BlueprintCallable, Category = "Lyra|Ability") ULyraHeroComponent* GetHeroComponentFromActorInfo() const; ELyraAbilityActivationPolicy GetActivationPolicy() const { return ActivationPolicy; } ELyraAbilityActivationGroup GetActivationGroup() const { return ActivationGroup; } void TryActivateAbilityOnSpawn(const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilitySpec& Spec) const; // Returns true if the requested activation group is a valid transition. UFUNCTION(BlueprintCallable, BlueprintPure = false, Category = "Lyra|Ability", Meta = (ExpandBoolAsExecs = "ReturnValue")) bool CanChangeActivationGroup(ELyraAbilityActivationGroup NewGroup) const; // Tries to change the activation group. Returns true if it successfully changed. UFUNCTION(BlueprintCallable, BlueprintPure = false, Category = "Lyra|Ability", Meta = (ExpandBoolAsExecs = "ReturnValue")) bool ChangeActivationGroup(ELyraAbilityActivationGroup NewGroup); // Sets the ability's camera mode. UFUNCTION(BlueprintCallable, Category = "Lyra|Ability") void SetCameraMode(TSubclassOf CameraMode); // Clears the ability's camera mode. Automatically called if needed when the ability ends. UFUNCTION(BlueprintCallable, Category = "Lyra|Ability") void ClearCameraMode(); void OnAbilityFailedToActivate(const FGameplayTagContainer& FailedReason) const { NativeOnAbilityFailedToActivate(FailedReason); ScriptOnAbilityFailedToActivate(FailedReason); } protected: // Called when the ability fails to activate virtual void NativeOnAbilityFailedToActivate(const FGameplayTagContainer& FailedReason) const; // Called when the ability fails to activate UFUNCTION(BlueprintImplementableEvent) void ScriptOnAbilityFailedToActivate(const FGameplayTagContainer& FailedReason) const; //~UGameplayAbility interface virtual bool CanActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayTagContainer* SourceTags, const FGameplayTagContainer* TargetTags, FGameplayTagContainer* OptionalRelevantTags) const override; virtual void SetCanBeCanceled(bool bCanBeCanceled) override; virtual void OnGiveAbility(const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilitySpec& Spec) override; virtual void OnRemoveAbility(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; virtual bool CheckCost(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, OUT FGameplayTagContainer* OptionalRelevantTags = nullptr) const override; virtual void ApplyCost(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo) const override; virtual FGameplayEffectContextHandle MakeEffectContext(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo) const override; virtual void ApplyAbilityTagsToGameplayEffectSpec(FGameplayEffectSpec& Spec, FGameplayAbilitySpec* AbilitySpec) const override; virtual bool DoesAbilitySatisfyTagRequirements(const UAbilitySystemComponent& AbilitySystemComponent, const FGameplayTagContainer* SourceTags, const FGameplayTagContainer* TargetTags, OUT FGameplayTagContainer* OptionalRelevantTags) const override; //~End of UGameplayAbility interface virtual void OnPawnAvatarSet(); virtual void GetAbilitySource(FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, float& OutSourceLevel, const ILyraAbilitySourceInterface*& OutAbilitySource, AActor*& OutEffectCauser) const; /** Called when this ability is granted to the ability system component. */ UFUNCTION(BlueprintImplementableEvent, Category = Ability, DisplayName = "OnAbilityAdded") void K2_OnAbilityAdded(); /** Called when this ability is removed from the ability system component. */ UFUNCTION(BlueprintImplementableEvent, Category = Ability, DisplayName = "OnAbilityRemoved") void K2_OnAbilityRemoved(); /** Called when the ability system is initialized with a pawn avatar. */ UFUNCTION(BlueprintImplementableEvent, Category = Ability, DisplayName = "OnPawnAvatarSet") void K2_OnPawnAvatarSet(); protected: // Defines how this ability is meant to activate. UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Lyra|Ability Activation") ELyraAbilityActivationPolicy ActivationPolicy; // Defines the relationship between this ability activating and other abilities activating. UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Lyra|Ability Activation") ELyraAbilityActivationGroup ActivationGroup; // Additional costs that must be paid to activate this ability UPROPERTY(EditDefaultsOnly, Instanced, Category = Costs) TArray> AdditionalCosts; // Map of failure tags to simple error messages UPROPERTY(EditDefaultsOnly, Category = "Advanced") TMap FailureTagToUserFacingMessages; // Map of failure tags to anim montages that should be played with them UPROPERTY(EditDefaultsOnly, Category = "Advanced") TMap FailureTagToAnimMontage; // Current camera mode set by the ability. TSubclassOf ActiveCameraMode; };