From c4a79ea43dfe3cf12422590caf0ce02e9edfea96 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 12 May 2025 18:07:48 +0800 Subject: [PATCH] =?UTF-8?q?feat(config):=20=E6=94=B9=E8=BF=9B=E7=BC=96?= =?UTF-8?q?=E7=A0=81=E5=92=8C=E8=A7=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/network/NetWorkDataTypes.java | 66 +++++++++++++------ .../plugin/network/PacketConsumers.java | 10 +-- .../client/CraftEngineFabricModClient.java | 13 ++-- .../fabric/client/util/NetWorkDataTypes.java | 66 +++++++++++++------ 4 files changed, 105 insertions(+), 50 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/NetWorkDataTypes.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/NetWorkDataTypes.java index db3af3c0d..50b8e57bf 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/NetWorkDataTypes.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/NetWorkDataTypes.java @@ -3,34 +3,62 @@ package net.momirealms.craftengine.bukkit.plugin.network; import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import java.util.HashMap; +import java.util.Map; import java.util.function.BiConsumer; import java.util.function.Function; -public enum NetWorkDataTypes { - CLIENT_CUSTOM_BLOCK( - FriendlyByteBuf::readInt, - FriendlyByteBuf::writeInt - ), - CANCEL_BLOCK_UPDATE( - FriendlyByteBuf::readBoolean, - FriendlyByteBuf::writeBoolean - ); +public class NetWorkDataTypes { + private static final Map> id2NetWorkDataTypes = new HashMap<>(); - private final Function decoder; - private final BiConsumer encoder; + public static final NetWorkDataTypes CLIENT_CUSTOM_BLOCK = + new NetWorkDataTypes<>(0, FriendlyByteBuf::readInt, FriendlyByteBuf::writeInt); - @SuppressWarnings("unchecked") - NetWorkDataTypes(Function decoder, BiConsumer encoder) { + public static final NetWorkDataTypes CANCEL_BLOCK_UPDATE = + new NetWorkDataTypes<>(1, FriendlyByteBuf::readBoolean, FriendlyByteBuf::writeBoolean); + + static { + register(CLIENT_CUSTOM_BLOCK); + register(CANCEL_BLOCK_UPDATE); + } + + private static void register(NetWorkDataTypes type) { + id2NetWorkDataTypes.put(type.id, type); + } + + private final int id; + private final Function decoder; + private final BiConsumer encoder; + + public NetWorkDataTypes(int id, Function decoder, BiConsumer encoder) { + this.id = id; this.decoder = decoder; - this.encoder = (buf, data) -> encoder.accept(buf, (T) data); + this.encoder = encoder; } - @SuppressWarnings("unchecked") - public T decode(FriendlyByteBuf buf) { - return (T) decoder.apply(buf); + public T decode(FriendlyByteBuf buf) { + return decoder.apply(buf); } - public void encode(FriendlyByteBuf buf, T data) { + public void encode(FriendlyByteBuf buf, T data) { encoder.accept(buf, data); } -} + + public int id() { + return id; + } + + public void writeType(FriendlyByteBuf buf) { + buf.writeVarInt(id); + } + + public static NetWorkDataTypes readType(FriendlyByteBuf buf) { + int id = buf.readVarInt(); + return id2NetWorkDataTypes.get(id); + } + + @SuppressWarnings("unchecked") + public NetWorkDataTypes as(Class clazz) { + return (NetWorkDataTypes) this; + } +} \ No newline at end of file diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java index 680391068..cec73f88d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -1962,9 +1962,9 @@ public class PacketConsumers { data = (byte[]) Reflections.method$DiscardedPayload$dataByteArray.invoke(payload); } FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.wrappedBuffer(data)); - NetWorkDataTypes dataType = buf.readEnumConstant(NetWorkDataTypes.class); + NetWorkDataTypes dataType = NetWorkDataTypes.readType(buf); if (dataType == NetWorkDataTypes.CLIENT_CUSTOM_BLOCK) { - int clientBlockRegistrySize = dataType.decode(buf); + int clientBlockRegistrySize = dataType.as(Integer.class).decode(buf); int serverBlockRegistrySize = RegistryUtils.currentBlockRegistrySize(); if (clientBlockRegistrySize != serverBlockRegistrySize) { Object kickPacket = Reflections.constructor$ClientboundDisconnectPacket.newInstance( @@ -1983,10 +1983,10 @@ public class PacketConsumers { user.setClientModState(true); } else if (dataType == NetWorkDataTypes.CANCEL_BLOCK_UPDATE) { if (!VersionHelper.isOrAbove1_20_2()) return; - if (dataType.decode(buf)) { + if (dataType.as(Boolean.class).decode(buf)) { FriendlyByteBuf bufPayload = new FriendlyByteBuf(Unpooled.buffer()); - bufPayload.writeEnumConstant(dataType); - dataType.encode(bufPayload, true); + dataType.writeType(bufPayload); + dataType.as(Boolean.class).encode(bufPayload, true); Object channelKey = KeyUtils.toResourceLocation(Key.of(NetworkManager.MOD_CHANNEL)); Object dataPayload = Reflections.constructor$DiscardedPayload.newInstance(channelKey, bufPayload.array()); Object responsePacket = Reflections.constructor$ClientboundCustomPayloadPacket.newInstance(dataPayload); 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 b0c300d51..ed32e3bda 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 @@ -71,16 +71,15 @@ public class CraftEngineFabricModClient implements ClientModInitializer { return; } - NetWorkDataTypes type = ModConfig.enableNetwork - ? NetWorkDataTypes.CLIENT_CUSTOM_BLOCK - : NetWorkDataTypes.CANCEL_BLOCK_UPDATE; - PacketByteBuf buf = new PacketByteBuf(Unpooled.buffer()); - buf.writeEnumConstant(type); if (ModConfig.enableNetwork) { + NetWorkDataTypes type = NetWorkDataTypes.CLIENT_CUSTOM_BLOCK; + type.writeType(buf); type.encode(buf, Block.STATE_IDS.size()); } else if (ModConfig.enableCancelBlockUpdate) { + NetWorkDataTypes type = NetWorkDataTypes.CANCEL_BLOCK_UPDATE; + type.writeType(buf); type.encode(buf, true); } @@ -90,9 +89,9 @@ public class CraftEngineFabricModClient implements ClientModInitializer { private static void handleReceiver(CraftEnginePayload payload, ClientConfigurationNetworking.Context context) { byte[] data = payload.data(); PacketByteBuf buf = new PacketByteBuf(Unpooled.wrappedBuffer(data)); - NetWorkDataTypes type = buf.readEnumConstant(NetWorkDataTypes.class); + NetWorkDataTypes type = NetWorkDataTypes.readType(buf); if (type == NetWorkDataTypes.CANCEL_BLOCK_UPDATE) { - serverInstalled = type.decode(buf); + serverInstalled = type.as(Boolean.class).decode(buf); } } } diff --git a/client-mod/src/client/java/net/momirealms/craftengine/fabric/client/util/NetWorkDataTypes.java b/client-mod/src/client/java/net/momirealms/craftengine/fabric/client/util/NetWorkDataTypes.java index e299b41eb..63c8bf8be 100644 --- a/client-mod/src/client/java/net/momirealms/craftengine/fabric/client/util/NetWorkDataTypes.java +++ b/client-mod/src/client/java/net/momirealms/craftengine/fabric/client/util/NetWorkDataTypes.java @@ -2,34 +2,62 @@ package net.momirealms.craftengine.fabric.client.util; import net.minecraft.network.PacketByteBuf; +import java.util.HashMap; +import java.util.Map; import java.util.function.BiConsumer; import java.util.function.Function; -public enum NetWorkDataTypes { - CLIENT_CUSTOM_BLOCK( - PacketByteBuf::readInt, - PacketByteBuf::writeInt - ), - CANCEL_BLOCK_UPDATE( - PacketByteBuf::readBoolean, - PacketByteBuf::writeBoolean - ); +public class NetWorkDataTypes { + private static final Map> id2NetWorkDataTypes = new HashMap<>(); - private final Function decoder; - private final BiConsumer encoder; + public static final NetWorkDataTypes CLIENT_CUSTOM_BLOCK = + new NetWorkDataTypes<>(0, PacketByteBuf::readInt, PacketByteBuf::writeInt); - @SuppressWarnings("unchecked") - NetWorkDataTypes(Function decoder, BiConsumer encoder) { + public static final NetWorkDataTypes CANCEL_BLOCK_UPDATE = + new NetWorkDataTypes<>(1, PacketByteBuf::readBoolean, PacketByteBuf::writeBoolean); + + static { + register(CLIENT_CUSTOM_BLOCK); + register(CANCEL_BLOCK_UPDATE); + } + + private static void register(NetWorkDataTypes type) { + id2NetWorkDataTypes.put(type.id, type); + } + + private final int id; + private final Function decoder; + private final BiConsumer encoder; + + public NetWorkDataTypes(int id, Function decoder, BiConsumer encoder) { + this.id = id; this.decoder = decoder; - this.encoder = (buf, data) -> encoder.accept(buf, (T) data); + this.encoder = encoder; } - @SuppressWarnings("unchecked") - public T decode(PacketByteBuf buf) { - return (T) decoder.apply(buf); + public T decode(PacketByteBuf buf) { + return decoder.apply(buf); } - public void encode(PacketByteBuf buf, T data) { + public void encode(PacketByteBuf buf, T data) { encoder.accept(buf, data); } -} + + public int id() { + return id; + } + + public void writeType(PacketByteBuf buf) { + buf.writeVarInt(id); + } + + public static NetWorkDataTypes readType(PacketByteBuf buf) { + int id = buf.readVarInt(); + return id2NetWorkDataTypes.get(id); + } + + @SuppressWarnings("unchecked") + public NetWorkDataTypes as(Class clazz) { + return (NetWorkDataTypes) this; + } +} \ No newline at end of file