diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/LegacyDecoder.java b/protocol/src/main/java/net/md_5/bungee/protocol/LegacyDecoder.java index 5518bf26..998874f8 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/LegacyDecoder.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/LegacyDecoder.java @@ -31,12 +31,12 @@ public class LegacyDecoder extends ByteToMessageDecoder if ( packetID == 0xFE ) { - out.add( new PacketWrapper( new LegacyPing( in.isReadable() && in.readUnsignedByte() == 0x01 ), Unpooled.EMPTY_BUFFER ) ); + out.add( new PacketWrapper( new LegacyPing( in.isReadable() && in.readUnsignedByte() == 0x01 ), Unpooled.EMPTY_BUFFER, Protocol.STATUS ) ); return; } else if ( packetID == 0x02 && in.isReadable() ) { in.skipBytes( in.readableBytes() ); - out.add( new PacketWrapper( new LegacyHandshake(), Unpooled.EMPTY_BUFFER ) ); + out.add( new PacketWrapper( new LegacyHandshake(), Unpooled.EMPTY_BUFFER, Protocol.STATUS ) ); return; } diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/MinecraftDecoder.java b/protocol/src/main/java/net/md_5/bungee/protocol/MinecraftDecoder.java index 1bc50e8c..482341ef 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/MinecraftDecoder.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/MinecraftDecoder.java @@ -50,7 +50,7 @@ public class MinecraftDecoder extends MessageToMessageDecoder in.skipBytes( in.readableBytes() ); } - out.add( new PacketWrapper( packet, slice ) ); + out.add( new PacketWrapper( packet, slice, protocol ) ); slice = null; } finally { diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/PacketWrapper.java b/protocol/src/main/java/net/md_5/bungee/protocol/PacketWrapper.java index 8eba797b..61e695cf 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/PacketWrapper.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/PacketWrapper.java @@ -10,6 +10,7 @@ public class PacketWrapper public final DefinedPacket packet; public final ByteBuf buf; + public final Protocol protocol; @Setter private boolean released; 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 34868024..fdc29b6a 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 @@ -136,8 +136,15 @@ public class UpstreamBridge extends PacketHandler { if ( con.getServer() != null ) { + Protocol serverEncode = con.getServer().getCh().getEncodeProtocol(); + // #3527: May still have old packets from client in game state when switching server to configuration state - discard those + if ( packet.protocol != serverEncode ) + { + return; + } + EntityMap rewrite = con.getEntityRewrite(); - if ( rewrite != null && con.getServer().getCh().getEncodeProtocol() == Protocol.GAME ) + if ( rewrite != null && serverEncode == Protocol.GAME ) { rewrite.rewriteServerbound( packet.buf, con.getClientEntityId(), con.getServerEntityId(), con.getPendingConnection().getVersion() ); }