diff --git a/src/main/java/ru/nanit/limbo/connection/ClientConnection.java b/src/main/java/ru/nanit/limbo/connection/ClientConnection.java index 362f27e..16cfe0f 100644 --- a/src/main/java/ru/nanit/limbo/connection/ClientConnection.java +++ b/src/main/java/ru/nanit/limbo/connection/ClientConnection.java @@ -101,6 +101,7 @@ public class ClientConnection extends ChannelInboundHandlerAdapter { if (packet instanceof PacketHandshake) { PacketHandshake handshake = (PacketHandshake) packet; clientVersion = handshake.getVersion(); + updateStateAndVersion(handshake.getNextState(), clientVersion); Logger.debug("Pinged from %s [%s]", address, clientVersion.toString()); @@ -134,8 +135,8 @@ public class ClientConnection extends ChannelInboundHandlerAdapter { return; } - if (clientVersion.equals(Version.UNDEFINED)) { - disconnectLogin("Incompatible client version"); + if (!clientVersion.isSupported()) { + disconnectLogin("Unsupported client version"); return; } diff --git a/src/main/java/ru/nanit/limbo/connection/pipeline/PacketDecoder.java b/src/main/java/ru/nanit/limbo/connection/pipeline/PacketDecoder.java index 1359dc2..5589121 100644 --- a/src/main/java/ru/nanit/limbo/connection/pipeline/PacketDecoder.java +++ b/src/main/java/ru/nanit/limbo/connection/pipeline/PacketDecoder.java @@ -30,6 +30,7 @@ public class PacketDecoder extends MessageToMessageDecoder { if (packet != null) { try { + Logger.debug("Received packet %s", packet.toString()); packet.decode(msg, version); } catch (Exception e) { Logger.warning("Cannot decode packet 0x%s: %s", Integer.toHexString(packetId), e.getMessage()); diff --git a/src/main/java/ru/nanit/limbo/protocol/ByteMessage.java b/src/main/java/ru/nanit/limbo/protocol/ByteMessage.java index a083704..3805c9b 100644 --- a/src/main/java/ru/nanit/limbo/protocol/ByteMessage.java +++ b/src/main/java/ru/nanit/limbo/protocol/ByteMessage.java @@ -47,6 +47,8 @@ public class ByteMessage extends ByteBuf { } } + buf.readBytes(maxRead); + throw new IllegalArgumentException("Cannot read VarInt"); } diff --git a/src/main/java/ru/nanit/limbo/protocol/packets/PacketHandshake.java b/src/main/java/ru/nanit/limbo/protocol/packets/PacketHandshake.java index 784c362..51721bf 100644 --- a/src/main/java/ru/nanit/limbo/protocol/packets/PacketHandshake.java +++ b/src/main/java/ru/nanit/limbo/protocol/packets/PacketHandshake.java @@ -1,7 +1,6 @@ package ru.nanit.limbo.protocol.packets; import ru.nanit.limbo.protocol.ByteMessage; -import ru.nanit.limbo.protocol.Packet; import ru.nanit.limbo.protocol.PacketIn; import ru.nanit.limbo.protocol.registry.State; import ru.nanit.limbo.protocol.registry.Version; @@ -31,7 +30,12 @@ public class PacketHandshake implements PacketIn { @Override public void decode(ByteMessage msg, Version version) { - this.version = Version.of(msg.readVarInt()); + try { + this.version = Version.of(msg.readVarInt()); + } catch (IllegalArgumentException e) { + this.version = Version.UNDEFINED; + } + this.host = msg.readString(); this.port = msg.readUnsignedShort(); this.nextState = State.getById(msg.readVarInt()); 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 e194bda..5478852 100644 --- a/src/main/java/ru/nanit/limbo/protocol/registry/State.java +++ b/src/main/java/ru/nanit/limbo/protocol/registry/State.java @@ -172,7 +172,7 @@ public enum State { private final Map registry = new HashMap<>(); public PacketRegistry getRegistry(Version version) { - return registry.get(version); + return registry.getOrDefault(version, registry.get(getMin())); } public void register(Supplier packet, Mapping... mappings) { 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 8dde6f9..de6fecc 100644 --- a/src/main/java/ru/nanit/limbo/protocol/registry/Version.java +++ b/src/main/java/ru/nanit/limbo/protocol/registry/Version.java @@ -83,14 +83,14 @@ public enum Version { return this.protocolNumber <= another.protocolNumber; } - public boolean between(Version min, Version max) { - return this.protocolNumber > min.protocolNumber && this.protocolNumber < max.protocolNumber; - } - public boolean fromTo(Version min, Version max) { return this.protocolNumber >= min.protocolNumber && this.protocolNumber <= max.protocolNumber; } + public boolean isSupported() { + return this != UNDEFINED; + } + public static Version getMin() { return V1_8; } diff --git a/src/main/resources/dimension_codec.nbt b/src/main/resources/dimension_codec.nbt deleted file mode 100644 index c38a856..0000000 Binary files a/src/main/resources/dimension_codec.nbt and /dev/null differ