From ac6cd1559a0f16a3ffad4b3d6bb76f95b2b5d63a Mon Sep 17 00:00:00 2001 From: booky10 Date: Sun, 29 Dec 2024 18:33:45 +0100 Subject: [PATCH] Update sponge platform injection handlers for rewrite refactor --- .../injector/SpongeChannelInjector.java | 2 +- .../handlers/PacketEventsDecoder.java | 25 +++++++++++------ .../handlers/PacketEventsEncoder.java | 27 ++++++++++++------- 3 files changed, 36 insertions(+), 18 deletions(-) diff --git a/sponge/src/main/java/io/github/retrooper/packetevents/sponge/injector/SpongeChannelInjector.java b/sponge/src/main/java/io/github/retrooper/packetevents/sponge/injector/SpongeChannelInjector.java index baf2eb19a..aae100b7f 100644 --- a/sponge/src/main/java/io/github/retrooper/packetevents/sponge/injector/SpongeChannelInjector.java +++ b/sponge/src/main/java/io/github/retrooper/packetevents/sponge/injector/SpongeChannelInjector.java @@ -208,7 +208,7 @@ public void setPlayer(Object channel, Object player) { PacketEventsDecoder decoder = getDecoder((Channel) channel); if (decoder != null) { - decoder.player = spongePlayer.uniqueId(); + decoder.playerId = spongePlayer.uniqueId(); decoder.user.getProfile().setName(spongePlayer.name()); decoder.user.getProfile().setUUID(spongePlayer.uniqueId()); } diff --git a/sponge/src/main/java/io/github/retrooper/packetevents/sponge/injector/handlers/PacketEventsDecoder.java b/sponge/src/main/java/io/github/retrooper/packetevents/sponge/injector/handlers/PacketEventsDecoder.java index 87e95810a..e14191da7 100644 --- a/sponge/src/main/java/io/github/retrooper/packetevents/sponge/injector/handlers/PacketEventsDecoder.java +++ b/sponge/src/main/java/io/github/retrooper/packetevents/sponge/injector/handlers/PacketEventsDecoder.java @@ -19,9 +19,10 @@ package io.github.retrooper.packetevents.sponge.injector.handlers; import com.github.retrooper.packetevents.PacketEvents; +import com.github.retrooper.packetevents.event.ProtocolPacketEvent; import com.github.retrooper.packetevents.exception.PacketProcessException; -import com.github.retrooper.packetevents.netty.buffer.ByteBufHelper; import com.github.retrooper.packetevents.protocol.ConnectionState; +import com.github.retrooper.packetevents.protocol.PacketSide; import com.github.retrooper.packetevents.protocol.player.User; import com.github.retrooper.packetevents.util.ExceptionUtil; import com.github.retrooper.packetevents.util.PacketEventsImplHelper; @@ -42,7 +43,7 @@ public class PacketEventsDecoder extends MessageToMessageDecoder { public User user; - public UUID player; + public UUID playerId; public boolean hasBeenRelocated; public PacketEventsDecoder(User user) { @@ -51,19 +52,27 @@ public PacketEventsDecoder(User user) { public PacketEventsDecoder(PacketEventsDecoder decoder) { user = decoder.user; - player = decoder.player; + playerId = decoder.playerId; hasBeenRelocated = decoder.hasBeenRelocated; } public void read(ChannelHandlerContext ctx, ByteBuf input, List out) throws Exception { - PacketEventsImplHelper.handleServerBoundPacket(ctx.channel(), user, player == null ? null : Sponge.server().player(player).orElse(null), input, true); - out.add(ByteBufHelper.retain(input)); + Object player = this.playerId == null ? null : Sponge.server().player(this.playerId).orElse(null); + ProtocolPacketEvent event = PacketEventsImplHelper.handlePacket(ctx.channel(), this.user, player, + input.retain(), true, PacketSide.CLIENT); + ByteBuf buf = event != null ? (ByteBuf) event.getByteBuf() : input; + + if (buf.isReadable()) { + out.add(buf); + } else { + buf.release(); + } } @Override public void decode(ChannelHandlerContext ctx, ByteBuf buffer, List out) throws Exception { if (buffer.isReadable()) { - read(ctx, buffer, out); + this.read(ctx, buffer, out); } } @@ -88,9 +97,9 @@ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws E // Do nothing. } user.closeConnection(); - if (player != null) { + if (playerId != null) { Sponge.server().scheduler().submit(Task.builder().plugin((PluginContainer) PacketEvents.getAPI().getPlugin()) - .execute(() -> Sponge.server().player(player).get().kick(Component.text("Invalid packet"))).build()); + .execute(() -> Sponge.server().player(playerId).get().kick(Component.text("Invalid packet"))).build()); } PacketEvents.getAPI().getLogManager().warn("Disconnected " + user.getProfile().getName() + " due to invalid packet!"); diff --git a/sponge/src/main/java/io/github/retrooper/packetevents/sponge/injector/handlers/PacketEventsEncoder.java b/sponge/src/main/java/io/github/retrooper/packetevents/sponge/injector/handlers/PacketEventsEncoder.java index 0ff9fe5ea..6ef5460ca 100644 --- a/sponge/src/main/java/io/github/retrooper/packetevents/sponge/injector/handlers/PacketEventsEncoder.java +++ b/sponge/src/main/java/io/github/retrooper/packetevents/sponge/injector/handlers/PacketEventsEncoder.java @@ -63,11 +63,11 @@ public PacketEventsEncoder(ChannelHandler encoder) { @Override protected void encode(ChannelHandlerContext ctx, ByteBuf byteBuf, List list) throws Exception { - boolean needsRecompression = !handledCompression && handleCompression(ctx, byteBuf); - handleClientBoundPacket(ctx.channel(), user, player, byteBuf, this.promise); + boolean needsRecompression = !this.handledCompression && this.handleCompression(ctx, byteBuf); + byteBuf = this.handleClientBoundPacket(ctx.channel(), this.user, this.player, byteBuf.retain(), this.promise); if (needsRecompression) { - compress(ctx, byteBuf); + this.compress(ctx, byteBuf); } // So apparently, this is how ViaVersion hacks around bungeecord not supporting sending empty packets @@ -75,19 +75,28 @@ protected void encode(ChannelHandlerContext ctx, ByteBuf byteBuf, List l throw CancelPacketException.INSTANCE; } - list.add(byteBuf.retain()); + list.add(byteBuf); } - private @Nullable PacketSendEvent handleClientBoundPacket(Channel channel, User user, UUID player, ByteBuf buffer, ChannelPromise promise) throws Exception { - PacketSendEvent packetSendEvent = PacketEventsImplHelper.handleClientBoundPacket(channel, user, player == null ? null : Sponge.server().player(player).orElse(null), buffer, true); - if (packetSendEvent != null && packetSendEvent.hasTasksAfterSend()) { + private ByteBuf handleClientBoundPacket( + Channel channel, User user, + @Nullable UUID playerId, ByteBuf buffer, + ChannelPromise promise + ) throws Exception { + Object player = playerId == null ? null : Sponge.server().player(playerId).orElse(null); + PacketSendEvent event = PacketEventsImplHelper.handleClientBoundPacket(channel, user, + player, buffer, true); + if (event == null) { + return buffer; + } + if (event.hasTasksAfterSend()) { promise.addListener((p) -> { - for (Runnable task : packetSendEvent.getTasksAfterSend()) { + for (Runnable task : event.getTasksAfterSend()) { task.run(); } }); } - return packetSendEvent; + return (ByteBuf) event.getByteBuf(); } @Override