311{
312 if (Manifest == nullptr)
313 {
314 return nullptr;
315 }
316
317
322
323
324 if (BuffRow.
Target.IsNone() || BuffRow.
Target == TEXT(
"Default") || BuffRow.
Target == FName(
"-"))
325 {
327 }
328 else
329 {
330 const FGameplayTag Tag = TAG_CHARACTER_STATE_COMBAT_SKILL.GetTag();
331 const FName FullTagName(*(Tag.ToString() + BuffRow.
Target.ToString()));
332
333
334 BuffData.
TargetSkillTag = UGameplayTagsManager::Get().RequestGameplayTag(FullTagName,
false);
335
337 {
338 LOG_WARNING(LogCKAbility,
"Buff_Master 의 Target '%s'에 대응하는 스킬 태그가 없습니다: %s", *BuffRow.
Target.ToString(), *FullTagName.ToString());
339 }
340 }
341
342
343
344 const FSoftObjectPath SourcePath = BuffRow.
GE_Path.ToSoftObjectPath();
345
346 if (SourcePath.IsNull() == false)
347 {
348 const FString PackageName = SourcePath.GetLongPackageName();
349 FString AssetName = SourcePath.GetAssetName();
350
351
352 if (AssetName.IsEmpty())
353 {
354 AssetName = FPackageName::GetShortName(PackageName);
355 }
356
357
358 if (AssetName.EndsWith(TEXT("_C")) == false)
359 {
360 AssetName += TEXT("_C");
361 }
362
363 BuffData.
EffectClass = TSoftClassPtr<UGameplayEffect>(FSoftObjectPath(PackageName + TEXT(
".") + AssetName));
364 }
365
366
368 {
369 LOG_ERROR(LogCKAbility,
"버프 '%s'에 GE 경로가 비어 있습니다.", *BuffRow.
Buff_ID.ToString());
371 Situation->
Initialize(SituationRow, BuffData);
372 return Situation;
373 }
374
375 const UClass* EffectClass = BuffData.
EffectClass.LoadSynchronous();
376 const UGameplayEffect* EffectCDO = EffectClass ? EffectClass->GetDefaultObject<UGameplayEffect>() : nullptr;
377
378 if (EffectCDO == nullptr)
379 {
382 Situation->
Initialize(SituationRow, BuffData);
383 return Situation;
384 }
385
386
387
388 if (EffectCDO->GetStackingType() != EGameplayEffectStackingType::None)
389 {
390 LOG_WARNING(LogCKAbility,
"버프 '%s'의 GE 가 StackingType=None 이 아닙니다. 같은 버프를 쓰는 상황끼리 핸들이 병합되어 버프가 서로 지워집니다.", *BuffRow.
Buff_ID.ToString());
391 }
392
393
394
395 if (EffectCDO->DurationPolicy == EGameplayEffectDurationType::Instant)
396 {
397 LOG_ERROR(LogCKAbility,
"버프 '%s'의 GE 가 Instant 입니다. 발동마다 수치가 영구 누적되고 만료/제거가 불가능하니 Has Duration 또는 Infinite 로 바꿔야 합니다.", *BuffRow.
Buff_ID.ToString());
398 }
399
401 Situation->
Initialize(SituationRow, BuffData);
402 return Situation;
403}
#define LOG_ERROR(Category, Format,...)
Definition CK_UE.h:40
#define LOG_WARNING(Category, Format,...)
Definition CK_UE.h:39
Definition SituationBase.h:31
void Initialize(const FDT_SituationTable &InSituationData, const FSituationBuffData &InBuffData)
Definition SituationBase.cpp:21
virtual FDT_BuffTable GetBuffTable(const FName &RowID)
Definition StageManifest.cpp:627
Definition DT_BuffTable.h:15
float Interval
Definition DT_BuffTable.h:31
FName Buff_ID
Definition DT_BuffTable.h:27
TSoftClassPtr< UGameplayEffect > GE_Path
Definition DT_BuffTable.h:40
FName Target
Definition DT_BuffTable.h:36
FName Buff_ID
Definition DT_SituationTable.h:51
Definition SituationBuffData.h:15
float Interval
Definition SituationBuffData.h:24
TSoftClassPtr< UGameplayEffect > EffectClass
Definition SituationBuffData.h:33
FName Buff_ID
Definition SituationBuffData.h:20
FGameplayTag TargetSkillTag
Definition SituationBuffData.h:29