5#include "CoreMinimal.h"
6#include "Engine/DataAsset.h"
7#include "GameplayTagContainer.h"
8#include "ScalableFloat.h"
9#include "StructUtils/InstancedStruct.h"
10#include "CombatDataBase.generated.h"
36 UPROPERTY(EditAnywhere, Category =
"SingleHit", meta = (ToolTip =
"대상별 1회 타격에 적용할 피해 배율입니다. 1.0은 100%입니다.", ClampMin =
"0.0"))
37 float DamageMultiplier = 1.0f;
39 UPROPERTY(EditAnywhere, Category = "SingleHit", meta = (ToolTip = "단일 타격 적중 시 히트 스톱 연출을 적용할지 결정합니다."))
40 uint8 bCauseHitStop : 1 = true;
54 UPROPERTY(EditAnywhere, Category =
"MultiHit", meta = (ToolTip =
"하나의 NotifyState 판정 구간에서 동일 대상을 타격할 수 있는 최대 횟수입니다.", ClampMin =
"2"))
55 int32 MaxHitCountPerTarget = 2;
57 UPROPERTY(EditAnywhere, Category = "
MultiHit", meta = (ToolTip = "일반 타격과 마지막 타격의 피해 배율, 재타격 간격, 히트 스톱 및 넉백 적용 시점을 정의합니다."))
76 UPROPERTY(EditAnywhere, Category =
"Hit", meta = (ToolTip =
"이 타격의 GameplayEffect와 FScalableFloat CurveTable 값을 평가할 때 사용하는 레벨입니다.", ClampMin =
"1.0"))
77 float CombatDataLevel = 1.0f;
79 UPROPERTY(EditAnywhere, Category = "Hit", meta = (ToolTip = "피격 모션과 Mesh Pulse 등 피해 연출을 선택합니다. 약 경직과 넉다운 적용 여부는 GameplayEffect 설정을 따릅니다.", Categories = "Damage.Type"))
80 FGameplayTag DamageTypeTag;
82 UPROPERTY(EditAnywhere, Category = "Hit", meta = (ToolTip = "판정 구간에서 동일 대상을 한 번만 타격할지 반복 타격할지 결정합니다. Notify와 NotifyState는 판정 지속 방식을 결정합니다."))
85 UPROPERTY(EditAnywhere, Category = "Hit", meta = (ToolTip = "대상별 1회 타격에 사용할 피해 배율과 히트 스톱 설정입니다.", EditCondition = "HitType ==
ECombatHitType::
Single", EditConditionHides))
88 UPROPERTY(EditAnywhere, Category = "Hit", meta = (ToolTip = "동일 대상을 반복 타격할 때 사용할 최대 횟수와 다단 타격 프로필입니다.", EditCondition = "HitType ==
ECombatHitType::
MultiHit", EditConditionHides))
91 UPROPERTY(EditAnywhere, Instanced, Category = "Hit|Impact", meta = (ToolTip = "적중 대상에게 적용할 넉백 설정입니다. 비워두면 넉백을 적용하지 않습니다."))
102 FORCEINLINE TSubclassOf<UGameplayEffect>
GetEffectClass()
const {
return EffectClass; }
106 UPROPERTY(EditAnywhere, Category =
"Effect", meta = (ToolTip =
"적중한 대상에게 적용할 GameplayEffect입니다."))
107 TSubclassOf<UGameplayEffect> EffectClass;
109 UPROPERTY(EditAnywhere, Category = "Effect", meta = (ToolTip = "GameplayEffect에 전달할 Data 태그별 기본값입니다.", Categories = "Data"))
110 TMap<FGameplayTag, FScalableFloat> SetByCallerMagnitudes;
120 template <
typename T>
121 const T* FindExtendedData()
const;
127 const int32 ArrayIndex = CombatHitDataIndex - 1;
128 return CombatHitData.IsValidIndex(ArrayIndex) ? &CombatHitData[ArrayIndex] :
nullptr;
133 UPROPERTY(EditDefaultsOnly, Category =
"Combat", meta = (ToolTip =
"공격의 충돌 검사에 사용할 Collision Trace Channel입니다."))
134 TEnumAsByte<ECollisionChannel> TraceChannel;
136 UPROPERTY(EditDefaultsOnly, Category = "Combat", meta = (ToolTip = "공격의 충돌 판정을 수행할 Trace Actor 클래스입니다."))
139 UPROPERTY(EditDefaultsOnly, Category = "Combat", meta = (ToolTip = "Ability 실행 시 시전자 자신에게 적용할 GameplayEffect 목록입니다."))
140 TArray<TSubclassOf<UGameplayEffect>> SelfEffectClasses;
143 UPROPERTY(EditDefaultsOnly, Category = "Combat|Effect", meta = (ToolTip = "피해 계산과 HitEffect, DamageType 전달에 사용할 GameplayEffect입니다."))
146 UPROPERTY(EditDefaultsOnly, Category = "Combat|Effect", meta = (ToolTip = "피해 외에 적중 대상에게 적용할 HitStun,
Groggy, KnockDown 등의 GameplayEffect 목록입니다."))
150 UPROPERTY(EditDefaultsOnly, Category = "Combat|Hit", meta = (ToolTip = "공격의 타격 단계별 설정입니다. Notify의 CombatHitDataIndex 1은 배열 요소 0에 대응합니다."))
154 UPROPERTY(EditDefaultsOnly, Category = "Payload", meta = (ToolTip = "몽타주, 스킬, 돌진, 보스 패턴처럼 해당 Ability에만 필요한 확장 데이터를 추가합니다.", BaseStruct = "/Script/
CK_UE.CombatExtendedData", ExcludeBaseStruct))
155 TArray<FInstancedStruct> ExtendedData;
159 mutable TMap<TObjectPtr<UScriptStruct>, int32> CachedIndices;
167 if (
const int32* CachedIndex = CachedIndices.Find(T::StaticStruct()))
169 return ExtendedData[*CachedIndex].GetPtr<T>();
172 for (int32 i = 0; i < ExtendedData.Num(); ++i)
174 if (
const T* Data = ExtendedData[i].GetPtr<T>())
176 CachedIndices.Add(T::StaticStruct(), i);
ECombatHitType
Definition CombatDataBase.h:20
Definition CK_UE.Build.cs:6
Definition CombatDataBase.h:116
FORCEINLINE const FCombatEffectData & GetDamageEffect() const
Definition CombatDataBase.h:123
FORCEINLINE const TArray< FCombatEffectData > & GetAdditionalTargetEffects() const
Definition CombatDataBase.h:124
FORCEINLINE const FCombatHitData * FindCombatHitData(const int32 CombatHitDataIndex) const
Definition CombatDataBase.h:125
Definition MultiHitProfile.h:23
Definition KnockbackData.h:39
Definition CombatDataBase.h:98
FORCEINLINE const TMap< FGameplayTag, FScalableFloat > & GetSetByCallerMagnitudes() const
Definition CombatDataBase.h:103
FORCEINLINE TSubclassOf< UGameplayEffect > GetEffectClass() const
Definition CombatDataBase.h:102
Definition CombatDataBase.h:64
FORCEINLINE const FSingleHitData & GetSingleHitData() const
Definition CombatDataBase.h:71
FORCEINLINE UKnockbackDataAsset * GetKnockbackData() const
Definition CombatDataBase.h:73
FORCEINLINE ECombatHitType GetHitType() const
Definition CombatDataBase.h:70
FORCEINLINE const FGameplayTag & GetDamageTypeTag() const
Definition CombatDataBase.h:69
FORCEINLINE float GetCombatDataLevel() const
Definition CombatDataBase.h:68
FORCEINLINE const FMultiHitData & GetMultiHitData() const
Definition CombatDataBase.h:72
Definition CombatDataBase.h:46
FORCEINLINE int32 GetMaxHitCountPerTarget() const
Definition CombatDataBase.h:50
FORCEINLINE UDA_MultiHitProfile * GetProfile() const
Definition CombatDataBase.h:51
Definition CombatDataBase.h:28
FORCEINLINE bool ShouldCauseHitStop() const
Definition CombatDataBase.h:33
FORCEINLINE float GetDamageMultiplier() const
Definition CombatDataBase.h:32