155 lines
		
	
	
	
		
			9.8 KiB
			
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			155 lines
		
	
	
	
		
			9.8 KiB
			
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 | 
						|
From: Mark Vainomaa <mikroskeem@mikroskeem.eu>
 | 
						|
Date: Sun, 17 Mar 2019 21:46:56 +0200
 | 
						|
Subject: [PATCH] Fire event on GS4 query
 | 
						|
 | 
						|
 | 
						|
diff --git a/src/main/java/net/minecraft/server/rcon/NetworkDataOutputStream.java b/src/main/java/net/minecraft/server/rcon/NetworkDataOutputStream.java
 | 
						|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
						|
--- a/src/main/java/net/minecraft/server/rcon/NetworkDataOutputStream.java
 | 
						|
+++ b/src/main/java/net/minecraft/server/rcon/NetworkDataOutputStream.java
 | 
						|
@@ -0,0 +0,0 @@ public class NetworkDataOutputStream {
 | 
						|
         this.dataOutputStream.write(0);
 | 
						|
     }
 | 
						|
 
 | 
						|
+    // Paper start - unchecked exception variant to use in Stream API
 | 
						|
+    public void writeStringUnchecked(String string) {
 | 
						|
+        try {
 | 
						|
+            writeString(string);
 | 
						|
+        } catch (IOException e) {
 | 
						|
+            com.destroystokyo.paper.util.SneakyThrow.sneaky(e);
 | 
						|
+        }
 | 
						|
+    }
 | 
						|
+    // Paper end
 | 
						|
+
 | 
						|
     public void write(int value) throws IOException {
 | 
						|
         this.dataOutputStream.write(value);
 | 
						|
     }
 | 
						|
diff --git a/src/main/java/net/minecraft/server/rcon/thread/QueryThreadGs4.java b/src/main/java/net/minecraft/server/rcon/thread/QueryThreadGs4.java
 | 
						|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 | 
						|
--- a/src/main/java/net/minecraft/server/rcon/thread/QueryThreadGs4.java
 | 
						|
+++ b/src/main/java/net/minecraft/server/rcon/thread/QueryThreadGs4.java
 | 
						|
@@ -0,0 +0,0 @@ public class QueryThreadGs4 extends GenericThread {
 | 
						|
                     NetworkDataOutputStream networkDataOutputStream = new NetworkDataOutputStream(1460);
 | 
						|
                     networkDataOutputStream.write(0);
 | 
						|
                     networkDataOutputStream.writeBytes(this.getIdentBytes(packet.getSocketAddress()));
 | 
						|
-                    networkDataOutputStream.writeString(this.serverName);
 | 
						|
+
 | 
						|
+                    com.destroystokyo.paper.event.server.GS4QueryEvent.QueryType queryType =
 | 
						|
+                        com.destroystokyo.paper.event.server.GS4QueryEvent.QueryType.BASIC;
 | 
						|
+                    com.destroystokyo.paper.event.server.GS4QueryEvent.QueryResponse queryResponse = com.destroystokyo.paper.event.server.GS4QueryEvent.QueryResponse.builder()
 | 
						|
+                        .motd(this.serverName)
 | 
						|
+                        .map(this.worldName)
 | 
						|
+                        .currentPlayers(this.serverInterface.getPlayerCount())
 | 
						|
+                        .maxPlayers(this.maxPlayers)
 | 
						|
+                        .port(this.serverPort)
 | 
						|
+                        .hostname(this.hostIp)
 | 
						|
+                        .gameVersion(this.serverInterface.getServerVersion())
 | 
						|
+                        .serverVersion(org.bukkit.Bukkit.getServer().getName() + " on " + org.bukkit.Bukkit.getServer().getBukkitVersion())
 | 
						|
+                        .build();
 | 
						|
+                    com.destroystokyo.paper.event.server.GS4QueryEvent queryEvent =
 | 
						|
+                        new com.destroystokyo.paper.event.server.GS4QueryEvent(queryType, packet.getAddress(), queryResponse);
 | 
						|
+                    queryEvent.callEvent();
 | 
						|
+                    queryResponse = queryEvent.getResponse();
 | 
						|
+
 | 
						|
+                    networkDataOutputStream.writeString(queryResponse.getMotd());
 | 
						|
                     networkDataOutputStream.writeString("SMP");
 | 
						|
-                    networkDataOutputStream.writeString(this.worldName);
 | 
						|
-                    networkDataOutputStream.writeString(Integer.toString(this.serverInterface.getPlayerCount()));
 | 
						|
-                    networkDataOutputStream.writeString(Integer.toString(this.maxPlayers));
 | 
						|
-                    networkDataOutputStream.writeShort((short)this.serverPort);
 | 
						|
-                    networkDataOutputStream.writeString(this.hostIp);
 | 
						|
+                    networkDataOutputStream.writeString(queryResponse.getMap());
 | 
						|
+                    networkDataOutputStream.writeString(Integer.toString(queryResponse.getCurrentPlayers()));
 | 
						|
+                    networkDataOutputStream.writeString(Integer.toString(queryResponse.getMaxPlayers()));
 | 
						|
+                    networkDataOutputStream.writeShort((short) queryResponse.getPort());
 | 
						|
+                    networkDataOutputStream.writeString(queryResponse.getHostname());
 | 
						|
+                    // Paper end
 | 
						|
                     this.sendTo(networkDataOutputStream.toByteArray(), packet);
 | 
						|
                     LOGGER.debug("Status [{}]", (Object)socketAddress);
 | 
						|
                 }
 | 
						|
