From 9476ffccdbf14511e48e6b42f23463519d642ef8 Mon Sep 17 00:00:00 2001 From: Outfluencer Date: Sat, 8 Mar 2025 16:56:20 +1100 Subject: [PATCH] #3797: Expose sendPacketQueued to unsafe interface --- .../md_5/bungee/api/connection/Connection.java | 10 ++++++++++ .../main/java/net/md_5/bungee/BungeeTitle.java | 2 +- .../java/net/md_5/bungee/ServerConnection.java | 15 +++++++++++++++ .../main/java/net/md_5/bungee/UserConnection.java | 14 ++++++++++++++ .../md_5/bungee/connection/InitialHandler.java | 6 ++++++ .../md_5/bungee/connection/UpstreamBridge.java | 2 +- 6 files changed, 47 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/net/md_5/bungee/api/connection/Connection.java b/api/src/main/java/net/md_5/bungee/api/connection/Connection.java index f59b49c7..392490d1 100644 --- a/api/src/main/java/net/md_5/bungee/api/connection/Connection.java +++ b/api/src/main/java/net/md_5/bungee/api/connection/Connection.java @@ -84,5 +84,15 @@ public interface Connection * @param packet the packet to send */ void sendPacket(DefinedPacket packet); + + /** + * Queue a packet to this connection. + * If the packet is not registered for the connections current encoder protocol, it will be queued until it is, + * otherwise it will be sent immediately. + * + * @param packet the packet to be queued + * @throws UnsupportedOperationException if used for a PendingConnection + */ + void sendPacketQueued(DefinedPacket packet); } } diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeTitle.java b/proxy/src/main/java/net/md_5/bungee/BungeeTitle.java index 9a6ef7a5..e75fcaa4 100644 --- a/proxy/src/main/java/net/md_5/bungee/BungeeTitle.java +++ b/proxy/src/main/java/net/md_5/bungee/BungeeTitle.java @@ -156,7 +156,7 @@ public class BungeeTitle implements Title { if ( player.getPendingConnection().getVersion() >= ProtocolConstants.MINECRAFT_1_17 ) { - ( (UserConnection) player ).sendPacketQueued( packet.newPacket ); + player.unsafe().sendPacketQueued( packet.newPacket ); } else { player.unsafe().sendPacket( packet.oldPacket ); diff --git a/proxy/src/main/java/net/md_5/bungee/ServerConnection.java b/proxy/src/main/java/net/md_5/bungee/ServerConnection.java index 54254a9b..a5a3c61a 100644 --- a/proxy/src/main/java/net/md_5/bungee/ServerConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/ServerConnection.java @@ -14,6 +14,7 @@ import net.md_5.bungee.api.connection.Server; import net.md_5.bungee.netty.ChannelWrapper; import net.md_5.bungee.protocol.DefinedPacket; import net.md_5.bungee.protocol.Protocol; +import net.md_5.bungee.protocol.ProtocolConstants; import net.md_5.bungee.protocol.packet.PluginMessage; @RequiredArgsConstructor @@ -40,6 +41,18 @@ public class ServerConnection implements Server { ch.write( packet ); } + + @Override + public void sendPacketQueued(DefinedPacket packet) + { + if ( ch.getEncodeVersion() >= ProtocolConstants.MINECRAFT_1_20_2 ) + { + ServerConnection.this.sendPacketQueued( packet ); + } else + { + sendPacket( packet ); + } + } }; public void sendPacketQueued(DefinedPacket packet) @@ -53,6 +66,8 @@ public class ServerConnection implements Server Protocol encodeProtocol = ch.getEncodeProtocol(); if ( !encodeProtocol.TO_SERVER.hasPacket( packet.getClass(), ch.getEncodeVersion() ) ) { + // we should limit this so bad api usage won't oom the server. + Preconditions.checkState( packetQueue.size() <= 4096, "too many queued packets" ); packetQueue.add( packet ); } else { diff --git a/proxy/src/main/java/net/md_5/bungee/UserConnection.java b/proxy/src/main/java/net/md_5/bungee/UserConnection.java index 6d661494..74ca0ac4 100644 --- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java @@ -150,6 +150,18 @@ public final class UserConnection implements ProxiedPlayer { ch.write( packet ); } + + @Override + public void sendPacketQueued(DefinedPacket packet) + { + if ( pendingConnection.getVersion() >= ProtocolConstants.MINECRAFT_1_20_2 ) + { + UserConnection.this.sendPacketQueued( packet ); + } else + { + sendPacket( packet ); + } + } }; public boolean init() @@ -191,6 +203,8 @@ public final class UserConnection implements ProxiedPlayer Protocol encodeProtocol = ch.getEncodeProtocol(); if ( !encodeProtocol.TO_CLIENT.hasPacket( packet.getClass(), getPendingConnection().getVersion() ) ) { + // we should limit this so bad api usage won't oom the server. + Preconditions.checkState( packetQueue.size() <= 4096, "too many queued packets" ); packetQueue.add( packet ); } else { diff --git a/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java b/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java index a048d5a3..12e05923 100644 --- a/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java +++ b/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java @@ -122,6 +122,12 @@ public class InitialHandler extends PacketHandler implements PendingConnection { ch.write( packet ); } + + @Override + public void sendPacketQueued(DefinedPacket packet) + { + throw new UnsupportedOperationException( "Not supported" ); + } }; @Getter private boolean onlineMode = BungeeCord.getInstance().config.isOnlineMode(); diff --git a/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java b/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java index 89ce8a5f..ce975957 100644 --- a/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java +++ b/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java @@ -103,7 +103,7 @@ public class UpstreamBridge extends PacketHandler if ( player.getPendingConnection().getVersion() >= ProtocolConstants.MINECRAFT_1_19_3 ) { // need to queue, because players in config state could receive it - ( (UserConnection) player ).sendPacketQueued( newPacket ); + player.unsafe().sendPacketQueued( newPacket ); } else { player.unsafe().sendPacket( oldPacket );