From 817735ca08fb5bbbc71d61f6f13c200c8251e7fd Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Tue, 25 Mar 2025 12:28:17 +0800 Subject: [PATCH] =?UTF-8?q?feat(block):=20=E6=94=B9=E5=96=84mod=E7=8E=A9?= =?UTF-8?q?=E5=AE=B6=E5=88=A4=E6=96=AD=E7=9A=84=E6=97=B6=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/network/BukkitNetworkManager.java | 2 +- .../client/CraftEngineFabricModClient.java | 65 ++++++++++--------- .../client/network/CraftEnginePayload.java | 4 +- .../craft-engine-fabric-mod/lang/en_us.json | 3 +- .../craft-engine-fabric-mod/lang/zh_cn.json | 3 +- 5 files changed, 38 insertions(+), 39 deletions(-) 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 c60fb6f0b..d7f9b23f9 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 @@ -163,7 +163,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener { } // for mod - @EventHandler + @EventHandler(priority = EventPriority.LOWEST) public void onPlayerRegisterChannel(PlayerRegisterChannelEvent event) { if (!event.getChannel().equals(MOD_CHANNEL)) return; Player player = event.getPlayer(); 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 5f912f868..b4e39a37f 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 @@ -2,14 +2,15 @@ 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; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.block.Block; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.color.world.BiomeColors; -import net.minecraft.client.gui.screen.DisconnectedScreen; +import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.client.render.RenderLayer; import net.minecraft.network.DisconnectionInfo; import net.minecraft.registry.Registries; @@ -29,6 +30,17 @@ public class CraftEngineFabricModClient implements ClientModInitializer { @Override public void onInitializeClient() { PayloadTypeRegistry.playS2C().register(CraftEnginePayload.ID, CraftEnginePayload.CODEC); + registerRenderLayer(); + ClientPlayConnectionEvents.INIT.register((handler, client) -> { + if (ModConfig.enableNetwork) { + registerChannel(handler, client); + } else { + ClientPlayNetworking.unregisterGlobalReceiver(CraftEnginePayload.ID.id()); + } + }); + } + + public static void registerRenderLayer() { Registries.BLOCK.forEach(block -> { Identifier id = Registries.BLOCK.getId(block); if (id.getNamespace().equals(CraftEngineFabricModClient.MOD_ID)) { @@ -38,36 +50,6 @@ public class CraftEngineFabricModClient implements ClientModInitializer { } } }); - ClientTickEvents.START_CLIENT_TICK.register(client -> { - if (!ModConfig.enableNetwork) { - ClientPlayNetworking.unregisterGlobalReceiver(CraftEnginePayload.ID.id()); - return; - } - ClientPlayNetworking.registerGlobalReceiver(CraftEnginePayload.ID, (payload, context) -> { - 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) { - if (client.player != null) { - client.player.networkHandler.getConnection().disconnect( - new DisconnectionInfo( - Text.translatable("disconnect.craftengine.block_registry_mismatch", Block.STATE_IDS.size(), blockRegistrySize), - Optional.of(FabricLoader.getInstance().getConfigDir().resolve("craft-engine-fabric-mod/mappings.yml")), - Optional.of(URI.create("https://github.com/Xiao-MoMi/craft-engine")) - ) - ); - } else { - client.disconnect(new DisconnectedScreen( - client.currentScreen, - Text.translatable("disconnect.craftengine.title"), - Text.translatable("disconnect.craftengine.block_registry_mismatch", Block.STATE_IDS.size(), blockRegistrySize)) - ); - } - } - } - }); - }); } public static void registerColor(Block block) { @@ -81,4 +63,23 @@ public class CraftEngineFabricModClient implements ClientModInitializer { block ); } + + private static void registerChannel(ClientPlayNetworkHandler handler, MinecraftClient client) { + ClientPlayNetworking.registerGlobalReceiver(CraftEnginePayload.ID, (payload, context) -> { + 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) { + handler.getConnection().disconnect( + new DisconnectionInfo( + Text.translatable("disconnect.craftengine.block_registry_mismatch", Block.STATE_IDS.size(), blockRegistrySize), + Optional.of(FabricLoader.getInstance().getConfigDir().resolve("craft-engine-fabric-mod/mappings.yml")), + Optional.of(URI.create("https://github.com/Xiao-MoMi/craft-engine")) + ) + ); + } + } + }); + } } diff --git a/client-mod/src/client/java/net/momirealms/craftengine/fabric/client/network/CraftEnginePayload.java b/client-mod/src/client/java/net/momirealms/craftengine/fabric/client/network/CraftEnginePayload.java index b8b27ff44..eb8e5add2 100644 --- a/client-mod/src/client/java/net/momirealms/craftengine/fabric/client/network/CraftEnginePayload.java +++ b/client-mod/src/client/java/net/momirealms/craftengine/fabric/client/network/CraftEnginePayload.java @@ -6,8 +6,8 @@ import net.minecraft.network.packet.CustomPayload; import net.minecraft.util.Identifier; public record CraftEnginePayload(byte[] data) implements CustomPayload { - public static final Identifier ADD_CRAFTENGINE_BLOCK = Identifier.of("craftengine", "payload"); - public static final Id ID = new Id<>(CraftEnginePayload.ADD_CRAFTENGINE_BLOCK); + public static final Identifier CRAFTENGINE_PAYLOAD = Identifier.of("craftengine", "payload"); + public static final Id ID = new Id<>(CraftEnginePayload.CRAFTENGINE_PAYLOAD); public static final PacketCodec CODEC = PacketCodec.tuple( new ByteArrayCodec(), CraftEnginePayload::data, CraftEnginePayload::new 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 56313e2df..711d5c3ca 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 @@ -3,6 +3,5 @@ "category.craftengine.general": "General", "option.craftengine.enable_network": "Enable custom blocks in server", "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" + "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." } \ 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 4dd4bbc4e..c16c77c9d 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 @@ -3,6 +3,5 @@ "category.craftengine.general": "通用", "option.craftengine.enable_network": "启用服务器内自定义方块", "tooltip.craftengine.enable_network": "需要重新进入服务器以应用更改", - "disconnect.craftengine.block_registry_mismatch": "方块注册表大小不匹配. 当前: %s. 预期: %s \n 1. 确保客户端mod配置与服务端配置一致. \n 2. 不要安装任何会注册新方块的mod. \n 3. 不要使用ViaVersion.", - "disconnect.craftengine.title": "CraftEngine连接错误" + "disconnect.craftengine.block_registry_mismatch": "方块注册表大小不匹配. 当前: %s. 预期: %s \n 1. 确保客户端mod配置与服务端配置一致. \n 2. 不要安装任何会注册新方块的mod. \n 3. 不要使用ViaVersion." } \ No newline at end of file