From 90968ca1952c24ab5df230896488dbf59fb0128b Mon Sep 17 00:00:00 2001 From: booky10 Date: Tue, 7 May 2024 21:10:51 +0200 Subject: [PATCH] Fix reading of JoinGame packet on 1.16/1.16.1 --- .../packetevents/wrapper/PacketWrapper.java | 8 +++---- .../server/WrapperPlayServerJoinGame.java | 22 ++++++++++++++----- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/api/src/main/java/com/github/retrooper/packetevents/wrapper/PacketWrapper.java b/api/src/main/java/com/github/retrooper/packetevents/wrapper/PacketWrapper.java index 3eb64235d9..3c23a1b798 100644 --- a/api/src/main/java/com/github/retrooper/packetevents/wrapper/PacketWrapper.java +++ b/api/src/main/java/com/github/retrooper/packetevents/wrapper/PacketWrapper.java @@ -953,7 +953,8 @@ public Dimension readDimension() { if (this.serverVersion.isNewerThanOrEquals(ServerVersion.V_1_20_5)) { return new Dimension(this.readVarInt()); } - if (serverVersion.isNewerThanOrEquals(ServerVersion.V_1_19)) { + if (this.serverVersion.isNewerThanOrEquals(ServerVersion.V_1_19) + || this.serverVersion.isOlderThan(ServerVersion.V_1_16_2)) { Dimension dimension = new Dimension(new NBTCompound()); dimension.setDimensionName(readIdentifier().toString()); return dimension; @@ -967,9 +968,8 @@ public void writeDimension(Dimension dimension) { this.writeVarInt(dimension.getId()); return; } - boolean v1_19 = serverVersion.isNewerThanOrEquals(ServerVersion.V_1_19); - boolean v1_16_2 = serverVersion.isNewerThanOrEquals(ServerVersion.V_1_16_2); - if (v1_19 || !v1_16_2) { + if (this.serverVersion.isNewerThanOrEquals(ServerVersion.V_1_19) + || this.serverVersion.isOlderThan(ServerVersion.V_1_16_2)) { writeString(dimension.getDimensionName(), 32767); } else { writeNBT(dimension.getAttributes()); diff --git a/api/src/main/java/com/github/retrooper/packetevents/wrapper/play/server/WrapperPlayServerJoinGame.java b/api/src/main/java/com/github/retrooper/packetevents/wrapper/play/server/WrapperPlayServerJoinGame.java index 4122231108..0bb6ede29f 100644 --- a/api/src/main/java/com/github/retrooper/packetevents/wrapper/play/server/WrapperPlayServerJoinGame.java +++ b/api/src/main/java/com/github/retrooper/packetevents/wrapper/play/server/WrapperPlayServerJoinGame.java @@ -23,7 +23,11 @@ import com.github.retrooper.packetevents.protocol.nbt.NBTCompound; import com.github.retrooper.packetevents.protocol.packettype.PacketType; import com.github.retrooper.packetevents.protocol.player.GameMode; -import com.github.retrooper.packetevents.protocol.world.*; +import com.github.retrooper.packetevents.protocol.world.Difficulty; +import com.github.retrooper.packetevents.protocol.world.Dimension; +import com.github.retrooper.packetevents.protocol.world.DimensionType; +import com.github.retrooper.packetevents.protocol.world.WorldBlockPosition; +import com.github.retrooper.packetevents.protocol.world.WorldType; import com.github.retrooper.packetevents.wrapper.PacketWrapper; import org.jetbrains.annotations.Nullable; @@ -124,10 +128,11 @@ public void read() { boolean v1_20_2 = serverVersion.isNewerThanOrEquals(ServerVersion.V_1_20_2); boolean v1_19 = serverVersion.isNewerThanOrEquals(ServerVersion.V_1_19); boolean v1_18 = serverVersion.isNewerThanOrEquals(ServerVersion.V_1_18); + boolean v1_16_2 = serverVersion.isNewerThanOrEquals(ServerVersion.V_1_16_2); boolean v1_16 = serverVersion.isNewerThanOrEquals(ServerVersion.V_1_16); boolean v1_15 = serverVersion.isNewerThanOrEquals(ServerVersion.V_1_15); boolean v1_14 = serverVersion.isNewerThanOrEquals(ServerVersion.V_1_14); - if (v1_16) { + if (v1_16_2) { hardcore = readBoolean(); if (!v1_20_2) { gameMode = readGameMode(); @@ -135,7 +140,7 @@ public void read() { } else { int gameModeId = readUnsignedByte(); hardcore = (gameModeId & 0x8) == 0x8; - gameMode = GameMode.getById(gameModeId & -0x9); + gameMode = GameMode.getById(gameModeId & ~0x08); } if (v1_16) { if (!v1_20_2) { @@ -163,7 +168,7 @@ public void read() { hashedSeed = readLong(); } if (v1_16) { - maxPlayers = readVarInt(); + this.maxPlayers = v1_16_2 ? this.readVarInt() : this.readUnsignedByte(); viewDistance = readVarInt(); if (v1_18) simulationDistance = readVarInt(); reducedDebugInfo = readBoolean(); @@ -208,10 +213,11 @@ public void write() { boolean v1_20_2 = serverVersion.isNewerThanOrEquals(ServerVersion.V_1_20_2); boolean v1_19 = serverVersion.isNewerThanOrEquals(ServerVersion.V_1_19); boolean v1_18 = serverVersion.isNewerThanOrEquals(ServerVersion.V_1_18); + boolean v1_16_2 = serverVersion.isNewerThanOrEquals(ServerVersion.V_1_16_2); boolean v1_16 = serverVersion.isNewerThanOrEquals(ServerVersion.V_1_16); boolean v1_14 = serverVersion.isNewerThanOrEquals(ServerVersion.V_1_14); boolean v1_15 = serverVersion.isNewerThanOrEquals(ServerVersion.V_1_15); - if (v1_16) { + if (v1_16_2) { writeBoolean(hardcore); if (!v1_20_2) { writeGameMode(gameMode); @@ -254,7 +260,11 @@ public void write() { writeLong(hashedSeed); } if (v1_16) { - writeVarInt(maxPlayers); + if (v1_16_2) { + this.writeVarInt(this.maxPlayers); + } else { + this.writeByte(this.maxPlayers); + } writeVarInt(viewDistance); if (v1_18) writeVarInt(simulationDistance); writeBoolean(reducedDebugInfo);