aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0289-Fire-event-on-GS4-query.patch
blob: 70ee09cecbcadc1205adf9323958ee60e62d78e4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
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/thread/QueryThreadGs4.java b/src/main/java/net/minecraft/server/rcon/thread/QueryThreadGs4.java
index 88917d7a179739fc13c59831b15e7ddc711bed1b..1ef089dbf83de35d875c00efdf468c397be56978 100644
--- a/src/main/java/net/minecraft/server/rcon/thread/QueryThreadGs4.java
+++ b/src/main/java/net/minecraft/server/rcon/thread/QueryThreadGs4.java
@@ -106,13 +106,32 @@ 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);
                     }
@@ -147,31 +166,75 @@ 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);