@@ -0,0 +0,0 @@ public class QueryThreadGs4 extends GenericThread {
 | 
						|
             this.rulesResponse.writeString("splitnum");
 | 
						|
             this.rulesResponse.write(128);
 | 
						|
             this.rulesResponse.write(0);
 | 
						|
+            // Paper start
 | 
						|
+            // Pack plugins
 | 
						|
+            java.util.List<com.destroystokyo.paper.event.server.GS4QueryEvent.QueryResponse.PluginInformation> plugins = java.util.Collections.emptyList();
 | 
						|
+            org.bukkit.plugin.Plugin[] bukkitPlugins;
 | 
						|
+            if (((net.minecraft.server.dedicated.DedicatedServer) this.serverInterface).server.getQueryPlugins() && (bukkitPlugins = org.bukkit.Bukkit.getPluginManager().getPlugins()).length > 0) {
 | 
						|
+                plugins = java.util.stream.Stream.of(bukkitPlugins)
 | 
						|
+                    .map(plugin -> com.destroystokyo.paper.event.server.GS4QueryEvent.QueryResponse.PluginInformation.of(plugin.getName(), plugin.getDescription().getVersion()))
 | 
						|
+                    .collect(java.util.stream.Collectors.toList());
 | 
						|
+            }
 | 
						|
+
 | 
						|
+            com.destroystokyo.paper.event.server.GS4QueryEvent.QueryResponse queryResponse = com.destroystokyo.paper.event.server.GS4QueryEvent.QueryResponse.builder()
 | 
						|
+                .motd(this.serverName)
 | 
						|
+                .map(this.worldName)
 | 
						|
+                .currentPlayers(this.serverInterface.getPlayerCount())
 | 
						|
+                .maxPlayers(this.maxPlayers)
 | 
						|
+                .port(this.serverPort)
 | 
						|
+                .hostname(this.hostIp)
 | 
						|
+                .plugins(plugins)
 | 
						|
+                .players(this.serverInterface.getPlayerNames())
 | 
						|
+                .gameVersion(this.serverInterface.getServerVersion())
 | 
						|
+                .serverVersion(org.bukkit.Bukkit.getServer().getName() + " on " + org.bukkit.Bukkit.getServer().getBukkitVersion())
 | 
						|
+                .build();
 | 
						|
+            com.destroystokyo.paper.event.server.GS4QueryEvent.QueryType queryType =
 | 
						|
+                com.destroystokyo.paper.event.server.GS4QueryEvent.QueryType.FULL;
 | 
						|
+            com.destroystokyo.paper.event.server.GS4QueryEvent queryEvent =
 | 
						|
+                new com.destroystokyo.paper.event.server.GS4QueryEvent(queryType, packet.getAddress(), queryResponse);
 | 
						|
+            queryEvent.callEvent();
 | 
						|
+            queryResponse = queryEvent.getResponse();
 | 
						|
             this.rulesResponse.writeString("hostname");
 | 
						|
-            this.rulesResponse.writeString(this.serverName);
 | 
						|
+            this.rulesResponse.writeString(queryResponse.getMotd());
 | 
						|
             this.rulesResponse.writeString("gametype");
 | 
						|
             this.rulesResponse.writeString("SMP");
 | 
						|
             this.rulesResponse.writeString("game_id");
 | 
						|
             this.rulesResponse.writeString("MINECRAFT");
 | 
						|
             this.rulesResponse.writeString("version");
 | 
						|
-            this.rulesResponse.writeString(this.serverInterface.getServerVersion());
 | 
						|
+            this.rulesResponse.writeString(queryResponse.getGameVersion());
 | 
						|
             this.rulesResponse.writeString("plugins");
 | 
						|
-            this.rulesResponse.writeString(this.serverInterface.getPluginNames());
 | 
						|
+            java.lang.StringBuilder pluginsString = new java.lang.StringBuilder();
 | 
						|
+            pluginsString.append(queryResponse.getServerVersion());
 | 
						|
+            if (!queryResponse.getPlugins().isEmpty()) {
 | 
						|
+                pluginsString.append(": ");
 | 
						|
+                java.util.Iterator<com.destroystokyo.paper.event.server.GS4QueryEvent.QueryResponse.PluginInformation> iter = queryResponse.getPlugins().iterator();
 | 
						|
+                while (iter.hasNext()) {
 | 
						|
+                    com.destroystokyo.paper.event.server.GS4QueryEvent.QueryResponse.PluginInformation info = iter.next();
 | 
						|
+                    pluginsString.append(info.getName());
 | 
						|
+                    if (info.getVersion() != null) {
 | 
						|
+                        pluginsString.append(' ').append(info.getVersion().replace(";", ","));
 | 
						|
+                    }
 | 
						|
+                    if (iter.hasNext()) {
 | 
						|
+                        pluginsString.append(';').append(' ');
 | 
						|
+                    }
 | 
						|
+                }
 | 
						|
+            }
 | 
						|
+            this.rulesResponse.writeString(pluginsString.toString());
 | 
						|
             this.rulesResponse.writeString("map");
 | 
						|
-            this.rulesResponse.writeString(this.worldName);
 | 
						|
+            this.rulesResponse.writeString(queryResponse.getMap());
 | 
						|
             this.rulesResponse.writeString("numplayers");
 | 
						|
-            this.rulesResponse.writeString("" + this.serverInterface.getPlayerCount());
 | 
						|
+            this.rulesResponse.writeString(Integer.toString(queryResponse.getCurrentPlayers()));
 | 
						|
             this.rulesResponse.writeString("maxplayers");
 | 
						|
-            this.rulesResponse.writeString("" + this.maxPlayers);
 | 
						|
+            this.rulesResponse.writeString(Integer.toString(queryResponse.getMaxPlayers()));
 | 
						|
             this.rulesResponse.writeString("hostport");
 | 
						|
-            this.rulesResponse.writeString("" + this.serverPort);
 | 
						|
+            this.rulesResponse.writeString(Integer.toString(queryResponse.getPort()));
 | 
						|
             this.rulesResponse.writeString("hostip");
 | 
						|
-            this.rulesResponse.writeString(this.hostIp);
 | 
						|
+            this.rulesResponse.writeString(queryResponse.getHostname());
 | 
						|
             this.rulesResponse.write(0);
 | 
						|
             this.rulesResponse.write(1);
 | 
						|
             this.rulesResponse.writeString("player_");
 | 
						|
             this.rulesResponse.write(0);
 | 
						|
-            String[] strings = this.serverInterface.getPlayerNames();
 | 
						|
+            String[] strings = queryResponse.getPlayers().toArray(String[]::new);
 | 
						|
 
 | 
						|
             for(String string : strings) {
 | 
						|
                 this.rulesResponse.writeString(string);
 |