From 2b9808cd13ed74065b579a5472e35ca6df5531a6 Mon Sep 17 00:00:00 2001 From: Outfluencer Date: Sun, 8 Jun 2025 11:07:20 +1000 Subject: [PATCH] #3846, #3847: Handle packet bundles --- .../protocol/AbstractPacketHandler.java | 5 ++++ .../net/md_5/bungee/protocol/Protocol.java | 6 ++++ .../protocol/packet/BundleDelimiter.java | 29 +++++++++++++++++++ .../java/net/md_5/bungee/ServerConnector.java | 7 ++++- .../java/net/md_5/bungee/UserConnection.java | 8 +++++ .../bungee/connection/DownstreamBridge.java | 7 +++++ 6 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 protocol/src/main/java/net/md_5/bungee/protocol/packet/BundleDelimiter.java diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/AbstractPacketHandler.java b/protocol/src/main/java/net/md_5/bungee/protocol/AbstractPacketHandler.java index 8c73509b..654f7da5 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/AbstractPacketHandler.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/AbstractPacketHandler.java @@ -1,6 +1,7 @@ package net.md_5.bungee.protocol; import net.md_5.bungee.protocol.packet.BossBar; +import net.md_5.bungee.protocol.packet.BundleDelimiter; import net.md_5.bungee.protocol.packet.Chat; import net.md_5.bungee.protocol.packet.ClearDialog; import net.md_5.bungee.protocol.packet.ClearTitles; @@ -293,4 +294,8 @@ public abstract class AbstractPacketHandler public void handle(CustomClickAction customClickAction) throws Exception { } + + public void handle(BundleDelimiter bundleDelimiter) throws Exception + { + } } diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/Protocol.java b/protocol/src/main/java/net/md_5/bungee/protocol/Protocol.java index 87c4a875..7b6d16a1 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/Protocol.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/Protocol.java @@ -10,6 +10,7 @@ import java.util.function.Supplier; import lombok.Data; import lombok.Getter; import net.md_5.bungee.protocol.packet.BossBar; +import net.md_5.bungee.protocol.packet.BundleDelimiter; import net.md_5.bungee.protocol.packet.Chat; import net.md_5.bungee.protocol.packet.ClearDialog; import net.md_5.bungee.protocol.packet.ClearTitles; @@ -85,6 +86,11 @@ public enum Protocol { { + TO_CLIENT.registerPacket( + BundleDelimiter.class, + BundleDelimiter::new, + map( ProtocolConstants.MINECRAFT_1_19_4, 0x00 ) + ); TO_CLIENT.registerPacket( KeepAlive.class, KeepAlive::new, diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/BundleDelimiter.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/BundleDelimiter.java new file mode 100644 index 00000000..12bb6259 --- /dev/null +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/BundleDelimiter.java @@ -0,0 +1,29 @@ +package net.md_5.bungee.protocol.packet; + +import io.netty.buffer.ByteBuf; +import lombok.Data; +import lombok.EqualsAndHashCode; +import net.md_5.bungee.protocol.AbstractPacketHandler; +import net.md_5.bungee.protocol.DefinedPacket; + +@Data +@EqualsAndHashCode(callSuper = false) +public class BundleDelimiter extends DefinedPacket +{ + + @Override + public void read(ByteBuf buf) + { + } + + @Override + public void write(ByteBuf buf) + { + } + + @Override + public void handle(AbstractPacketHandler handler) throws Exception + { + handler.handle( this ); + } +} diff --git a/proxy/src/main/java/net/md_5/bungee/ServerConnector.java b/proxy/src/main/java/net/md_5/bungee/ServerConnector.java index 5583a1b3..d47f5ef9 100644 --- a/proxy/src/main/java/net/md_5/bungee/ServerConnector.java +++ b/proxy/src/main/java/net/md_5/bungee/ServerConnector.java @@ -39,6 +39,7 @@ import net.md_5.bungee.protocol.Either; import net.md_5.bungee.protocol.PacketWrapper; import net.md_5.bungee.protocol.Protocol; import net.md_5.bungee.protocol.ProtocolConstants; +import net.md_5.bungee.protocol.packet.BundleDelimiter; import net.md_5.bungee.protocol.packet.CookieRequest; import net.md_5.bungee.protocol.packet.CookieResponse; import net.md_5.bungee.protocol.packet.EncryptionRequest; @@ -369,9 +370,13 @@ public class ServerConnector extends PacketHandler { if ( user.getServer() != null ) { - // Begin config mode if ( user.getCh().getEncodeProtocol() != Protocol.CONFIGURATION ) { + if ( user.isBundling() ) + { + user.toggleBundling(); + user.unsafe().sendPacket( new BundleDelimiter() ); + } user.unsafe().sendPacket( new StartConfiguration() ); } } 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 5adee5b8..50c16388 100644 --- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java @@ -114,6 +114,14 @@ public final class UserConnection implements ProxiedPlayer // Used for trying multiple servers in order @Setter private Queue serverJoinQueue; + @Getter + @Setter + private boolean bundling; + + public void toggleBundling() + { + bundling = !bundling; + } /*========================================================================*/ private final Collection groups = new CaseInsensitiveSet(); private final Collection permissions = new CaseInsensitiveSet(); diff --git a/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java b/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java index 71470345..aa5b5bc6 100644 --- a/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java +++ b/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java @@ -54,6 +54,7 @@ import net.md_5.bungee.protocol.PacketWrapper; import net.md_5.bungee.protocol.Protocol; import net.md_5.bungee.protocol.ProtocolConstants; import net.md_5.bungee.protocol.packet.BossBar; +import net.md_5.bungee.protocol.packet.BundleDelimiter; import net.md_5.bungee.protocol.packet.Commands; import net.md_5.bungee.protocol.packet.FinishConfiguration; import net.md_5.bungee.protocol.packet.KeepAlive; @@ -812,6 +813,12 @@ public class DownstreamBridge extends PacketHandler throw CancelSendSignal.INSTANCE; } + @Override + public void handle(BundleDelimiter bundleDelimiter) throws Exception + { + con.toggleBundling(); + } + @Override public String toString() {