From 2aad938393ff14b5106321b0f56c83e2d9eebf1d Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Mon, 24 Mar 2025 23:41:01 +0800 Subject: [PATCH] improve mod --- .../textures/block/custom/netherite_anvil.png | Bin 1060 -> 404 bytes .../plugin/network/BukkitNetworkManager.java | 1 + client-mod/build.gradle.kts | 1 + .../client/CraftEngineFabricModClient.java | 26 +++++++-------- .../fabric/CraftEngineFabricMod.java | 12 +++---- .../fabric/util/StringKeyConstructor.java | 31 ++++++++++++++++++ .../craftengine/fabric/util/YamlUtils.java | 24 +++++++------- .../craft-engine-fabric-mod/lang/en_us.json | 4 +-- .../craft-engine-fabric-mod/lang/zh_cn.json | 4 +-- 9 files changed, 66 insertions(+), 37 deletions(-) create mode 100644 client-mod/src/main/java/net/momirealms/craftengine/fabric/util/StringKeyConstructor.java diff --git a/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/netherite_anvil.png b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/netherite_anvil.png index a977ea20ff06b0fbb500ae3ee14419fdb1f99517..0838fe2cc0208f94720d0b88c35f023171f6e2d7 100644 GIT binary patch delta 388 zcmV-~0ek+W2$Tbm8Gix*005AYXf^-<00DDSM?wIu&K&6g00B-(L_t(Ija^d9Zo?oD z92`errx>_2iX!DBa_;|sL#5s-S*>%y7}+LDQunX~)2=Lx#Oyp4*xUIGKq~`)i5h@3 z5&!^i{Sqbsy|Y@G-dO-8p_!;{*PdSY*dW#evXLH;jU+A&^ncD4L=Y(lj|buhM70f= zsAVHbKPoI?GW#Qu#mb~?*8;~SOj?;TSzp5BiIv)(BEzNA%E(5dk)I#$l=S>P3;mB}`}L<$V?a?l)Rlxs{FNoCDyT7hC?g&c!%~#FTG(XOom4{BY@P*RGa&XOmaT zN5TBy$#A->*g#JsLGxKBXq*!L#`$Yk3EBgeuJRvrRiMc}k8Iwb1hvBY_!8^$cqL9& i|0tv$LgaaJDAh0ITG88|*>RWv0000A5BN_zbn`}il;LunMb2=5|vd45OEz&08%#9BFF+&pPN|&QGz&f z*~sNlUKtTJXws^Wp*_>aY=Vdmc($rd0YpxKqG83T?d27UH1rrX7FJlrPJogzH1B}X z`E*X3pV9=K8t5mZo`?lZfK<{mr!80XVpK&}#B2YUp~wmZO~t5vQ+XvrCZGdIf#!l5 z%kpHeK&ufo5)vYP>Q$0w`5uN1F>EBrablPk*)VzVQ8=KZPl{P7br25kVpItsTV$AW zxlETsG<1p#CkO(=@(j-hF(T;BSxEJQmfKNPkbtW>hK&qpk-nlj0cTN+!e;lgFzuSG zb9bvxat2799Hhr?8uwvjLL@E}V5Ve0P%_ekfZ^I6y_v z$w4?>Eo7zy5p+w?CiyVUab(w+Vd=2!c2^jRBFdJFR7(T06r->PZ5X=9N~sW=jPPt< zT;RAAJIF>NaY5n}A)&W7oJ>}^64Yi*V4*5kKjen$a{YcVZ5&wwj&TR*DF>QlC27&9 z?}e?acfi%_d*SMG8El5}ulBF2t{&n3@t3vU#hY690}HpjgL`}X<)!=hU7XB}kbsg3W}_Z#1m1Te{_Cl69XJsis!sfJ&$jkA}%&Hw7mO$VJ`W#Kj3}O<>Zac zr}E9@;;YHjCCpx&K6Va3rE-b1Mg1+#P#&*#?H653p0D^Wn-fK`O=SHPqs96 zXZZHR#aFvmu7y7Deta|D`DLrrc6a7h!^(%_dyS_Fs { - try { - byte[] data = payload.data(); - String decoded = new String(data, StandardCharsets.UTF_8); - if (decoded.startsWith("cp:")) { - int blockRegistrySize = Integer.parseInt(decoded.substring(3)); - if (Block.STATE_IDS.size() != blockRegistrySize) { - client.disconnect(new DisconnectedScreen( - client.currentScreen, - Text.translatable("disconnect.craftengine.title"), - Text.translatable("disconnect.craftengine.block_registry_mismatch")) - ); - } + byte[] data = payload.data(); + String decoded = new String(data, StandardCharsets.UTF_8); + if (decoded.startsWith("cp:")) { + int blockRegistrySize = Integer.parseInt(decoded.substring(3)); + if (Block.STATE_IDS.size() != blockRegistrySize) { + client.disconnect(new DisconnectedScreen( + client.currentScreen, + Text.translatable("disconnect.craftengine.title"), + Text.translatable("disconnect.craftengine.block_registry_mismatch", Block.STATE_IDS.size(), blockRegistrySize)) + ); } - } catch (Exception e) { - e.printStackTrace(); } }); }); diff --git a/client-mod/src/main/java/net/momirealms/craftengine/fabric/CraftEngineFabricMod.java b/client-mod/src/main/java/net/momirealms/craftengine/fabric/CraftEngineFabricMod.java index d73898587..1b599bc5d 100644 --- a/client-mod/src/main/java/net/momirealms/craftengine/fabric/CraftEngineFabricMod.java +++ b/client-mod/src/main/java/net/momirealms/craftengine/fabric/CraftEngineFabricMod.java @@ -26,12 +26,10 @@ public class CraftEngineFabricMod implements ModInitializer { @Override public void onInitialize() { loadConfig(); - Runtime.getRuntime().addShutdownHook(new Thread(this::saveConfig)); LoggerFilter.filter(); try { - YamlUtils.ensureConfigFile("additional-real-blocks.yml"); - YamlUtils.ensureConfigFile("mappings.yml"); - YamlUtils.ensureConfigFile("config.yml"); + YamlUtils.saveDefaultResource("additional-real-blocks.yml"); + YamlUtils.saveDefaultResource("mappings.yml"); Map map = YamlUtils.loadMappingsAndAdditionalBlocks(); for (Map.Entry entry : map.entrySet()) { Identifier replacedBlockId = entry.getKey(); @@ -46,15 +44,15 @@ public class CraftEngineFabricMod implements ModInitializer { } catch (IOException e) { e.printStackTrace(); } + Runtime.getRuntime().addShutdownHook(new Thread(this::saveConfig)); } @SuppressWarnings("unchecked") private void loadConfig() { if (!Files.exists(CONFIG_PATH)) { - saveConfig(); + ModConfig.enableNetwork = true; return; } - try (InputStream inputStream = Files.newInputStream(CONFIG_PATH)) { Yaml yaml = new Yaml(); var config = yaml.loadAs(inputStream, java.util.Map.class); @@ -68,10 +66,8 @@ public class CraftEngineFabricMod implements ModInitializer { DumperOptions options = new DumperOptions(); options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); Yaml yaml = new Yaml(options); - var data = new java.util.HashMap(); data.put("enable-network", ModConfig.enableNetwork); - try (Writer writer = Files.newBufferedWriter(CONFIG_PATH)) { yaml.dump(data, writer); } catch (IOException e) { diff --git a/client-mod/src/main/java/net/momirealms/craftengine/fabric/util/StringKeyConstructor.java b/client-mod/src/main/java/net/momirealms/craftengine/fabric/util/StringKeyConstructor.java new file mode 100644 index 000000000..2b0496bdd --- /dev/null +++ b/client-mod/src/main/java/net/momirealms/craftengine/fabric/util/StringKeyConstructor.java @@ -0,0 +1,31 @@ +package net.momirealms.craftengine.fabric.util; + +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 java.util.LinkedHashMap; +import java.util.Map; + +public class StringKeyConstructor extends SafeConstructor { + + public StringKeyConstructor(LoaderOptions loaderOptions) { + super(loaderOptions); + } + + @Override + protected Map constructMapping(MappingNode node) { + Map map = new LinkedHashMap<>(); + for (NodeTuple tuple : node.getValue()) { + Node keyNode = tuple.getKeyNode(); + Node valueNode = tuple.getValueNode(); + String key = constructScalar((ScalarNode) keyNode); + Object value = constructObject(valueNode); + map.put(key, value); + } + return map; + } +} diff --git a/client-mod/src/main/java/net/momirealms/craftengine/fabric/util/YamlUtils.java b/client-mod/src/main/java/net/momirealms/craftengine/fabric/util/YamlUtils.java index 8286589b0..e10175ced 100644 --- a/client-mod/src/main/java/net/momirealms/craftengine/fabric/util/YamlUtils.java +++ b/client-mod/src/main/java/net/momirealms/craftengine/fabric/util/YamlUtils.java @@ -9,8 +9,10 @@ import net.minecraft.registry.Registries; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.RegistryWrapper; import net.minecraft.util.Identifier; +import org.yaml.snakeyaml.LoaderOptions; import org.yaml.snakeyaml.Yaml; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; @@ -21,23 +23,25 @@ import java.util.LinkedHashMap; import java.util.Map; public class YamlUtils { - public static final String CONFIG_DIR = "config/craft-engine-fabric-mod/"; - private static final Yaml yaml = new Yaml(); + public static final Path CONFIG_DIR = Path.of("config/craft-engine-fabric-mod/"); private static final RegistryWrapper registryWrapper = BuiltinRegistries.createWrapperLookup().getOrThrow(RegistryKeys.BLOCK); public static T loadConfig(Path filePath) throws IOException { + if (!Files.exists(filePath)) { + throw new FileNotFoundException(filePath.toString()); + } try (InputStream inputStream = Files.newInputStream(filePath)) { + Yaml yaml = new Yaml(new StringKeyConstructor(new LoaderOptions())); return yaml.load(inputStream); } } - public static void ensureConfigFile(String fileName) throws IOException { - Path configDir = Path.of(CONFIG_DIR); - if (!Files.exists(configDir)) { - Files.createDirectories(configDir); + public static void saveDefaultResource(String fileName) throws IOException { + if (!Files.exists(CONFIG_DIR)) { + Files.createDirectories(CONFIG_DIR); } - Path targetPath = configDir.resolve(fileName); + Path targetPath = CONFIG_DIR.resolve(fileName); if (Files.exists(targetPath)) return; String resourcePath = "assets/craft-engine-fabric-mod/config/" + fileName; try (InputStream inputStream = YamlUtils.class.getClassLoader().getResourceAsStream(resourcePath)) { @@ -48,10 +52,9 @@ public class YamlUtils { } } - public static Map loadMappingsAndAdditionalBlocks() throws IOException { - Path mappingPath = Path.of(CONFIG_DIR + "mappings.yml"); - Path additionalYamlPath = Path.of(CONFIG_DIR + "additional-real-blocks.yml"); + Path mappingPath = CONFIG_DIR.resolve("mappings.yml"); + Path additionalYamlPath = CONFIG_DIR.resolve("additional-real-blocks.yml"); Map blockStateMappings = loadConfig(mappingPath); validateBlockStateMappings(blockStateMappings); Map blockTypeCounter = new LinkedHashMap<>(); @@ -63,7 +66,6 @@ public class YamlUtils { return buildRegisteredRealBlockSlots(blockTypeCounter, additionalYaml); } - private static void validateBlockStateMappings(Map blockStateMappings) { Map temp = new HashMap<>(blockStateMappings); for (Map.Entry entry : temp.entrySet()) { diff --git a/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/en_us.json b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/en_us.json index 4828e8338..56313e2df 100644 --- a/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/en_us.json +++ b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/en_us.json @@ -2,7 +2,7 @@ "title.craftengine.config": "CraftEngine Settings", "category.craftengine.general": "General", "option.craftengine.enable_network": "Enable custom blocks in server", - "tooltip.craftengine.enable_network": "You need to re-enter the server to take effect", - "disconnect.craftengine.block_registry_mismatch": "Block registry size mismatch!", + "tooltip.craftengine.enable_network": "Changes requires re-entering the server to take effect", + "disconnect.craftengine.block_registry_mismatch": "Block registry size mismatch. Current: %s. Expected: %s. \n 1. Make sure that the configs are the same as the server's. \n 2. Do not use any mod that might register new block. \n 3. Do not install ViaVersion.", "disconnect.craftengine.title": "CraftEngine Connection Error" } \ No newline at end of file diff --git a/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/zh_cn.json b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/zh_cn.json index ef1c36b89..4dd4bbc4e 100644 --- a/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/zh_cn.json +++ b/client-mod/src/main/resources/assets/craft-engine-fabric-mod/lang/zh_cn.json @@ -2,7 +2,7 @@ "title.craftengine.config": "CraftEngine设置", "category.craftengine.general": "通用", "option.craftengine.enable_network": "启用服务器内自定义方块", - "tooltip.craftengine.enable_network": "需要重新进入服务器即可生效", - "disconnect.craftengine.block_registry_mismatch": "方块注册表大小不匹配!", + "tooltip.craftengine.enable_network": "需要重新进入服务器以应用更改", + "disconnect.craftengine.block_registry_mismatch": "方块注册表大小不匹配. 当前: %s. 预期: %s \n 1. 确保客户端mod配置与服务端配置一致. \n 2. 不要安装任何会注册新方块的mod. \n 3. 不要使用ViaVersion.", "disconnect.craftengine.title": "CraftEngine连接错误" } \ No newline at end of file