diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/StringKeyConstructor.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/StringKeyConstructor.java index 568679a97..44cfded3d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/StringKeyConstructor.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/StringKeyConstructor.java @@ -4,25 +4,44 @@ import net.momirealms.craftengine.core.plugin.locale.TranslationManager; import net.momirealms.craftengine.core.util.VersionHelper; import org.yaml.snakeyaml.LoaderOptions; import org.yaml.snakeyaml.constructor.SafeConstructor; -import org.yaml.snakeyaml.nodes.MappingNode; -import org.yaml.snakeyaml.nodes.Node; -import org.yaml.snakeyaml.nodes.NodeTuple; -import org.yaml.snakeyaml.nodes.ScalarNode; +import org.yaml.snakeyaml.nodes.*; import java.nio.file.Path; import java.util.LinkedHashMap; import java.util.Map; +import static org.yaml.snakeyaml.nodes.Tag.PREFIX; +import static org.yaml.snakeyaml.nodes.Tag.standardTags; + public class StringKeyConstructor extends SafeConstructor { private final Path path; private static final String VERSION_PREFIX = "$$"; private static final String DEEP_KEY_SEPARATOR = "::"; + public static final Tag BYTE = new Tag(PREFIX + "byte"); + public static final Tag SHORT = new Tag(PREFIX + "short"); + public static final Tag LONG = new Tag(PREFIX + "long"); + public static final Tag FLOAT_SINGLE = new Tag(PREFIX + "float_single"); // 原本有个!!float解析出来的是双精度浮点数使用这个避免命名冲突 + public static final Tag FLOAT_DOUBLE = new Tag(PREFIX + "double"); + + static { + standardTags.add(BYTE); + standardTags.add(SHORT); + standardTags.add(LONG); + standardTags.add(FLOAT_SINGLE); + standardTags.add(FLOAT_DOUBLE); + } public StringKeyConstructor(Path path, LoaderOptions loaderOptions) { super(loaderOptions); + this.yamlConstructors.put(BYTE, new ConstructYamlByte()); + this.yamlConstructors.put(SHORT, new ConstructYamlShort()); + this.yamlConstructors.put(LONG, new ConstructYamlLong()); + this.yamlConstructors.put(FLOAT_SINGLE, new ConstructYamlFloatSingle()); + this.yamlConstructors.put(FLOAT_DOUBLE, new ConstructYamlDouble()); this.path = path; } + private boolean isVersionMatch(String versionSpec) { int index = versionSpec.indexOf('~'); // 没有范围值 @@ -235,4 +254,64 @@ public class StringKeyConstructor extends SafeConstructor { configKey, String.valueOf(node.getStartMark().getLine() + 1)); } -} \ No newline at end of file + + public class ConstructYamlByte extends ConstructYamlInt { + + @Override + public Object construct(Node node) { + Object value = super.construct(node); + if (value instanceof Number number) { + return number.byteValue(); + } + throw new RuntimeException("Unexpected type: " + value.getClass().getName()); + } + } + + public class ConstructYamlShort extends ConstructYamlInt { + + @Override + public Object construct(Node node) { + Object value = super.construct(node); + if (value instanceof Number number) { + return number.shortValue(); + } + throw new RuntimeException("Unexpected type: " + value.getClass().getName()); + } + } + + public class ConstructYamlLong extends ConstructYamlInt { + + @Override + public Object construct(Node node) { + Object value = super.construct(node); + if (value instanceof Number number) { + return number.longValue(); + } + throw new RuntimeException("Unexpected type: " + value.getClass().getName()); + } + } + + public class ConstructYamlFloatSingle extends ConstructYamlFloat { + + @Override + public Object construct(Node node) { + Object value = super.construct(node); + if (value instanceof Number number) { + return number.floatValue(); + } + throw new RuntimeException("Unexpected type: " + value.getClass().getName()); + } + } + + public class ConstructYamlDouble extends ConstructYamlFloat { + + @Override + public Object construct(Node node) { + Object value = super.construct(node); + if (value instanceof Number number) { + return number.doubleValue(); + } + throw new RuntimeException("Unexpected type: " + value.getClass().getName()); + } + } +}