From ed2094a749be38f1e0a43fd29d45aa7e75747f66 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 25 Mar 2018 20:29:18 +0300 Subject: [PATCH] Handshake packet --- src/main/java/mc/core/netty/BasePacket.java | 2 + .../java/mc/core/netty/HandshakePacket.java | 29 ++++++++++++ .../java/mc/core/netty/PacketDecoder.java | 29 ++++-------- .../java/mc/core/netty/PacketHandler.java | 6 +-- src/main/java/mc/core/netty/Utilits.java | 45 +++++++++++++++++++ 5 files changed, 87 insertions(+), 24 deletions(-) create mode 100644 src/main/java/mc/core/netty/HandshakePacket.java create mode 100644 src/main/java/mc/core/netty/Utilits.java diff --git a/src/main/java/mc/core/netty/BasePacket.java b/src/main/java/mc/core/netty/BasePacket.java index 0c258c6..4942c29 100644 --- a/src/main/java/mc/core/netty/BasePacket.java +++ b/src/main/java/mc/core/netty/BasePacket.java @@ -6,9 +6,11 @@ package mc.core.netty; import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.ToString; @RequiredArgsConstructor @Getter +@ToString class BasePacket { private final int length; private final int id; diff --git a/src/main/java/mc/core/netty/HandshakePacket.java b/src/main/java/mc/core/netty/HandshakePacket.java new file mode 100644 index 0000000..97d875f --- /dev/null +++ b/src/main/java/mc/core/netty/HandshakePacket.java @@ -0,0 +1,29 @@ +/* + * DmitriyMX + * 2018-03-25 + */ +package mc.core.netty; + +import io.netty.buffer.ByteBuf; +import lombok.Getter; +import lombok.ToString; + +import static mc.core.netty.Utilits.*; + +@Getter +@ToString +public class HandshakePacket extends BasePacket { + private final int protocolVersion; + private final String serverAddress; + private final int serverPort; + private final int nextState; + + public HandshakePacket(int length, int id, ByteBuf byteBuf) throws Exception { + super(length, id); + + protocolVersion = readVarInt(byteBuf); + serverAddress = readString(byteBuf); + serverPort = readUnsignedShort(byteBuf); + nextState = readVarInt(byteBuf); + } +} diff --git a/src/main/java/mc/core/netty/PacketDecoder.java b/src/main/java/mc/core/netty/PacketDecoder.java index 5a09dd8..cfb9b12 100644 --- a/src/main/java/mc/core/netty/PacketDecoder.java +++ b/src/main/java/mc/core/netty/PacketDecoder.java @@ -10,32 +10,19 @@ import io.netty.handler.codec.ReplayingDecoder; import java.util.List; +import static mc.core.netty.Utilits.readVarInt; + public class PacketDecoder extends ReplayingDecoder { - private int readVarInt(ByteBuf byteBuf) throws Exception { - int result = 0; - byte read; - int numRead = 0; - - do { - read = byteBuf.readByte(); - int value = (read & 0b01111111); - result |= (value << (7 * numRead)); - - numRead++; - if (numRead > 5) { - throw new Exception("VarInt is too big"); - } - } while ((read & 0b10000000) != 0); - - return result; - } - @Override protected void decode(ChannelHandlerContext context, ByteBuf byteBuf, List list) throws Exception { int length = readVarInt(byteBuf); int id = readVarInt(byteBuf); - list.add(new BasePacket(length, id)); - byteBuf.skipBytes(length); + if (id == 0) { + list.add(new HandshakePacket(length, id, byteBuf)); + } else { + list.add(new BasePacket(length, id)); + byteBuf.skipBytes(length); + } } } diff --git a/src/main/java/mc/core/netty/PacketHandler.java b/src/main/java/mc/core/netty/PacketHandler.java index 3f40d5a..16d4982 100644 --- a/src/main/java/mc/core/netty/PacketHandler.java +++ b/src/main/java/mc/core/netty/PacketHandler.java @@ -12,8 +12,8 @@ import lombok.extern.slf4j.Slf4j; public class PacketHandler extends SimpleChannelInboundHandler { @Override protected void channelRead0(ChannelHandlerContext context, BasePacket packet) throws Exception { - log.info("Lenght: {} | Id: {}", - packet.getLength(), - packet.getId()); + log.info("Packet: {} | Data: {}", + packet.getClass().getSimpleName(), + packet.toString()); } } diff --git a/src/main/java/mc/core/netty/Utilits.java b/src/main/java/mc/core/netty/Utilits.java new file mode 100644 index 0000000..2bbccfa --- /dev/null +++ b/src/main/java/mc/core/netty/Utilits.java @@ -0,0 +1,45 @@ +/* + * DmitriyMX + * 2018-03-25 + */ +package mc.core.netty; + +import io.netty.buffer.ByteBuf; + +import java.nio.charset.StandardCharsets; + +public class Utilits { + public static int readVarInt(ByteBuf byteBuf) throws Exception { + int result = 0; + byte read; + int numRead = 0; + + do { + read = byteBuf.readByte(); + int value = (read & 0b01111111); + result |= (value << (7 * numRead)); + + numRead++; + if (numRead > 5) { + throw new Exception("VarInt is too big"); + } + } while ((read & 0b10000000) != 0); + + return result; + } + + public static String readString(ByteBuf byteBuf) throws Exception { + int length = readVarInt(byteBuf); + byte[] buffer = new byte[length]; + int i = 0; + do { + buffer[i++] = byteBuf.readByte(); + } while (i < length); + + return new String(buffer, StandardCharsets.UTF_8); + } + + public static int readUnsignedShort(ByteBuf byteBuf) { + return byteBuf.readUnsignedShort(); + } +}