// Copyright Epic Games, Inc. All Rights Reserved. #include "LyraHealExecution.h" #include "GameplayEffectTypes.h" #include "AbilitySystem/Attributes/LyraHealthSet.h" #include "AbilitySystem/Attributes/LyraCombatSet.h" struct FHealStatics { FGameplayEffectAttributeCaptureDefinition BaseHealDef; FHealStatics() { BaseHealDef = FGameplayEffectAttributeCaptureDefinition(ULyraCombatSet::GetBaseHealAttribute(), EGameplayEffectAttributeCaptureSource::Source, true); } }; static FHealStatics& HealStatics() { static FHealStatics Statics; return Statics; } ULyraHealExecution::ULyraHealExecution() { RelevantAttributesToCapture.Add(HealStatics().BaseHealDef); } void ULyraHealExecution::Execute_Implementation(const FGameplayEffectCustomExecutionParameters& ExecutionParams, FGameplayEffectCustomExecutionOutput& OutExecutionOutput) const { #if WITH_SERVER_CODE const FGameplayEffectSpec& Spec = ExecutionParams.GetOwningSpec(); const FGameplayTagContainer* SourceTags = Spec.CapturedSourceTags.GetAggregatedTags(); const FGameplayTagContainer* TargetTags = Spec.CapturedTargetTags.GetAggregatedTags(); FAggregatorEvaluateParameters EvaluateParameters; EvaluateParameters.SourceTags = SourceTags; EvaluateParameters.TargetTags = TargetTags; float BaseHeal = 0.0f; ExecutionParams.AttemptCalculateCapturedAttributeMagnitude(HealStatics().BaseHealDef, EvaluateParameters, BaseHeal); const float HealingDone = FMath::Max(0.0f, BaseHeal); if (HealingDone > 0.0f) { OutExecutionOutput.AddOutputModifier(FGameplayModifierEvaluatedData(ULyraHealthSet::GetHealthAttribute(), EGameplayModOp::Additive, HealingDone)); } #endif // #if WITH_SERVER_CODE }