// Copyright 2025 https://yuewu.dev/en All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "GGA_AbilitySystemGlobals.h" #include "CombatFlow/GCS_AttackResult.h" #include "GCS_CombatSystemComponent.generated.h" class UGCS_CombatFlow; /** * Structure for requesting montage playback. * 请求蒙太奇播放的结构。 */ USTRUCT(BlueprintType) struct GENERICCOMBATSYSTEM_API FGCS_PlayMontageRequest { GENERATED_BODY() /** * The animation montage to play. * 要播放的动画蒙太奇。 */ UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="GCS") TObjectPtr AnimMontage{nullptr}; /** * The playback rate for the montage. * 蒙太奇的播放速率。 */ UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="GCS") float PlayRate{1.0f}; /** * The starting section name for the montage. * 蒙太奇的起始片段名称。 */ UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="GCS") FName StartSectionName{NAME_None}; /** * The scale for root motion translation. * 根运动平移的缩放。 */ UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="GCS") float RootTranslationScale{1.0f}; /** * The start time for the montage in seconds. * 蒙太奇的起始时间(秒)。 */ UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="GCS") float StartTimeSeconds{0.0f}; }; /** * Structure for predicted montage information. * 预测蒙太奇信息的结构。 */ USTRUCT() struct FGCS_PredictedMontageInfo { GENERATED_BODY() /** * The animation montage. * 动画蒙太奇。 */ UPROPERTY() TObjectPtr AnimMontage{nullptr}; /** * The playback rate. * 播放速率。 */ UPROPERTY() float PlayRate{1.0f}; /** * The starting section name. * 起始片段名称。 */ UPROPERTY() FName StartSectionName{NAME_None}; /** * The time the montage was triggered. * 蒙太奇触发的时间。 */ UPROPERTY() float TriggeredTime{0.0f}; }; /** * Structure for replicated montage information. * 复制蒙太奇信息的结构。 */ USTRUCT() struct FGCS_ReplicatedMontageInfo { GENERATED_BODY() /** * The animation montage. * 动画蒙太奇。 */ UPROPERTY() TObjectPtr AnimMontage{nullptr}; /** * The playback rate. * 播放速率。 */ UPROPERTY() float PlayRate{1.0f}; /** * The starting section name. * 起始片段名称。 */ UPROPERTY() FName StartSectionName{NAME_None}; /** * The time the montage was triggered. * 蒙太奇触发的时间。 */ UPROPERTY() float TriggeredTime{0.0f}; }; DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FGCS_ComboStepChangedEventSignature, int32, PrevComboStep); /** * Component for handling offensive and defensive combat behaviors. * 处理进攻和防御战斗行为的组件。 */ UCLASS(ClassGroup=GCS, Blueprintable, BlueprintType, AutoExpandCategories=("GCS"), meta=(BlueprintSpawnableComponent)) class GENERICCOMBATSYSTEM_API UGCS_CombatSystemComponent : public UActorComponent, public IGGA_AbilitySystemGlobalsEventReceiver { GENERATED_BODY() friend UGCS_CombatFlow; public: /** * Default constructor. * 默认构造函数。 */ UGCS_CombatSystemComponent(); /** * Initializes the component. * 初始化组件。 */ virtual void InitializeComponent() override; /** * Called when the game starts. * 游戏开始时调用。 */ virtual void BeginPlay() override; /** * Called when the game ends. * 游戏结束时调用。 * @param EndPlayReason The reason for ending. 结束原因。 */ virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; /** * Retrieves lifetime replicated properties. * 获取生命周期复制属性。 * @param OutLifetimeProps The lifetime properties. 生命周期属性。 */ virtual void GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const override; /** * Gets the combat system component for an actor. * 获取演员的战斗系统组件。 * @param Actor The actor to query. 要查询的演员。 * @return The combat system component. 战斗系统组件。 */ UFUNCTION(BlueprintCallable, BlueprintPure, Category = "GCS|Combat", Meta = (DefaultToSelf="Actor")) static UGCS_CombatSystemComponent* GetCombatSystemComponent(const AActor* Actor); /** * Finds the combat system component for an actor. * 查找演员的战斗系统组件。 * @param Actor The actor to query. 要查询的演员。 * @param CombatComponent The found component (output). 找到的组件(输出)。 * @return True if found. 如果找到返回true。 */ UFUNCTION(BlueprintCallable, Category = "GCS|Combat", Meta = (DefaultToSelf="Actor", ExpandBoolAsExecs = "ReturnValue")) static bool FindCombatSystemComponent(const AActor* Actor, UGCS_CombatSystemComponent*& CombatComponent); /** * Finds a typed combat system component for an actor. * 查找演员的特定类型战斗系统组件。 * @param Actor The actor to query. 要查询的演员。 * @param DesiredClass The desired component class. 期望的组件类。 * @param Component The found component (output). 找到的组件(输出)。 * @return True if found. 如果找到返回true。 */ UFUNCTION(BlueprintCallable, Category = "GCS|Combat", meta=(DefaultToSelf="Actor", DeterminesOutputType="DesiredClass", DynamicOutputParam="Component", ExpandBoolAsExecs="ReturnValue")) static bool FindTypedCombatSystemComponent(AActor* Actor, TSubclassOf DesiredClass, UGCS_CombatSystemComponent*& Component); /** * Gets the combat flow for handling incoming attacks. * 获取处理传入攻击的战斗流程。 * @return The combat flow instance. 战斗流程实例。 */ UFUNCTION(BlueprintCallable, BlueprintPure, Category = "GCS|Combat", meta=(DisplayName="Get Combat Flow")) UGCS_CombatFlow* GetCombatFlow() const; /** * Registers an attack result. * 注册攻击结果。 * @param Payload The attack result to register. 要注册的攻击结果。 */ UFUNCTION(BlueprintCallable, Category="GCS|Combat") void RegisterAttackResult(UPARAM(ref) FGCS_AttackResult& Payload); /** * Gets the last processed attack result. * 获取最后处理的攻击结果。 * @return The last attack result. 最后攻击结果。 */ UFUNCTION(BlueprintCallable, BlueprintPure, Category = "GCS|Combat") FGCS_AttackResult GetLastProcessedAttackResult() const; /** * Sets the last processed attack result. * 设置最后处理的攻击结果。 * @param Payload The attack result to set. 要设置的攻击结果。 */ UFUNCTION(BlueprintCallable, Category = "GCS|Combat") void SetLastProcessedAttackResult(const FGCS_AttackResult& Payload); /** * Plays a predictable montage for a target combat system component. * 为目标战斗系统组件播放可预测的蒙太奇。 * @param TargetCSC The target combat system component. 目标战斗系统组件。 * @param Request The montage play request. 蒙太奇播放请求。 */ UFUNCTION(BlueprintCallable, Category="GCS|Combat") void PlayPredictableMontageForTarget(UGCS_CombatSystemComponent* TargetCSC, FGCS_PlayMontageRequest Request); /** * Server RPC to play a predictable montage for a target. * 为目标播放可预测蒙太奇的服务器RPC。 * @param TargetCSC The target combat system component. 目标战斗系统组件。 * @param Request The montage play request. 蒙太奇播放请求。 */ UFUNCTION(Server, Reliable, BlueprintCallable, Category="GCS|Combat") void ServerPlayPredictableMontageForTarget(UGCS_CombatSystemComponent* TargetCSC, FGCS_PlayMontageRequest Request); /** * Sets the replicated montage information. * 设置复制的蒙太奇信息。 * @param Request The montage play request. 蒙太奇播放请求。 */ void SetReplicatedMontage(const FGCS_PlayMontageRequest& Request); /** * Timer handle for montage-related operations. * 蒙太奇相关操作的计时器句柄。 */ FTimerHandle TimerHandle; /** * Handles replication of montage information. * 处理蒙太奇信息的复制。 */ UFUNCTION() void OnRep_ReplicatedMontageInfo(); /** * Plays a predicted montage. * 播放预测的蒙太奇。 * @param Request The montage play request. 蒙太奇播放请求。 */ void PlayPredictedMontage(const FGCS_PlayMontageRequest& Request); /** * Gets the character's skeletal mesh component. * 获取角色的骨骼网格组件。 * @return The skeletal mesh component. 骨骼网格组件。 */ USkeletalMeshComponent* GetCharacterMeshComponent() const; protected: /** * Handles pre-gameplay effect spec application. * 处理游戏效果规格应用前逻辑。 * @param Spec The gameplay effect spec. 游戏效果规格。 * @param AbilitySystemComponent The ability system component. 能力系统组件。 */ virtual void OnGlobalPreGameplayEffectSpecApply(FGameplayEffectSpec& Spec, UAbilitySystemComponent* AbilitySystemComponent) override; /** * Handles replication of the combat flow. * 处理战斗流程的复制。 */ UFUNCTION() void OnRep_CombatFlow(); /** * The class of the combat flow to instantiate. * 要实例化的战斗流程类。 */ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "GCS|Combat Settings") TSubclassOf CombatFlowClass; /** * The instantiated combat flow. * 实例化的战斗流程。 */ UPROPERTY(VisibleAnywhere, ReplicatedUsing=OnRep_CombatFlow, Category = "GCS|Combat State", meta=(ShowInnerProperties)) TObjectPtr CombatFlow; /** * The last attack result processed by the combat flow. * 战斗流程处理的最后攻击结果。 */ UPROPERTY(VisibleAnywhere, Category = "GCS|Combat State") FGCS_AttackResult LastProcessedAttackResult; /** * Container for attack results. * 攻击结果容器。 */ UPROPERTY(VisibleAnywhere, Replicated, Category="GCS|Combat State") FGCS_AttackResultContainer AttackResultContainer; /** * Replicated montage information. * 复制的蒙太奇信息。 */ UPROPERTY(VisibleAnywhere, ReplicatedUsing=OnRep_ReplicatedMontageInfo, Category = "GCS|Combat State") FGCS_ReplicatedMontageInfo ReplicatedMontageInfo; /** * Predicted montage information. * 预测的蒙太奇信息。 */ UPROPERTY(VisibleAnywhere, Category = "GCS|Combat State") FGCS_PredictedMontageInfo PredictedMontageInfo; #pragma region Combo System public: /** * Get the current combo step. * @return The current combo step. */ UFUNCTION(BlueprintCallable, BlueprintPure, Category="GMS|Combat") int32 GetComboStep() const; UFUNCTION(BlueprintCallable, Category="GCS|Combat") void UpdateComboStep(int32 NewComboStep); UFUNCTION(BlueprintCallable, Category="GCS|Combat") virtual void ResetComboState(); /** * Event for combo step changed. * 连击步骤变更事件。 */ UPROPERTY(BlueprintAssignable, Category="Event") FGCS_ComboStepChangedEventSignature OnComboStepChangedEvent; private: void UpdateComboStep(int32 NewComboStep, bool bSendRpc); UFUNCTION() void OnReplicated_ComboStep(int32 PrevComboStep); /** * Client RPC to set the combo step. * 客户端RPC设置运动集。 * @param NewComboStep combo step. 新运动集。 */ UFUNCTION(Client, Reliable, WithValidation) void ClientUpdateComboStep(int32 NewComboStep); /** * Server RPC to set the combo step. * 服务器RPC设置运动集。 * @param NewComboStep The new combo step. 新运动集。 */ UFUNCTION(Server, Reliable, WithValidation) void ServerUpdateComboStep(int32 NewComboStep); protected: virtual bool ClientUpdateComboStep_Validate(int32 NewComboStep); virtual bool ServerUpdateComboStep_Validate(int32 NewComboStep); UFUNCTION(BlueprintNativeEvent, Category="GMS|Combat") void OnComboStepChanged(int32 PrevComboStep); virtual void OnComboStepChanged_Implementation(int32 PrevComboStep); UPROPERTY(VisibleAnywhere, BlueprintReadOnly, ReplicatedUsing=OnReplicated_ComboStep, Category = "GCS|Combat State") int32 ComboStep{0}; private: #pragma endregion };