ab347c4c96
Upstream has released updates that appears to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 42d5a714 SPIGOT-5899: Hoglins API similar to Piglins 2c1ee10e SPIGOT-5887: ClickType doesn't include off hand swaps 5ff7c7ce SPIGOT-5886: Missing BlockData CraftBukkit Changes: 7560f5f5 SPIGOT-5905: Fix hex colours not being allowed in MOTD d47c47ee SPIGOT-5889: Villager using composter should call EntityChangeBlockEvent 2fe6b4a3 SPIGOT-5899: Hoglins API similar to Piglins e09dbeca SPIGOT-5887: ClickType doesn't include off hand swaps 23aac2a5 SPIGOT-5903: EntityDismountEvent cannot be triggered asynchronously 92cbf656 SPIGOT-5884: Tab completions lost on reloadData / minecraft:reload fb4e54ad SPIGOT-5902: PlayerRespawnEvent places player at spawn before event is called aa8f3d5a SPIGOT-5901: Structures are generated in all worlds based on the setting for the main world a0c35937 SPIGOT-5895: PlayerChangedWorldEvent#getFrom is incorrect 89c0a5c3 SPIGOT-5886: Missing BlockData Spigot Changes: 0287a20d SPIGOT-5903: EntityDismountEvent cannot be triggered asynchronously
262 lines
11 KiB
Diff
262 lines
11 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Minecrell <minecrell@minecrell.net>
|
|
Date: Wed, 11 Oct 2017 15:56:26 +0200
|
|
Subject: [PATCH] Implement extended PaperServerListPingEvent
|
|
|
|
|
|
diff --git a/src/main/java/com/destroystokyo/paper/network/PaperServerListPingEventImpl.java b/src/main/java/com/destroystokyo/paper/network/PaperServerListPingEventImpl.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..c1a8e295b66501e0580bcfc041bca51e69109062
|
|
--- /dev/null
|
|
+++ b/src/main/java/com/destroystokyo/paper/network/PaperServerListPingEventImpl.java
|
|
@@ -0,0 +1,31 @@
|
|
+package com.destroystokyo.paper.network;
|
|
+
|
|
+import com.destroystokyo.paper.event.server.PaperServerListPingEvent;
|
|
+import net.minecraft.server.EntityPlayer;
|
|
+import net.minecraft.server.MinecraftServer;
|
|
+import org.bukkit.entity.Player;
|
|
+import org.bukkit.util.CachedServerIcon;
|
|
+
|
|
+import javax.annotation.Nullable;
|
|
+
|
|
+class PaperServerListPingEventImpl extends PaperServerListPingEvent {
|
|
+
|
|
+ private final MinecraftServer server;
|
|
+
|
|
+ PaperServerListPingEventImpl(MinecraftServer server, StatusClient client, int protocolVersion, @Nullable CachedServerIcon icon) {
|
|
+ super(client, server.getMotd(), server.getPlayerCount(), server.getMaxPlayers(),
|
|
+ server.getServerModName() + ' ' + server.getVersion(), protocolVersion, icon);
|
|
+ this.server = server;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ protected final Object[] getOnlinePlayers() {
|
|
+ return this.server.getPlayerList().players.toArray();
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ protected final Player getBukkitPlayer(Object player) {
|
|
+ return ((EntityPlayer) player).getBukkitEntity();
|
|
+ }
|
|
+
|
|
+}
|
|
diff --git a/src/main/java/com/destroystokyo/paper/network/PaperStatusClient.java b/src/main/java/com/destroystokyo/paper/network/PaperStatusClient.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..a2a409e635dde08f7c53e67164b967a000511e94
|
|
--- /dev/null
|
|
+++ b/src/main/java/com/destroystokyo/paper/network/PaperStatusClient.java
|
|
@@ -0,0 +1,11 @@
|
|
+package com.destroystokyo.paper.network;
|
|
+
|
|
+import net.minecraft.server.NetworkManager;
|
|
+
|
|
+class PaperStatusClient extends PaperNetworkClient implements StatusClient {
|
|
+
|
|
+ PaperStatusClient(NetworkManager networkManager) {
|
|
+ super(networkManager);
|
|
+ }
|
|
+
|
|
+}
|
|
diff --git a/src/main/java/com/destroystokyo/paper/network/StandardPaperServerListPingEventImpl.java b/src/main/java/com/destroystokyo/paper/network/StandardPaperServerListPingEventImpl.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..a85466bc7e0a8aa54b9eff14077fe6c992ae2902
|
|
--- /dev/null
|
|
+++ b/src/main/java/com/destroystokyo/paper/network/StandardPaperServerListPingEventImpl.java
|
|
@@ -0,0 +1,112 @@
|
|
+package com.destroystokyo.paper.network;
|
|
+
|
|
+import com.destroystokyo.paper.profile.CraftPlayerProfile;
|
|
+import com.destroystokyo.paper.profile.PlayerProfile;
|
|
+import com.google.common.base.MoreObjects;
|
|
+import com.google.common.base.Strings;
|
|
+import com.mojang.authlib.GameProfile;
|
|
+import net.minecraft.server.ChatComponentText;
|
|
+import net.minecraft.server.MinecraftServer;
|
|
+import net.minecraft.server.NetworkManager;
|
|
+import net.minecraft.server.PacketStatusOutServerInfo;
|
|
+import net.minecraft.server.ServerPing;
|
|
+
|
|
+import java.util.List;
|
|
+import java.util.UUID;
|
|
+
|
|
+import javax.annotation.Nonnull;
|
|
+
|
|
+public final class StandardPaperServerListPingEventImpl extends PaperServerListPingEventImpl {
|
|
+
|
|
+ private static final GameProfile[] EMPTY_PROFILES = new GameProfile[0];
|
|
+ private static final UUID FAKE_UUID = new UUID(0, 0);
|
|
+
|
|
+ private GameProfile[] originalSample;
|
|
+
|
|
+ private StandardPaperServerListPingEventImpl(MinecraftServer server, NetworkManager networkManager, ServerPing ping) {
|
|
+ super(server, new PaperStatusClient(networkManager), ping.getServerData() != null ? ping.getServerData().getProtocolVersion() : -1, server.server.getServerIcon());
|
|
+ this.originalSample = ping.getPlayers() == null ? null : ping.getPlayers().getSample(); // GH-1473 - pre-tick race condition NPE
|
|
+ }
|
|
+
|
|
+ @Nonnull
|
|
+ @Override
|
|
+ public List<PlayerProfile> getPlayerSample() {
|
|
+ List<PlayerProfile> sample = super.getPlayerSample();
|
|
+
|
|
+ if (this.originalSample != null) {
|
|
+ for (GameProfile profile : this.originalSample) {
|
|
+ sample.add(CraftPlayerProfile.asBukkitCopy(profile));
|
|
+ }
|
|
+ this.originalSample = null;
|
|
+ }
|
|
+
|
|
+ return sample;
|
|
+ }
|
|
+
|
|
+ private GameProfile[] getPlayerSampleHandle() {
|
|
+ if (this.originalSample != null) {
|
|
+ return this.originalSample;
|
|
+ }
|
|
+
|
|
+ List<PlayerProfile> entries = super.getPlayerSample();
|
|
+ if (entries.isEmpty()) {
|
|
+ return EMPTY_PROFILES;
|
|
+ }
|
|
+
|
|
+ GameProfile[] profiles = new GameProfile[entries.size()];
|
|
+ for (int i = 0; i < profiles.length; i++) {
|
|
+ /*
|
|
+ * Avoid null UUIDs/names since that will make the response invalid
|
|
+ * on the client.
|
|
+ * Instead, fall back to a fake/empty UUID and an empty string as name.
|
|
+ * This can be used to create custom lines in the player list that do not
|
|
+ * refer to a specific player.
|
|
+ */
|
|
+
|
|
+ PlayerProfile profile = entries.get(i);
|
|
+ if (profile.getId() != null && profile.getName() != null) {
|
|
+ profiles[i] = CraftPlayerProfile.asAuthlib(profile);
|
|
+ } else {
|
|
+ profiles[i] = new GameProfile(MoreObjects.firstNonNull(profile.getId(), FAKE_UUID), Strings.nullToEmpty(profile.getName()));
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return profiles;
|
|
+ }
|
|
+
|
|
+ @SuppressWarnings("deprecation")
|
|
+ public static void processRequest(MinecraftServer server, NetworkManager networkManager) {
|
|
+ StandardPaperServerListPingEventImpl event = new StandardPaperServerListPingEventImpl(server, networkManager, server.getServerPing());
|
|
+ server.server.getPluginManager().callEvent(event);
|
|
+
|
|
+ // Close connection immediately if event is cancelled
|
|
+ if (event.isCancelled()) {
|
|
+ networkManager.close(null);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ // Setup response
|
|
+ ServerPing ping = new ServerPing();
|
|
+
|
|
+ // Description
|
|
+ ping.setMOTD(new ChatComponentText(event.getMotd()));
|
|
+
|
|
+ // Players
|
|
+ if (!event.shouldHidePlayers()) {
|
|
+ ping.setPlayerSample(new ServerPing.ServerPingPlayerSample(event.getMaxPlayers(), event.getNumPlayers()));
|
|
+ ping.getPlayers().setSample(event.getPlayerSampleHandle());
|
|
+ }
|
|
+
|
|
+ // Version
|
|
+ ping.setServerInfo(new ServerPing.ServerData(event.getVersion(), event.getProtocolVersion()));
|
|
+
|
|
+ // Favicon
|
|
+ if (event.getServerIcon() != null) {
|
|
+ ping.setFavicon(event.getServerIcon().getData());
|
|
+ }
|
|
+
|
|
+ // Send response
|
|
+ networkManager.sendPacket(new PacketStatusOutServerInfo(ping));
|
|
+ }
|
|
+
|
|
+}
|
|
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
index 5a5fc0626562d46f1ea6ce3e779e75de55611548..1698b42ed56a2932c5c1d60c655c9fd4cf5bed66 100644
|
|
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
@@ -2,6 +2,9 @@ package net.minecraft.server;
|
|
|
|
import com.google.common.base.Splitter;
|
|
import com.google.common.collect.ImmutableList;
|
|
+import co.aikar.timings.Timings;
|
|
+import com.destroystokyo.paper.event.server.PaperServerListPingEvent;
|
|
+import com.google.common.base.Stopwatch;
|
|
import com.google.common.collect.Lists;
|
|
import com.google.common.collect.Maps;
|
|
import com.google.common.collect.Sets;
|
|
@@ -1120,7 +1123,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
|
|
if (i - this.T >= 5000000000L) {
|
|
this.T = i;
|
|
this.serverPing.setPlayerSample(new ServerPing.ServerPingPlayerSample(this.getMaxPlayers(), this.getPlayerCount()));
|
|
- GameProfile[] agameprofile = new GameProfile[Math.min(this.getPlayerCount(), 12)];
|
|
+ GameProfile[] agameprofile = new GameProfile[Math.min(this.getPlayerCount(), org.spigotmc.SpigotConfig.playerSample)]; // Paper
|
|
int j = MathHelper.nextInt(this.r, 0, this.getPlayerCount() - agameprofile.length);
|
|
|
|
for (int k = 0; k < agameprofile.length; ++k) {
|
|
diff --git a/src/main/java/net/minecraft/server/PacketStatusListener.java b/src/main/java/net/minecraft/server/PacketStatusListener.java
|
|
index d38de25d71ba1eb405e34ba2b04a2cfbccd637cc..ee18dc3fa2d0beeccbe1539573cce433f87566b8 100644
|
|
--- a/src/main/java/net/minecraft/server/PacketStatusListener.java
|
|
+++ b/src/main/java/net/minecraft/server/PacketStatusListener.java
|
|
@@ -35,6 +35,8 @@ public class PacketStatusListener implements PacketStatusInListener {
|
|
this.networkManager.close(PacketStatusListener.a);
|
|
} else {
|
|
this.d = true;
|
|
+ // Paper start - Replace everything
|
|
+ /*
|
|
// CraftBukkit start
|
|
// this.networkManager.sendPacket(new PacketStatusOutServerInfo(this.minecraftServer.getServerPing()));
|
|
final Object[] players = minecraftServer.getPlayerList().players.toArray();
|
|
@@ -130,6 +132,9 @@ public class PacketStatusListener implements PacketStatusInListener {
|
|
ping.setServerInfo(new ServerPing.ServerData(minecraftServer.getServerModName() + " " + minecraftServer.getVersion(), version));
|
|
|
|
this.networkManager.sendPacket(new PacketStatusOutServerInfo(ping));
|
|
+ */
|
|
+ com.destroystokyo.paper.network.StandardPaperServerListPingEventImpl.processRequest(this.minecraftServer, this.networkManager);
|
|
+ // Paper end
|
|
}
|
|
// CraftBukkit end
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/ServerPing.java b/src/main/java/net/minecraft/server/ServerPing.java
|
|
index aa125a52dcdf4f137cfe17c5dc808b17d5e9de0b..ea52e89bd965afbd74f15b0e2974657319c28e4a 100644
|
|
--- a/src/main/java/net/minecraft/server/ServerPing.java
|
|
+++ b/src/main/java/net/minecraft/server/ServerPing.java
|
|
@@ -29,6 +29,7 @@ public class ServerPing {
|
|
this.a = ichatbasecomponent;
|
|
}
|
|
|
|
+ public ServerPingPlayerSample getPlayers() { return b(); } // Paper - OBFHELPER
|
|
public ServerPing.ServerPingPlayerSample b() {
|
|
return this.b;
|
|
}
|
|
@@ -160,10 +161,12 @@ public class ServerPing {
|
|
return this.b;
|
|
}
|
|
|
|
+ public GameProfile[] getSample() { return c(); } // Paper - OBFHELPER
|
|
public GameProfile[] c() {
|
|
return this.c;
|
|
}
|
|
|
|
+ public void setSample(GameProfile[] sample) { a(sample); } // Paper - OBFHELPER
|
|
public void a(GameProfile[] agameprofile) {
|
|
this.c = agameprofile;
|
|
}
|
|
diff --git a/src/main/java/org/spigotmc/SpigotConfig.java b/src/main/java/org/spigotmc/SpigotConfig.java
|
|
index 6d77bbc5aa98ec7c3977b1d36b13c96cc6582e01..1cf214eaca80feae283f6524605976022f856116 100644
|
|
--- a/src/main/java/org/spigotmc/SpigotConfig.java
|
|
+++ b/src/main/java/org/spigotmc/SpigotConfig.java
|
|
@@ -285,7 +285,7 @@ public class SpigotConfig
|
|
public static int playerSample;
|
|
private static void playerSample()
|
|
{
|
|
- playerSample = getInt( "settings.sample-count", 12 );
|
|
+ playerSample = Math.max( getInt( "settings.sample-count", 12 ), 0 ); // Paper - Avoid negative counts
|
|
Bukkit.getLogger().log( Level.INFO, "Server Ping Player Sample Count: {0}", playerSample ); // Paper - Use logger
|
|
}
|
|
|