diff --git a/pom.xml b/pom.xml index cbc34df..0453852 100644 --- a/pom.xml +++ b/pom.xml @@ -41,6 +41,11 @@ lombok 1.16.16 + + com.google.code.gson + gson + 2.8.2 + diff --git a/src/main/java/mc/core/netty/BasePacket.java b/src/main/java/mc/core/netty/BasePacket.java index 4942c29..ccdd7c2 100644 --- a/src/main/java/mc/core/netty/BasePacket.java +++ b/src/main/java/mc/core/netty/BasePacket.java @@ -4,14 +4,21 @@ */ package mc.core.netty; +import io.netty.buffer.ByteBuf; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.ToString; +import lombok.extern.slf4j.Slf4j; @RequiredArgsConstructor @Getter @ToString +@Slf4j class BasePacket { private final int length; private final int id; + + public void writeSelf(ByteBuf byteBuf) { + log.warn("write not support"); + } } diff --git a/src/main/java/mc/core/netty/HandshakePacket.java b/src/main/java/mc/core/netty/HandshakeRequestPacket.java similarity index 79% rename from src/main/java/mc/core/netty/HandshakePacket.java rename to src/main/java/mc/core/netty/HandshakeRequestPacket.java index 97d875f..2ccb866 100644 --- a/src/main/java/mc/core/netty/HandshakePacket.java +++ b/src/main/java/mc/core/netty/HandshakeRequestPacket.java @@ -12,13 +12,13 @@ import static mc.core.netty.Utilits.*; @Getter @ToString -public class HandshakePacket extends BasePacket { +public class HandshakeRequestPacket 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 { + public HandshakeRequestPacket(int length, int id, ByteBuf byteBuf) throws Exception { super(length, id); protocolVersion = readVarInt(byteBuf); diff --git a/src/main/java/mc/core/netty/HandshakeResponsePacket.java b/src/main/java/mc/core/netty/HandshakeResponsePacket.java new file mode 100644 index 0000000..10ac2fa --- /dev/null +++ b/src/main/java/mc/core/netty/HandshakeResponsePacket.java @@ -0,0 +1,48 @@ +/* + * DmitriyMX + * 2018-03-25 + */ +package mc.core.netty; + +import com.google.gson.JsonObject; +import io.netty.buffer.ByteBuf; + +import static mc.core.netty.Utilits.lengthVarInt; + +public class HandshakeResponsePacket extends BasePacket { + private static String json; + + static { + JsonObject versionObj = new JsonObject(); + versionObj.addProperty("name", "1.12.2"); + versionObj.addProperty("protocol", 340); + + JsonObject playersObj = new JsonObject(); + playersObj.addProperty("max", 100); + playersObj.addProperty("online", 15); + + JsonObject descriptionObj = new JsonObject(); + descriptionObj.addProperty("text", "MC Core"); + + JsonObject rootObj = new JsonObject(); + rootObj.add("version", versionObj); + rootObj.add("players", playersObj); + rootObj.add("description", descriptionObj); + + json = rootObj.toString(); + } + + public HandshakeResponsePacket(int length, int id) { + super(length, id); + } + + @Override + public void writeSelf(ByteBuf byteBuf) { + Utilits.writeString(json, byteBuf); + } + + @Override + public int getLength() { + return lengthVarInt(getId()) + lengthVarInt(json.length()) + json.length(); + } +} diff --git a/src/main/java/mc/core/netty/NettyServer.java b/src/main/java/mc/core/netty/NettyServer.java index 1681c70..8feebcc 100644 --- a/src/main/java/mc/core/netty/NettyServer.java +++ b/src/main/java/mc/core/netty/NettyServer.java @@ -23,6 +23,7 @@ public class NettyServer implements Server { protected void initChannel(SocketChannel socketChannel) { socketChannel.pipeline().addLast( new LoggingHandler(), + new PacketEncoder(), new PacketDecoder(), new PacketHandler() ); diff --git a/src/main/java/mc/core/netty/PacketDecoder.java b/src/main/java/mc/core/netty/PacketDecoder.java index cfb9b12..0c8d232 100644 --- a/src/main/java/mc/core/netty/PacketDecoder.java +++ b/src/main/java/mc/core/netty/PacketDecoder.java @@ -19,7 +19,7 @@ public class PacketDecoder extends ReplayingDecoder { int id = readVarInt(byteBuf); if (id == 0) { - list.add(new HandshakePacket(length, id, byteBuf)); + list.add(new HandshakeRequestPacket(length, id, byteBuf)); } else { list.add(new BasePacket(length, id)); byteBuf.skipBytes(length); diff --git a/src/main/java/mc/core/netty/PacketEncoder.java b/src/main/java/mc/core/netty/PacketEncoder.java new file mode 100644 index 0000000..232c4fe --- /dev/null +++ b/src/main/java/mc/core/netty/PacketEncoder.java @@ -0,0 +1,20 @@ +/* + * DmitriyMX + * 2018-03-25 + */ +package mc.core.netty; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToByteEncoder; + +import static mc.core.netty.Utilits.writeVarInt; + +public class PacketEncoder extends MessageToByteEncoder { + @Override + protected void encode(ChannelHandlerContext context, BasePacket packet, ByteBuf byteBuf) throws Exception { + writeVarInt(packet.getLength(), byteBuf); + writeVarInt(packet.getId(), byteBuf); + packet.writeSelf(byteBuf); + } +} diff --git a/src/main/java/mc/core/netty/PacketHandler.java b/src/main/java/mc/core/netty/PacketHandler.java index 16d4982..247d1ef 100644 --- a/src/main/java/mc/core/netty/PacketHandler.java +++ b/src/main/java/mc/core/netty/PacketHandler.java @@ -15,5 +15,9 @@ public class PacketHandler extends SimpleChannelInboundHandler { log.info("Packet: {} | Data: {}", packet.getClass().getSimpleName(), packet.toString()); + + if (packet.getClass().getSimpleName().equals("HandshakeRequestPacket")) { + context.channel().writeAndFlush(new HandshakeResponsePacket(0, 0)); + } } } diff --git a/src/main/java/mc/core/netty/Utilits.java b/src/main/java/mc/core/netty/Utilits.java index 2bbccfa..f71001b 100644 --- a/src/main/java/mc/core/netty/Utilits.java +++ b/src/main/java/mc/core/netty/Utilits.java @@ -28,6 +28,29 @@ public class Utilits { return result; } + public static void writeVarInt(int value, ByteBuf byteBuf) { + do { + byte temp = (byte)(value & 0b01111111); + value >>>= 7; + if (value != 0) { + temp |= 0b10000000; + } + + byteBuf.writeByte(temp); + } while (value != 0); + } + + public static int lengthVarInt(int value) { + int result = 0; + + do { + value >>>= 7; + result++; + } while (value != 0); + + return result; + } + public static String readString(ByteBuf byteBuf) throws Exception { int length = readVarInt(byteBuf); byte[] buffer = new byte[length]; @@ -42,4 +65,9 @@ public class Utilits { public static int readUnsignedShort(ByteBuf byteBuf) { return byteBuf.readUnsignedShort(); } + + public static void writeString(String value, ByteBuf byteBuf) { + writeVarInt(value.length(), byteBuf); + byteBuf.writeBytes(value.getBytes()); + } }