From 497c6879e05d168102b3331e55c53ccfd9fef541 Mon Sep 17 00:00:00 2001 From: md_5 Date: Sun, 24 Sep 2023 06:50:46 +1000 Subject: [PATCH] Add (hopefully temporary) queue for plugin messages to server --- .../bungee/protocol/MinecraftEncoder.java | 1 + .../net/md_5/bungee/ServerConnection.java | 26 ++++++++++++++++++- .../java/net/md_5/bungee/UserConnection.java | 2 +- .../bungee/connection/UpstreamBridge.java | 3 +++ .../net/md_5/bungee/netty/ChannelWrapper.java | 5 ++++ 5 files changed, 35 insertions(+), 2 deletions(-) diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/MinecraftEncoder.java b/protocol/src/main/java/net/md_5/bungee/protocol/MinecraftEncoder.java index 5d0ca482c..2245dc56b 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/MinecraftEncoder.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/MinecraftEncoder.java @@ -15,6 +15,7 @@ public class MinecraftEncoder extends MessageToByteEncoder @Setter private Protocol protocol; private boolean server; + @Getter @Setter private int protocolVersion; 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 5e4527805..5d5404502 100644 --- a/proxy/src/main/java/net/md_5/bungee/ServerConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/ServerConnection.java @@ -5,6 +5,7 @@ import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.ArrayDeque; import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; import lombok.Data; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -13,6 +14,7 @@ import net.md_5.bungee.api.chat.BaseComponent; 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.packet.PluginMessage; @RequiredArgsConstructor @@ -30,6 +32,7 @@ public class ServerConnection implements Server private final boolean forgeServer = false; @Getter private final Queue keepAlives = new ArrayDeque<>(); + private final Queue packetQueue = new ConcurrentLinkedQueue<>(); private final Unsafe unsafe = new Unsafe() { @@ -40,10 +43,31 @@ public class ServerConnection implements Server } }; + public void sendPacketQueued(DefinedPacket packet) + { + Protocol encodeProtocol = ch.getEncodeProtocol(); + if ( !encodeProtocol.TO_SERVER.hasPacket( packet.getClass(), ch.getEncodeVersion() ) ) + { + packetQueue.add( packet ); + } else + { + unsafe().sendPacket( packet ); + } + } + + public void sendQueuedPackets() + { + DefinedPacket packet; + while ( ( packet = packetQueue.poll() ) != null ) + { + unsafe().sendPacket( packet ); + } + } + @Override public void sendData(String channel, byte[] data) { - unsafe().sendPacket( new PluginMessage( channel, data, forgeServer ) ); + sendPacketQueued( new PluginMessage( channel, data, forgeServer ) ); } @Override 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 c1c73abab..be65c3ada 100644 --- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java @@ -182,7 +182,7 @@ public final class UserConnection implements ProxiedPlayer public void sendPacketQueued(DefinedPacket packet) { Protocol encodeProtocol = ch.getEncodeProtocol(); - if ( encodeProtocol != Protocol.GAME && !encodeProtocol.TO_CLIENT.hasPacket( packet.getClass(), getPendingConnection().getVersion() ) ) + if ( !encodeProtocol.TO_CLIENT.hasPacket( packet.getClass(), getPendingConnection().getVersion() ) ) { packetQueue.add( packet ); } else 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 48a523c68..348680246 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 @@ -331,6 +331,9 @@ public class UpstreamBridge extends PacketHandler ch.setDecodeProtocol( Protocol.CONFIGURATION ); ch.write( new LoginAcknowledged() ); ch.setEncodeProtocol( Protocol.CONFIGURATION ); + + con.getServer().sendQueuedPackets(); + throw CancelSendSignal.INSTANCE; } } diff --git a/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java b/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java index 915f8a7bb..e8d5ed196 100644 --- a/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java +++ b/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java @@ -69,6 +69,11 @@ public class ChannelWrapper ch.pipeline().get( MinecraftEncoder.class ).setProtocolVersion( protocol ); } + public int getEncodeVersion() + { + return ch.pipeline().get( MinecraftEncoder.class ).getProtocolVersion(); + } + public void write(Object packet) { if ( !closed )