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 new file mode 100644 index 000000000..db3af3c0d --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/NetWorkDataTypes.java @@ -0,0 +1,36 @@ +package net.momirealms.craftengine.bukkit.plugin.network; + + +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +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 + ); + + private final Function decoder; + private final BiConsumer encoder; + + @SuppressWarnings("unchecked") + NetWorkDataTypes(Function decoder, BiConsumer encoder) { + this.decoder = decoder; + this.encoder = (buf, data) -> encoder.accept(buf, (T) data); + } + + @SuppressWarnings("unchecked") + public T decode(FriendlyByteBuf buf) { + return (T) decoder.apply(buf); + } + + public void encode(FriendlyByteBuf buf, T data) { + encoder.accept(buf, data); + } +} 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 755a10375..680391068 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 @@ -1961,14 +1961,10 @@ public class PacketConsumers { } else { data = (byte[]) Reflections.method$DiscardedPayload$dataByteArray.invoke(payload); } - String decodeData = new String(data, StandardCharsets.UTF_8); - if (decodeData.endsWith("init")) { - int firstColon = decodeData.indexOf(':'); - if (firstColon == -1) return; - int secondColon = decodeData.indexOf(':', firstColon + 1); - if (secondColon == -1) return; - String payloadData = decodeData.substring(firstColon + 1, secondColon); - int clientBlockRegistrySize = Integer.parseInt(payloadData); + FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.wrappedBuffer(data)); + NetWorkDataTypes dataType = buf.readEnumConstant(NetWorkDataTypes.class); + if (dataType == NetWorkDataTypes.CLIENT_CUSTOM_BLOCK) { + int clientBlockRegistrySize = dataType.decode(buf); int serverBlockRegistrySize = RegistryUtils.currentBlockRegistrySize(); if (clientBlockRegistrySize != serverBlockRegistrySize) { Object kickPacket = Reflections.constructor$ClientboundDisconnectPacket.newInstance( @@ -1985,23 +1981,16 @@ public class PacketConsumers { return; } user.setClientModState(true); - } else if (decodeData.endsWith("cancel")) { + } else if (dataType == NetWorkDataTypes.CANCEL_BLOCK_UPDATE) { if (!VersionHelper.isOrAbove1_20_2()) return; - int firstColon = decodeData.indexOf(':'); - if (firstColon == -1) return; - int secondColon = decodeData.indexOf(':', firstColon + 1); - if (secondColon == -1) return; - String payloadData = decodeData.substring(firstColon + 1, secondColon); - boolean cancel = Boolean.parseBoolean(payloadData); - if (cancel) { - user.nettyChannel().writeAndFlush( - Reflections.constructor$ClientboundCustomPayloadPacket.newInstance( - Reflections.constructor$DiscardedPayload.newInstance( - KeyUtils.toResourceLocation(Key.of(NetworkManager.MOD_CHANNEL)), - (":true:cancel").getBytes(StandardCharsets.UTF_8) - ) - ) - ); + if (dataType.decode(buf)) { + FriendlyByteBuf bufPayload = new FriendlyByteBuf(Unpooled.buffer()); + bufPayload.writeEnumConstant(dataType); + dataType.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); + user.nettyChannel().writeAndFlush(responsePacket); } } } 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 9dc5e6b27..b0c300d51 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 @@ -1,5 +1,6 @@ package net.momirealms.craftengine.fabric.client; +import io.netty.buffer.Unpooled; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -14,14 +15,14 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.color.world.BiomeColors; import net.minecraft.client.network.ClientConfigurationNetworkHandler; import net.minecraft.client.render.RenderLayer; +import net.minecraft.network.PacketByteBuf; import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; import net.minecraft.world.biome.FoliageColors; import net.momirealms.craftengine.fabric.client.blocks.CustomBlock; import net.momirealms.craftengine.fabric.client.config.ModConfig; import net.momirealms.craftengine.fabric.client.network.CraftEnginePayload; - -import java.nio.charset.StandardCharsets; +import net.momirealms.craftengine.fabric.client.util.NetWorkDataTypes; @Environment(EnvType.CLIENT) public class CraftEngineFabricModClient implements ClientModInitializer { @@ -65,34 +66,33 @@ public class CraftEngineFabricModClient implements ClientModInitializer { } private static void initChannel(ClientConfigurationNetworkHandler handler, MinecraftClient client) { - if (ModConfig.enableNetwork) { - registerChannel(handler); - } else if (ModConfig.enableCancelBlockUpdate) { - registerCancelBlockUpdateChannel(handler); - } else { + if (!ModConfig.enableNetwork && !ModConfig.enableCancelBlockUpdate) { ClientConfigurationNetworking.unregisterGlobalReceiver(CraftEnginePayload.ID); + 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) { + type.encode(buf, Block.STATE_IDS.size()); + } else if (ModConfig.enableCancelBlockUpdate) { + type.encode(buf, true); + } + + ClientConfigurationNetworking.send(new CraftEnginePayload(buf.array())); } private static void handleReceiver(CraftEnginePayload payload, ClientConfigurationNetworking.Context context) { byte[] data = payload.data(); - String decodeData = new String(data, StandardCharsets.UTF_8); - if (decodeData.endsWith("cancel")) { - int firstColon = decodeData.indexOf(':'); - if (firstColon == -1) return; - int secondColon = decodeData.indexOf(':', firstColon + 1); - if (secondColon == -1) return; - String payloadData = decodeData.substring(firstColon + 1, secondColon); - serverInstalled = Boolean.parseBoolean(payloadData); + PacketByteBuf buf = new PacketByteBuf(Unpooled.wrappedBuffer(data)); + NetWorkDataTypes type = buf.readEnumConstant(NetWorkDataTypes.class); + if (type == NetWorkDataTypes.CANCEL_BLOCK_UPDATE) { + serverInstalled = type.decode(buf); } } - - private static void registerChannel(ClientConfigurationNetworkHandler handler) { - ClientConfigurationNetworking.send(new CraftEnginePayload((":" + Block.STATE_IDS.size() + ":init").getBytes(StandardCharsets.UTF_8))); - } - - private static void registerCancelBlockUpdateChannel(ClientConfigurationNetworkHandler handler) { - ClientConfigurationNetworking.send(new CraftEnginePayload((":true:cancel").getBytes(StandardCharsets.UTF_8))); - - } } 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 new file mode 100644 index 000000000..e299b41eb --- /dev/null +++ b/client-mod/src/client/java/net/momirealms/craftengine/fabric/client/util/NetWorkDataTypes.java @@ -0,0 +1,35 @@ +package net.momirealms.craftengine.fabric.client.util; + +import net.minecraft.network.PacketByteBuf; + +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 + ); + + private final Function decoder; + private final BiConsumer encoder; + + @SuppressWarnings("unchecked") + NetWorkDataTypes(Function decoder, BiConsumer encoder) { + this.decoder = decoder; + this.encoder = (buf, data) -> encoder.accept(buf, (T) data); + } + + @SuppressWarnings("unchecked") + public T decode(PacketByteBuf buf) { + return (T) decoder.apply(buf); + } + + public void encode(PacketByteBuf buf, T data) { + encoder.accept(buf, data); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/FriendlyByteBuf.java b/core/src/main/java/net/momirealms/craftengine/core/util/FriendlyByteBuf.java index 5219bb4b4..8f12573cb 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/FriendlyByteBuf.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/FriendlyByteBuf.java @@ -458,6 +458,15 @@ public class FriendlyByteBuf extends ByteBuf { this.writeBytes(Arrays.copyOf(byteArray, MCUtils.positiveCeilDiv(size, 8))); } + @SuppressWarnings("unchecked") + public > T readEnumConstant(Class enumClass) { + return (T)((Enum[])enumClass.getEnumConstants())[this.readVarInt()]; + } + + public FriendlyByteBuf writeEnumConstant(Enum instance) { + return this.writeVarInt(instance.ordinal()); + } + @FunctionalInterface public interface Writer extends BiConsumer {