From 74e388df7803376d231e2afdab4dcdad7c0190e5 Mon Sep 17 00:00:00 2001 From: "FivePB (Xer)" Date: Tue, 11 Aug 2020 22:29:50 +0200 Subject: [PATCH] 1.16.2 Temporary support patch (#560) --- .../0057-Waterfall-1.16.2-patch.patch | 385 ++++++++++++++++++ 1 file changed, 385 insertions(+) create mode 100644 BungeeCord-Patches/0057-Waterfall-1.16.2-patch.patch diff --git a/BungeeCord-Patches/0057-Waterfall-1.16.2-patch.patch b/BungeeCord-Patches/0057-Waterfall-1.16.2-patch.patch new file mode 100644 index 0000000..bbfee26 --- /dev/null +++ b/BungeeCord-Patches/0057-Waterfall-1.16.2-patch.patch @@ -0,0 +1,385 @@ +From 410bda8afddf6865905cf495afd65da36740f224 Mon Sep 17 00:00:00 2001 +From: "Five (Xer)" +Date: Tue, 11 Aug 2020 20:03:28 +0200 +Subject: [PATCH] Waterfall 1.16.2-patch + + +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 546564fb..e2a02360 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 +@@ -72,7 +72,8 @@ public enum Protocol + map( ProtocolConstants.MINECRAFT_1_13, 0x21 ), + map( ProtocolConstants.MINECRAFT_1_14, 0x20 ), + map( ProtocolConstants.MINECRAFT_1_15, 0x21 ), +- map( ProtocolConstants.MINECRAFT_1_16, 0x20 ) ++ map( ProtocolConstants.MINECRAFT_1_16, 0x20 ), ++ map( ProtocolConstants.MINECRAFT_1_16_2, 0x1F ) + ); + TO_CLIENT.registerPacket( + Login.class, +@@ -81,7 +82,8 @@ public enum Protocol + map( ProtocolConstants.MINECRAFT_1_9, 0x23 ), + map( ProtocolConstants.MINECRAFT_1_13, 0x25 ), + map( ProtocolConstants.MINECRAFT_1_15, 0x26 ), +- map( ProtocolConstants.MINECRAFT_1_16, 0x25 ) ++ map( ProtocolConstants.MINECRAFT_1_16, 0x25 ), ++ map( ProtocolConstants.MINECRAFT_1_16_2, 0x24 ) + ); + TO_CLIENT.registerPacket( + Chat.class, +@@ -102,7 +104,8 @@ public enum Protocol + map( ProtocolConstants.MINECRAFT_1_13, 0x38 ), + map( ProtocolConstants.MINECRAFT_1_14, 0x3A ), + map( ProtocolConstants.MINECRAFT_1_15, 0x3B ), +- map( ProtocolConstants.MINECRAFT_1_16, 0x3A ) ++ map( ProtocolConstants.MINECRAFT_1_16, 0x3A ), ++ map( ProtocolConstants.MINECRAFT_1_16_2, 0x39 ) + ); + TO_CLIENT.registerPacket( + BossBar.class, +@@ -135,7 +138,8 @@ public enum Protocol + map(ProtocolConstants.MINECRAFT_1_13, 0x36), + map(ProtocolConstants.MINECRAFT_1_14, 0x38), + map(ProtocolConstants.MINECRAFT_1_15, 0x39), +- map(ProtocolConstants.MINECRAFT_1_16, 0x38) ++ map(ProtocolConstants.MINECRAFT_1_16, 0x38), ++ map(ProtocolConstants.MINECRAFT_1_16_2, 0x37) + ); + // Waterfall end + TO_CLIENT.registerPacket( +@@ -147,7 +151,8 @@ public enum Protocol + map( ProtocolConstants.MINECRAFT_1_13, 0x30 ), + map( ProtocolConstants.MINECRAFT_1_14, 0x33 ), + map( ProtocolConstants.MINECRAFT_1_15, 0x34 ), +- map( ProtocolConstants.MINECRAFT_1_16, 0x33 ) ++ map( ProtocolConstants.MINECRAFT_1_16, 0x33 ), ++ map( ProtocolConstants.MINECRAFT_1_16_2, 0x32 ) + ); + TO_CLIENT.registerPacket( + TabCompleteResponse.class, +@@ -156,7 +161,8 @@ public enum Protocol + map( ProtocolConstants.MINECRAFT_1_9, 0x0E ), + map( ProtocolConstants.MINECRAFT_1_13, 0x10 ), + map( ProtocolConstants.MINECRAFT_1_15, 0x11 ), +- map( ProtocolConstants.MINECRAFT_1_16, 0x10 ) ++ map( ProtocolConstants.MINECRAFT_1_16, 0x10 ), ++ map( ProtocolConstants.MINECRAFT_1_16_2, 0x0F ) + ); + TO_CLIENT.registerPacket( + ScoreboardObjective.class, +@@ -210,7 +216,8 @@ public enum Protocol + map( ProtocolConstants.MINECRAFT_1_13, 0x19 ), + map( ProtocolConstants.MINECRAFT_1_14, 0x18 ), + map( ProtocolConstants.MINECRAFT_1_15, 0x19 ), +- map( ProtocolConstants.MINECRAFT_1_16, 0x18 ) ++ map( ProtocolConstants.MINECRAFT_1_16, 0x18 ), ++ map( ProtocolConstants.MINECRAFT_1_16_2, 0x17 ) + ); + TO_CLIENT.registerPacket( + Kick.class, +@@ -220,7 +227,8 @@ public enum Protocol + map( ProtocolConstants.MINECRAFT_1_13, 0x1B ), + map( ProtocolConstants.MINECRAFT_1_14, 0x1A ), + map( ProtocolConstants.MINECRAFT_1_15, 0x1B ), +- map( ProtocolConstants.MINECRAFT_1_16, 0x1A ) ++ map( ProtocolConstants.MINECRAFT_1_16, 0x1A ), ++ map( ProtocolConstants.MINECRAFT_1_16_2, 0x19 ) + ); + TO_CLIENT.registerPacket( + Title.class, +@@ -254,21 +262,24 @@ public enum Protocol + map( ProtocolConstants.MINECRAFT_1_13, 0x1C ), + map( ProtocolConstants.MINECRAFT_1_14, 0x1B ), + map( ProtocolConstants.MINECRAFT_1_15, 0x1C ), +- map( ProtocolConstants.MINECRAFT_1_16, 0x1B ) ++ map( ProtocolConstants.MINECRAFT_1_16, 0x1B ), ++ map( ProtocolConstants.MINECRAFT_1_16_2, 0x1A ) + ); + TO_CLIENT.registerPacket( + Commands.class, + Commands::new, // Waterfall - speed up packet construction + map( ProtocolConstants.MINECRAFT_1_13, 0x11 ), + map( ProtocolConstants.MINECRAFT_1_15, 0x12 ), +- map( ProtocolConstants.MINECRAFT_1_16, 0x11 ) ++ map( ProtocolConstants.MINECRAFT_1_16, 0x11 ), ++ map( ProtocolConstants.MINECRAFT_1_16_2, 0x10 ) + ); + TO_CLIENT.registerPacket( + GameState.class, + GameState::new, // Waterfall - speed up packet construction + map( ProtocolConstants.MINECRAFT_1_15, 0x1F ), + map( ProtocolConstants.MINECRAFT_1_16, 0x1E ), +- map( ProtocolConstants.MINECRAFT_1_15, 0x1F ) ++ map( ProtocolConstants.MINECRAFT_1_15, 0x1F ), ++ map( ProtocolConstants.MINECRAFT_1_16_2, 0x1E ) + ); + TO_CLIENT.registerPacket( + ViewDistance.class, +diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/ProtocolConstants.java b/protocol/src/main/java/net/md_5/bungee/protocol/ProtocolConstants.java +index a82f2ec8..aa1b770c 100644 +--- a/protocol/src/main/java/net/md_5/bungee/protocol/ProtocolConstants.java ++++ b/protocol/src/main/java/net/md_5/bungee/protocol/ProtocolConstants.java +@@ -30,6 +30,7 @@ public class ProtocolConstants + public static final int MINECRAFT_1_15_2 = 578; + public static final int MINECRAFT_1_16 = 735; + public static final int MINECRAFT_1_16_1 = 736; ++ public static final int MINECRAFT_1_16_2 = 751; + public static final List SUPPORTED_VERSIONS = Arrays.asList( + "1.8.x", + "1.9.x", +@@ -65,7 +66,8 @@ public class ProtocolConstants + ProtocolConstants.MINECRAFT_1_15_1, + ProtocolConstants.MINECRAFT_1_15_2, + ProtocolConstants.MINECRAFT_1_16, +- ProtocolConstants.MINECRAFT_1_16_1 ++ ProtocolConstants.MINECRAFT_1_16_1, ++ ProtocolConstants.MINECRAFT_1_16_2 + ); + + public static final boolean isBeforeOrEq(int before, int other) +diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/Commands.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/Commands.java +index 2b1c8377..1330cac2 100644 +--- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/Commands.java ++++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/Commands.java +@@ -550,6 +550,7 @@ public class Commands extends DefinedPacket + PROVIDERS.put( "minecraft:uuid", VOID ); // 1.16 + PROVIDERS.put( "minecraft:test_argument", VOID ); // 1.16, debug + PROVIDERS.put( "minecraft:test_class", VOID ); // 1.16, debug ++ PROVIDERS.put( "minecraft:angle", VOID ); // 1.16 + } + + private static ArgumentType read(String key, ByteBuf buf) +diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/Login.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/Login.java +index 6ca80e2b..8f02538e 100644 +--- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/Login.java ++++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/Login.java +@@ -35,19 +35,29 @@ public class Login extends DefinedPacket + private String worldName; + private long seed; + private short difficulty; +- private short maxPlayers; ++ private int maxPlayers; + private String levelType; + private int viewDistance; + private boolean reducedDebugInfo; + private boolean normalRespawn; + private boolean debug; + private boolean flat; ++ private boolean hardcoreMode; + + @Override + public void read(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion) + { + entityId = buf.readInt(); +- gameMode = buf.readUnsignedByte(); ++ if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_16_2 ) ++ { ++ hardcoreMode = buf.readBoolean(); ++ gameMode = buf.readByte(); ++ } else ++ { ++ gameMode = buf.readByte(); ++ hardcoreMode = (gameMode & 0x08) != 0; ++ gameMode &= ~0x08; ++ } + if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_16 ) + { + previousGameMode = buf.readUnsignedByte(); +@@ -67,7 +77,13 @@ public class Login extends DefinedPacket + + if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_16 ) + { +- dimension = readString( buf ); ++ if ( protocolVersion < ProtocolConstants.MINECRAFT_1_16_2 ) ++ { ++ dimension = readString( buf ); ++ ++ } else { ++ dimension = NamedTag.read( new DataInputStream( new ByteBufInputStream( buf ) ) ); ++ } + worldName = readString( buf ); + } else if ( protocolVersion > ProtocolConstants.MINECRAFT_1_9 ) + { +@@ -84,7 +100,12 @@ public class Login extends DefinedPacket + { + difficulty = buf.readUnsignedByte(); + } +- maxPlayers = buf.readUnsignedByte(); ++ if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_16_2 ) ++ { ++ maxPlayers = readVarInt( buf ); ++ } else { ++ maxPlayers = buf.readUnsignedByte(); ++ } + if ( protocolVersion < ProtocolConstants.MINECRAFT_1_16 ) + { + levelType = readString( buf ); +@@ -112,7 +133,14 @@ public class Login extends DefinedPacket + public void write(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion) + { + buf.writeInt( entityId ); +- buf.writeByte( gameMode ); ++ if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_16_2 ) ++ { ++ buf.writeBoolean( hardcoreMode ); ++ buf.writeByte( gameMode ); ++ } else ++ { ++ buf.writeByte( hardcoreMode ? gameMode | 0x8 : gameMode ); ++ } + if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_16 ) + { + buf.writeByte( previousGameMode ); +@@ -134,7 +162,18 @@ public class Login extends DefinedPacket + + if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_16 ) + { +- writeString( (String) dimension, buf ); ++ if ( protocolVersion < ProtocolConstants.MINECRAFT_1_16_2 ) ++ { ++ writeString( (String) dimension, buf ); ++ } else { ++ try ++ { ++ ((Tag) dimension).write( new DataOutputStream( new ByteBufOutputStream( buf ) ) ); ++ } catch ( IOException ex ) ++ { ++ throw new RuntimeException( "Exception writing current dimension", ex ); ++ } ++ } + writeString( worldName, buf ); + } else if ( protocolVersion > ProtocolConstants.MINECRAFT_1_9 ) + { +@@ -151,7 +190,13 @@ public class Login extends DefinedPacket + { + buf.writeByte( difficulty ); + } +- buf.writeByte( maxPlayers ); ++ if( protocolVersion >= ProtocolConstants.MINECRAFT_1_16_2 ) ++ { ++ writeVarInt( maxPlayers, buf ); ++ } else ++ { ++ buf.writeByte( maxPlayers ); ++ } + if ( protocolVersion < ProtocolConstants.MINECRAFT_1_16 ) + { + writeString( levelType, buf ); +diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/Respawn.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/Respawn.java +index 0d8068ea..ef78db16 100644 +--- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/Respawn.java ++++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/Respawn.java +@@ -1,6 +1,8 @@ + package net.md_5.bungee.protocol.packet; + + import io.netty.buffer.ByteBuf; ++import io.netty.buffer.ByteBufInputStream; ++import io.netty.buffer.ByteBufOutputStream; + import lombok.AllArgsConstructor; + import lombok.Data; + import lombok.EqualsAndHashCode; +@@ -8,6 +10,12 @@ import lombok.NoArgsConstructor; + import net.md_5.bungee.protocol.AbstractPacketHandler; + import net.md_5.bungee.protocol.DefinedPacket; + import net.md_5.bungee.protocol.ProtocolConstants; ++import se.llbit.nbt.NamedTag; ++import se.llbit.nbt.Tag; ++ ++import java.io.DataInputStream; ++import java.io.DataOutputStream; ++import java.io.IOException; + + @Data + @NoArgsConstructor +@@ -32,7 +40,13 @@ public class Respawn extends DefinedPacket + { + if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_16 ) + { +- dimension = readString( buf ); ++ if( protocolVersion >= ProtocolConstants.MINECRAFT_1_16_2 ) ++ { ++ dimension = NamedTag.read( new DataInputStream( new ByteBufInputStream( buf ) ) ); ++ } else ++ { ++ dimension = readString( buf ); ++ } + worldName = readString( buf ); + } else + { +@@ -64,7 +78,19 @@ public class Respawn extends DefinedPacket + { + if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_16 ) + { +- writeString( (String) dimension, buf ); ++ if( protocolVersion >= ProtocolConstants.MINECRAFT_1_16_2 ) ++ { ++ try ++ { ++ ((Tag) dimension).write( new DataOutputStream( new ByteBufOutputStream( buf ) ) ); ++ } catch ( IOException ex ) ++ { ++ throw new RuntimeException( "Exception writing current Dimension (respawn)", ex ); ++ } ++ } else ++ { ++ writeString( (String) dimension, buf ); ++ } + writeString( worldName, buf ); + } else + { +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 78401dae..c473acdb 100644 +--- a/proxy/src/main/java/net/md_5/bungee/ServerConnector.java ++++ b/proxy/src/main/java/net/md_5/bungee/ServerConnector.java +@@ -54,6 +54,7 @@ import net.md_5.bungee.protocol.packet.SetCompression; + import net.md_5.bungee.protocol.packet.ViewDistance; + import net.md_5.bungee.util.BufUtil; + import net.md_5.bungee.util.QuietException; ++import se.llbit.nbt.Tag; + + @RequiredArgsConstructor + public class ServerConnector extends PacketHandler +@@ -246,7 +247,7 @@ public class ServerConnector extends PacketHandler + + // Set tab list size, TODO: what shall we do about packet mutability + Login modLogin = new Login( login.getEntityId(), login.getGameMode(), login.getPreviousGameMode(), login.getWorldNames(), login.getDimensions(), login.getDimension(), login.getWorldName(), login.getSeed(), login.getDifficulty(), +- (byte) user.getPendingConnection().getListener().getTabListSize(), login.getLevelType(), login.getViewDistance(), login.isReducedDebugInfo(), login.isNormalRespawn(), login.isDebug(), login.isFlat() ); ++ (byte) user.getPendingConnection().getListener().getTabListSize(), login.getLevelType(), login.getViewDistance(), login.isReducedDebugInfo(), login.isNormalRespawn(), login.isDebug(), login.isFlat(), login.isHardcoreMode() ); + + user.unsafe().sendPacket( modLogin ); + +@@ -264,7 +265,7 @@ public class ServerConnector extends PacketHandler + } + user.getSentBossBars().clear(); + +- user.unsafe().sendPacket( new Respawn( login.getDimension(), login.getWorldName(), login.getSeed(), login.getDifficulty(), login.getGameMode(), login.getPreviousGameMode(), login.getLevelType(), login.isDebug(), login.isFlat(), false ) ); ++ user.unsafe().sendPacket( new Respawn( login.getDimension(), login.getWorldName(), login.getSeed(), login.getDifficulty(), login.getGameMode(), login.getPreviousGameMode(), login.getLevelType(), login.isDebug(), login.isFlat(), false) ); + user.getServer().disconnect( "Quitting" ); + } else + { +@@ -332,7 +333,7 @@ public class ServerConnector extends PacketHandler + } + + Login modLogin = new Login( login.getEntityId(), login.getGameMode(), login.getPreviousGameMode(), login.getWorldNames(), login.getDimensions(), login.getDimension(), login.getWorldName(), login.getSeed(), login.getDifficulty(), +- (byte) user.getPendingConnection().getListener().getTabListSize(), login.getLevelType(), login.getViewDistance(), login.isReducedDebugInfo(), login.isNormalRespawn(), login.isDebug(), login.isFlat() ); ++ (byte) user.getPendingConnection().getListener().getTabListSize(), login.getLevelType(), login.getViewDistance(), login.isReducedDebugInfo(), login.isNormalRespawn(), login.isDebug(), login.isFlat(), login.isHardcoreMode() ); + user.unsafe().sendPacket(modLogin); + + // Only send if we're in the same dimension +diff --git a/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap.java b/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap.java +index e64a11b5..05947c40 100644 +--- a/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap.java ++++ b/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap.java +@@ -70,6 +70,8 @@ public abstract class EntityMap + case ProtocolConstants.MINECRAFT_1_16: + case ProtocolConstants.MINECRAFT_1_16_1: + return EntityMap_1_16.INSTANCE; ++ case ProtocolConstants.MINECRAFT_1_16_2: ++ return EntityMap_Dummy.INSTANCE; + } + throw new RuntimeException( "Version " + version + " has no entity map" ); + } +-- +2.24.0 +