mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-29 20:09:13 +00:00
feat(network): 快速确认注册表一致
This commit is contained in:
@@ -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")
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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连接错误"
|
||||
}
|
||||
Reference in New Issue
Block a user