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 a977ea20f..0838fe2cc 100644 Binary files a/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/netherite_anvil.png and b/bukkit/loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/netherite_anvil.png differ diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java index bce8d79ac..c60fb6f0b 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java @@ -26,6 +26,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerRegisterChannelEvent; import org.jetbrains.annotations.NotNull; diff --git a/client-mod/build.gradle.kts b/client-mod/build.gradle.kts index 2eab55f43..e662f9c3e 100644 --- a/client-mod/build.gradle.kts +++ b/client-mod/build.gradle.kts @@ -104,5 +104,6 @@ java { } tasks.build { + dependsOn(tasks.clean) dependsOn(tasks.shadowJar) } \ No newline at end of file diff --git a/client-mod/src/client/java/net/momirealms/craftengine/fabric/client/CraftEngineFabricModClient.java b/client-mod/src/client/java/net/momirealms/craftengine/fabric/client/CraftEngineFabricModClient.java index 6ea917713..04198be2a 100644 --- a/client-mod/src/client/java/net/momirealms/craftengine/fabric/client/CraftEngineFabricModClient.java +++ b/client-mod/src/client/java/net/momirealms/craftengine/fabric/client/CraftEngineFabricModClient.java @@ -3,6 +3,7 @@ package net.momirealms.craftengine.fabric.client; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry; import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; @@ -13,6 +14,7 @@ import net.minecraft.client.render.RenderLayer; import net.minecraft.registry.Registries; import net.minecraft.text.Text; import net.minecraft.util.Identifier; +import net.minecraft.util.crash.CrashReport; import net.minecraft.world.biome.FoliageColors; import net.momirealms.craftengine.fabric.client.config.ModConfig; import net.momirealms.craftengine.fabric.client.network.CraftEnginePayload; @@ -40,21 +42,17 @@ public class CraftEngineFabricModClient implements ClientModInitializer { return; } ClientPlayNetworking.registerGlobalReceiver(CraftEnginePayload.ID, (payload, context) -> { - 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