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());
+ }
}