From 4e1ba7faee72752ad9b374756f378d1c93ef3c2a Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 29 Aug 2019 15:18:34 +0300 Subject: [PATCH] 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; + } } } }