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 5373cac5a..139d24511 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 @@ -10,6 +10,7 @@ import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.network.impl.*; import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.bukkit.util.RegistryUtils; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.network.ConnectionState; import net.momirealms.craftengine.core.plugin.network.NetWorkUser; @@ -30,6 +31,7 @@ import org.bukkit.event.player.PlayerRegisterChannelEvent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiConsumer; @@ -166,6 +168,9 @@ public class BukkitNetworkManager implements NetworkManager, Listener { NetWorkUser user = getUser(player); if (user == null) return; user.setUsingClientMod(true); + int blockRegistrySize = RegistryUtils.currentBlockRegistrySize(); + byte[] payload = ("cp:" + blockRegistrySize).getBytes(StandardCharsets.UTF_8); + player.sendPluginMessage(plugin.bootstrap(), "craftengine:payload", payload); } @Override @@ -177,6 +182,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener { public void init() { if (init) return; try { + plugin.bootstrap().getServer().getMessenger().registerOutgoingPluginChannel(plugin.bootstrap(), "craftengine:payload"); Object server = Reflections.method$MinecraftServer$getServer.invoke(null); Object serverConnection = Reflections.field$MinecraftServer$connection.get(server); @SuppressWarnings("unchecked") diff --git a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java index f52a736a5..c1d5b2f92 100644 --- a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java +++ b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/client/CraftEngineFabricModClient.java @@ -5,18 +5,17 @@ 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.ClientPlayNetworking; import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; -import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.block.Block; +import net.minecraft.client.gui.screen.DisconnectedScreen; import net.minecraft.client.render.RenderLayer; import net.minecraft.registry.Registries; +import net.minecraft.text.Text; import net.minecraft.util.Identifier; import net.momirealms.craftEngineFabricMod.client.config.ModConfig; import net.momirealms.craftEngineFabricMod.client.network.CraftEnginePayload; import net.momirealms.craftEngineFabricMod.client.util.BlockUtils; -import net.momirealms.craftEngineFabricMod.util.YamlUtils; -import java.io.IOException; -import java.nio.file.Path; -import java.util.Map; +import java.nio.charset.StandardCharsets; public class CraftEngineFabricModClient implements ClientModInitializer { public static final String MOD_ID = "craftengine"; @@ -38,7 +37,24 @@ public class CraftEngineFabricModClient implements ClientModInitializer { ClientPlayNetworking.unregisterGlobalReceiver(CraftEnginePayload.ID.id()); return; } - ClientPlayNetworking.registerGlobalReceiver(CraftEnginePayload.ID, (payload, context) -> {}); + 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")) + ); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + }); }); } } diff --git a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java index 6b3eb2805..4e133ef22 100644 --- a/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java +++ b/client-mod/src/client/java/net/momirealms/craftEngineFabricMod/util/YamlUtils.java @@ -31,10 +31,6 @@ public class YamlUtils { } } - public static void saveConfig(Map config, Path filePath) throws IOException { - Files.writeString(filePath, yaml.dump(config)); - } - public static void ensureConfigFile(String fileName) throws IOException { Path configDir = Path.of(CONFIG_DIR); if (!Files.exists(configDir)) { 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 fccc82ec9..4828e8338 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,5 +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" + "tooltip.craftengine.enable_network": "You need to re-enter the server to take effect", + "disconnect.craftengine.block_registry_mismatch": "Block registry size mismatch!", + "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 ff5183d31..ef1c36b89 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,5 +2,7 @@ "title.craftengine.config": "CraftEngine设置", "category.craftengine.general": "通用", "option.craftengine.enable_network": "启用服务器内自定义方块", - "tooltip.craftengine.enable_network": "需要重新进入服务器即可生效" + "tooltip.craftengine.enable_network": "需要重新进入服务器即可生效", + "disconnect.craftengine.block_registry_mismatch": "方块注册表大小不匹配!", + "disconnect.craftengine.title": "CraftEngine连接错误" } \ No newline at end of file