// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Abilities/LyraGameplayAbility.h" #include "AbilitySystemComponent.h" #include "NativeGameplayTags.h" #include "LyraAbilitySystemComponent.generated.h" #define UE_API LYRAGAME_API class AActor; class UGameplayAbility; class ULyraAbilityTagRelationshipMapping; class UObject; struct FFrame; struct FGameplayAbilityTargetDataHandle; LYRAGAME_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(TAG_Gameplay_AbilityInputBlocked); /** * ULyraAbilitySystemComponent * * Base ability system component class used by this project. */ UCLASS(MinimalAPI) class ULyraAbilitySystemComponent : public UAbilitySystemComponent { GENERATED_BODY() public: UE_API ULyraAbilitySystemComponent(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get()); //~UActorComponent interface UE_API virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; //~End of UActorComponent interface UE_API virtual void InitAbilityActorInfo(AActor* InOwnerActor, AActor* InAvatarActor) override; typedef TFunctionRef TShouldCancelAbilityFunc; UE_API void CancelAbilitiesByFunc(TShouldCancelAbilityFunc ShouldCancelFunc, bool bReplicateCancelAbility); UE_API void CancelInputActivatedAbilities(bool bReplicateCancelAbility); UE_API void AbilityInputTagPressed(const FGameplayTag& InputTag); UE_API void AbilityInputTagReleased(const FGameplayTag& InputTag); UE_API void ProcessAbilityInput(float DeltaTime, bool bGamePaused); UE_API void ClearAbilityInput(); UE_API bool IsActivationGroupBlocked(ELyraAbilityActivationGroup Group) const; UE_API void AddAbilityToActivationGroup(ELyraAbilityActivationGroup Group, ULyraGameplayAbility* LyraAbility); UE_API void RemoveAbilityFromActivationGroup(ELyraAbilityActivationGroup Group, ULyraGameplayAbility* LyraAbility); UE_API void CancelActivationGroupAbilities(ELyraAbilityActivationGroup Group, ULyraGameplayAbility* IgnoreLyraAbility, bool bReplicateCancelAbility); // Uses a gameplay effect to add the specified dynamic granted tag. UE_API void AddDynamicTagGameplayEffect(const FGameplayTag& Tag); // Removes all active instances of the gameplay effect that was used to add the specified dynamic granted tag. UE_API void RemoveDynamicTagGameplayEffect(const FGameplayTag& Tag); /** Gets the ability target data associated with the given ability handle and activation info */ UE_API void GetAbilityTargetData(const FGameplayAbilitySpecHandle AbilityHandle, FGameplayAbilityActivationInfo ActivationInfo, FGameplayAbilityTargetDataHandle& OutTargetDataHandle); /** Sets the current tag relationship mapping, if null it will clear it out */ UE_API void SetTagRelationshipMapping(ULyraAbilityTagRelationshipMapping* NewMapping); /** Looks at ability tags and gathers additional required and blocking tags */ UE_API void GetAdditionalActivationTagRequirements(const FGameplayTagContainer& AbilityTags, FGameplayTagContainer& OutActivationRequired, FGameplayTagContainer& OutActivationBlocked) const; UE_API void TryActivateAbilitiesOnSpawn(); protected: UE_API virtual void AbilitySpecInputPressed(FGameplayAbilitySpec& Spec) override; UE_API virtual void AbilitySpecInputReleased(FGameplayAbilitySpec& Spec) override; UE_API virtual void NotifyAbilityActivated(const FGameplayAbilitySpecHandle Handle, UGameplayAbility* Ability) override; UE_API virtual void NotifyAbilityFailed(const FGameplayAbilitySpecHandle Handle, UGameplayAbility* Ability, const FGameplayTagContainer& FailureReason) override; UE_API virtual void NotifyAbilityEnded(FGameplayAbilitySpecHandle Handle, UGameplayAbility* Ability, bool bWasCancelled) override; UE_API virtual void ApplyAbilityBlockAndCancelTags(const FGameplayTagContainer& AbilityTags, UGameplayAbility* RequestingAbility, bool bEnableBlockTags, const FGameplayTagContainer& BlockTags, bool bExecuteCancelTags, const FGameplayTagContainer& CancelTags) override; UE_API virtual void HandleChangeAbilityCanBeCanceled(const FGameplayTagContainer& AbilityTags, UGameplayAbility* RequestingAbility, bool bCanBeCanceled) override; /** Notify client that an ability failed to activate */ UFUNCTION(Client, Unreliable) UE_API void ClientNotifyAbilityFailed(const UGameplayAbility* Ability, const FGameplayTagContainer& FailureReason); UE_API void HandleAbilityFailed(const UGameplayAbility* Ability, const FGameplayTagContainer& FailureReason); protected: // If set, this table is used to look up tag relationships for activate and cancel UPROPERTY() TObjectPtr TagRelationshipMapping; // Handles to abilities that had their input pressed this frame. TArray InputPressedSpecHandles; // Handles to abilities that had their input released this frame. TArray InputReleasedSpecHandles; // Handles to abilities that have their input held. TArray InputHeldSpecHandles; // Number of abilities running in each activation group. int32 ActivationGroupCounts[(uint8)ELyraAbilityActivationGroup::MAX]; }; #undef UE_API