From 34b6a5061dbffe55320bfb4fddcde32333532fcb Mon Sep 17 00:00:00 2001 From: Dereku Date: Sun, 3 Dec 2023 19:20:52 +0700 Subject: [PATCH] =?UTF-8?q?1.2.=20=D0=9F=D1=80=D0=BE=D1=81=D1=82=D0=BE=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8=20=D0=BD=D0=B0?= =?UTF-8?q?=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=83.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../net/rubeta/legacyping/ServerThread.java | 46 ++++++++++++++----- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/pom.xml b/pom.xml index 99f945f..0bbf5cf 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ net.rubeta LegacyPing - 1.1 + 1.2 jar LegacyPing diff --git a/src/main/java/net/rubeta/legacyping/ServerThread.java b/src/main/java/net/rubeta/legacyping/ServerThread.java index 799adde..d03ee9b 100644 --- a/src/main/java/net/rubeta/legacyping/ServerThread.java +++ b/src/main/java/net/rubeta/legacyping/ServerThread.java @@ -27,13 +27,27 @@ public class ServerThread extends Thread { this.serverSocket.setPerformancePreferences(0, 2, 1); } + public ServerThread(final String host, int port) throws IOException { + this.minecraftServer = null; + this.setName("LegacyPing thread listening " + host + ":" + port); + final InetAddress address = InetAddress.getByName(host); + this.serverSocket = new ServerSocket(port, 10, address); + this.serverSocket.setSoTimeout((int) TimeUnit.SECONDS.toMillis(10L)); + this.serverSocket.setPerformancePreferences(0, 2, 1); + } + + public static void main(String[] args) throws IOException { + new ServerThread("", 25565).start(); + } + @Override public void run() { this.working.set(true); - while (this.working.get() || !this.serverSocket.isClosed()) { + while (this.working.get() && !this.serverSocket.isClosed()) { try { final Socket socket = this.serverSocket.accept(); socket.setTrafficClass(SocketOptions.TCP_NODELAY & SocketOptions.IP_TOS); + System.out.println("[LegacyPing] Got new ping from " + socket.getRemoteSocketAddress()); final InputStream inputStream = socket.getInputStream(); final OutputStream outputStream = socket.getOutputStream(); final int firstByte = inputStream.read(); @@ -49,7 +63,9 @@ public class ServerThread extends Thread { } outputStream.flush(); socket.close(); - } catch (IOException ignore) { + } catch (SocketTimeoutException ignore) { + } catch (IOException ex) { + System.out.println("Exception caught: " + ex); } } } @@ -66,9 +82,7 @@ public class ServerThread extends Thread { final ByteArrayOutputStream result = new ByteArrayOutputStream(); final DataOutputStream dos = new DataOutputStream(result); dos.write(255); // Packet 0xFF (PacketDisconnect) - final String response = ((CraftServer) this.minecraftServer).getServer().motd - + '\u0000' + this.minecraftServer.getOnlinePlayers().length - + '\u0000' + this.minecraftServer.getMaxPlayers(); + final String response = this.getMotd() + '\u0000' + this.getOnlinePlayers() + '\u0000' + this.getMaxPlayers(); dos.writeShort(response.length()); for (char c : response.toCharArray()) { dos.writeChar(c); @@ -83,9 +97,7 @@ public class ServerThread extends Thread { private void responseForLegacyPing(final OutputStream outputStream) throws IOException { final DataOutputStream clientOutput = new DataOutputStream(outputStream); clientOutput.write(255); - final String response = ((CraftServer) this.minecraftServer).getServer().motd - + '\u00a7' + this.minecraftServer.getOnlinePlayers().length - + '\u00a7' + this.minecraftServer.getMaxPlayers(); + final String response = this.getMotd() + '\u00a7' + this.getOnlinePlayers() + '\u00a7' + this.getMaxPlayers(); clientOutput.writeShort(response.length()); for (char c : response.toCharArray()) { clientOutput.writeChar(c); @@ -94,9 +106,9 @@ public class ServerThread extends Thread { } private void responseForModernPing(final OutputStream outputStream) throws IOException { - final String responseJson = MODERN_RESPONSE.replace("%max%", String.valueOf(this.minecraftServer.getMaxPlayers())) - .replace("%now%", String.valueOf(this.minecraftServer.getOnlinePlayers().length)) - .replace("%motd%", ((CraftServer) this.minecraftServer).getServer().motd); + final String responseJson = MODERN_RESPONSE.replace("%max%", String.valueOf(this.getMaxPlayers())) + .replace("%now%", String.valueOf(this.getOnlinePlayers())) + .replace("%motd%", this.getMotd()); byte[] bytes = responseJson.getBytes(); final DataOutputStream clientOutput = new DataOutputStream(outputStream); this.writeVarInt(clientOutput, bytes.length + 3); @@ -106,6 +118,18 @@ public class ServerThread extends Thread { // Packet data end } + private String getMotd() { + return this.minecraftServer == null ? "This is an example of the Message of the Day" : ((CraftServer) this.minecraftServer).getServer().motd; + } + + private int getOnlinePlayers() { + return this.minecraftServer == null ? 13 : this.minecraftServer.getOnlinePlayers().length; + } + + private int getMaxPlayers() { + return this.minecraftServer == null ? 37 : this.minecraftServer.getMaxPlayers(); + } + private void writeVarInt(DataOutputStream out, int paramInt) throws IOException { while (true) { if ((paramInt & 0xFFFFFF80) == 0) {