From 8832052c84a686e75a526a2c1538c248601f6fa7 Mon Sep 17 00:00:00 2001 From: md_5 Date: Sun, 26 Jan 2014 12:14:05 +1100 Subject: [PATCH] Fix Ping Player Sample to bring it back in line with Vanilla behaviour. The behaviour which Bukkit introduced recently is broken on larger servers as it introduces too many players to the list. --- .../0102-Fix-Ping-Player-Sample.patch | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 CraftBukkit-Patches/0102-Fix-Ping-Player-Sample.patch diff --git a/CraftBukkit-Patches/0102-Fix-Ping-Player-Sample.patch b/CraftBukkit-Patches/0102-Fix-Ping-Player-Sample.patch new file mode 100644 index 0000000..2d2ea9d --- /dev/null +++ b/CraftBukkit-Patches/0102-Fix-Ping-Player-Sample.patch @@ -0,0 +1,61 @@ +From d8be3082b4cc82d525e1152efc58bced681890b1 Mon Sep 17 00:00:00 2001 +From: md_5 +Date: Sun, 26 Jan 2014 12:13:31 +1100 +Subject: [PATCH] Fix Ping Player Sample + + +diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java +index a549a95..e967d17 100644 +--- a/src/main/java/net/minecraft/server/MinecraftServer.java ++++ b/src/main/java/net/minecraft/server/MinecraftServer.java +@@ -105,6 +105,7 @@ public abstract class MinecraftServer implements ICommandListener, Runnable, IMo + private static final int TPS = 20; + private static final int TICK_TIME = 1000000000 / TPS; + public final double[] recentTps = new double[ 3 ]; ++ public EntityPlayer[] pingPlayers; + // Spigot end + + public MinecraftServer(OptionSet options, Proxy proxy) { // CraftBukkit - signature file -> OptionSet +@@ -560,15 +561,23 @@ public abstract class MinecraftServer implements ICommandListener, Runnable, IMo + if (i - this.T >= 5000000000L) { + this.T = i; + this.p.setPlayerSample(new ServerPingPlayerSample(this.C(), this.B())); +- GameProfile[] agameprofile = new GameProfile[Math.min(this.B(), 12)]; ++ EntityPlayer[] agameprofile = new EntityPlayer[Math.min(this.B(), 12)]; // Spigot + int j = MathHelper.nextInt(this.q, 0, this.B() - agameprofile.length); + + for (int k = 0; k < agameprofile.length; ++k) { +- agameprofile[k] = ((EntityPlayer) this.t.players.get(j + k)).getProfile(); ++ agameprofile[k] = ((EntityPlayer) this.t.players.get(j + k)); // Spigot + } + + Collections.shuffle(Arrays.asList(agameprofile)); +- this.p.b().a(agameprofile); ++ // Spigot Start ++ GameProfile[] profiles = new GameProfile[ agameprofile.length ]; ++ for ( int l = 0; l < profiles.length; l++ ) ++ { ++ profiles[l] = agameprofile[l].getProfile(); ++ } ++ this.p.b().a( profiles ); ++ this.pingPlayers = agameprofile; ++ // Spigot End + } + + if ((this.autosavePeriod > 0) && ((this.ticks % this.autosavePeriod) == 0)) { // CraftBukkit +diff --git a/src/main/java/net/minecraft/server/PacketStatusListener.java b/src/main/java/net/minecraft/server/PacketStatusListener.java +index 7903c43..8203fbd 100644 +--- a/src/main/java/net/minecraft/server/PacketStatusListener.java ++++ b/src/main/java/net/minecraft/server/PacketStatusListener.java +@@ -35,7 +35,7 @@ public class PacketStatusListener implements PacketStatusInListener { + + public void a(PacketStatusInStart packetstatusinstart) { + // CraftBukkit start - fire ping event +- final Object[] players = minecraftServer.getPlayerList().players.toArray(); ++ final Object[] players = minecraftServer.pingPlayers; + class ServerListPingEvent extends org.bukkit.event.server.ServerListPingEvent { + CraftIconCache icon = minecraftServer.server.getServerIcon(); + +-- +1.8.3.2 +