diff --git a/bungeecord/src/main/java/io/github/retrooper/packetevents/handlers/PacketEventsEncoder.java b/bungeecord/src/main/java/io/github/retrooper/packetevents/handlers/PacketEventsEncoder.java index 10b7a79ddc..92630cce39 100644 --- a/bungeecord/src/main/java/io/github/retrooper/packetevents/handlers/PacketEventsEncoder.java +++ b/bungeecord/src/main/java/io/github/retrooper/packetevents/handlers/PacketEventsEncoder.java @@ -28,14 +28,15 @@ import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPipeline; -import io.netty.handler.codec.MessageToByteEncoder; +import io.netty.handler.codec.MessageToMessageEncoder; import net.md_5.bungee.api.connection.ProxiedPlayer; import java.lang.reflect.InvocationTargetException; +import java.util.List; // Thanks to ViaVersion for the compression method. @ChannelHandler.Sharable -public class PacketEventsEncoder extends MessageToByteEncoder { +public class PacketEventsEncoder extends MessageToMessageEncoder { public ProxiedPlayer player; public User user; public boolean handledCompression; @@ -44,7 +45,7 @@ public PacketEventsEncoder(User user) { this.user = user; } - public void read(ChannelHandlerContext ctx, ByteBuf buffer) throws Exception { + public void read(ChannelHandlerContext ctx, ByteBuf buffer, List out) throws Exception { boolean doCompression = handleCompressionOrder(ctx, buffer); int firstReaderIndex = buffer.readerIndex(); PacketSendEvent packetSendEvent = EventCreationUtil.createSendEvent(ctx.channel(), user, player, @@ -61,7 +62,9 @@ public void read(ChannelHandlerContext ctx, ByteBuf buffer) throws Exception { buffer.readerIndex(firstReaderIndex); } if (doCompression) { - recompress(ctx, buffer); + recompress(ctx, buffer, out); + } else { + out.add(buffer.retain()); } } else { ByteBufHelper.clear(packetSendEvent.getByteBuf()); @@ -74,12 +77,11 @@ public void read(ChannelHandlerContext ctx, ByteBuf buffer) throws Exception { } @Override - protected void encode(ChannelHandlerContext ctx, ByteBuf msg, ByteBuf out) throws Exception { + protected void encode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { if (!msg.isReadable()) { return; } - read(ctx, msg); - out.writeBytes(msg); + read(ctx, msg, out); } @Override @@ -123,18 +125,12 @@ private boolean handleCompressionOrder(ChannelHandlerContext ctx, ByteBuf buffer return false; } - private void recompress(ChannelHandlerContext ctx, ByteBuf buffer) { + private void recompress(ChannelHandlerContext ctx, ByteBuf buffer, List out) { ChannelHandler compressor = ctx.pipeline().get("compress"); - ByteBuf compressed = ctx.alloc().buffer(); try { - CustomPipelineUtil.callPacketEncodeByteBuf(compressor, ctx, buffer, compressed); + CustomPipelineUtil.callPacketEncodeByteBuf(compressor, ctx, buffer, out); } catch (InvocationTargetException e) { e.printStackTrace(); } - try { - buffer.clear().writeBytes(compressed); - } finally { - compressed.release(); - } } } diff --git a/bungeecord/src/main/java/io/github/retrooper/packetevents/injector/CustomPipelineUtil.java b/bungeecord/src/main/java/io/github/retrooper/packetevents/injector/CustomPipelineUtil.java index 37c2ad6e3c..d27c3fb773 100644 --- a/bungeecord/src/main/java/io/github/retrooper/packetevents/injector/CustomPipelineUtil.java +++ b/bungeecord/src/main/java/io/github/retrooper/packetevents/injector/CustomPipelineUtil.java @@ -130,12 +130,12 @@ public static List callMTMDecode(Object decoder, Object ctx, Object msg) return output; } - public static void callPacketEncodeByteBuf(Object encoder, Object ctx, Object msg, Object output) throws InvocationTargetException { + public static void callPacketEncodeByteBuf(Object encoder, Object ctx, Object msg, List output) throws InvocationTargetException { if (BUNGEE_PACKET_ENCODE_BYTEBUF == null) { try { BUNGEE_PACKET_ENCODE_BYTEBUF = encoder.getClass() .getDeclaredMethod("encode", ChannelHandlerContext.class, ByteBuf.class, - ByteBuf.class); + List.class); BUNGEE_PACKET_ENCODE_BYTEBUF.setAccessible(true); } catch (NoSuchMethodException e) { e.printStackTrace();