|
|
|
@ -7,25 +7,44 @@
|
|
|
|
|
#include "GasaGenCommon.cpp"
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
void def_attribute_properties ( CodeBody body, Array<StringCached> properties );
|
|
|
|
|
void def_attribute_field_on_reps ( CodeBody body, Array<StringCached> properties );
|
|
|
|
|
void def_attribute_field_property_getters ( CodeBody body, StrC class_name, Array<StringCached> properties );
|
|
|
|
|
void def_attribute_field_value_getters ( CodeBody body, Array<StringCached> properties );
|
|
|
|
|
void def_attribute_field_value_setters ( CodeBody body, Array<StringCached> properties );
|
|
|
|
|
void def_attribute_field_property_setter_inlines( CodeBody body, StrC class_name, Array<StringCached> properties );
|
|
|
|
|
void def_attribute_field_initers ( CodeBody body, Array<StringCached> properties );
|
|
|
|
|
void impl_attribute_fields ( CodeBody body, StrC class_name, Array<StringCached> properties );
|
|
|
|
|
struct GAS_AttributeEntry
|
|
|
|
|
{
|
|
|
|
|
StringCached Name;
|
|
|
|
|
StringCached MinName;
|
|
|
|
|
StringCached MaxName;
|
|
|
|
|
float Min;
|
|
|
|
|
float Max;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Array<StringCached> get_gasa_attribute_fields()
|
|
|
|
|
void def_attribute_properties ( CodeBody body, Array<GAS_AttributeEntry> properties );
|
|
|
|
|
void def_attribute_field_on_reps ( CodeBody body, Array<GAS_AttributeEntry> properties );
|
|
|
|
|
void def_attribute_field_property_getters ( CodeBody body, StrC class_name, Array<GAS_AttributeEntry> properties );
|
|
|
|
|
void def_attribute_field_value_getters ( CodeBody body, Array<GAS_AttributeEntry> properties );
|
|
|
|
|
void def_attribute_field_value_setters ( CodeBody body, Array<GAS_AttributeEntry> properties );
|
|
|
|
|
void def_attribute_field_property_setter_inlines( CodeBody body, StrC class_name, Array<GAS_AttributeEntry> properties );
|
|
|
|
|
void def_attribute_field_initers ( CodeBody body, Array<GAS_AttributeEntry> properties );
|
|
|
|
|
void impl_attribute_fields ( CodeBody body, StrC class_name, Array<GAS_AttributeEntry> properties );
|
|
|
|
|
|
|
|
|
|
Array<GAS_AttributeEntry> get_gasa_attribute_fields()
|
|
|
|
|
{
|
|
|
|
|
local_persist
|
|
|
|
|
Array<StringCached> attribute_fields = Array<StringCached>::init_reserve(GlobalAllocator, 64);
|
|
|
|
|
Array<GAS_AttributeEntry> attribute_fields = Array<GAS_AttributeEntry>::init_reserve(GlobalAllocator, 64);
|
|
|
|
|
|
|
|
|
|
for (local_persist s32 do_once = 0; do_once == 0; ++ do_once) {
|
|
|
|
|
attribute_fields.append( get_cached_string(txt("Health")));
|
|
|
|
|
attribute_fields.append( get_cached_string(txt("MaxHealth")));
|
|
|
|
|
attribute_fields.append( get_cached_string(txt("Mana")));
|
|
|
|
|
attribute_fields.append( get_cached_string(txt("MaxMana")));
|
|
|
|
|
StringCached str_Health = get_cached_string(txt("Health"));
|
|
|
|
|
StringCached str_MaxHealth = get_cached_string(txt("MaxHealth"));
|
|
|
|
|
StringCached str_Mana = get_cached_string(txt("Mana"));
|
|
|
|
|
StringCached str_MaxMana = get_cached_string(txt("MaxMana"));
|
|
|
|
|
|
|
|
|
|
GAS_AttributeEntry Health = { str_Health, {nullptr}, str_MaxHealth, 0, 100.f };
|
|
|
|
|
GAS_AttributeEntry MaxHealth = { str_MaxHealth, {nullptr}, {nullptr}, 0, 99999.f };
|
|
|
|
|
GAS_AttributeEntry Mana = { str_Mana, {nullptr}, str_MaxMana, 0, 50.f };
|
|
|
|
|
GAS_AttributeEntry MaxMana = { str_MaxMana, {nullptr}, {nullptr}, 0, 99999.f };
|
|
|
|
|
|
|
|
|
|
attribute_fields.append(Health);
|
|
|
|
|
attribute_fields.append(MaxHealth);
|
|
|
|
|
attribute_fields.append(Mana);
|
|
|
|
|
attribute_fields.append(MaxMana);
|
|
|
|
|
}
|
|
|
|
|
return attribute_fields;
|
|
|
|
|
}
|
|
|
|
@ -35,7 +54,7 @@ void gen_UGasaAttributeSet()
|
|
|
|
|
CodeType type_UAttributeSet = def_type( txt("UAttributeSet") );
|
|
|
|
|
CodeComment generation_notice = def_comment(txt("Generated by GasaGen/GasaGen_UGasaAttributeSet.cpp"));
|
|
|
|
|
|
|
|
|
|
Array<StringCached> attribute_fields = get_gasa_attribute_fields();
|
|
|
|
|
Array<GAS_AttributeEntry> attribute_fields = get_gasa_attribute_fields();
|
|
|
|
|
|
|
|
|
|
StrC class_name = txt("UGasaAttributeSet");
|
|
|
|
|
|
|
|
|
@ -57,32 +76,39 @@ void gen_UGasaAttributeSet()
|
|
|
|
|
body.append( UHT_GENERATED_BODY);
|
|
|
|
|
body.append( access_public );
|
|
|
|
|
|
|
|
|
|
def_attribute_properties( body, attribute_fields);
|
|
|
|
|
|
|
|
|
|
body.append(fmt_newline);
|
|
|
|
|
body.append( def_constructor() );
|
|
|
|
|
body.append(fmt_newline);
|
|
|
|
|
|
|
|
|
|
def_attribute_properties( body, attribute_fields);
|
|
|
|
|
body.append(fmt_newline);
|
|
|
|
|
def_attribute_field_on_reps( body, attribute_fields);
|
|
|
|
|
|
|
|
|
|
body.append(fmt_newline);
|
|
|
|
|
|
|
|
|
|
body.append( fmt_newline );
|
|
|
|
|
body.append( def_pragma(code( region Getters )));
|
|
|
|
|
body.append( def_pragma(txt( "region Getters" )));
|
|
|
|
|
def_attribute_field_property_getters( body, class_name, attribute_fields );
|
|
|
|
|
body.append( fmt_newline );
|
|
|
|
|
def_attribute_field_value_getters( body, attribute_fields );
|
|
|
|
|
body.append( def_pragma(code( endregion Getters )));
|
|
|
|
|
body.append( def_pragma(txt( "endregion Getters" )));
|
|
|
|
|
body.append( fmt_newline );
|
|
|
|
|
|
|
|
|
|
body.append( def_pragma(code( region Setters )));
|
|
|
|
|
body.append( def_pragma(txt( "region Setters" )));
|
|
|
|
|
def_attribute_field_value_setters( body, attribute_fields );
|
|
|
|
|
body.append( fmt_newline );
|
|
|
|
|
body.append( fmt_newline );
|
|
|
|
|
def_attribute_field_initers( body, attribute_fields );
|
|
|
|
|
body.append( def_pragma(code( endregion Setters )));
|
|
|
|
|
body.append( def_pragma(txt( "endregion Setters" )));
|
|
|
|
|
body.append( fmt_newline );
|
|
|
|
|
|
|
|
|
|
body.append( def_pragma( txt("region AttributeSet")));
|
|
|
|
|
body.append( code_str(
|
|
|
|
|
void PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) override;
|
|
|
|
|
// void PostAttributeChange(const FGameplayAttribute& Attribute, float OldValue, float NewValue) override;
|
|
|
|
|
));
|
|
|
|
|
body.append( def_pragma( txt("endregion AttributeSet")));
|
|
|
|
|
body.append(fmt_newline);
|
|
|
|
|
|
|
|
|
|
body.append( def_pragma( txt("region UObject")));
|
|
|
|
|
CodeFn GetLifetimeOfReplicatedProps = parse_function( code(
|
|
|
|
|
void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
|
|
|
|
@ -165,14 +191,54 @@ void gen_UGasaAttributeSet()
|
|
|
|
|
|
|
|
|
|
impl_attribute_fields( body, class_name, attribute_fields);
|
|
|
|
|
|
|
|
|
|
CodeFn PreAttributeChange;
|
|
|
|
|
{
|
|
|
|
|
CodeBody attribute_clamps = def_body( CodeT::Function_Body );
|
|
|
|
|
attribute_clamps.append(fmt_newline);
|
|
|
|
|
attribute_clamps.append(fmt_newline);
|
|
|
|
|
for (GAS_AttributeEntry field : attribute_fields)
|
|
|
|
|
{
|
|
|
|
|
String clamp_min;
|
|
|
|
|
if (field.MinName.Data)
|
|
|
|
|
clamp_min = get_cached_string(token_fmt( "MinName", (StrC)field.MinName, "Get<MinName>()"));
|
|
|
|
|
else
|
|
|
|
|
clamp_min = String::fmt_buf(GlobalAllocator, "%f", field.Min);
|
|
|
|
|
|
|
|
|
|
String clamp_max;
|
|
|
|
|
if (field.MaxName.Data)
|
|
|
|
|
clamp_max = get_cached_string(token_fmt( "MaxName", (StrC)field.MaxName, "Get<MaxName>()"));
|
|
|
|
|
else
|
|
|
|
|
clamp_max = String::fmt_buf(GlobalAllocator, "%f", field.Max);
|
|
|
|
|
|
|
|
|
|
attribute_clamps.append( code_fmt(
|
|
|
|
|
"field", (StrC)field.Name,
|
|
|
|
|
"clamp_min", (StrC)clamp_min,
|
|
|
|
|
"clamp_max", (StrC)clamp_max,
|
|
|
|
|
stringize(
|
|
|
|
|
if (Attribute == Get<field>Attribute())
|
|
|
|
|
{
|
|
|
|
|
NewValue = FMath::Clamp(NewValue, <clamp_min>, <clamp_max>);
|
|
|
|
|
}
|
|
|
|
|
)));
|
|
|
|
|
}
|
|
|
|
|
PreAttributeChange = parse_function( token_fmt( "attribute_clamps", (StrC)attribute_clamps.to_string(), stringize(
|
|
|
|
|
void UGasaAttributeSet::PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue)
|
|
|
|
|
{
|
|
|
|
|
Super::PreAttributeChange(Attribute, NewValue);
|
|
|
|
|
<attribute_clamps>
|
|
|
|
|
}
|
|
|
|
|
)));
|
|
|
|
|
}
|
|
|
|
|
body.append(PreAttributeChange);
|
|
|
|
|
|
|
|
|
|
CodeFn GetLifetimeOfReplicatedProps;
|
|
|
|
|
{
|
|
|
|
|
CodeBody field_lifetimes = def_body( CodeT::Function_Body);
|
|
|
|
|
field_lifetimes.append(fmt_newline);
|
|
|
|
|
field_lifetimes.append(fmt_newline);
|
|
|
|
|
for (StringCached field : attribute_fields)
|
|
|
|
|
for (GAS_AttributeEntry field : attribute_fields)
|
|
|
|
|
{
|
|
|
|
|
field_lifetimes.append( code_fmt( "field", (StrC)field, stringize(
|
|
|
|
|
field_lifetimes.append( code_fmt( "field", (StrC)field.Name, stringize(
|
|
|
|
|
DOREPLIFETIME_DEFAULT_GAS(UGasaAttributeSet, <field>);
|
|
|
|
|
)));
|
|
|
|
|
}
|
|
|
|
@ -194,44 +260,39 @@ void gen_UGasaAttributeSet()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void def_attribute_properties( CodeBody body, Array<StringCached> properties )
|
|
|
|
|
void def_attribute_properties( CodeBody body, Array<GAS_AttributeEntry> properties )
|
|
|
|
|
{
|
|
|
|
|
for ( StringCached property : properties )
|
|
|
|
|
for ( GAS_AttributeEntry property : properties )
|
|
|
|
|
{
|
|
|
|
|
Code field_uproperty = code_fmt( "property", (StrC)property, stringize(
|
|
|
|
|
Code field_uproperty = code_fmt( "property", (StrC)property.Name, stringize(
|
|
|
|
|
UPROPERTY(ReplicatedUsing=Client_OnRep_<property>, EditAnywhere, BlueprintReadWrite, Category="Attributes")
|
|
|
|
|
FGameplayAttributeData <property>;
|
|
|
|
|
));
|
|
|
|
|
|
|
|
|
|
CodeType type_FGameplayAttributeData = def_type( txt("FGameplayAttributeData"));
|
|
|
|
|
|
|
|
|
|
body.append(fmt_newline);
|
|
|
|
|
body.append( field_uproperty );
|
|
|
|
|
body.append(fmt_newline);
|
|
|
|
|
body.append( def_variable( type_FGameplayAttributeData, StrC(property)) );
|
|
|
|
|
body.append(field_uproperty);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void def_attribute_field_on_reps( CodeBody body, Array<StringCached> properties )
|
|
|
|
|
void def_attribute_field_on_reps( CodeBody body, Array<GAS_AttributeEntry> properties )
|
|
|
|
|
{
|
|
|
|
|
for ( StringCached property : properties )
|
|
|
|
|
for ( GAS_AttributeEntry property : properties )
|
|
|
|
|
{
|
|
|
|
|
Code umeta_UFUNCTION = code_str( UFUNCTION() );
|
|
|
|
|
|
|
|
|
|
body.append(fmt_newline);
|
|
|
|
|
body.append( umeta_UFUNCTION );
|
|
|
|
|
body.append(fmt_newline);
|
|
|
|
|
body.append( code_fmt( "property", (StrC)property, stringize(
|
|
|
|
|
body.append( code_fmt( "property", (StrC)property.Name, stringize(
|
|
|
|
|
void Client_OnRep_<property>(FGameplayAttributeData& Prev<property>);
|
|
|
|
|
)));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void def_attribute_field_property_getters( CodeBody body, StrC class_name, Array<StringCached> properties )
|
|
|
|
|
void def_attribute_field_property_getters( CodeBody body, StrC class_name, Array<GAS_AttributeEntry> properties )
|
|
|
|
|
{
|
|
|
|
|
for ( String property : properties )
|
|
|
|
|
for ( GAS_AttributeEntry property : properties )
|
|
|
|
|
{
|
|
|
|
|
CodeFn generated_get_attribute = parse_function(
|
|
|
|
|
token_fmt( "class_name", class_name, "property", (StrC)property,
|
|
|
|
|
token_fmt( "class_name", class_name, "property", (StrC)property.Name,
|
|
|
|
|
stringize(
|
|
|
|
|
static FGameplayAttribute Get<property>Attribute()
|
|
|
|
|
{
|
|
|
|
@ -245,11 +306,11 @@ void def_attribute_field_property_getters( CodeBody body, StrC class_name, Array
|
|
|
|
|
|
|
|
|
|
#pragma push_macro("FORCEINLINE")
|
|
|
|
|
#undef FORCEINLINE
|
|
|
|
|
void def_attribute_field_value_getters( CodeBody body, Array<StringCached> properties )
|
|
|
|
|
void def_attribute_field_value_getters( CodeBody body, Array<GAS_AttributeEntry> properties )
|
|
|
|
|
{
|
|
|
|
|
for ( String property : properties )
|
|
|
|
|
for ( GAS_AttributeEntry property : properties )
|
|
|
|
|
{
|
|
|
|
|
body.append( code_fmt( "property", (StrC)property,
|
|
|
|
|
body.append( code_fmt( "property", (StrC)property.Name,
|
|
|
|
|
stringize(
|
|
|
|
|
FORCEINLINE float Get<property>() const
|
|
|
|
|
{
|
|
|
|
@ -259,24 +320,24 @@ void def_attribute_field_value_getters( CodeBody body, Array<StringCached> prope
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void def_attribute_field_value_setters( CodeBody body, Array<StringCached> properties )
|
|
|
|
|
void def_attribute_field_value_setters( CodeBody body, Array<GAS_AttributeEntry> properties )
|
|
|
|
|
{
|
|
|
|
|
for ( String property : properties )
|
|
|
|
|
for ( GAS_AttributeEntry property : properties )
|
|
|
|
|
{
|
|
|
|
|
body.append( code_fmt( "property", (StrC)property,
|
|
|
|
|
body.append( code_fmt( "property", (StrC)property.Name,
|
|
|
|
|
stringize(
|
|
|
|
|
FORCEINLINE void Set<property>(float NewVal);
|
|
|
|
|
)));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void def_attribute_field_property_setter_inlines( CodeBody body, StrC class_name, Array<StringCached> properties )
|
|
|
|
|
void def_attribute_field_property_setter_inlines( CodeBody body, StrC class_name, Array<GAS_AttributeEntry> properties )
|
|
|
|
|
{
|
|
|
|
|
body.append(def_pragma( txt("region Attribute Setters")));
|
|
|
|
|
for ( String property : properties )
|
|
|
|
|
for ( GAS_AttributeEntry property : properties )
|
|
|
|
|
{
|
|
|
|
|
CodeFn generated_get_attribute = parse_function(
|
|
|
|
|
token_fmt( "class_name", class_name, "property", (StrC)property,
|
|
|
|
|
token_fmt( "class_name", class_name, "property", (StrC)property.Name,
|
|
|
|
|
stringize(
|
|
|
|
|
FORCEINLINE void <class_name>::Set<property>(float NewVal)
|
|
|
|
|
{
|
|
|
|
@ -292,11 +353,11 @@ void def_attribute_field_property_setter_inlines( CodeBody body, StrC class_name
|
|
|
|
|
body.append(def_pragma( txt("endregion Attribute Setters")));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void def_attribute_field_initers ( CodeBody body, Array<StringCached> properties )
|
|
|
|
|
void def_attribute_field_initers ( CodeBody body, Array<GAS_AttributeEntry> properties )
|
|
|
|
|
{
|
|
|
|
|
for ( String property : properties )
|
|
|
|
|
for ( GAS_AttributeEntry property : properties )
|
|
|
|
|
{
|
|
|
|
|
body.append( code_fmt( "property", (StrC)property,
|
|
|
|
|
body.append( code_fmt( "property", (StrC)property.Name,
|
|
|
|
|
stringize(
|
|
|
|
|
FORCEINLINE void Init<property>(float NewVal)
|
|
|
|
|
{
|
|
|
|
@ -307,14 +368,14 @@ void def_attribute_field_initers ( CodeBody body, Array<StringCached> properties
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void impl_attribute_fields( CodeBody body, StrC class_name, Array<StringCached> properties )
|
|
|
|
|
void impl_attribute_fields( CodeBody body, StrC class_name, Array<GAS_AttributeEntry> properties )
|
|
|
|
|
{
|
|
|
|
|
body.append(fmt_newline);
|
|
|
|
|
body.append(def_pragma( txt("region Rep Notifies")));
|
|
|
|
|
for ( String property : properties )
|
|
|
|
|
for ( GAS_AttributeEntry property : properties )
|
|
|
|
|
{
|
|
|
|
|
CodeFn field_impl = parse_function( token_fmt(
|
|
|
|
|
"class_name", class_name, "property", (StrC)property, "from_notice", txt("\n// From GAMEPLAYATTRIBUTE_REPNOTIFY\n"),
|
|
|
|
|
"class_name", class_name, "property", (StrC)property.Name, "from_notice", txt("\n// From GAMEPLAYATTRIBUTE_REPNOTIFY\n"),
|
|
|
|
|
stringize(
|
|
|
|
|
void <class_name>::Client_OnRep_<property>(FGameplayAttributeData& Prev<property>)
|
|
|
|
|
{
|
|
|
|
|