9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-23 00:49:20 +00:00

feat(block): 改善mod玩家判断的时机

This commit is contained in:
jhqwqmc
2025-03-25 12:28:17 +08:00
parent d2d796f4d3
commit 817735ca08
5 changed files with 38 additions and 39 deletions

View File

@@ -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();

View File

@@ -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"))
)
);
}
}
});
}
}

View File

@@ -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<CraftEnginePayload> ID = new Id<>(CraftEnginePayload.ADD_CRAFTENGINE_BLOCK);
public static final Identifier CRAFTENGINE_PAYLOAD = Identifier.of("craftengine", "payload");
public static final Id<CraftEnginePayload> ID = new Id<>(CraftEnginePayload.CRAFTENGINE_PAYLOAD);
public static final PacketCodec<RegistryByteBuf, CraftEnginePayload> CODEC = PacketCodec.tuple(
new ByteArrayCodec(), CraftEnginePayload::data,
CraftEnginePayload::new

View File

@@ -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."
}

View File

@@ -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."
}