第一次提交

This commit is contained in:
不明不惑
2026-03-03 01:23:02 +08:00
commit 3e434877e8
1053 changed files with 102411 additions and 0 deletions

View File

@@ -0,0 +1,30 @@
// Copyright 2025 https://yuewu.dev/en All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "GGA_GameplayAbility.h"
#include "GCS_CombatAbility.generated.h"
class IGCS_CombatEntityInterface;
class UGCS_CombatSystemComponent;
/**
* Base combat ability.
* 基础战斗能力。
*/
UCLASS(Abstract)
class GENERICCOMBATSYSTEM_API UGCS_CombatAbility : public UGGA_GameplayAbility
{
GENERATED_BODY()
protected:
UFUNCTION(BlueprintCallable, BlueprintPure, Category="GCS|Ability")
UGCS_CombatSystemComponent* GetCombatSystemFromActorInfo() const;
UFUNCTION(BlueprintCallable, BlueprintPure, Category="GCS|Ability")
UObject* GetCombatEntityFromActorInfo() const;
UFUNCTION(BlueprintCallable, BlueprintPure, Category="GCS|Ability")
TScriptInterface<IGCS_CombatEntityInterface> GetCombatEntityInterfaceFromActorInfo() const;
};

View File

@@ -0,0 +1,105 @@
// 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<UGameplayAbility> CurrentAbilityClass;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Combo")
FGameplayAbilitySpecHandle NextAbility;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Combo")
TSubclassOf<UGameplayAbility> NextAbilityAbilityClass;
int32 DesiredComboStep{INDEX_NONE};
/**
* Granted potential combo abilities.
* 赋予的潜在ComboAbilities.
*/
// UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Combo")
// TArray<FGameplayAbilitySpecHandle> AvailableAbilities;
FDelegateHandle AbilityEndedDelegateHandle;
#if WITH_EDITOR
virtual EDataValidationResult IsDataValid(class FDataValidationContext& Context) const override;
#endif
};

View File

@@ -0,0 +1,124 @@
// Copyright 2025 https://yuewu.dev/en All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "AttributeSet.h"
#include "AbilitySystemComponent.h"
#include "NativeGameplayTags.h"
#include "AS_Poise.generated.h"
namespace AS_Poise
{
GENERICCOMBATSYSTEM_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Poise)
GENERICCOMBATSYSTEM_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(MaxPoise)
GENERICCOMBATSYSTEM_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(PoiseRecover)
}
#define ATTRIBUTE_ACCESSORS(ClassName, PropertyName) \
GAMEPLAYATTRIBUTE_PROPERTY_GETTER(ClassName, PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \
GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName)
UCLASS()
class GENERICCOMBATSYSTEM_API UAS_Poise : public UAttributeSet
{
GENERATED_BODY()
public:
UAS_Poise();
virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
virtual void PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) override;
virtual void PostAttributeChange(const FGameplayAttribute& Attribute, float OldValue, float NewValue) override;
virtual bool PreGameplayEffectExecute(struct FGameplayEffectModCallbackData& Data) override;
virtual void PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data) override;
// Current Poise value of an actor.(actor的当前抗打击值)
UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_Poise, Category = "Attribute|PoiseSet", Meta = (AllowPrivateAccess = true))
FGameplayAttributeData Poise{ 3 };
ATTRIBUTE_ACCESSORS(ThisClass, Poise)
// Max Poise value of an actor.(actor的最大抗打击值)
UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_MaxPoise, Category = "Attribute|PoiseSet", Meta = (AllowPrivateAccess = true))
FGameplayAttributeData MaxPoise{ 3 };
ATTRIBUTE_ACCESSORS(ThisClass, MaxPoise)
// How many Poise to recover per second.(每秒恢复抗打击值)
UPROPERTY(BlueprintReadOnly, ReplicatedUsing = OnRep_PoiseRecover, Category = "Attribute|PoiseSet", Meta = (AllowPrivateAccess = true))
FGameplayAttributeData PoiseRecover{ 1 };
ATTRIBUTE_ACCESSORS(ThisClass, PoiseRecover)
UFUNCTION(BlueprintCallable,BlueprintPure,meta=(DisplayName="GetPoiseAttribute"), Category = "Attribute|PoiseSet")
static FGameplayAttribute Bp_GetPoiseAttribute();
UFUNCTION(BlueprintPure,meta=(DisplayName="GetPoise"), Category = "Attribute|PoiseSet")
float Bp_GetPoise() const;
UFUNCTION(BlueprintCallable,meta=(DisplayName="SetPoise"), Category = "Attribute|PoiseSet")
void Bp_SetPoise(float NewValue);
UFUNCTION(BlueprintCallable,meta=(DisplayName="InitPoise"), Category = "Attribute|PoiseSet")
void Bp_InitPoise(float NewValue);
UFUNCTION(BlueprintCallable,BlueprintPure,meta=(DisplayName="GetMaxPoiseAttribute"), Category = "Attribute|PoiseSet")
static FGameplayAttribute Bp_GetMaxPoiseAttribute();
UFUNCTION(BlueprintPure,meta=(DisplayName="GetMaxPoise"), Category = "Attribute|PoiseSet")
float Bp_GetMaxPoise() const;
UFUNCTION(BlueprintCallable,meta=(DisplayName="SetMaxPoise"), Category = "Attribute|PoiseSet")
void Bp_SetMaxPoise(float NewValue);
UFUNCTION(BlueprintCallable,meta=(DisplayName="InitMaxPoise"), Category = "Attribute|PoiseSet")
void Bp_InitMaxPoise(float NewValue);
UFUNCTION(BlueprintCallable,BlueprintPure,meta=(DisplayName="GetPoiseRecoverAttribute"), Category = "Attribute|PoiseSet")
static FGameplayAttribute Bp_GetPoiseRecoverAttribute();
UFUNCTION(BlueprintPure,meta=(DisplayName="GetPoiseRecover"), Category = "Attribute|PoiseSet")
float Bp_GetPoiseRecover() const;
UFUNCTION(BlueprintCallable,meta=(DisplayName="SetPoiseRecover"), Category = "Attribute|PoiseSet")
void Bp_SetPoiseRecover(float NewValue);
UFUNCTION(BlueprintCallable,meta=(DisplayName="InitPoiseRecover"), Category = "Attribute|PoiseSet")
void Bp_InitPoiseRecover(float NewValue);
protected:
/** Helper function to proportionally adjust the value of an attribute when it's associated max attribute changes. (i.e. When MaxHealth increases, Health increases by an amount that maintains the same percentage as before) */
virtual void AdjustAttributeForMaxChange(FGameplayAttributeData& AffectedAttribute, const FGameplayAttributeData& MaxAttribute, float NewMaxValue, const FGameplayAttribute& AffectedAttributeProperty);
UFUNCTION()
virtual void OnRep_Poise(const FGameplayAttributeData& OldValue);
UFUNCTION()
virtual void OnRep_MaxPoise(const FGameplayAttributeData& OldValue);
UFUNCTION()
virtual void OnRep_PoiseRecover(const FGameplayAttributeData& OldValue);
};

