From b19fa9db37883704cad8e7b6f0f649c6bbb1cdc1 Mon Sep 17 00:00:00 2001 From: Max Date: Thu, 28 Jul 2022 13:38:26 -0500 Subject: [PATCH 01/11] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 73566f0..c537db3 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ Symbol `X` means all minor versions. - [x] 1.17.X - [x] 1.18.X - [x] 1.19 +- [x] 1.19.1 The server **doesn't** support snapshots. From e7257894e372199594326a310271e48c5f0a9313 Mon Sep 17 00:00:00 2001 From: "Pantera (Mad_Daniel)" <89838384+Pantera07@users.noreply.github.com> Date: Sun, 28 Aug 2022 10:01:28 +0900 Subject: [PATCH 02/11] Update build.gradle --- build.gradle | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index 09eec6a..944741b 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id 'java' - id 'com.github.johnrengelman.shadow' version '7.0.0' + id 'com.github.johnrengelman.shadow' version '7.1.2' } group 'ru.nanit' @@ -20,12 +20,12 @@ repositories { } dependencies { - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.0' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.0' implementation 'org.spongepowered:configurate-yaml:4.1.2' - implementation 'io.netty:netty-all:4.1.77.Final' - implementation 'net.kyori:adventure-nbt:4.10.1' + implementation 'io.netty:netty-all:4.1.80.Final' + implementation 'net.kyori:adventure-nbt:4.11.0' implementation 'com.grack:nanojson:1.7' } @@ -41,4 +41,4 @@ shadowJar { test { useJUnitPlatform() -} \ No newline at end of file +} From 699996e267840d2544638d201a8e48cc52674d27 Mon Sep 17 00:00:00 2001 From: "Pantera (Mad_Daniel)" <89838384+Pantera07@users.noreply.github.com> Date: Fri, 16 Sep 2022 13:45:25 +0900 Subject: [PATCH 03/11] Bump netty to 4.1.82.Final Bump netty to 4.1.82.Final --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 944741b..9924c8f 100644 --- a/build.gradle +++ b/build.gradle @@ -24,7 +24,7 @@ dependencies { testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.0' implementation 'org.spongepowered:configurate-yaml:4.1.2' - implementation 'io.netty:netty-all:4.1.80.Final' + implementation 'io.netty:netty-all:4.1.82.Final' implementation 'net.kyori:adventure-nbt:4.11.0' implementation 'com.grack:nanojson:1.7' } From 4c8668f2227126115ead6cbd21311c0d2d6d78b1 Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Fri, 30 Sep 2022 18:49:23 +0200 Subject: [PATCH 04/11] Added 1.7.x support --- .../limbo/connection/ClientConnection.java | 58 +++++++++++-------- .../packets/login/PacketLoginSuccess.java | 4 +- .../packets/play/PacketChatMessage.java | 6 +- .../protocol/packets/play/PacketJoinGame.java | 8 +++ .../packets/play/PacketKeepAlive.java | 8 ++- .../packets/play/PacketPlayerInfo.java | 24 +++++--- .../play/PacketPlayerPositionAndLook.java | 11 ++-- .../nanit/limbo/protocol/registry/State.java | 14 ++--- .../limbo/protocol/registry/Version.java | 6 +- 9 files changed, 86 insertions(+), 53 deletions(-) diff --git a/src/main/java/ru/nanit/limbo/connection/ClientConnection.java b/src/main/java/ru/nanit/limbo/connection/ClientConnection.java index 4d4324b..4551a15 100644 --- a/src/main/java/ru/nanit/limbo/connection/ClientConnection.java +++ b/src/main/java/ru/nanit/limbo/connection/ClientConnection.java @@ -46,6 +46,7 @@ import java.security.InvalidKeyException; import java.security.MessageDigest; import java.util.UUID; import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; public class ClientConnection extends ChannelInboundHandlerAdapter { @@ -123,38 +124,45 @@ public class ClientConnection extends ChannelInboundHandlerAdapter { return; } - writePacket(PacketSnapshots.PACKET_LOGIN_SUCCESS); + sendPacket(PacketSnapshots.PACKET_LOGIN_SUCCESS); updateState(State.PLAY); - server.getConnections().addConnection(this); - writePacket(PacketSnapshots.PACKET_JOIN_GAME); - writePacket(PacketSnapshots.PACKET_PLAYER_ABILITIES); - writePacket(PacketSnapshots.PACKET_PLAYER_POS); + Runnable sendPlayPackets = () -> { + writePacket(PacketSnapshots.PACKET_JOIN_GAME); + writePacket(PacketSnapshots.PACKET_PLAYER_ABILITIES); + writePacket(PacketSnapshots.PACKET_PLAYER_POS); - if (server.getConfig().isUsePlayerList() || clientVersion.equals(Version.V1_16_4)) - writePacket(PacketSnapshots.PACKET_PLAYER_INFO); + if (server.getConfig().isUsePlayerList() || clientVersion.equals(Version.V1_16_4)) + writePacket(PacketSnapshots.PACKET_PLAYER_INFO); - if (clientVersion.moreOrEqual(Version.V1_13)) { - writePacket(PacketSnapshots.PACKET_DECLARE_COMMANDS); + if (clientVersion.moreOrEqual(Version.V1_13)) { + writePacket(PacketSnapshots.PACKET_DECLARE_COMMANDS); - if (PacketSnapshots.PACKET_PLUGIN_MESSAGE != null) - writePacket(PacketSnapshots.PACKET_PLUGIN_MESSAGE); + if (PacketSnapshots.PACKET_PLUGIN_MESSAGE != null) + writePacket(PacketSnapshots.PACKET_PLUGIN_MESSAGE); + } + + if (PacketSnapshots.PACKET_BOSS_BAR != null && clientVersion.moreOrEqual(Version.V1_9)) + writePacket(PacketSnapshots.PACKET_BOSS_BAR); + + if (PacketSnapshots.PACKET_JOIN_MESSAGE != null) + writePacket(PacketSnapshots.PACKET_JOIN_MESSAGE); + + if (PacketSnapshots.PACKET_TITLE_TITLE != null && clientVersion.moreOrEqual(Version.V1_8)) + writeTitle(); + + if (PacketSnapshots.PACKET_HEADER_AND_FOOTER != null && clientVersion.moreOrEqual(Version.V1_8)) + writePacket(PacketSnapshots.PACKET_HEADER_AND_FOOTER); + + sendKeepAlive(); + }; + + if (clientVersion.lessOrEqual(Version.V1_7_6)) { + this.channel.eventLoop().schedule(sendPlayPackets, 100, TimeUnit.MILLISECONDS); + } else { + sendPlayPackets.run(); } - - if (PacketSnapshots.PACKET_BOSS_BAR != null && clientVersion.moreOrEqual(Version.V1_9)) - writePacket(PacketSnapshots.PACKET_BOSS_BAR); - - if (PacketSnapshots.PACKET_JOIN_MESSAGE != null) - writePacket(PacketSnapshots.PACKET_JOIN_MESSAGE); - - if (PacketSnapshots.PACKET_TITLE_TITLE != null) - writeTitle(); - - if (PacketSnapshots.PACKET_HEADER_AND_FOOTER != null) - writePacket(PacketSnapshots.PACKET_HEADER_AND_FOOTER); - - sendKeepAlive(); } public void disconnectLogin(String reason) { diff --git a/src/main/java/ru/nanit/limbo/protocol/packets/login/PacketLoginSuccess.java b/src/main/java/ru/nanit/limbo/protocol/packets/login/PacketLoginSuccess.java index b06d2e0..6159c9f 100644 --- a/src/main/java/ru/nanit/limbo/protocol/packets/login/PacketLoginSuccess.java +++ b/src/main/java/ru/nanit/limbo/protocol/packets/login/PacketLoginSuccess.java @@ -40,8 +40,10 @@ public class PacketLoginSuccess implements PacketOut { public void encode(ByteMessage msg, Version version) { if (version.moreOrEqual(Version.V1_16)) { msg.writeUuid(uuid); - } else { + } else if (version.moreOrEqual(Version.V1_7_6)) { msg.writeString(uuid.toString()); + } else { + msg.writeString(uuid.toString().replace("-", "")); } msg.writeString(username); if (version.moreOrEqual(Version.V1_19)) { diff --git a/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketChatMessage.java b/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketChatMessage.java index 29e5609..21c57aa 100644 --- a/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketChatMessage.java +++ b/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketChatMessage.java @@ -46,11 +46,9 @@ public class PacketChatMessage implements PacketOut { msg.writeString(jsonData); if (version.moreOrEqual(Version.V1_19_1)) { msg.writeBoolean(position.index == PositionLegacy.ACTION_BAR.index); - } - else if (version.moreOrEqual(Version.V1_19)) { + } else if (version.moreOrEqual(Version.V1_19)) { msg.writeVarInt(position.index); - } - else { + } else if (version.moreOrEqual(Version.V1_8)) { msg.writeByte(position.index); } diff --git a/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketJoinGame.java b/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketJoinGame.java index 111ed47..6d03dbd 100644 --- a/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketJoinGame.java +++ b/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketJoinGame.java @@ -99,6 +99,14 @@ public class PacketJoinGame implements PacketOut { public void encode(ByteMessage msg, Version version) { msg.writeInt(entityId); + if (version.fromTo(Version.V1_7_2, Version.V1_7_6)) { + msg.writeByte(gameMode); + msg.writeByte(dimensionRegistry.getDefaultDimension_1_16().getId()); + msg.writeByte(0); // Difficulty + msg.writeByte(maxPlayers); + msg.writeString("flat"); // Level type + } + if (version.fromTo(Version.V1_8, Version.V1_9)) { msg.writeByte(gameMode); msg.writeByte(dimensionRegistry.getDefaultDimension_1_16().getId()); diff --git a/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketKeepAlive.java b/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketKeepAlive.java index a92d63a..133ef32 100644 --- a/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketKeepAlive.java +++ b/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketKeepAlive.java @@ -37,8 +37,10 @@ public class PacketKeepAlive implements Packet { public void encode(ByteMessage msg, Version version) { if (version.moreOrEqual(Version.V1_12_2)) { msg.writeLong(id); - } else { + } else if (version.moreOrEqual(Version.V1_8)) { msg.writeVarInt((int) id); + } else { + msg.writeInt((int) id); } } @@ -46,8 +48,10 @@ public class PacketKeepAlive implements Packet { public void decode(ByteMessage msg, Version version) { if (version.moreOrEqual(Version.V1_12_2)) { this.id = msg.readLong(); - } else { + } else if (version.moreOrEqual(Version.V1_8)) { this.id = msg.readVarInt(); + } else { + this.id = msg.readInt(); } } diff --git a/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketPlayerInfo.java b/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketPlayerInfo.java index 4bb5fb3..9084d08 100644 --- a/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketPlayerInfo.java +++ b/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketPlayerInfo.java @@ -46,16 +46,22 @@ public class PacketPlayerInfo implements PacketOut { @Override public void encode(ByteMessage msg, Version version) { - msg.writeVarInt(0); // Add player action - msg.writeVarInt(1); - msg.writeUuid(uuid); - msg.writeString(username); - msg.writeVarInt(0); - msg.writeVarInt(gameMode); - msg.writeVarInt(60); - msg.writeBoolean(false); - if (version.moreOrEqual(Version.V1_19)) { + if (version.less(Version.V1_8)) { + msg.writeString(username); + msg.writeBoolean(true); // Is online + msg.writeShort(0); + } else { + msg.writeVarInt(0); // Add player action + msg.writeVarInt(1); + msg.writeUuid(uuid); + msg.writeString(username); + msg.writeVarInt(0); + msg.writeVarInt(gameMode); + msg.writeVarInt(60); msg.writeBoolean(false); + if (version.moreOrEqual(Version.V1_19)) { + msg.writeBoolean(false); + } } } diff --git a/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketPlayerPositionAndLook.java b/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketPlayerPositionAndLook.java index c195f49..eb24dea 100644 --- a/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketPlayerPositionAndLook.java +++ b/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketPlayerPositionAndLook.java @@ -62,15 +62,18 @@ public class PacketPlayerPositionAndLook implements PacketOut { @Override public void encode(ByteMessage msg, Version version) { msg.writeDouble(x); - msg.writeDouble(y); + msg.writeDouble(y + (version.less(Version.V1_8) ? 1.62F : 0)); msg.writeDouble(z); msg.writeFloat(yaw); msg.writeFloat(pitch); - if (version.less(Version.V1_9)) { - msg.writeBoolean(true); // On ground - } else { + if (version.moreOrEqual(Version.V1_8)) { msg.writeByte(flags); + } else { + msg.writeBoolean(true); + } + + if (version.moreOrEqual(Version.V1_9)) { msg.writeVarInt(teleportId); } diff --git a/src/main/java/ru/nanit/limbo/protocol/registry/State.java b/src/main/java/ru/nanit/limbo/protocol/registry/State.java index 2e419fc..d5e9e45 100644 --- a/src/main/java/ru/nanit/limbo/protocol/registry/State.java +++ b/src/main/java/ru/nanit/limbo/protocol/registry/State.java @@ -77,7 +77,7 @@ public enum State { PLAY(3) { { serverBound.register(PacketKeepAlive::new, - map(0x00, V1_8, V1_8), + map(0x00, V1_7_2, V1_8), map(0x0B, V1_9, V1_11_1), map(0x0C, V1_12, V1_12), map(0x0B, V1_12_1, V1_12_2), @@ -98,7 +98,7 @@ public enum State { map(0x0F, V1_19, V1_19_1) ); clientBound.register(PacketJoinGame::new, - map(0x01, V1_8, V1_8), + map(0x01, V1_7_2, V1_8), map(0x23, V1_9, V1_12_2), map(0x25, V1_13, V1_14_4), map(0x26, V1_15, V1_15_2), @@ -119,7 +119,7 @@ public enum State { map(0x16, V1_19_1, V1_19_1) ); clientBound.register(PacketPlayerAbilities::new, - map(0x39, V1_8, V1_8), + map(0x39, V1_7_2, V1_8), map(0x2B, V1_9, V1_12), map(0x2C, V1_12_1, V1_12_2), map(0x2E, V1_13, V1_13_2), @@ -132,7 +132,7 @@ public enum State { map(0x31, V1_19_1, V1_19_1) ); clientBound.register(PacketPlayerPositionAndLook::new, - map(0x08, V1_8, V1_8), + map(0x08, V1_7_2, V1_8), map(0x2E, V1_9, V1_12), map(0x2F, V1_12_1, V1_12_2), map(0x32, V1_13, V1_13_2), @@ -145,7 +145,7 @@ public enum State { map(0x39, V1_19_1, V1_19_1) ); clientBound.register(PacketKeepAlive::new, - map(0x00, V1_8, V1_8), + map(0x00, V1_7_2, V1_8), map(0x1F, V1_9, V1_12_2), map(0x21, V1_13, V1_13_2), map(0x20, V1_14, V1_14_4), @@ -157,7 +157,7 @@ public enum State { map(0x20, V1_19_1, V1_19_1) ); clientBound.register(PacketChatMessage::new, - map(0x02, V1_8, V1_8), + map(0x02, V1_7_2, V1_8), map(0x0F, V1_9, V1_12_2), map(0x0E, V1_13, V1_14_4), map(0x0F, V1_15, V1_15_2), @@ -174,7 +174,7 @@ public enum State { map(0x0A, V1_19, V1_19_1) ); clientBound.register(PacketPlayerInfo::new, - map(0x38, V1_8, V1_8), + map(0x38, V1_7_2, V1_8), map(0x2D, V1_9, V1_12), map(0x2E, V1_12_1, V1_12_2), map(0x30, V1_13, V1_13_2), diff --git a/src/main/java/ru/nanit/limbo/protocol/registry/Version.java b/src/main/java/ru/nanit/limbo/protocol/registry/Version.java index 388ef51..df28f1d 100644 --- a/src/main/java/ru/nanit/limbo/protocol/registry/Version.java +++ b/src/main/java/ru/nanit/limbo/protocol/registry/Version.java @@ -23,6 +23,10 @@ import java.util.Map; public enum Version { UNDEFINED(-1), + V1_7_2(4), + // 1.7.2-1.7.5 has same protocol numbers + V1_7_6(5), + // 1.7.6-1.7.10 has same protocol numbers V1_8(47), // 1.8-1.8.8 has same protocol numbers V1_9(107), @@ -119,7 +123,7 @@ public enum Version { } public static Version getMin() { - return V1_8; + return V1_7_2; } public static Version getMax() { From 747da18b728f9a1d590d1bc0ab1309e5435b9f77 Mon Sep 17 00:00:00 2001 From: RK_01 <50594595+RaphiMC@users.noreply.github.com> Date: Fri, 30 Sep 2022 18:50:03 +0200 Subject: [PATCH 05/11] Added 1.7.x to README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c537db3..793b776 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ The general features: Symbol `X` means all minor versions. +- [x] 1.7.X - [x] 1.8.X - [x] 1.9.X - [x] 1.10.X From af304da0f04aebf64526d80974beeae8d0292b7a Mon Sep 17 00:00:00 2001 From: RaphiMC <50594595+RaphiMC@users.noreply.github.com> Date: Sat, 1 Oct 2022 00:11:56 +0200 Subject: [PATCH 06/11] Set gamemode to creative for 1.7.x instead of spectator --- .../ru/nanit/limbo/protocol/packets/play/PacketJoinGame.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketJoinGame.java b/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketJoinGame.java index 6d03dbd..afec119 100644 --- a/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketJoinGame.java +++ b/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketJoinGame.java @@ -100,7 +100,7 @@ public class PacketJoinGame implements PacketOut { msg.writeInt(entityId); if (version.fromTo(Version.V1_7_2, Version.V1_7_6)) { - msg.writeByte(gameMode); + msg.writeByte(gameMode == 3 ? 1 : gameMode); msg.writeByte(dimensionRegistry.getDefaultDimension_1_16().getId()); msg.writeByte(0); // Difficulty msg.writeByte(maxPlayers); From bc22bdd4ed9d176f7518c914d0bbaf06bcb19db7 Mon Sep 17 00:00:00 2001 From: "Pantera (Mad_Daniel)" <89838384+Pantera07@users.noreply.github.com> Date: Tue, 18 Oct 2022 00:32:22 +0900 Subject: [PATCH 07/11] Update build.gradle --- build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 9924c8f..491f492 100644 --- a/build.gradle +++ b/build.gradle @@ -20,11 +20,11 @@ repositories { } dependencies { - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.0' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.0' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.1' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.1' implementation 'org.spongepowered:configurate-yaml:4.1.2' - implementation 'io.netty:netty-all:4.1.82.Final' + implementation 'io.netty:netty-all:4.1.84.Final' implementation 'net.kyori:adventure-nbt:4.11.0' implementation 'com.grack:nanojson:1.7' } From 714ef11fa8e8a1ca6c8ee5bdbce64b94c3ef4200 Mon Sep 17 00:00:00 2001 From: "Pantera (Mad_Daniel)" <89838384+Pantera07@users.noreply.github.com> Date: Thu, 10 Nov 2022 19:35:32 +0900 Subject: [PATCH 08/11] Bump netty to 4.1.85.Final Bump netty to 4.1.85.Final --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 491f492..d0c542d 100644 --- a/build.gradle +++ b/build.gradle @@ -24,7 +24,7 @@ dependencies { testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.1' implementation 'org.spongepowered:configurate-yaml:4.1.2' - implementation 'io.netty:netty-all:4.1.84.Final' + implementation 'io.netty:netty-all:4.1.85.Final' implementation 'net.kyori:adventure-nbt:4.11.0' implementation 'com.grack:nanojson:1.7' } From a327f7bc982e4cd1167b3e20d85d1f42005deff1 Mon Sep 17 00:00:00 2001 From: "Pantera (Mad_Daniel)" <89838384+Pantera07@users.noreply.github.com> Date: Thu, 1 Dec 2022 12:23:27 +0900 Subject: [PATCH 09/11] Bump adventure-nbt to 4.12.0 Bump adventure-nbt to 4.12.0 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index d0c542d..e036717 100644 --- a/build.gradle +++ b/build.gradle @@ -25,7 +25,7 @@ dependencies { implementation 'org.spongepowered:configurate-yaml:4.1.2' implementation 'io.netty:netty-all:4.1.85.Final' - implementation 'net.kyori:adventure-nbt:4.11.0' + implementation 'net.kyori:adventure-nbt:4.12.0' implementation 'com.grack:nanojson:1.7' } From b36decb3ddcc2c95bd089e769daab41e86573815 Mon Sep 17 00:00:00 2001 From: BoomEaro <21033866+BoomEaro@users.noreply.github.com> Date: Thu, 8 Dec 2022 13:21:17 +0200 Subject: [PATCH 10/11] Support 1.19.3 --- .../ru/nanit/limbo/protocol/ByteMessage.java | 21 ++++++++++ .../packets/play/PacketPlayerInfo.java | 28 +++++++++++++ .../nanit/limbo/protocol/registry/State.java | 41 ++++++++++++------- .../limbo/protocol/registry/Version.java | 3 +- 4 files changed, 78 insertions(+), 15 deletions(-) diff --git a/src/main/java/ru/nanit/limbo/protocol/ByteMessage.java b/src/main/java/ru/nanit/limbo/protocol/ByteMessage.java index be4ef13..edc5995 100644 --- a/src/main/java/ru/nanit/limbo/protocol/ByteMessage.java +++ b/src/main/java/ru/nanit/limbo/protocol/ByteMessage.java @@ -34,6 +34,9 @@ import java.nio.channels.GatheringByteChannel; import java.nio.channels.ScatteringByteChannel; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.BitSet; +import java.util.EnumSet; import java.util.UUID; public class ByteMessage extends ByteBuf { @@ -190,6 +193,24 @@ public class ByteMessage extends ByteBuf { } } + public > void writeEnumSet(EnumSet enumset, Class oclass) { + E[] enums = oclass.getEnumConstants(); + BitSet bits = new BitSet(enums.length); + + for (int i = 0; i < enums.length; ++i) { + bits.set(i, enumset.contains(enums[i])); + } + + writeFixedBitSet(bits, enums.length, buf); + } + + private static void writeFixedBitSet(BitSet bits, int size, ByteBuf buf) { + if (bits.length() > size) { + throw new StackOverflowError("BitSet too large (expected " + size + " got " + bits.size() + ")"); + } + buf.writeBytes(Arrays.copyOf(bits.toByteArray(), (size + 8) >> 3)); + } + /* Delegated methods */ @Override diff --git a/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketPlayerInfo.java b/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketPlayerInfo.java index 4bb5fb3..efaa639 100644 --- a/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketPlayerInfo.java +++ b/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketPlayerInfo.java @@ -21,6 +21,7 @@ import ru.nanit.limbo.protocol.ByteMessage; import ru.nanit.limbo.protocol.PacketOut; import ru.nanit.limbo.protocol.registry.Version; +import java.util.EnumSet; import java.util.UUID; /** @@ -46,6 +47,24 @@ public class PacketPlayerInfo implements PacketOut { @Override public void encode(ByteMessage msg, Version version) { + if (version.moreOrEqual(Version.V1_19_3)) { + EnumSet actions = EnumSet.noneOf(Action.class); + actions.add(Action.ADD_PLAYER); + actions.add(Action.UPDATE_LISTED); + actions.add(Action.UPDATE_GAMEMODE); + msg.writeEnumSet(actions, Action.class); + + msg.writeVarInt(1); // Array length (1 element) + msg.writeUuid(uuid); // UUID + msg.writeString(username); //Username + msg.writeVarInt(0); //Properties (0 is empty) + + msg.writeBoolean(true); //Update listed + + msg.writeVarInt(gameMode); //Gamemode + + return; + } msg.writeVarInt(0); // Add player action msg.writeVarInt(1); msg.writeUuid(uuid); @@ -59,4 +78,13 @@ public class PacketPlayerInfo implements PacketOut { } } + public static enum Action { + + ADD_PLAYER, + INITIALIZE_CHAT, + UPDATE_GAMEMODE, + UPDATE_LISTED, + UPDATE_LATENCY, + UPDATE_DISPLAY_NAME; + } } diff --git a/src/main/java/ru/nanit/limbo/protocol/registry/State.java b/src/main/java/ru/nanit/limbo/protocol/registry/State.java index 2e419fc..c3ef547 100644 --- a/src/main/java/ru/nanit/limbo/protocol/registry/State.java +++ b/src/main/java/ru/nanit/limbo/protocol/registry/State.java @@ -86,7 +86,8 @@ public enum State { map(0x10, V1_16, V1_16_4), map(0x0F, V1_17, V1_18_2), map(0x11, V1_19, V1_19), - map(0x12, V1_19_1, V1_19_1) + map(0x12, V1_19_1, V1_19_1), + map(0x11, V1_19_3, V1_19_3) ); clientBound.register(PacketDeclareCommands::new, @@ -95,7 +96,8 @@ public enum State { map(0x11, V1_16, V1_16_1), map(0x10, V1_16_2, V1_16_4), map(0x12, V1_17, V1_18_2), - map(0x0F, V1_19, V1_19_1) + map(0x0F, V1_19, V1_19_1), + map(0x0E, V1_19_3, V1_19_3) ); clientBound.register(PacketJoinGame::new, map(0x01, V1_8, V1_8), @@ -106,7 +108,8 @@ public enum State { map(0x24, V1_16_2, V1_16_4), map(0x26, V1_17, V1_18_2), map(0x23, V1_19, V1_19), - map(0x25, V1_19_1, V1_19_1) + map(0x25, V1_19_1, V1_19_1), + map(0x24, V1_19_3, V1_19_3) ); clientBound.register(PacketPluginMessage::new, map(0x19, V1_13, V1_13_2), @@ -116,7 +119,8 @@ public enum State { map(0x17, V1_16_2, V1_16_4), map(0x18, V1_17, V1_18_2), map(0x15, V1_19, V1_19), - map(0x16, V1_19_1, V1_19_1) + map(0x16, V1_19_1, V1_19_1), + map(0x15, V1_19_3, V1_19_3) ); clientBound.register(PacketPlayerAbilities::new, map(0x39, V1_8, V1_8), @@ -129,7 +133,8 @@ public enum State { map(0x30, V1_16_2, V1_16_4), map(0x32, V1_17, V1_18_2), map(0x2F, V1_19, V1_19), - map(0x31, V1_19_1, V1_19_1) + map(0x31, V1_19_1, V1_19_1), + map(0x30, V1_19_3, V1_19_3) ); clientBound.register(PacketPlayerPositionAndLook::new, map(0x08, V1_8, V1_8), @@ -142,7 +147,8 @@ public enum State { map(0x34, V1_16_2, V1_16_4), map(0x38, V1_17, V1_18_2), map(0x36, V1_19, V1_19), - map(0x39, V1_19_1, V1_19_1) + map(0x39, V1_19_1, V1_19_1), + map(0x38, V1_19_3, V1_19_3) ); clientBound.register(PacketKeepAlive::new, map(0x00, V1_8, V1_8), @@ -154,7 +160,8 @@ public enum State { map(0x1F, V1_16_2, V1_16_4), map(0x21, V1_17, V1_18_2), map(0x1E, V1_19, V1_19), - map(0x20, V1_19_1, V1_19_1) + map(0x20, V1_19_1, V1_19_1), + map(0x1F, V1_19_3, V1_19_3) ); clientBound.register(PacketChatMessage::new, map(0x02, V1_8, V1_8), @@ -164,14 +171,15 @@ public enum State { map(0x0E, V1_16, V1_16_4), map(0x0F, V1_17, V1_18_2), map(0x5F, V1_19, V1_19), - map(0x62, V1_19_1, V1_19_1) + map(0x62, V1_19_1, V1_19_1), + map(0x60, V1_19_3, V1_19_3) ); clientBound.register(PacketBossBar::new, map(0x0C, V1_9, V1_14_4), map(0x0D, V1_15, V1_15_2), map(0x0C, V1_16, V1_16_4), map(0x0D, V1_17, V1_18_2), - map(0x0A, V1_19, V1_19_1) + map(0x0A, V1_19, V1_19_3) ); clientBound.register(PacketPlayerInfo::new, map(0x38, V1_8, V1_8), @@ -184,7 +192,8 @@ public enum State { map(0x32, V1_16_2, V1_16_4), map(0x36, V1_17, V1_18_2), map(0x34, V1_19, V1_19), - map(0x37, V1_19_1, V1_19_1) + map(0x37, V1_19_1, V1_19_1), + map(0x36, V1_19_3, V1_19_3) ); clientBound.register(PacketTitleLegacy::new, map(0x45, V1_8, V1_11_1), @@ -198,17 +207,20 @@ public enum State { clientBound.register(PacketTitleSetTitle::new, map(0x59, V1_17, V1_17_1), map(0x5A, V1_18, V1_19), - map(0x5D, V1_19_1, V1_19_1) + map(0x5D, V1_19_1, V1_19_1), + map(0x5B, V1_19_3, V1_19_3) ); clientBound.register(PacketTitleSetSubTitle::new, map(0x57, V1_17, V1_17_1), map(0x58, V1_18, V1_19), - map(0x5B, V1_19_1, V1_19_1) + map(0x5B, V1_19_1, V1_19_1), + map(0x59, V1_19_3, V1_19_3) ); clientBound.register(PacketTitleTimes::new, map(0x5A, V1_17, V1_17_1), map(0x5B, V1_18, V1_19), - map(0x5E, V1_19_1, V1_19_1) + map(0x5E, V1_19_1, V1_19_1), + map(0x5C, V1_19_3, V1_19_3) ); clientBound.register(PacketPlayerListHeader::new, map(0x47, V1_8, V1_8), @@ -223,7 +235,8 @@ public enum State { map(0x5E, V1_17, V1_17_1), map(0x5F, V1_18, V1_18_2), map(0x60, V1_19, V1_19), - map(0x63, V1_19_1, V1_19_1) + map(0x63, V1_19_1, V1_19_1), + map(0x61, V1_19_3, V1_19_3) ); } }; diff --git a/src/main/java/ru/nanit/limbo/protocol/registry/Version.java b/src/main/java/ru/nanit/limbo/protocol/registry/Version.java index 388ef51..580e3bd 100644 --- a/src/main/java/ru/nanit/limbo/protocol/registry/Version.java +++ b/src/main/java/ru/nanit/limbo/protocol/registry/Version.java @@ -60,7 +60,8 @@ public enum Version { // 1.18.1 has same protocol number V1_18_2(758), V1_19(759), - V1_19_1(760); + V1_19_1(760), + V1_19_3(761); private static final Map VERSION_MAP; private static final Version MAX; From 68ea7c020cca8dda5faebfe6479ef383f8fda47d Mon Sep 17 00:00:00 2001 From: BoomEaro <21033866+BoomEaro@users.noreply.github.com> Date: Thu, 8 Dec 2022 15:05:46 +0200 Subject: [PATCH 11/11] Add PacketSpawnPosition for 1.19.3 --- .../limbo/connection/ClientConnection.java | 3 ++ .../limbo/connection/PacketSnapshots.java | 7 ++++ .../packets/play/PacketSpawnPosition.java | 34 +++++++++++++++++++ .../nanit/limbo/protocol/registry/State.java | 3 ++ 4 files changed, 47 insertions(+) create mode 100644 src/main/java/ru/nanit/limbo/protocol/packets/play/PacketSpawnPosition.java diff --git a/src/main/java/ru/nanit/limbo/connection/ClientConnection.java b/src/main/java/ru/nanit/limbo/connection/ClientConnection.java index 4d4324b..72f7b98 100644 --- a/src/main/java/ru/nanit/limbo/connection/ClientConnection.java +++ b/src/main/java/ru/nanit/limbo/connection/ClientConnection.java @@ -131,6 +131,9 @@ public class ClientConnection extends ChannelInboundHandlerAdapter { writePacket(PacketSnapshots.PACKET_JOIN_GAME); writePacket(PacketSnapshots.PACKET_PLAYER_ABILITIES); writePacket(PacketSnapshots.PACKET_PLAYER_POS); + if (clientVersion.moreOrEqual(Version.V1_19_3)) { + writePacket(PacketSnapshots.PACKET_SPAWN_POSITION); + } if (server.getConfig().isUsePlayerList() || clientVersion.equals(Version.V1_16_4)) writePacket(PacketSnapshots.PACKET_PLAYER_INFO); diff --git a/src/main/java/ru/nanit/limbo/connection/PacketSnapshots.java b/src/main/java/ru/nanit/limbo/connection/PacketSnapshots.java index 6d1f929..6c993bd 100644 --- a/src/main/java/ru/nanit/limbo/connection/PacketSnapshots.java +++ b/src/main/java/ru/nanit/limbo/connection/PacketSnapshots.java @@ -33,6 +33,7 @@ public final class PacketSnapshots { public static PacketSnapshot PACKET_LOGIN_SUCCESS; public static PacketSnapshot PACKET_JOIN_GAME; + public static PacketSnapshot PACKET_SPAWN_POSITION; public static PacketSnapshot PACKET_PLUGIN_MESSAGE; public static PacketSnapshot PACKET_PLAYER_ABILITIES; public static PacketSnapshot PACKET_PLAYER_INFO; @@ -99,8 +100,14 @@ public final class PacketSnapshots { info.setGameMode(server.getConfig().getGameMode()); info.setUuid(uuid); + PacketSpawnPosition packetSpawnPosition = new PacketSpawnPosition(); + packetSpawnPosition.setX((long) server.getConfig().getSpawnPosition().getX()); + packetSpawnPosition.setY((long) server.getConfig().getSpawnPosition().getY()); + packetSpawnPosition.setZ((long) server.getConfig().getSpawnPosition().getZ()); + PACKET_LOGIN_SUCCESS = PacketSnapshot.of(loginSuccess); PACKET_JOIN_GAME = PacketSnapshot.of(joinGame); + PACKET_SPAWN_POSITION = PacketSnapshot.of(packetSpawnPosition); PACKET_PLAYER_ABILITIES = PacketSnapshot.of(playerAbilities); PACKET_PLAYER_POS = PacketSnapshot.of(positionAndLook); PACKET_PLAYER_INFO = PacketSnapshot.of(info); diff --git a/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketSpawnPosition.java b/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketSpawnPosition.java new file mode 100644 index 0000000..559cdc3 --- /dev/null +++ b/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketSpawnPosition.java @@ -0,0 +1,34 @@ +package ru.nanit.limbo.protocol.packets.play; + +import ru.nanit.limbo.protocol.ByteMessage; +import ru.nanit.limbo.protocol.PacketOut; +import ru.nanit.limbo.protocol.registry.Version; + +public class PacketSpawnPosition implements PacketOut { + + private long x; + private long y; + private long z; + + public void setX(long x) { + this.x = x; + } + + public void setY(long y) { + this.y = y; + } + + public void setZ(long z) { + this.z = z; + } + + @Override + public void encode(ByteMessage msg, Version version) { + msg.writeLong(encodePosition(x, y ,z)); + msg.writeFloat(0); + } + + private static long encodePosition(long x, long y, long z) { + return ((x & 0x3FFFFFF) << 38) | ((z & 0x3FFFFFF) << 12) | (y & 0xFFF); + } +} diff --git a/src/main/java/ru/nanit/limbo/protocol/registry/State.java b/src/main/java/ru/nanit/limbo/protocol/registry/State.java index c3ef547..378b9b9 100644 --- a/src/main/java/ru/nanit/limbo/protocol/registry/State.java +++ b/src/main/java/ru/nanit/limbo/protocol/registry/State.java @@ -238,6 +238,9 @@ public enum State { map(0x63, V1_19_1, V1_19_1), map(0x61, V1_19_3, V1_19_3) ); + clientBound.register(PacketSpawnPosition::new, + map(0x4C, V1_19_3, V1_19_3) + ); } };