Skip to content

Commit

Permalink
Update sponge platform injection handlers for rewrite refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
booky10 committed Dec 29, 2024
1 parent 1621df3 commit ac6cd15
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -42,7 +43,7 @@
public class PacketEventsDecoder extends MessageToMessageDecoder<ByteBuf> {

public User user;
public UUID player;
public UUID playerId;
public boolean hasBeenRelocated;

public PacketEventsDecoder(User user) {
Expand All @@ -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<Object> 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<Object> out) throws Exception {
if (buffer.isReadable()) {
read(ctx, buffer, out);
this.read(ctx, buffer, out);
}
}

Expand All @@ -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!");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,31 +63,40 @@ public PacketEventsEncoder(ChannelHandler encoder) {

@Override
protected void encode(ChannelHandlerContext ctx, ByteBuf byteBuf, List<Object> 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
if (!ByteBufHelper.isReadable(byteBuf)) {
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
Expand Down

0 comments on commit ac6cd15

Please sign in to comment.