View File

@@ -0,0 +1,16 @@
// Copyright 2025 https://yuewu.dev/en All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "GGA_AbilitySystemGlobals.h"
#include "DEPRECATED_GCS_AbilitySystemGlobals.generated.h"
UCLASS(Deprecated, meta=(DeprecationMessage="GCS_AbilitySystemGlobals is deprecated. Please use GGA_AbilitySystemGlobals instead."))
class GENERICCOMBATSYSTEM_API UDEPRECATED_GCS_AbilitySystemGlobals : public UGGA_AbilitySystemGlobals
{
GENERATED_BODY()
public:
virtual FGameplayEffectContext* AllocGameplayEffectContext() const override;
};

View File

@@ -0,0 +1,24 @@
// Copyright 2025 https://yuewu.dev/en All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "GameplayEffectComponent.h"
#include "GCS_GEComponent_PredictivelyExecute.generated.h"
/**
* This component will predictively execute instant GE which treated as infinite one.
* @attention Internally will mark this effect context as local predicting context, so you can conditional apply logic in subsequent codes.
*/
UCLASS()
class GENERICCOMBATSYSTEM_API UGCS_GEComponent_PredictivelyExecute : public UGameplayEffectComponent
{
GENERATED_BODY()
public:
virtual void OnGameplayEffectApplied(FActiveGameplayEffectsContainer& ActiveGEContainer, FGameplayEffectSpec& GESpec, FPredictionKey& PredictionKey) const override;
private:
UPROPERTY(EditDefaultsOnly, Category = GCS)
bool bPredictGameplayCues{false};
};

View File

