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 diff --git a/src/main/java/ru/nanit/limbo/connection/ClientConnection.java b/src/main/java/ru/nanit/limbo/connection/ClientConnection.java index 72f7b98..75cbc74 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,41 +124,48 @@ 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); - if (clientVersion.moreOrEqual(Version.V1_19_3)) { - writePacket(PacketSnapshots.PACKET_SPAWN_POSITION); + Runnable sendPlayPackets = () -> { + 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); + + 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_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 (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 (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) - 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..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 @@ -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 == 3 ? 1 : 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 efaa639..17f0d05 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 @@ -47,39 +47,44 @@ 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); + if (version.less(Version.V1_8)) { + msg.writeString(username); + msg.writeBoolean(true); // Is online + msg.writeShort(0); + } else { + 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.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); - msg.writeString(username); - msg.writeVarInt(0); - msg.writeVarInt(gameMode); - msg.writeVarInt(60); - msg.writeBoolean(false); - if (version.moreOrEqual(Version.V1_19)) { + msg.writeBoolean(true); //Update listed + msg.writeVarInt(gameMode); //Gamemode + return; + } + + 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); + } } } public static enum Action { - ADD_PLAYER, INITIALIZE_CHAT, UPDATE_GAMEMODE, 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 378b9b9..73a0e93 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), @@ -100,7 +100,7 @@ public enum State { map(0x0E, V1_19_3, V1_19_3) ); 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), @@ -123,7 +123,7 @@ public enum State { map(0x15, V1_19_3, V1_19_3) ); 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), @@ -137,7 +137,7 @@ public enum State { map(0x30, V1_19_3, V1_19_3) ); 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), @@ -151,7 +151,7 @@ public enum State { map(0x38, V1_19_3, V1_19_3) ); 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), @@ -164,7 +164,7 @@ public enum State { map(0x1F, V1_19_3, V1_19_3) ); 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), @@ -182,7 +182,7 @@ public enum State { map(0x0A, V1_19, V1_19_3) ); 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 580e3bd..57165f7 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), @@ -120,7 +124,7 @@ public enum Version { } public static Version getMin() { - return V1_8; + return V1_7_2; } public static Version getMax() {