diff --git a/src/main/java/mc/protocol/State.java b/src/main/java/mc/protocol/State.java
index da448e6..3d38333 100644
--- a/src/main/java/mc/protocol/State.java
+++ b/src/main/java/mc/protocol/State.java
@@ -7,7 +7,9 @@ import lombok.RequiredArgsConstructor;
import mc.protocol.packets.Packet;
import mc.protocol.packets.PacketDirection;
import mc.protocol.packets.client.HandshakePacket;
+import mc.protocol.packets.client.LoginStartPacket;
import mc.protocol.packets.client.StatusServerRequest;
+import mc.protocol.packets.server.DisconnectPacket;
import mc.protocol.packets.server.StatusServerResponse;
import javax.annotation.Nullable;
@@ -24,6 +26,12 @@ public enum State {
ImmutableBiMap.of(0x00, StatusServerRequest.class),
// client bound
ImmutableBiMap.of(0x00, StatusServerResponse.class)
+ ),
+ LOGIN(2,
+ // server bound
+ ImmutableBiMap.of(0x00, LoginStartPacket.class),
+ // client bound
+ ImmutableBiMap.of(0x00, DisconnectPacket.class)
);
@Nullable
diff --git a/src/main/java/mc/protocol/packets/client/LoginStartPacket.java b/src/main/java/mc/protocol/packets/client/LoginStartPacket.java
new file mode 100644
index 0000000..6fa953e
--- /dev/null
+++ b/src/main/java/mc/protocol/packets/client/LoginStartPacket.java
@@ -0,0 +1,43 @@
+package mc.protocol.packets.client;
+
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+import mc.protocol.State;
+import mc.protocol.io.NetByteBuf;
+import mc.protocol.packets.Packet;
+
+/**
+ * Login start packet.
+ *
+ *
Начало авторизации.
+ *
+ * Структура пакета
+ *
+ * | FIELD | TYPE | NOTES |
+ * |-------|--------|------------------|
+ * | Name | String | Имя/Логин игрока |
+ *
+ *
+ * @see Login start
+ * @see State
+ */
+@NoArgsConstructor
+@Getter
+@EqualsAndHashCode
+@ToString
+public class LoginStartPacket implements Packet {
+
+ private String name;
+
+ @Override
+ public void readSelf(NetByteBuf netByteBuf) {
+ this.name = netByteBuf.readString();
+ }
+
+ @Override
+ public void writeSelf(NetByteBuf netByteBuf) {
+ netByteBuf.writeString(name);
+ }
+}
diff --git a/src/main/java/mc/protocol/packets/server/DisconnectPacket.java b/src/main/java/mc/protocol/packets/server/DisconnectPacket.java
new file mode 100644
index 0000000..2cfb3e2
--- /dev/null
+++ b/src/main/java/mc/protocol/packets/server/DisconnectPacket.java
@@ -0,0 +1,47 @@
+package mc.protocol.packets.server;
+
+import lombok.Data;
+import mc.protocol.State;
+import mc.protocol.io.NetByteBuf;
+import mc.protocol.packets.Packet;
+
+/**
+ * Diconnect packet.
+ *
+ * Отключение клиента сервером с указанием причины.
+ *
+ * Структура пакета
+ *
+ * | FIELD | TYPE | NOTES |
+ * |--------|------|----------------------------------|
+ * | Reason | Text | Причина отключения. Опционально. |
+ *
+ *
+ * @see Disconnect
+ * @see State
+ */
+@Data
+public class DisconnectPacket implements Packet {
+
+ /**
+ * Причина отключения.
+ *
+ * Пример:
+ *
+ * {
+ * "text": "foo"
+ * }
+ *
+ */
+ private String reason;
+
+ @Override
+ public void readSelf(NetByteBuf netByteBuf) {
+ this.reason = netByteBuf.readString();
+ }
+
+ @Override
+ public void writeSelf(NetByteBuf netByteBuf) {
+ netByteBuf.writeString(reason);
+ }
+}
diff --git a/src/main/java/mc/server/di/NetworkModule.java b/src/main/java/mc/server/di/NetworkModule.java
index c06bb2c..c5ca566 100644
--- a/src/main/java/mc/server/di/NetworkModule.java
+++ b/src/main/java/mc/server/di/NetworkModule.java
@@ -16,9 +16,10 @@ import mc.protocol.io.codec.ProtocolDecoder;
import mc.protocol.io.codec.ProtocolEncoder;
import mc.protocol.io.codec.ProtocolSplitter;
import mc.server.network.Server;
-import mc.server.network.netty.HandshakeHandler;
+import mc.server.network.netty.handler.HandshakeHandler;
import mc.server.network.netty.NettyServer;
-import mc.server.network.netty.StatusHandler;
+import mc.server.network.netty.handler.LoginHandler;
+import mc.server.network.netty.handler.StatusHandler;
import javax.inject.Provider;
import java.util.LinkedHashMap;
@@ -56,14 +57,17 @@ public class NetworkModule {
}
@Provides
- Map provideChannelHandlerMap(Provider statusHandlerProvider) {
+ Map provideChannelHandlerMap(
+ Provider statusHandlerProvider,
+ Provider loginHandlerProvider
+ ) {
Map map = new LinkedHashMap<>();
map.put("logger", new LoggingHandler(LogLevel.DEBUG));
map.put("protocol_splitter", new ProtocolSplitter());
map.put("protocol_decoder", new ProtocolDecoder(true));
map.put("protocol_encoder", new ProtocolEncoder());
- map.put("handshake_handler", new HandshakeHandler(statusHandlerProvider));
+ map.put("handshake_handler", new HandshakeHandler(statusHandlerProvider, loginHandlerProvider));
return map;
}
@@ -72,4 +76,9 @@ public class NetworkModule {
StatusHandler provideStatusHandler() {
return new StatusHandler();
}
+
+ @Provides
+ LoginHandler provideLoginHandler() {
+ return new LoginHandler();
+ }
}
diff --git a/src/main/java/mc/server/network/netty/AbstractPacketHandler.java b/src/main/java/mc/server/network/netty/handler/AbstractPacketHandler.java
similarity index 92%
rename from src/main/java/mc/server/network/netty/AbstractPacketHandler.java
rename to src/main/java/mc/server/network/netty/handler/AbstractPacketHandler.java
index 733e255..3d2d900 100644
--- a/src/main/java/mc/server/network/netty/AbstractPacketHandler.java
+++ b/src/main/java/mc/server/network/netty/handler/AbstractPacketHandler.java
@@ -1,4 +1,4 @@
-package mc.server.network.netty;
+package mc.server.network.netty.handler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
diff --git a/src/main/java/mc/server/network/netty/HandshakeHandler.java b/src/main/java/mc/server/network/netty/handler/HandshakeHandler.java
similarity index 58%
rename from src/main/java/mc/server/network/netty/HandshakeHandler.java
rename to src/main/java/mc/server/network/netty/handler/HandshakeHandler.java
index 8ceb9a1..5f31d3e 100644
--- a/src/main/java/mc/server/network/netty/HandshakeHandler.java
+++ b/src/main/java/mc/server/network/netty/handler/HandshakeHandler.java
@@ -1,9 +1,10 @@
-package mc.server.network.netty;
+package mc.server.network.netty.handler;
import io.netty.channel.ChannelHandlerContext;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import mc.protocol.NetworkAttributes;
+import mc.protocol.State;
import mc.protocol.packets.client.HandshakePacket;
import javax.inject.Provider;
@@ -13,12 +14,18 @@ import javax.inject.Provider;
public class HandshakeHandler extends AbstractPacketHandler {
private final Provider statusHandlerProvider;
+ private final Provider loginHandlerProvider;
@Override
protected void channelRead1(ChannelHandlerContext ctx, HandshakePacket packet) {
log.info("{}", packet);
ctx.channel().attr(NetworkAttributes.STATE).set(packet.getNextState());
- ctx.pipeline().replace("handshake_handler", "status_handler", statusHandlerProvider.get());
+
+ if (State.STATUS == packet.getNextState()) {
+ ctx.pipeline().replace("handshake_handler", "status_handler", statusHandlerProvider.get());
+ } else if (State.LOGIN == packet.getNextState()) {
+ ctx.channel().pipeline().replace("handshake_handler", "login_handler", loginHandlerProvider.get());
+ }
}
}
diff --git a/src/main/java/mc/server/network/netty/handler/LoginHandler.java b/src/main/java/mc/server/network/netty/handler/LoginHandler.java
new file mode 100644
index 0000000..8a0d92c
--- /dev/null
+++ b/src/main/java/mc/server/network/netty/handler/LoginHandler.java
@@ -0,0 +1,18 @@
+package mc.server.network.netty.handler;
+
+import io.netty.channel.ChannelHandlerContext;
+import mc.protocol.packets.client.LoginStartPacket;
+import mc.protocol.packets.server.DisconnectPacket;
+
+public class LoginHandler extends AbstractPacketHandler {
+
+ @Override
+ protected void channelRead1(ChannelHandlerContext ctx, LoginStartPacket packet) {
+ DisconnectPacket disconnectPacket = new DisconnectPacket();
+ disconnectPacket.setReason("{\n" +
+ " \"text\": \"Server is not available.\"\n" +
+ "}");
+
+ ctx.channel().writeAndFlush(disconnectPacket).channel().disconnect();
+ }
+}
diff --git a/src/main/java/mc/server/network/netty/StatusHandler.java b/src/main/java/mc/server/network/netty/handler/StatusHandler.java
similarity index 95%
rename from src/main/java/mc/server/network/netty/StatusHandler.java
rename to src/main/java/mc/server/network/netty/handler/StatusHandler.java
index 2d898ff..0628875 100644
--- a/src/main/java/mc/server/network/netty/StatusHandler.java
+++ b/src/main/java/mc/server/network/netty/handler/StatusHandler.java
@@ -1,4 +1,4 @@
-package mc.server.network.netty;
+package mc.server.network.netty.handler;
import io.netty.channel.ChannelHandlerContext;
import lombok.extern.slf4j.Slf4j;