diff --git a/pom.xml b/pom.xml
index 0453852..31b033a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -46,6 +46,11 @@
gson
2.8.2
+
+ com.google.guava
+ guava
+ 24.1-jre
+
diff --git a/src/main/java/mc/core/netty/HandshakeRequestPacket.java b/src/main/java/mc/core/netty/HandshakeRequestPacket.java
index 6fdf260..eb5cd19 100644
--- a/src/main/java/mc/core/netty/HandshakeRequestPacket.java
+++ b/src/main/java/mc/core/netty/HandshakeRequestPacket.java
@@ -9,6 +9,8 @@ import lombok.Getter;
import lombok.ToString;
import mc.core.NotSupportException;
+import java.util.Optional;
+
import static mc.core.netty.Utils.*;
@Getter
@@ -18,7 +20,7 @@ public class HandshakeRequestPacket implements NettyPacket {
private int protocolVersion;
private String serverAddress;
private int serverPort;
- private int nextState;
+ private State nextState;
private int size;
@Override
@@ -31,13 +33,14 @@ public class HandshakeRequestPacket implements NettyPacket {
protocolVersion = readVarInt(byteBuf);
serverAddress = readString(byteBuf);
serverPort = readUnsignedShort(byteBuf);
- nextState = readVarInt(byteBuf);
+ final int nextStateInt = readVarInt(byteBuf);
+ nextState = State.getById(nextStateInt).orElseThrow(() -> new UnknowState(nextStateInt));
size = lengthVarInt(id)
+ lengthVarInt(protocolVersion)
+ lengthString(serverAddress)
+ lengthVarInt(serverPort)
- + lengthVarInt(nextState);
+ + lengthVarInt(nextState.getId());
}
@Override
diff --git a/src/main/java/mc/core/netty/PacketDecoder.java b/src/main/java/mc/core/netty/PacketDecoder.java
index 631af13..0f65ffd 100644
--- a/src/main/java/mc/core/netty/PacketDecoder.java
+++ b/src/main/java/mc/core/netty/PacketDecoder.java
@@ -9,6 +9,7 @@ import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ReplayingDecoder;
import java.util.List;
+import java.util.Optional;
import static mc.core.netty.Utils.readVarInt;
@@ -18,8 +19,10 @@ public class PacketDecoder extends ReplayingDecoder {
int length = readVarInt(byteBuf);
int id = readVarInt(byteBuf);
- if (id == 0) {
- NettyPacket packet = new HandshakeRequestPacket();
+ Optional> packetClass = context.channel().attr(State.ATTR_STATE).get().getPacketClass(id);
+
+ if (packetClass.isPresent()) {
+ NettyPacket packet = packetClass.get().newInstance();
packet.fillFromByteBuf(byteBuf);
list.add(packet);
} else {
diff --git a/src/main/java/mc/core/netty/PacketHandler.java b/src/main/java/mc/core/netty/PacketHandler.java
index e5ef4ab..47f0634 100644
--- a/src/main/java/mc/core/netty/PacketHandler.java
+++ b/src/main/java/mc/core/netty/PacketHandler.java
@@ -12,6 +12,11 @@ import static mc.core.netty.Utils.equalsPacket;
@Slf4j
public class PacketHandler extends SimpleChannelInboundHandler {
+ @Override
+ public void channelActive(ChannelHandlerContext context) throws Exception {
+ context.channel().attr(State.ATTR_STATE).set(State.Handshaking);
+ }
+
@Override
protected void channelRead0(ChannelHandlerContext context, NettyPacket packet) throws Exception {
log.info("Packet: {} | Data: {}",
diff --git a/src/main/java/mc/core/netty/State.java b/src/main/java/mc/core/netty/State.java
new file mode 100644
index 0000000..ea5b778
--- /dev/null
+++ b/src/main/java/mc/core/netty/State.java
@@ -0,0 +1,36 @@
+/*
+ * DmitriyMX
+ * 2018-03-25
+ */
+package mc.core.netty;
+
+import com.google.common.collect.ImmutableMap;
+import io.netty.util.AttributeKey;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.Map;
+import java.util.Optional;
+
+public enum State {
+ Handshaking(1, ImmutableMap.of(0, HandshakeRequestPacket.class));
+
+ public static final AttributeKey ATTR_STATE = AttributeKey.newInstance("ATTR_STATE");
+
+ public static Optional getById(final int id) {
+ return Arrays.stream(State.values()).filter(state -> state.id == id).findFirst();
+ }
+
+ @Getter
+ private final int id;
+ private final Map> requestMap;
+
+ State(int id, Map> requestMap) {
+ this.id = id;
+ this.requestMap = requestMap;
+ }
+
+ public Optional> getPacketClass(int id) {
+ return Optional.ofNullable(requestMap.get(id));
+ }
+}
diff --git a/src/main/java/mc/core/netty/UnknowState.java b/src/main/java/mc/core/netty/UnknowState.java
new file mode 100644
index 0000000..13dcbc3
--- /dev/null
+++ b/src/main/java/mc/core/netty/UnknowState.java
@@ -0,0 +1,11 @@
+/*
+ * DmitriyMX
+ * 2018-03-26
+ */
+package mc.core.netty;
+
+public class UnknowState extends RuntimeException {
+ public UnknowState(int numberOfState) {
+ super("Unknown state: " + numberOfState);
+ }
+}