diff --git a/common/src/main/java/commonnetwork/CommonNetworkMod.java b/common/src/main/java/commonnetwork/CommonNetworkMod.java index f2b13c5..1c2fd5a 100644 --- a/common/src/main/java/commonnetwork/CommonNetworkMod.java +++ b/common/src/main/java/commonnetwork/CommonNetworkMod.java @@ -65,6 +65,18 @@ public static PacketRegistrar registerPacket(CustomPacketPayload.Type PacketRegistrar registerConfigurationPacket(CustomPacketPayload.Type type, Class packetClass, StreamCodec codec, Consumer> handler) + { + if (INSTANCE != null) + { + return INSTANCE.packetRegistration.registerConfigurationPacket(type, packetClass, codec, handler); + } + else + { + return getDelayedHandler().registerConfigurationPacket(type, packetClass, codec, handler); + } + } + public PacketRegistrationHandler getPacketRegistration() { return packetRegistration; diff --git a/common/src/main/java/commonnetwork/api/Network.java b/common/src/main/java/commonnetwork/api/Network.java index 684f41e..635d326 100644 --- a/common/src/main/java/commonnetwork/api/Network.java +++ b/common/src/main/java/commonnetwork/api/Network.java @@ -47,6 +47,21 @@ public static PacketRegistrar registerPacket(CustomPacketPayload.Type - The class type + * @return The registrar for chaining registrations. + */ + public static PacketRegistrar registerConfigurationPacket(CustomPacketPayload.Type type, Class packetClass, StreamCodec codec, Consumer> handler) + { + return CommonNetworkMod.registerConfigurationPacket(type, packetClass, codec, handler); + } + /** * Gets the Network handler for use to send packets. * diff --git a/common/src/main/java/commonnetwork/networking/DelayedPacketRegistrationHandler.java b/common/src/main/java/commonnetwork/networking/DelayedPacketRegistrationHandler.java index 9e490fb..bb66fdd 100644 --- a/common/src/main/java/commonnetwork/networking/DelayedPacketRegistrationHandler.java +++ b/common/src/main/java/commonnetwork/networking/DelayedPacketRegistrationHandler.java @@ -41,7 +41,15 @@ public PacketRegistrar registerPacket(ResourceLocation id, Class packetCl @Override public PacketRegistrar registerPacket(CustomPacketPayload.Type type, Class packetClass, StreamCodec codec, Consumer> handler) { - PacketContainer container = new PacketContainer<>(type, packetClass, codec, handler); + PacketContainer container = new PacketContainer<>(type, packetClass, codec, handler, PacketContainer.PacketType.PLAY); + QUEUED_PACKET_MAP.put(packetClass, container); + return this; + } + + @Override + public PacketRegistrar registerConfigurationPacket(CustomPacketPayload.Type type, Class packetClass, StreamCodec codec, Consumer> handler) + { + PacketContainer container = new PacketContainer<>(type, packetClass, codec, handler, PacketContainer.PacketType.CONFIGURATION); QUEUED_PACKET_MAP.put(packetClass, container); return this; } diff --git a/common/src/main/java/commonnetwork/networking/PacketRegistrar.java b/common/src/main/java/commonnetwork/networking/PacketRegistrar.java index e20bda5..861b07a 100644 --- a/common/src/main/java/commonnetwork/networking/PacketRegistrar.java +++ b/common/src/main/java/commonnetwork/networking/PacketRegistrar.java @@ -19,7 +19,7 @@ public interface PacketRegistrar Side getSide(); /** - * Packet Registration + * Packet Registration registers a PLAY packet * * @param packetIdentifier - The unique {@link ResourceLocation} packet id. * @param packetClass - The class of the packet. @@ -34,7 +34,7 @@ public interface PacketRegistrar PacketRegistrar registerPacket(ResourceLocation packetIdentifier, Class packetClass, BiConsumer encoder, Function decoder, Consumer> handler); /** - * Packet Registration + * Packet Registration, registers a PLAY packet * * @param type - The packet type. * @param packetClass - The class of the packet. @@ -45,4 +45,15 @@ public interface PacketRegistrar */ PacketRegistrar registerPacket(CustomPacketPayload.Type type, Class packetClass, StreamCodec codec, Consumer> handler); + /** + * Packet Registration, registers a CONFIGURATION packet + * + * @param type - The packet type. + * @param packetClass - The class of the packet. + * @param codec - The StreamCodec. + * @param handler - The handler method. + * @param - The class type + * @return The registrar for chaining registrations. + */ + PacketRegistrar registerConfigurationPacket(CustomPacketPayload.Type type, Class packetClass, StreamCodec codec, Consumer> handler); } diff --git a/common/src/main/java/commonnetwork/networking/PacketRegistrationHandler.java b/common/src/main/java/commonnetwork/networking/PacketRegistrationHandler.java index 0de7ceb..f47b4c2 100644 --- a/common/src/main/java/commonnetwork/networking/PacketRegistrationHandler.java +++ b/common/src/main/java/commonnetwork/networking/PacketRegistrationHandler.java @@ -32,6 +32,7 @@ public PacketRegistrationHandler(Side side) this.side = side; } + @Override public PacketRegistrar registerPacket(ResourceLocation packetIdentifier, Class packetClass, BiConsumer encoder, Function decoder, Consumer> handler) { PacketContainer container = new PacketContainer<>(packetIdentifier, packetClass, encoder, decoder, handler); @@ -40,10 +41,19 @@ public PacketRegistrar registerPacket(ResourceLocation packetIdentifier, Cla return this; } + @Override + public PacketRegistrar registerConfigurationPacket(CustomPacketPayload.Type type, Class packetClass, StreamCodec codec, Consumer> handler) + { + PacketContainer container = new PacketContainer<>(type, packetClass, codec, handler, PacketContainer.PacketType.CONFIGURATION); + PACKET_MAP.put(packetClass, container); + registerPacket(container); + return this; + } + @Override public PacketRegistrar registerPacket(CustomPacketPayload.Type type, Class packetClass, StreamCodec codec, Consumer> handler) { - PacketContainer container = new PacketContainer<>(type, packetClass, codec, handler); + PacketContainer container = new PacketContainer<>(type, packetClass, codec, handler, PacketContainer.PacketType.PLAY); PACKET_MAP.put(packetClass, container); registerPacket(container); return this; diff --git a/common/src/main/java/commonnetwork/networking/data/PacketContainer.java b/common/src/main/java/commonnetwork/networking/data/PacketContainer.java index 1a7c59f..714ff6d 100644 --- a/common/src/main/java/commonnetwork/networking/data/PacketContainer.java +++ b/common/src/main/java/commonnetwork/networking/data/PacketContainer.java @@ -15,7 +15,8 @@ public record PacketContainer( BiConsumer encoder, Function decoder, StreamCodec codec, - Consumer> handler) + Consumer> handler, + PacketType packetType) { //TODO: Removing for mc 1.21.2 or 1.22 @Deprecated(forRemoval = true) @@ -25,16 +26,17 @@ public PacketContainer(ResourceLocation id, Function decoder, Consumer> handle) { - this(new CustomPacketPayload.Type<>(id), classType, encoder, decoder, null, handle); + this(new CustomPacketPayload.Type<>(id), classType, encoder, decoder, null, handle, PacketType.PLAY); } @SuppressWarnings("unchecked") public PacketContainer(CustomPacketPayload.Type type, Class classType, StreamCodec codec, - Consumer> handle) + Consumer> handle, + PacketType packetType) { - this(type, classType, null, null, (StreamCodec) codec, handle); + this(type, classType, null, null, (StreamCodec) codec, handle, packetType ); } @SuppressWarnings("unchecked") @@ -62,4 +64,10 @@ public StreamCodec getCodec( (buf) -> new CommonPacketWrapper<>(this, this.codec().decode(buf))); } } + + public enum PacketType + { + PLAY, + CONFIGURATION + } } diff --git a/doc/changelog.html b/doc/changelog.html index 812e42a..2033b73 100644 --- a/doc/changelog.html +++ b/doc/changelog.html @@ -10,5 +10,5 @@

Common Networking ${version} for Minecraft ${mcversion}

New in ${version}

    -
  • Fixed: Forge networking.
  • +
  • Added: Configuration packets this is a beta version, please understand there may be issues.
diff --git a/fabric/src/main/java/commonnetwork/networking/FabricNetworkHandler.java b/fabric/src/main/java/commonnetwork/networking/FabricNetworkHandler.java index 9a5d9d9..a613973 100644 --- a/fabric/src/main/java/commonnetwork/networking/FabricNetworkHandler.java +++ b/fabric/src/main/java/commonnetwork/networking/FabricNetworkHandler.java @@ -6,8 +6,10 @@ import commonnetwork.networking.data.PacketContext; import commonnetwork.networking.data.Side; import commonnetwork.networking.exceptions.RegistrationException; +import net.fabricmc.fabric.api.client.networking.v1.ClientConfigurationNetworking; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; +import net.fabricmc.fabric.api.networking.v1.ServerConfigurationNetworking; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.minecraft.server.level.ServerPlayer; @@ -24,8 +26,16 @@ protected void registerPacket(PacketContainer container) { try { - PayloadTypeRegistry.playC2S().register(container.getType(), container.getCodec()); - PayloadTypeRegistry.playS2C().register(container.getType(), container.getCodec()); + if (container.packetType() == PacketContainer.PacketType.PLAY) + { + PayloadTypeRegistry.playC2S().register(container.getType(), container.getCodec()); + PayloadTypeRegistry.playS2C().register(container.getType(), container.getCodec()); + } + else + { + PayloadTypeRegistry.configurationC2S().register(container.getType(), container.getCodec()); + PayloadTypeRegistry.configurationS2C().register(container.getType(), container.getCodec()); + } } catch (IllegalArgumentException e) { @@ -36,17 +46,41 @@ protected void registerPacket(PacketContainer container) { Constants.LOG.debug("Registering packet {} : {} on the: {}", container.type().id(), container.classType(), Side.CLIENT); - ClientPlayNetworking.registerGlobalReceiver(container.getType(), - (ClientPlayNetworking.PlayPayloadHandler>) (payload, context) -> context.client().execute(() -> - container.handler().accept( - new PacketContext<>(payload.packet(), Side.CLIENT)))); + if (container.packetType() == PacketContainer.PacketType.PLAY) + { + // play packets + ClientPlayNetworking.registerGlobalReceiver(container.getType(), + (ClientPlayNetworking.PlayPayloadHandler>) (payload, context) -> context.client().execute(() -> + container.handler().accept( + new PacketContext<>(payload.packet(), Side.CLIENT)))); + } + else + { + // configuration packets + ClientConfigurationNetworking.registerGlobalReceiver(container.getType(), + (ClientConfigurationNetworking.ConfigurationPayloadHandler>) (payload, context) -> context.client().execute(() -> + container.handler().accept( + new PacketContext<>(payload.packet(), Side.CLIENT)))); + } } Constants.LOG.debug("Registering packet {} : {} on the: {}", container.type().id(), container.classType(), Side.SERVER); - ServerPlayNetworking.registerGlobalReceiver(container.getType(), - (ServerPlayNetworking.PlayPayloadHandler>) (payload, context) -> context.player().server.execute(() -> - container.handler().accept( - new PacketContext<>(context.player(), payload.packet(), Side.SERVER)))); + if (container.packetType() == PacketContainer.PacketType.PLAY) + { + // play packets + ServerPlayNetworking.registerGlobalReceiver(container.getType(), + (ServerPlayNetworking.PlayPayloadHandler>) (payload, context) -> context.player().server.execute(() -> + container.handler().accept( + new PacketContext<>(context.player(), payload.packet(), Side.SERVER)))); + } + else + { + // configuration packets + ServerConfigurationNetworking.registerGlobalReceiver(container.getType(), + (ServerConfigurationNetworking.ConfigurationPacketHandler>) (payload, context) -> context.server().execute(() -> + container.handler().accept( + new PacketContext<>(null, payload.packet(), Side.SERVER)))); + } } diff --git a/forge/src/main/java/commonnetwork/networking/ForgeNetworkHandler.java b/forge/src/main/java/commonnetwork/networking/ForgeNetworkHandler.java index da0c465..268e79f 100644 --- a/forge/src/main/java/commonnetwork/networking/ForgeNetworkHandler.java +++ b/forge/src/main/java/commonnetwork/networking/ForgeNetworkHandler.java @@ -6,15 +6,13 @@ import commonnetwork.networking.data.PacketContext; import commonnetwork.networking.data.Side; import commonnetwork.networking.exceptions.RegistrationException; -import io.netty.buffer.Unpooled; import net.minecraft.client.Minecraft; import net.minecraft.network.Connection; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.server.level.ServerPlayer; import net.minecraftforge.event.network.CustomPayloadEvent; +import net.minecraftforge.network.Channel; import net.minecraftforge.network.ChannelBuilder; -import net.minecraftforge.network.EventNetworkChannel; import java.util.HashMap; import java.util.Map; @@ -35,11 +33,32 @@ protected void registerPacket(PacketContainer container) { if (CHANNELS.get(container.classType()) == null) { - var channel = ChannelBuilder.named(container.type().id()).optional().eventNetworkChannel() - .addListener(event -> { - CommonPacketWrapper msg = container.getCodec().decode(event.getPayload()); - buildHandler(container.handler()).accept(msg.packet(), event.getSource()); - }); + var channelBuilder = ChannelBuilder.named(container.type().id()).optional().payloadChannel(); + Channel channel; + if (container.packetType() == PacketContainer.PacketType.PLAY) + { + channel = channelBuilder + .play() + .bidirectional() + .addMain(container.getType(), container.getCodec(), (msg, ctx) -> buildHandler(container.handler()) + .accept((T) msg.packet(), ctx)) + .build(); + } + else + { + channel = channelBuilder + .configuration() + .bidirectional() + .addMain(container.getType(), container.getCodec(), (msg, ctx) -> buildHandler(container.handler()) + .accept((T) msg.packet(), ctx) + ).build(); + } + +// var channel = ChannelBuilder.named(container.type().id()).optional().eventNetworkChannel() +// .addListener(event -> { +// CommonPacketWrapper msg = container.getCodec().decode(event.getPayload()); +// buildHandler(container.handler()).accept(msg.packet(), event.getSource()); +// }); CHANNELS.put(container.classType(), new Message<>(channel, container)); } } @@ -54,9 +73,9 @@ public void sendToServer(T packet, boolean ignoreCheck) Connection connection = Minecraft.getInstance().getConnection().getConnection(); if (ignoreCheck || channel.isRemotePresent(connection)) { - FriendlyByteBuf buf = new RegistryFriendlyByteBuf(Unpooled.buffer(), Minecraft.getInstance().player.registryAccess()); - message.container.codec().encode(buf, packet); - channel.send(buf, connection); +// FriendlyByteBuf buf = new RegistryFriendlyByteBuf(Unpooled.buffer(), Minecraft.getInstance().player.registryAccess()); +// message.container.codec().encode(buf, packet); + channel.send(new CommonPacketWrapper(message.container, packet), connection); } } else @@ -76,9 +95,9 @@ public void sendToClient(T packet, ServerPlayer player, boolean ignoreCheck) Connection connection = player.connection.getConnection(); if (ignoreCheck || channel.isRemotePresent(connection)) { - FriendlyByteBuf buf = new RegistryFriendlyByteBuf(Unpooled.buffer(), player.server.registryAccess()); - message.container.codec().encode(buf, packet); - channel.send(buf, connection); +// FriendlyByteBuf buf = new RegistryFriendlyByteBuf(Unpooled.buffer(), player.server.registryAccess()); +// message.container.codec().encode(buf, packet); + channel.send(new CommonPacketWrapper(message.container, packet), connection); } } @@ -88,6 +107,9 @@ public void sendToClient(T packet, ServerPlayer player, boolean ignoreCheck) } } + private static void handle(CustomPacketPayload customPacketPayload, CustomPayloadEvent.Context ctx) + { + } private BiConsumer buildHandler(Consumer> handler) { @@ -108,7 +130,7 @@ private BiConsumer buildHandler(Consumer(EventNetworkChannel channel, PacketContainer container) + public record Message(Channel channel, PacketContainer container) { } } diff --git a/neoforge/src/main/java/commonnetwork/networking/NeoForgeNetworkHandler.java b/neoforge/src/main/java/commonnetwork/networking/NeoForgeNetworkHandler.java index 65c660b..4e27bc7 100644 --- a/neoforge/src/main/java/commonnetwork/networking/NeoForgeNetworkHandler.java +++ b/neoforge/src/main/java/commonnetwork/networking/NeoForgeNetworkHandler.java @@ -39,8 +39,17 @@ public void register(final RegisterPayloadHandlersEvent event) { if (!PACKET_MAP.isEmpty()) { - PACKET_MAP.forEach((type, container) -> event.registrar(container.getType().id().getNamespace()) - .optional().commonBidirectional(container.getType(), container.getCodec(), buildHandler(container.handler()))); + PACKET_MAP.forEach((type, container) -> { + var registrar = event.registrar(container.getType().id().getNamespace()).optional(); + if (container.packetType() == PacketContainer.PacketType.PLAY) + { + registrar.playBidirectional(container.getType(), container.getCodec(), buildHandler(container.handler())); + } + else + { + registrar.configurationBidirectional(container.getType(), container.getCodec(), buildHandler(container.handler())); + } + }); } }