From 83100d17cca5e4645c8af9a85378f135f714f340 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 28 Aug 2019 17:01:48 +0300 Subject: [PATCH 1/3] add constructors --- .../java/mc/protocol/handshake/client/HandshakePacket.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/mc/protocol/handshake/client/HandshakePacket.java b/src/main/java/mc/protocol/handshake/client/HandshakePacket.java index 2d2f148..deac1e2 100644 --- a/src/main/java/mc/protocol/handshake/client/HandshakePacket.java +++ b/src/main/java/mc/protocol/handshake/client/HandshakePacket.java @@ -1,11 +1,15 @@ package mc.protocol.handshake.client; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; import mc.protocol.NetInputStream; import mc.protocol.NetOutputStream; import mc.protocol.Packet; import mc.protocol.State; +@AllArgsConstructor +@NoArgsConstructor @Data public class HandshakePacket implements Packet { From c519c426d8f64de87b574235d3b6b01a072d74dc Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 28 Aug 2019 17:02:02 +0300 Subject: [PATCH 2/3] constants --- src/main/java/mc/protocol/ProtocolConstant.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/mc/protocol/ProtocolConstant.java 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"; +} From 4e1ba7faee72752ad9b374756f378d1c93ef3c2a Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 29 Aug 2019 15:18:34 +0300 Subject: [PATCH 3/3] add unknown packet object --- src/main/java/mc/protocol/UnknownPacket.java | 25 ++++++++++++++++ src/main/java/mc/protocol/Utils.java | 17 +++++++++++ .../mc/protocol/coder/ProtocolDecoder.java | 30 +++++++++++-------- 3 files changed, 59 insertions(+), 13 deletions(-) create mode 100644 src/main/java/mc/protocol/UnknownPacket.java create mode 100644 src/main/java/mc/protocol/Utils.java diff --git a/src/main/java/mc/protocol/UnknownPacket.java b/src/main/java/mc/protocol/UnknownPacket.java new file mode 100644 index 0000000..5f4744b --- /dev/null +++ b/src/main/java/mc/protocol/UnknownPacket.java @@ -0,0 +1,25 @@ +package mc.protocol; + +import lombok.Data; +import lombok.ToString; + +@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/coder/ProtocolDecoder.java b/src/main/java/mc/protocol/coder/ProtocolDecoder.java index 9715c7b..38f347a 100644 --- a/src/main/java/mc/protocol/coder/ProtocolDecoder.java +++ b/src/main/java/mc/protocol/coder/ProtocolDecoder.java @@ -13,12 +13,7 @@ https://wiki.vg/index.php?title=Protocol&oldid=7368#Without_compression */ import lombok.RequiredArgsConstructor; -import mc.protocol.NetInputStream; -import mc.protocol.Packet; -import mc.protocol.PacketDirection; -import mc.protocol.State; - -import java.util.Objects; +import mc.protocol.*; @RequiredArgsConstructor public class ProtocolDecoder { @@ -31,15 +26,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; + } } } }