diff --git a/fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/impl/networking/payload/UntypedPayload.java b/fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/impl/networking/payload/UntypedPayload.java index 028734a4b..856b348e4 100644 --- a/fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/impl/networking/payload/UntypedPayload.java +++ b/fabric-networking-api-v1/src/main/java/net/fabricmc/fabric/impl/networking/payload/UntypedPayload.java @@ -21,6 +21,7 @@ import org.jetbrains.annotations.Nullable; import net.minecraft.network.PacketByteBuf; import net.minecraft.util.Identifier; +import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; import net.fabricmc.fabric.api.networking.v1.PacketType; public record UntypedPayload(Identifier id, PacketByteBuf buffer) implements ResolvedPayload { @@ -29,8 +30,9 @@ public record UntypedPayload(Identifier id, PacketByteBuf buffer) implements Res if (type == null) { return this; } else { - TypedPayload typed = new TypedPayload(type.read(buffer)); - int dangling = buffer.readableBytes(); + PacketByteBuf copy = PacketByteBufs.copy(buffer); + TypedPayload typed = new TypedPayload(type.read(copy)); + int dangling = copy.readableBytes(); if (dangling > 0) { throw new IllegalStateException("Found " + dangling + " extra bytes when reading packet " + id); @@ -42,6 +44,11 @@ public record UntypedPayload(Identifier id, PacketByteBuf buffer) implements Res @Override public void write(PacketByteBuf buf) { - buf.writeBytes(buffer); + buf.writeBytes(buffer.copy()); + } + + @Override + public PacketByteBuf buffer() { + return PacketByteBufs.copy(buffer); } } diff --git a/fabric-networking-api-v1/src/test/java/net/fabricmc/fabric/test/networking/unit/CommonPacketTests.java b/fabric-networking-api-v1/src/test/java/net/fabricmc/fabric/test/networking/unit/CommonPacketTests.java index f735f7721..5702c9efc 100644 --- a/fabric-networking-api-v1/src/test/java/net/fabricmc/fabric/test/networking/unit/CommonPacketTests.java +++ b/fabric-networking-api-v1/src/test/java/net/fabricmc/fabric/test/networking/unit/CommonPacketTests.java @@ -47,9 +47,11 @@ import net.minecraft.network.packet.CustomPayload; import net.minecraft.server.network.ServerConfigurationNetworkHandler; import net.minecraft.util.Identifier; +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.PacketByteBufs; import net.fabricmc.fabric.api.networking.v1.PacketSender; +import net.fabricmc.fabric.api.networking.v1.ServerConfigurationNetworking; import net.fabricmc.fabric.impl.networking.ChannelInfoHolder; import net.fabricmc.fabric.impl.networking.CommonPacketHandler; import net.fabricmc.fabric.impl.networking.CommonPacketsImpl; @@ -58,7 +60,6 @@ import net.fabricmc.fabric.impl.networking.CommonVersionPayload; import net.fabricmc.fabric.impl.networking.client.ClientConfigurationNetworkAddon; import net.fabricmc.fabric.impl.networking.client.ClientNetworkingImpl; import net.fabricmc.fabric.impl.networking.payload.ResolvablePayload; -import net.fabricmc.fabric.impl.networking.payload.UntypedPayload; import net.fabricmc.fabric.impl.networking.server.ServerConfigurationNetworkAddon; import net.fabricmc.fabric.impl.networking.server.ServerNetworkingImpl; @@ -108,7 +109,9 @@ public class CommonPacketTests { PacketByteBuf buf = PacketByteBufs.create(); buf.writeIntArray(new int[]{1, 2, 3}); - packetHandler.internal().receive(null, clientNetworkHandler, new UntypedPayload(null, buf), packetSender); + // The actual handler doesn't copy the buffer + ClientConfigurationNetworking.ConfigurationChannelHandler actualHandler = (ClientConfigurationNetworking.ConfigurationChannelHandler) packetHandler.actual(); + actualHandler.receive(null, clientNetworkHandler, buf, packetSender); // Assert the entire packet was read assertEquals(0, buf.readableBytes()); @@ -132,7 +135,8 @@ public class CommonPacketTests { buf.writeIntArray(new int[]{2, 3}); // We only support version 1 assertThrows(UnsupportedOperationException.class, () -> { - packetHandler.internal().receive(null, clientNetworkHandler, new UntypedPayload(null, buf), packetSender); + ClientConfigurationNetworking.ConfigurationChannelHandler actualHandler = (ClientConfigurationNetworking.ConfigurationChannelHandler) packetHandler.actual(); + actualHandler.receive(null, clientNetworkHandler, buf, packetSender); }); // Assert the entire packet was read @@ -149,7 +153,8 @@ public class CommonPacketTests { PacketByteBuf buf = PacketByteBufs.create(); buf.writeIntArray(new int[]{1, 2, 3}); - packetHandler.internal().receive(null, serverNetworkHandler, new UntypedPayload(null, buf), null); + ServerConfigurationNetworking.ConfigurationChannelHandler actualHandler = (ServerConfigurationNetworking.ConfigurationChannelHandler) packetHandler.actual(); + actualHandler.receive(null, serverNetworkHandler, buf, null); // Assert the entire packet was read assertEquals(0, buf.readableBytes()); @@ -167,7 +172,8 @@ public class CommonPacketTests { buf.writeIntArray(new int[]{3}); // Server only supports version 1 assertThrows(UnsupportedOperationException.class, () -> { - packetHandler.internal().receive(null, serverNetworkHandler, new UntypedPayload(null, buf), packetSender); + ServerConfigurationNetworking.ConfigurationChannelHandler actualHandler = (ServerConfigurationNetworking.ConfigurationChannelHandler) packetHandler.actual(); + actualHandler.receive(null, serverNetworkHandler, buf, null); }); // Assert the entire packet was read @@ -188,7 +194,8 @@ public class CommonPacketTests { buf.writeString("play"); // Target phase buf.writeCollection(List.of(new Identifier("fabric", "test")), PacketByteBuf::writeIdentifier); - packetHandler.internal().receive(null, clientNetworkHandler, new UntypedPayload(null, buf), packetSender); + ClientConfigurationNetworking.ConfigurationChannelHandler actualHandler = (ClientConfigurationNetworking.ConfigurationChannelHandler) packetHandler.actual(); + actualHandler.receive(null, clientNetworkHandler, buf, packetSender); // Assert the entire packet was read assertEquals(0, buf.readableBytes()); @@ -217,7 +224,8 @@ public class CommonPacketTests { buf.writeString("configuration"); // Target phase buf.writeCollection(List.of(new Identifier("fabric", "test")), PacketByteBuf::writeIdentifier); - packetHandler.internal().receive(null, clientNetworkHandler, new UntypedPayload(null, buf), packetSender); + ClientConfigurationNetworking.ConfigurationChannelHandler actualHandler = (ClientConfigurationNetworking.ConfigurationChannelHandler) packetHandler.actual(); + actualHandler.receive(null, clientNetworkHandler, buf, packetSender); // Assert the entire packet was read assertEquals(0, buf.readableBytes()); @@ -245,7 +253,8 @@ public class CommonPacketTests { buf.writeString("play"); // Target phase buf.writeCollection(List.of(new Identifier("fabric", "test")), PacketByteBuf::writeIdentifier); - packetHandler.internal().receive(null, serverNetworkHandler, new UntypedPayload(null, buf), packetSender); + ServerConfigurationNetworking.ConfigurationChannelHandler actualHandler = (ServerConfigurationNetworking.ConfigurationChannelHandler) packetHandler.actual(); + actualHandler.receive(null, serverNetworkHandler, buf, null); // Assert the entire packet was read assertEquals(0, buf.readableBytes()); @@ -266,7 +275,8 @@ public class CommonPacketTests { buf.writeString("configuration"); // Target phase buf.writeCollection(List.of(new Identifier("fabric", "test")), PacketByteBuf::writeIdentifier); - packetHandler.internal().receive(null, serverNetworkHandler, new UntypedPayload(null, buf), packetSender); + ServerConfigurationNetworking.ConfigurationChannelHandler actualHandler = (ServerConfigurationNetworking.ConfigurationChannelHandler) packetHandler.actual(); + actualHandler.receive(null, serverNetworkHandler, buf, null); // Assert the entire packet was read assertEquals(0, buf.readableBytes()); diff --git a/fabric-networking-api-v1/src/testmod/java/net/fabricmc/fabric/test/networking/play/NetworkingPlayPacketTest.java b/fabric-networking-api-v1/src/testmod/java/net/fabricmc/fabric/test/networking/play/NetworkingPlayPacketTest.java index cacc82535..e73e80797 100644 --- a/fabric-networking-api-v1/src/testmod/java/net/fabricmc/fabric/test/networking/play/NetworkingPlayPacketTest.java +++ b/fabric-networking-api-v1/src/testmod/java/net/fabricmc/fabric/test/networking/play/NetworkingPlayPacketTest.java @@ -78,6 +78,13 @@ public final class NetworkingPlayPacketTest implements ModInitializer { ctx.getSource().getPlayer().networkHandler.sendPacket(new CustomPayloadS2CPacket(buf)); return Command.SINGLE_SUCCESS; })) + .then(literal("repeat").executes(ctx -> { + PacketByteBuf buf = PacketByteBufs.create(); + buf.writeText(Text.literal("repeat")); + ServerPlayNetworking.send(ctx.getSource().getPlayer(), TEST_CHANNEL, buf); + ServerPlayNetworking.send(ctx.getSource().getPlayer(), TEST_CHANNEL, buf); + return Command.SINGLE_SUCCESS; + })) .then(literal("bundled").executes(ctx -> { PacketByteBuf buf1 = PacketByteBufs.create(); buf1.writeText(Text.literal("bundled #1"));