Files
Cog/Source/CogSample/CogSampleExecCalculation_PoolRegen.cpp
T
2023-10-05 16:57:43 -04:00

57 lines
2.2 KiB
C++

#include "CogSampleExecCalculation_PoolRegen.h"
#include "AbilitySystemComponent.h"
//--------------------------------------------------------------------------------------------------------------------------
UCogSampleExecCalculation_PoolRegen::UCogSampleExecCalculation_PoolRegen()
{
}
//--------------------------------------------------------------------------------------------------------------------------
void UCogSampleExecCalculation_PoolRegen::Execute_Implementation(const FGameplayEffectCustomExecutionParameters& ExecutionParams, OUT FGameplayEffectCustomExecutionOutput& OutExecutionOutput) const
{
UAbilitySystemComponent* TargetAbilitySystem = ExecutionParams.GetTargetAbilitySystemComponent();
const FGameplayEffectSpec& Spec = ExecutionParams.GetOwningSpec();
FAggregatorEvaluateParameters EvaluationParameters;
EvaluationParameters.SourceTags = Spec.CapturedSourceTags.GetAggregatedTags();
EvaluationParameters.TargetTags = Spec.CapturedTargetTags.GetAggregatedTags();
const float Period = ExecutionParams.GetOwningSpec().GetPeriod();
float RegenRateValue = 0.0f;
if (TargetAbilitySystem->HasMatchingGameplayTag(DisableRegenTag) == false)
{
switch (Mode)
{
case ECogSamplePoolRegenMode::Attribute:
{
RegenRateValue = TargetAbilitySystem->GetNumericAttribute(RegenRateAttribute);
}
break;
case ECogSamplePoolRegenMode::ScalableFloatRate:
{
RegenRateValue = RegenRate.GetValueAtLevel(Spec.GetLevel());
}
case ECogSamplePoolRegenMode::MaxPoolDuration:
{
const float MaxAmount = TargetAbilitySystem->GetNumericAttribute(MaxAmountAttribute);
const float TotalDurationValue = TotalDuration.GetValueAtLevel(Spec.GetLevel());
RegenRateValue = TotalDurationValue > 0 ? (MaxAmount / TotalDurationValue) * Period : 0.0f;
}
break;
default:
break;
}
}
if (RegenRateValue != 0.0f)
{
OutExecutionOutput.AddOutputModifier(FGameplayModifierEvaluatedData(AmountAttribute, EGameplayModOp::Additive, RegenRateValue));
}
}