diff --git a/protocol/src/main/java/mc/protocol/State.java b/protocol/src/main/java/mc/protocol/State.java index f284800..180f4d7 100644 --- a/protocol/src/main/java/mc/protocol/State.java +++ b/protocol/src/main/java/mc/protocol/State.java @@ -50,12 +50,14 @@ public enum State { 0x00, TeleportConfirmPacket.class, 0x04, ClientSettingsPacket.class, 0x09, PluginMessagePacket.class, + 0x0B, PingPacket.class, 0x0D, PlayerPositionPacket.class, 0x0E, CPlayerPositionAndLookPacket.class, 0x0F, PlayerLookPacket.class ), // client bound Map.of( + PingPacket.class, 0x1F, JoinGamePacket.class, 0x23, SpawnPositionPacket.class, 0x46, ChunkDataPacket.class, 0x20, diff --git a/server/src/main/java/mc/server/Main.java b/server/src/main/java/mc/server/Main.java index e8bb6aa..fedfe80 100644 --- a/server/src/main/java/mc/server/Main.java +++ b/server/src/main/java/mc/server/Main.java @@ -53,6 +53,7 @@ public class Main { State.STATUS.packetFlux(PingPacket.class).subscribe(packetHandler::onKeepAlive); State.STATUS.packetFlux(StatusServerRequestPacket.class).subscribe(packetHandler::onServerStatus); State.LOGIN.packetFlux(LoginStartPacket.class).subscribe(packetHandler::onLoginStart); + State.PLAY.packetFlux(PingPacket.class).subscribe(packetHandler::onKeepAlivePlay); server.bind(config.server().host(), config.server().port()); } diff --git a/server/src/main/java/mc/server/PacketHandler.java b/server/src/main/java/mc/server/PacketHandler.java index 641fd17..49ebee7 100644 --- a/server/src/main/java/mc/server/PacketHandler.java +++ b/server/src/main/java/mc/server/PacketHandler.java @@ -38,6 +38,10 @@ public class PacketHandler { channel.getCtx().writeAndFlush(channel.getPacket()).channel().disconnect(); } + public void onKeepAlivePlay(ChannelContext channel) { + channel.getCtx().writeAndFlush(channel.getPacket()); + } + public void onServerStatus(ChannelContext channel) { ServerInfo serverInfo = new ServerInfo(); serverInfo.version().name(ProtocolConstant.PROTOCOL_NAME); @@ -106,7 +110,14 @@ public class PacketHandler { playerPositionAndLookPacket.setLook(new Look(0f, 0f)); playerPositionAndLookPacket.setTeleportId(random.nextInt()); - channel.getCtx().writeAndFlush(playerPositionAndLookPacket); + channel.getCtx().write(playerPositionAndLookPacket); + + PingPacket pingPacket = new PingPacket(); + pingPacket.setPayload(System.currentTimeMillis()); + + channel.getCtx().write(pingPacket); + + channel.getCtx().flush(); } private static String faviconToBase64(Path iconPath) {