diff --git a/src/main/java/mc/server/network/impl/handler/HandshakeHandler.java b/src/main/java/mc/server/network/impl/handler/HandshakeHandler.java index b055295..5f4b838 100644 --- a/src/main/java/mc/server/network/impl/handler/HandshakeHandler.java +++ b/src/main/java/mc/server/network/impl/handler/HandshakeHandler.java @@ -5,6 +5,7 @@ import com.google.inject.Provider; import io.netty.channel.ChannelHandlerContext; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import mc.protocol.State; import mc.protocol.handshake.client.HandshakePacket; import static mc.server.network.impl.NettyConstants.ATTR_STATE; @@ -15,13 +16,19 @@ public class HandshakeHandler extends AbstractPacketHandler { private final Provider statusHandlerProvider; private final Provider pingHandlerProvider; + private final Provider loginHandlerProvider; @Override protected void channelRead1(ChannelHandlerContext ctx, HandshakePacket packet) { log.info("{}", packet); ctx.channel().attr(ATTR_STATE).set(packet.getNextState()); - ctx.channel().pipeline().replace("handshake_handler", "status_handler", statusHandlerProvider.get()); - ctx.channel().pipeline().addAfter("status_handler", "ping_handler", pingHandlerProvider.get()); + + if (packet.getNextState() == State.STATUS) { + ctx.channel().pipeline().replace("handshake_handler", "status_handler", statusHandlerProvider.get()); + ctx.channel().pipeline().addAfter("status_handler", "ping_handler", pingHandlerProvider.get()); + } else if (packet.getNextState() == State.LOGIN) { + ctx.channel().pipeline().replace("handshake_handler", "login_handler", loginHandlerProvider.get()); + } } } diff --git a/src/main/java/mc/server/network/impl/handler/LoginHandler.java b/src/main/java/mc/server/network/impl/handler/LoginHandler.java new file mode 100644 index 0000000..29a56c7 --- /dev/null +++ b/src/main/java/mc/server/network/impl/handler/LoginHandler.java @@ -0,0 +1,23 @@ +package mc.server.network.impl.handler; + +import io.netty.channel.ChannelHandlerContext; +import mc.protocol.login.client.LoginStartPacket; +import mc.protocol.login.server.DisconnectPacket; +import mc.protocol.text.Text; +import mc.protocol.text.TextColor; +import mc.protocol.text.TextStyle; + +public class LoginHandler extends AbstractPacketHandler { + + @Override + protected void channelRead1(ChannelHandlerContext ctx, LoginStartPacket packet) { + DisconnectPacket disconnectPacket = new DisconnectPacket(); + disconnectPacket.setReason(Text.builder() + .append(Text.of(TextColor.WHITE, "Server is ")) + .color(TextColor.RED).style(TextStyle.BOLD).append("NOT ") + .color(TextColor.WHITE).append("available.") + .build()); + + ctx.channel().writeAndFlush(disconnectPacket).channel().disconnect(); + } +}