41{
42 Super::Execute_Implementation(ExecutionParams, OutExecutionOutput);
43
44
45 UAbilitySystemComponent* SourceASC = ExecutionParams.GetSourceAbilitySystemComponent();
46 UAbilitySystemComponent* TargetASC = ExecutionParams.GetTargetAbilitySystemComponent();
47
48 if (!SourceASC || !TargetASC)
49 {
50 return;
51 }
52
53 const FGameplayEffectSpec& Spec = ExecutionParams.GetOwningSpec();
54 FAggregatorEvaluateParameters EvaluationParameters;
55
56 const FGameplayTagContainer* TargetTags = Spec.CapturedTargetTags.GetAggregatedTags();
57 const FGameplayTagContainer* SourceTags = Spec.CapturedSourceTags.GetAggregatedTags();
58
59 EvaluationParameters.TargetTags = TargetTags;
60 EvaluationParameters.SourceTags = SourceTags;
61
62
63 if (TargetTags && TargetTags->HasTag(TAG_CHARACTER_STATE_ISINVINCIBLE))
64 {
65 return;
66 }
67
68
69
70 float BaseDamage = 0.0f;
71 ExecutionParams.AttemptCalculateCapturedAttributeMagnitude(
DamageStatics().AttackDef, EvaluationParameters, BaseDamage);
72 BaseDamage = FMath::Max<float>(BaseDamage, 0.0f);
73
74 float FinalDamage = BaseDamage;
75
76
77 float CriticalChance = 0.0f;
78 ExecutionParams.AttemptCalculateCapturedAttributeMagnitude(
DamageStatics().CriticalDef, EvaluationParameters, CriticalChance);
79 CriticalChance = FMath::Max<float>(CriticalChance, 0.0f);
80
81 bool bIsCriticalHit = false;
82
83 float CriticalMultiplier = 0.0f;
84 ExecutionParams.AttemptCalculateCapturedAttributeMagnitude(
DamageStatics().Critical_DmgDef, EvaluationParameters, CriticalMultiplier);
85 CriticalMultiplier = FMath::Max<float>(CriticalMultiplier, 1.0f);
86
87 if (CriticalChance > 0.0f)
88 {
89 float Random = FMath::RandRange(0.0f, 100.0f);
90 if (Random < CriticalChance)
91 {
92 bIsCriticalHit = true;
93 FinalDamage *= CriticalMultiplier;
94 }
95 }
96
97
98
99 const float DamageMul = Spec.GetSetByCallerMagnitude(TAG_DATA_DAMAGE_MUL, false, 1.0f);
100 FinalDamage *= DamageMul;
101
102 FinalDamage = FMath::CeilToFloat(FinalDamage);
103
104 if (FinalDamage > 0.0f)
105 {
106 float CritFlag = bIsCriticalHit ? 1.0f : 0.0f;
107 OutExecutionOutput.AddOutputModifier(FGameplayModifierEvaluatedData(UBaseAttributeSet::GetDamageIsCriticalAttribute(), EGameplayModOp::Additive, CritFlag));
108
109 OutExecutionOutput.AddOutputModifier(FGameplayModifierEvaluatedData(UBaseAttributeSet::GetDamageAttribute(), EGameplayModOp::Additive, FinalDamage));
110 }
111}