64. Properly Clamping Attributes
This commit is contained in:
parent
3a3f0c0271
commit
067c2f03c5
@ -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 )
|
||||||
|
@ -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 );
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user