Fixed only the issue about "BOOLEAN" occurring when importing resources. (#2028)

* Only Fix 'Exception in thread 'main' com.google.gson.JsonSyntaxException: java.io.IOException: Invalid DynamicFloat definition - BOOLEAN' problem.

* Update ResourceLoader.java

* Modify code indentation and optimization.

* Update JsonUtils.java

* Update JsonUtils.java

* Update DynamicFloat.java

---------

Co-authored-by: Magix <27646710+KingRainbow44@users.noreply.github.com>
This commit is contained in:
Lemon_miaow 2023-02-16 08:31:09 +08:00 committed by GitHub
parent 1a50cccb38
commit 11351d9866
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 33 additions and 3 deletions

View File

@ -6,7 +6,7 @@ import emu.grasscutter.utils.Position;
import emu.grasscutter.utils.Utils;
public final class GameConstants {
public static String VERSION = "3.3.0";
public static String VERSION = "3.4.0";
public static final int DEFAULT_TEAMS = 4;
public static final int MAX_TEAMS = 10;

View File

@ -1,20 +1,25 @@
package emu.grasscutter.data.common;
import java.util.List;
import java.util.Optional;
import it.unimi.dsi.fastutil.floats.FloatArrayList;
import it.unimi.dsi.fastutil.objects.Object2FloatArrayMap;
import it.unimi.dsi.fastutil.objects.Object2FloatMap;
import lombok.val;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.luaj.vm2.ast.Str;
public class DynamicFloat {
public static DynamicFloat ZERO = new DynamicFloat(0f);
public static class StackOp {
enum Op {CONSTANT, KEY, ADD, SUB, MUL, DIV};
enum Op { CONSTANT, KEY, ADD, SUB, MUL, DIV, NEXBOOLEAN };
public Op op;
public float fValue;
public String sValue;
public boolean bValue;
public StackOp(String s) {
switch (s.toUpperCase()) {
@ -28,12 +33,17 @@ public class DynamicFloat {
}
}
}
public StackOp(boolean b) {
this.op = Op.NEXBOOLEAN;
this.bValue = Boolean.parseBoolean(String.valueOf(b));
}
public StackOp(float f) {
this.op = Op.CONSTANT;
this.fValue = f;
}
}
private List<StackOp> ops;
private boolean dynamic = false;
private float constant = 0f;
@ -42,11 +52,22 @@ public class DynamicFloat {
this.constant = constant;
}
public String toString(boolean nextBoolean) {
String key = String.valueOf(nextBoolean);
this.ops = List.of(new StackOp(key));
return ops.toString();
}
public DynamicFloat(String key) {
this.dynamic = true;
this.ops = List.of(new StackOp(key));
}
public DynamicFloat(boolean b) {
this.dynamic = true;
this.ops = List.of(new StackOp(String.valueOf(b)));
}
public DynamicFloat(List<StackOp> ops) {
this.dynamic = true;
this.ops = ops;
@ -69,8 +90,10 @@ public class DynamicFloat {
case SUB -> fl.push(-fl.popFloat() + fl.popFloat()); // [f0, f1, f2] -> [f0, f1-f2] (opposite of RPN order)
case MUL -> fl.push(fl.popFloat() * fl.popFloat());
case DIV -> fl.push((1f/fl.popFloat()) * fl.popFloat()); // [f0, f1, f2] -> [f0, f1/f2]
case NEXBOOLEAN -> fl.push(props.getOrDefault(Optional.of(op.bValue), 0f));
}
}
return fl.popFloat(); // well-formed data will always have only one value left at this point
}
}

View File

@ -19,6 +19,10 @@ import it.unimi.dsi.fastutil.ints.IntArrayList;
import it.unimi.dsi.fastutil.ints.IntList;
import lombok.val;
import static com.google.gson.stream.JsonToken.BEGIN_ARRAY;
import static com.google.gson.stream.JsonToken.BEGIN_OBJECT;
import static emu.grasscutter.utils.JsonUtils.gson;
public class JsonAdapters {
static class DynamicFloatAdapter extends TypeAdapter<DynamicFloat> {
@Override
@ -28,6 +32,8 @@ public class JsonAdapters {
return new DynamicFloat(reader.nextString());
case NUMBER:
return new DynamicFloat((float) reader.nextDouble());
case BOOLEAN:
return new DynamicFloat(reader.nextBoolean());
case BEGIN_ARRAY:
reader.beginArray();
val opStack = new ArrayList<DynamicFloat.StackOp>();
@ -35,6 +41,7 @@ public class JsonAdapters {
opStack.add(switch (reader.peek()) {
case STRING -> new DynamicFloat.StackOp(reader.nextString());
case NUMBER -> new DynamicFloat.StackOp((float) reader.nextDouble());
case BOOLEAN -> new DynamicFloat.StackOp(reader.nextBoolean());
default -> throw new IOException("Invalid DynamicFloat definition - " + reader.peek().name());
});
}
@ -122,7 +129,7 @@ public class JsonAdapters {
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
Class<T> enumClass = (Class<T>) type.getRawType();
if (!enumClass.isEnum()) return null;
// Make mappings of (string) names to enum constants
val map = new HashMap<String, T>();
val enumConstants = enumClass.getEnumConstants();