// Copyright 2025 https://yuewu.dev/en All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "GCS_CombatAbility.h" #include "Combo/GCS_ComboDefinition.h" #include "GCS_ComboAbility.generated.h" class UGCS_CombatSystemComponent; class UAS_Combat; /** * This combo ability acted as manager of sub abilities. */ UCLASS(Abstract, HideCategories=(Cooldowns,Input,GampelayEffects)) class GENERICCOMBATSYSTEM_API UGCS_ComboAbility : public UGCS_CombatAbility { GENERATED_BODY() public: UGCS_ComboAbility(); virtual void PreActivate(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, FOnGameplayAbilityEnded::FDelegate* OnGameplayAbilityEndedDelegate, const FGameplayEventData* TriggerEventData = nullptr) override; virtual void ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData) override; virtual bool CanActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayTagContainer* SourceTags = nullptr, const FGameplayTagContainer* TargetTags = nullptr, FGameplayTagContainer* OptionalRelevantTags = nullptr) const override; virtual void OnGiveAbility(const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilitySpec& Spec) override; virtual void OnRemoveAbility(const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilitySpec& Spec) override; virtual void EndAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, bool bReplicateEndAbility, bool bWasCancelled) override; protected: UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category = "Combat Ability") bool AllowAdvanceCombo() const; UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category = "Combat Ability") void StartCombo(const FGameplayEventData& ComboEvent); virtual void StartCombo_Implementation(const FGameplayEventData& ComboEvent); /** * Advance combo with ComboEventData as context. * @param ComboEventData The data used as combo context. 游戏事件数据作为连击上下文。 */ UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category = "Combat Ability") void AdvanceCombo(const FGameplayEventData& ComboEventData); virtual void AdvanceCombo_Implementation(const FGameplayEventData& ComboEventData); UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category = "Combat Ability") void ResetCombo(); UFUNCTION() virtual void HandleAbilityEnd(const FAbilityEndedData& AbilityEndedData); virtual bool SelectComboDefinition(const FGameplayEventData& ComboEventData, int32 CurrentStep, FGCS_ComboDefinition& OutDefinition); /** * This is where you can use the extension filed within your combo definition to apply additional rules. * 这里你可以使用连击定义中的自定义字段来添加额外的选择规则。 * @param ComboEvent The combo event data to provide as context.连击事件数据,用作上下文参考。 * @param CurrentStep The current combo step of combat system. 当前的连击步骤。 * @param ComboDefinition The combo definition you are checking. 正在检查的连击定义。 */ UFUNCTION(BlueprintNativeEvent, Category = "Combat Ability") bool CanSelectedComboDefinition(const FGameplayEventData& ComboEvent, int32 CurrentStep, const FGCS_ComboDefinition& ComboDefinition) const; virtual void HandleComboExecution(const FGameplayEventData& ComboEventData); // virtual void GiveSubAbilities(const FGameplayAbilitySpec& CurrentSpec); // virtual void RemoveSubAbilities(); protected: bool bCurrentAbilityEnded = false; //The ability current combo step was executing. UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Combo") FGameplayAbilitySpecHandle CurrentAbility; UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Combo") TSubclassOf CurrentAbilityClass; UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Combo") FGameplayAbilitySpecHandle NextAbility; UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Combo") TSubclassOf NextAbilityAbilityClass; int32 DesiredComboStep{INDEX_NONE}; /** * Granted potential combo abilities. * 赋予的潜在ComboAbilities. */ // UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Combo") // TArray AvailableAbilities; FDelegateHandle AbilityEndedDelegateHandle; #if WITH_EDITOR virtual EDataValidationResult IsDataValid(class FDataValidationContext& Context) const override; #endif };