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() {