diff --git a/src/main/java/mc/protocol/ProtocolConstant.java b/src/main/java/mc/protocol/ProtocolConstant.java new file mode 100644 index 0000000..bbf9292 --- /dev/null +++ b/src/main/java/mc/protocol/ProtocolConstant.java @@ -0,0 +1,10 @@ +package mc.protocol; + +import lombok.experimental.UtilityClass; + +@UtilityClass +public class ProtocolConstant { + + public final int PROTOCOL_VERSION = 47; + public final String PROTOCOL_VERSION_VALUE = "1.8.8"; +} diff --git a/src/main/java/mc/protocol/UnknownPacket.java b/src/main/java/mc/protocol/UnknownPacket.java new file mode 100644 index 0000000..d953e8d --- /dev/null +++ b/src/main/java/mc/protocol/UnknownPacket.java @@ -0,0 +1,27 @@ +package mc.protocol; + +import lombok.Data; +import lombok.ToString; +import mc.protocol.io.NetInputStream; +import mc.protocol.io.NetOutputStream; + +@Data +@ToString(exclude = "rawData") +public class UnknownPacket implements Packet { + + private final State state; + private final int id; + private final int dataSize; + private byte[] rawData; + + @Override + public void readSelf(NetInputStream netInputStream) { + rawData = new byte[dataSize]; + netInputStream.readBytes(rawData); + } + + @Override + public void writeSelf(NetOutputStream netOutputStream) { + netOutputStream.writeBytes(rawData); + } +} diff --git a/src/main/java/mc/protocol/Utils.java b/src/main/java/mc/protocol/Utils.java new file mode 100644 index 0000000..d5fbe79 --- /dev/null +++ b/src/main/java/mc/protocol/Utils.java @@ -0,0 +1,17 @@ +package mc.protocol; + +import lombok.experimental.UtilityClass; + +@UtilityClass +public class Utils { + + public int sizeOfVarInt(int value) { + for (int i = 1; i < 5; ++i) { + if ((value & -1 << i * 7) == 0) { + return i; + } + } + + return 5; + } +} diff --git a/src/main/java/mc/protocol/handshake/client/HandshakePacket.java b/src/main/java/mc/protocol/handshake/client/HandshakePacket.java index 6f72ed9..7a70ba2 100644 --- a/src/main/java/mc/protocol/handshake/client/HandshakePacket.java +++ b/src/main/java/mc/protocol/handshake/client/HandshakePacket.java @@ -30,14 +30,14 @@ import mc.protocol.io.NetOutputStream; public class HandshakePacket implements Packet { private int protocolVersion; - private String ip; + private String host; private int port; private State nextState; @Override public void readSelf(NetInputStream netInputStream) { protocolVersion = netInputStream.readVarInt(); - ip = netInputStream.readString(255); + host = netInputStream.readString(255); port = netInputStream.readUnsignedShort(); nextState = State.getById(netInputStream.readVarInt()); } @@ -45,7 +45,7 @@ public class HandshakePacket implements Packet { @Override public void writeSelf(NetOutputStream netOutputStream) { netOutputStream.writeVarInt(protocolVersion); - netOutputStream.writeString(ip); + netOutputStream.writeString(host); netOutputStream.writeShort(port); netOutputStream.writeVarInt(nextState.getId()); } diff --git a/src/main/java/mc/protocol/io/coder/ProtocolDecoder.java b/src/main/java/mc/protocol/io/coder/ProtocolDecoder.java index 4acad4c..b6fd920 100644 --- a/src/main/java/mc/protocol/io/coder/ProtocolDecoder.java +++ b/src/main/java/mc/protocol/io/coder/ProtocolDecoder.java @@ -1,13 +1,9 @@ package mc.protocol.io.coder; import lombok.RequiredArgsConstructor; -import mc.protocol.Packet; -import mc.protocol.PacketDirection; -import mc.protocol.State; +import mc.protocol.*; import mc.protocol.io.NetInputStream; -import java.util.Objects; - @RequiredArgsConstructor public class ProtocolDecoder { @@ -19,15 +15,24 @@ public class ProtocolDecoder { int packetId = netInputStream.readVarInt(); Class packetClass = state.getPacketById(direction, packetId); - Objects.requireNonNull(packetClass); - - try { - Packet packet = packetClass.newInstance(); + if (packetClass == null) { + //FIXME необходимо в лог пивать предупреждение + UnknownPacket packet = new UnknownPacket( + state, + packetId, + sizePacket - Utils.sizeOfVarInt(packetId) + ); packet.readSelf(netInputStream); return packet; - } catch (InstantiationException | IllegalAccessException e) { - e.printStackTrace(); //FIXME нужно писать в лог - return null; + } else { + try { + Packet packet = packetClass.newInstance(); + packet.readSelf(netInputStream); + return packet; + } catch (InstantiationException | IllegalAccessException e) { + e.printStackTrace(); //FIXME нужно писать в лог + return null; + } } } }