@@ -0,0 +1,74 @@
// Copyright 2025 https://yuewu.dev/en All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "GCS_CombatStructLibrary.h"
#include "UObject/Object.h"
#include "GCS_GameplayEffectContext.generated.h"
/**
* The Combat related data which was carried and pass around within gameplay effect context, as one of the gameplay effect context payload.
* 战斗相关数据,在游戏效果上下文中被携带和传递,作为游戏效果上下文数据之一。
*/
USTRUCT(BlueprintType)
struct GENERICCOMBATSYSTEM_API FGCS_ContextPayload_Combat
{
GENERATED_BODY()
void SetTaggedValue(const FGameplayTag& Tag, float NewValue);
float GetTaggedValue(const FGameplayTag& Tag) const;
/**
* Indicate the effect spec owning this context was Predictively executed.
* 表示拥有此上下文的效果实例是以客户端预测方式执行的。
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="GCS")
bool bIsPredictingContext{false};
UPROPERTY()
FPredictionKey PredictionKey;
/**
* Attack definition data table.
* 攻击定义数据表。
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="GCS", meta=(RequiredAssetDataTags = "RowStructure=/Script/GenericCombatSystem.GCS_AttackDefinition"))
TObjectPtr<const UDataTable> AtkDataTable{nullptr};
/**
* Row name in the attack definition table.
* 攻击定义表中的行名。
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="GCS")
FName AtkRowName{NAME_None};
/**
* Bullet definition data table.
* 子弹定义数据表。
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="GCS", meta=(RequiredAssetDataTags = "RowStructure=/Script/GenericCombatSystem.GCS_BulletDefinition"))
TObjectPtr<const UDataTable> BulletDataTable{nullptr};
/**
* Row name in the bullet definition table.
* 子弹定义表中的行名。
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="GCS")
FName BulletRowName{NAME_None};
/**
* The tags added during gameplay effect apply(coming from MMC,or Execution).
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="GCS")
FGameplayTagContainer DynamicTags;
/**
* Array of tagged values associated with the combat process.
* 与战斗过程关联的标记值数组。
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="GCS")
TArray<FGCS_TaggedValue> TaggedValues;
};

View File

@@ -0,0 +1,116 @@
// Copyright 2025 https://yuewu.dev/en All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Abilities/Tasks/AbilityTask.h"
#include "Collision/GCS_TraceStructLibrary.h"
#include "Components/SkeletalMeshComponent.h"
#include "GCS_AbilityTask_CollisionTrace.generated.h"
class UGCS_AttackRequest_Melee;
/**
* Ability task for handling collision traces in combat.
* 处理战斗中碰撞检测的能力任务。
*/
UCLASS()
class GENERICCOMBATSYSTEM_API UGCS_AbilityTask_CollisionTrace : public UAbilityTask
{
GENERATED_BODY()
public:
UGCS_AbilityTask_CollisionTrace();
/**
* Creates and activates a collision trace task.
* 创建并激活碰撞检测任务。
* @param OwningAbility The owning gameplay ability. 所属游戏能力。
* @param TaskInstanceName The name of the task instance. 任务实例名称。
* @param bAdjustVisibilityBasedAnimTickOption Whether to adjust visibility-based animation ticking. 是否调整基于可见性的动画tick。
* @return The created task. 创建的任务。
*/
UFUNCTION(BlueprintCallable, Category = "GCS|AbilityTasks", meta = (HidePin = "OwningAbility", DefaultToSelf = "OwningAbility", BlueprintInternalUseOnly = "TRUE"))
static UGCS_AbilityTask_CollisionTrace* HandleCollisionTraces(UGameplayAbility* OwningAbility, FName TaskInstanceName, bool bAdjustVisibilityBasedAnimTickOption = false);
/**
* Activates the task.
* 激活任务。
*/
virtual void Activate() override;
/**
* Called when the task is destroyed.
* 任务销毁时调用。
* @param bInOwnerFinished Whether the owner finished the task. 拥有者是否完成了任务。
*/
virtual void OnDestroy(bool bInOwnerFinished) override;
/**
* Adds a melee attack request to the task.
* 向任务添加近战攻击请求。
* @param Request The melee attack request. 近战攻击请求。
* @param SourceObject Optional source object. 可选的源对象。
*/
UFUNCTION(BlueprintCallable, Category = "GCS|AbilityTasks")
void AddMeleeRequest(const UGCS_AttackRequest_Melee* Request, UObject* SourceObject);
/**
* Removes a melee attack request from the task.
* 从任务移除近战攻击请求。
* @param Request The melee attack request. 近战攻击请求。
*/
UFUNCTION(BlueprintCallable, Category = "GCS|AbilityTasks")
void RemoveMeleeRequest(const UGCS_AttackRequest_Melee* Request);
/**
* Delegate for trace instance hit events.
* 碰撞检测实例命中事件的委托。
*/
DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FGCS_OnTraceInstanceHitSignature, const UGCS_AttackRequest_Melee*, MeleeRequest, const FGCS_TraceHandle&, TraceHandle,
const FHitResult&,
HitResult);
/**
* Fired when a trace instance detects targets.
* 当碰撞检测实例检测到目标时触发。
*/
UPROPERTY(BlueprintAssignable)
FGCS_OnTraceInstanceHitSignature OnTargetsFound;
protected:
/**
* Handles trace instance hit events.
* 处理碰撞检测实例命中事件。
* @param TraceHandle The trace instance. 碰撞检测实例。
* @param HitResult The hit result. 命中结果。
*/
UFUNCTION()
void TraceHitCallback(const FGCS_TraceHandle& TraceHandle, const FHitResult& HitResult);
/**
* Map of melee requests to their associated trace instances.
* 近战请求及其关联碰撞检测实例的映射。
*/
TMap<TObjectPtr<const UGCS_AttackRequest_Melee>, TArray<FGCS_TraceHandle>> MeleeRequests;
/**
* Whether to adjust visibility-based animation ticking.
* 是否调整基于可见性的动画tick。
*/
UPROPERTY()
bool bAdjustAnimTickOption{false};
/**
* Whether the animation tick option was adjusted.
* 是否已调整动画tick选项。
*/
UPROPERTY()
bool bAdjustedAnimTickOption{false};
/**
* The previous animation tick option.
* 之前的动画tick选项。
*/
UPROPERTY()
EVisibilityBasedAnimTickOption PrevAnimTickOption{EVisibilityBasedAnimTickOption::AlwaysTickPose};
};