412 lines
12 KiB
C++
412 lines
12 KiB
C++
// 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<UAnimMontage> 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<UAnimMontage> 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<UAnimMontage> 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<FLifetimeProperty>& 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<UGCS_CombatSystemComponent> 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<UGCS_CombatFlow> CombatFlowClass;
|
|
|
|
/**
|
|
* The instantiated combat flow.
|
|
* 实例化的战斗流程。
|
|
*/
|
|
UPROPERTY(VisibleAnywhere, ReplicatedUsing=OnRep_CombatFlow, Category = "GCS|Combat State", meta=(ShowInnerProperties))
|
|
TObjectPtr<UGCS_CombatFlow> 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
|
|
};
|