64. Properly Clamping Attributes

This commit is contained in:
Edward R. Gonzalez 2024-10-19 22:34:51 -04:00
parent 3a3f0c0271
commit 067c2f03c5
3 changed files with 62 additions and 21 deletions

View File

@ -6,6 +6,7 @@
#include "AbilitySystemComponent.h" #include "AbilitySystemComponent.h"
#include "Net/UnrealNetwork.h" #include "Net/UnrealNetwork.h"
#include "Networking/GasaNetLibrary.h" #include "Networking/GasaNetLibrary.h"
#include "GameplayEffectExtension.h"
UGasaAttributeSet::UGasaAttributeSet() UGasaAttributeSet::UGasaAttributeSet()
{ {
@ -47,6 +48,23 @@ void UGasaAttributeSet::PostGameplayEffectExecute( FGameplayEffectModCallbackDat
Super::PostGameplayEffectExecute( Data ); Super::PostGameplayEffectExecute( Data );
FEffectProperties Props; FEffectProperties Props;
Props.Populate( Data ); Props.Populate( Data );
if ( Data.EvaluatedData.Attribute == GetHealthAttribute() )
{
SetHealth( FMath::Clamp( GetHealth(), 0, GetMaxHealth() ) );
}
if ( Data.EvaluatedData.Attribute == GetMaxHealthAttribute() )
{
SetMaxHealth( FMath::Clamp( GetMaxHealth(), 0, 99999.000000 ) );
}
if ( Data.EvaluatedData.Attribute == GetManaAttribute() )
{
SetMana( FMath::Clamp( GetMana(), 0, GetMaxMana() ) );
}
if ( Data.EvaluatedData.Attribute == GetMaxManaAttribute() )
{
SetMaxMana( FMath::Clamp( GetMaxMana(), 0, 99999.000000 ) );
}
} }
void UGasaAttributeSet::PreAttributeChange( FGameplayAttribute const& Attribute, float& NewValue ) void UGasaAttributeSet::PreAttributeChange( FGameplayAttribute const& Attribute, float& NewValue )

View File

@ -109,12 +109,12 @@ void UGlobeProgressBar::SetPercentage(float CurrentValue, float MaxValue)
UWorld* World = GetWorld(); UWorld* World = GetWorld();
FTimerManager& TM = World->GetTimerManager(); FTimerManager& TM = World->GetTimerManager();
if ( CurrentValueClamped < PreviousValue ) if ( CurrentValueClamped <= PreviousValue )
{ {
// Timer will auto-clear previous set delay // Timer will auto-clear previous set delay
TM.SetTimer( GhostPercentChangeTimer, this, & UGlobeProgressBar::GhostPercentUpdateViaTimer, GhostPercentChangeDelay ); TM.SetTimer( GhostPercentChangeTimer, this, & UGlobeProgressBar::GhostPercentUpdateViaTimer, GhostPercentChangeDelay );
} }
else else if ( Bar->GetPercent() >= GhostBar->GetPercent() )
{ {
if ( TM.TimerExists( GhostPercentChangeTimer )) if ( TM.TimerExists( GhostPercentChangeTimer ))
TM.ClearTimer( GhostPercentChangeTimer ); TM.ClearTimer( GhostPercentChangeTimer );
@ -179,7 +179,7 @@ void UGlobeProgressBar::NativeTick(const FGeometry& MyGeometry, float InDeltaTim
FTimerManager& TM = World->GetTimerManager(); FTimerManager& TM = World->GetTimerManager();
// Ghost Percent Interpolation // Ghost Percent Interpolation
if ( ! TM.TimerExists( GhostPercentChangeTimer )) if ( ! TM.TimerExists( GhostPercentChangeTimer ) )
{ {
float NextPercent = FMath::FInterpTo( GhostBar->GetPercent(), GhostTargetPercent, InDeltaTime, GhostPercentInterpolationSpeed ); float NextPercent = FMath::FInterpTo( GhostBar->GetPercent(), GhostTargetPercent, InDeltaTime, GhostPercentInterpolationSpeed );
GhostBar->SetPercent( NextPercent ); GhostBar->SetPercent( NextPercent );

View File

@ -175,6 +175,7 @@ void gen_UGasaAttributeSet()
source.print( def_include( txt("AbilitySystemComponent.h"))); source.print( def_include( txt("AbilitySystemComponent.h")));
source.print( def_include( txt("Net/UnrealNetwork.h"))); source.print( def_include( txt("Net/UnrealNetwork.h")));
source.print( def_include( txt("Networking/GasaNetLibrary.h"))); source.print( def_include( txt("Networking/GasaNetLibrary.h")));
source.print( def_include( txt("GameplayEffectExtension.h")));
{ {
CodeBody body = def_body( CodeT::Global_Body ); CodeBody body = def_body( CodeT::Global_Body );
body.append(fmt_newline); body.append(fmt_newline);
@ -192,22 +193,17 @@ void gen_UGasaAttributeSet()
impl_attribute_fields( body, class_name, attribute_fields); impl_attribute_fields( body, class_name, attribute_fields);
Code PostGameplayEffectExecute = parse_function( code( CodeFn PostGameplayEffectExecute;
void UGasaAttributeSet::PostGameplayEffectExecute(FGameplayEffectModCallbackData const& Data)
{
Super::PostGameplayEffectExecute(Data);
FEffectProperties Props;
Props.Populate(Data);
}
));
body.append(PostGameplayEffectExecute);
body.append(fmt_newline);
CodeFn PreAttributeChange; CodeFn PreAttributeChange;
{ {
CodeBody attribute_clamps = def_body( CodeT::Function_Body ); CodeBody pre_attribute_clamps = def_body( CodeT::Function_Body );
attribute_clamps.append(fmt_newline); pre_attribute_clamps.append(fmt_newline);
attribute_clamps.append(fmt_newline); pre_attribute_clamps.append(fmt_newline);
CodeBody post_attribute_clamps = def_body( CodeT::Function_Body );
post_attribute_clamps.append(fmt_newline);
post_attribute_clamps.append(fmt_newline);
for (GAS_AttributeEntry field : attribute_fields) for (GAS_AttributeEntry field : attribute_fields)
{ {
String clamp_min; String clamp_min;
@ -222,7 +218,7 @@ void gen_UGasaAttributeSet()
else else
clamp_max = String::fmt_buf(GlobalAllocator, "%f", field.Max); clamp_max = String::fmt_buf(GlobalAllocator, "%f", field.Max);
attribute_clamps.append( code_fmt( pre_attribute_clamps.append( code_fmt(
"field", (StrC)field.Name, "field", (StrC)field.Name,
"clamp_min", (StrC)clamp_min, "clamp_min", (StrC)clamp_min,
"clamp_max", (StrC)clamp_max, "clamp_max", (StrC)clamp_max,
@ -232,17 +228,44 @@ void gen_UGasaAttributeSet()
NewValue = FMath::Clamp(NewValue, <clamp_min>, <clamp_max>); NewValue = FMath::Clamp(NewValue, <clamp_min>, <clamp_max>);
} }
))); )));
post_attribute_clamps.append( code_fmt(
"field", (StrC)field.Name,
"clamp_min", (StrC)clamp_min,
"clamp_max", (StrC)clamp_max,
stringize(
if ( Data.EvaluatedData.Attribute == Get<field>Attribute() )
{
Set<field>(FMath::Clamp(Get<field>(), <clamp_min>, <clamp_max> ));
}
)));
} }
attribute_clamps.append(fmt_newline);
attribute_clamps.append(fmt_newline); pre_attribute_clamps.append(fmt_newline);
PreAttributeChange = parse_function( token_fmt( "attribute_clamps", (StrC)attribute_clamps.to_string(), stringize( pre_attribute_clamps.append(fmt_newline);
PreAttributeChange = parse_function( token_fmt( "attribute_clamps", (StrC)pre_attribute_clamps.to_string(), stringize(
void UGasaAttributeSet::PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) void UGasaAttributeSet::PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue)
{ {
Super::PreAttributeChange(Attribute, NewValue); Super::PreAttributeChange(Attribute, NewValue);
<attribute_clamps> <attribute_clamps>
} }
))); )));
post_attribute_clamps.append(fmt_newline);
post_attribute_clamps.append(fmt_newline);
PostGameplayEffectExecute = parse_function( token_fmt( "attribute_clamps", (StrC)post_attribute_clamps.to_string(), stringize(
void UGasaAttributeSet::PostGameplayEffectExecute(FGameplayEffectModCallbackData const& Data)
{
Super::PostGameplayEffectExecute(Data);
FEffectProperties Props;
Props.Populate(Data);
<attribute_clamps>
}
)));
} }
body.append(PostGameplayEffectExecute);
body.append(fmt_newline);
body.append(PreAttributeChange); body.append(PreAttributeChange);
body.append(fmt_newline); body.append(fmt_newline);