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