Skip to content

Commit

Permalink
Store the number of arguments in post fix instead of the variable names
Browse files Browse the repository at this point in the history
Makes it slightly more bulky to deserialize, but means I only need an int to read from the network, will prevent needing to sync variable names ot the client and make serializing a bit easier
  • Loading branch information
KnightMiner committed Dec 31, 2023
1 parent f7e1b0f commit d69c5b6
Show file tree
Hide file tree
Showing 7 changed files with 25 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public sealed interface ModifierFormula permits PostFixFormula, SimpleLevelingFo
float apply(float... arguments);

/** Serializes this object to JSON */
JsonObject serialize(JsonObject json);
JsonObject serialize(JsonObject json, String[] variableNames);

/** Writes this object to the network */
void toNetwork(FriendlyByteBuf buffer);
Expand All @@ -52,17 +52,17 @@ static ModifierFormula deserialize(JsonObject json, String[] variableNames, Fall
/**
* Reads a formula from the network
* @param buffer Buffer instance
* @param variableNames Variable names for when post fix is used
* @param numArguments Number of arguments for the formula for validation
* @param fallback Fallback for when not using post fix
* @return Formula object
*/
static ModifierFormula fromNetwork(FriendlyByteBuf buffer, String[] variableNames, FallbackFormula fallback) {
static ModifierFormula fromNetwork(FriendlyByteBuf buffer, int numArguments, FallbackFormula fallback) {
short size = buffer.readShort();
if (size == -1) {
LevelingValue leveling = LevelingValue.fromNetwork(buffer);
return new SimpleLevelingFormula(leveling, fallback);
}
return PostFixFormula.fromNetwork(buffer, size, variableNames);
return PostFixFormula.fromNetwork(buffer, size, numArguments);
}

/** Formula to use when not using the post fix formula */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,12 @@
import java.util.List;

/** Performs a math formula using a post fix calculator */
public record PostFixFormula(List<StackOperation> operations, String[] variableNames) implements ModifierFormula {
public record PostFixFormula(List<StackOperation> operations, int numArguments) implements ModifierFormula {
@Override
public float apply(float... values) {
// must have the right number of values to evaluate
if (values.length != variableNames.length) {
throw new IllegalArgumentException("Expected " + variableNames.length + " arguments, but received " + values.length);
if (values.length != numArguments) {
throw new IllegalArgumentException("Expected " + numArguments + " arguments, but received " + values.length);
}
AbstractFloatList stack = new FloatArrayList(5);
for (StackOperation operation : operations) {
Expand All @@ -44,7 +44,7 @@ public float computeLevel(IToolContext tool, ModifierEntry modifier) {
* @throws RuntimeException if something is invalid in the formula
*/
public void validateFormula() {
apply(new float[variableNames.length]);
apply(new float[numArguments]);
}

/** Deserializes a formula from JSON */
Expand All @@ -54,12 +54,12 @@ public static PostFixFormula deserialize(JsonObject json, String[] variableNames
return StackOperation.deserialize(element.getAsJsonPrimitive(), variableNames);
}
throw new JsonSyntaxException("Expected " + key + " to be a string or number, was " + GsonHelper.getType(element));
}), variableNames);
}), variableNames.length);
}

/** Serializes this object to JSON */
@Override
public JsonObject serialize(JsonObject json) {
public JsonObject serialize(JsonObject json, String[] variableNames) {
JsonArray array = new JsonArray();
for (StackOperation operation : operations) {
array.add(operation.serialize(variableNames));
Expand All @@ -69,17 +69,17 @@ public JsonObject serialize(JsonObject json) {
}

/** Reads a formula from the network */
public static PostFixFormula fromNetwork(FriendlyByteBuf buffer, String[] variableNames) {
return fromNetwork(buffer, buffer.readShort(), variableNames);
public static PostFixFormula fromNetwork(FriendlyByteBuf buffer, int numArguments) {
return fromNetwork(buffer, buffer.readShort(), numArguments);
}

/** Common logic between {@link #fromNetwork(FriendlyByteBuf, String[])} and {@link ModifierFormula#fromNetwork(FriendlyByteBuf, String[], FallbackFormula)} */
static PostFixFormula fromNetwork(FriendlyByteBuf buffer, short size, String[] variableNames) {
/** Common logic between {@link #fromNetwork(FriendlyByteBuf, int)} and {@link ModifierFormula#fromNetwork(FriendlyByteBuf, int, FallbackFormula)} */
static PostFixFormula fromNetwork(FriendlyByteBuf buffer, short size, int numArguments) {
ImmutableList.Builder<StackOperation> builder = ImmutableList.builder();
for (int i = 0; i < size; i++) {
builder.add(StackOperation.fromNetwork(buffer));
}
return new PostFixFormula(builder.build(), variableNames);
return new PostFixFormula(builder.build(), numArguments);
}

/** Writes this formula to the network */
Expand Down Expand Up @@ -151,7 +151,7 @@ public T power() {

/** Validates and builds the formula */
public PostFixFormula buildFormula() {
PostFixFormula formula = new PostFixFormula(operations.build(), variableNames);
PostFixFormula formula = new PostFixFormula(operations.build(), variableNames.length);
formula.validateFormula();
return formula;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public float computeLevel(IToolContext tool, ModifierEntry modifier) {
}

@Override
public JsonObject serialize(JsonObject json) {
public JsonObject serialize(JsonObject json, String[] variableNames) {
return leveling.serialize(json);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,12 @@ public T deserialize(JsonObject json) {
@Override
public void serialize(T object, JsonObject json) {
object.condition().serializeInto(json);
object.formula().serialize(json);
object.formula().serialize(json, variables);
}

@Override
public T fromNetwork(FriendlyByteBuf buffer) {
return constructor.apply(ModifierFormula.fromNetwork(buffer, variables, fallbackFormula), ModifierModuleCondition.fromNetwork(buffer));
return constructor.apply(ModifierFormula.fromNetwork(buffer, variables.length, fallbackFormula), ModifierModuleCondition.fromNetwork(buffer));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ public void serialize(ConditionalDamageModule object, JsonObject json) {
object.condition.serializeInto(json);
json.add("target", LivingEntityPredicate.LOADER.serialize(object.target));
json.addProperty("percent", object.percent);
object.formula.serialize(json);
object.formula.serialize(json, VARIABLES);
}

@Override
Expand All @@ -127,7 +127,7 @@ public ConditionalDamageModule fromNetwork(FriendlyByteBuf buffer) {
return new ConditionalDamageModule(
LivingEntityPredicate.LOADER.fromNetwork(buffer),
LivingEntityPredicate.LOADER.fromNetwork(buffer),
ModifierFormula.fromNetwork(buffer, VARIABLES, percent ? PERCENT : BOOST), percent,
ModifierFormula.fromNetwork(buffer, VARIABLES.length, percent ? PERCENT : BOOST), percent,
ModifierModuleCondition.fromNetwork(buffer));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,14 +72,14 @@ public KnockbackModule deserialize(JsonObject json) {
public void serialize(KnockbackModule object, JsonObject json) {
object.condition.serializeInto(json);
json.add("entity", LivingEntityPredicate.LOADER.serialize(object.entity));
object.formula.serialize(json);
object.formula.serialize(json, VARIABLES);
}

@Override
public KnockbackModule fromNetwork(FriendlyByteBuf buffer) {
return new KnockbackModule(
LivingEntityPredicate.LOADER.fromNetwork(buffer),
ModifierFormula.fromNetwork(buffer, VARIABLES, FALLBACK_FORMULA),
ModifierFormula.fromNetwork(buffer, VARIABLES.length, FALLBACK_FORMULA),
ModifierModuleCondition.fromNetwork(buffer)
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ public void serialize(ConditionalMiningSpeedModule object, JsonObject json) {
json.add("entity", LivingEntityPredicate.LOADER.serialize(object.holder));
json.addProperty("require_effective", object.requireEffective);
json.addProperty("percent", object.percent);
object.formula.serialize(json);
object.formula.serialize(json, VARIABLES);
}

@Override
Expand All @@ -126,7 +126,7 @@ public ConditionalMiningSpeedModule fromNetwork(FriendlyByteBuf buffer) {
BlockPredicate.LOADER.fromNetwork(buffer),
LivingEntityPredicate.LOADER.fromNetwork(buffer),
buffer.readBoolean(),
ModifierFormula.fromNetwork(buffer, VARIABLES, percent ? PERCENT : BOOST), percent,
ModifierFormula.fromNetwork(buffer, VARIABLES.length, percent ? PERCENT : BOOST), percent,
ModifierModuleCondition.fromNetwork(buffer)
);
}
Expand Down

0 comments on commit d69c5b6

Please sign in to comment.