mirror of
https://github.com/barkeser2002/CatServer.git
synced 2026-09-25 14:26:00 +03:00
113 lines
5.2 KiB
Diff
113 lines
5.2 KiB
Diff
--- ../src-base/minecraft/net/minecraft/server/network/NetHandlerStatusServer.java
|
|
+++ ../src-work/minecraft/net/minecraft/server/network/NetHandlerStatusServer.java
|
|
@@ -1,6 +1,8 @@
|
|
package net.minecraft.server.network;
|
|
|
|
+import net.minecraft.entity.player.EntityPlayer;
|
|
import net.minecraft.network.NetworkManager;
|
|
+import net.minecraft.network.ServerStatusResponse;
|
|
import net.minecraft.network.status.INetHandlerStatusServer;
|
|
import net.minecraft.network.status.client.CPacketPing;
|
|
import net.minecraft.network.status.client.CPacketServerQuery;
|
|
@@ -10,6 +12,12 @@
|
|
import net.minecraft.util.text.ITextComponent;
|
|
import net.minecraft.util.text.TextComponentString;
|
|
|
|
+import java.util.Iterator;
|
|
+
|
|
+import org.bukkit.entity.Player;
|
|
+
|
|
+import com.mojang.authlib.GameProfile;
|
|
+
|
|
public class NetHandlerStatusServer implements INetHandlerStatusServer
|
|
{
|
|
private static final ITextComponent EXIT_MESSAGE = new TextComponentString("Status request has been handled.");
|
|
@@ -36,6 +44,87 @@
|
|
else
|
|
{
|
|
this.handled = true;
|
|
+
|
|
+ final ServerStatusResponse response = server.getServerStatusResponse();
|
|
+ final Object[] players = server.getPlayerList().getPlayerList().toArray();
|
|
+ class ServerListPingEvent extends org.bukkit.event.server.ServerListPingEvent {
|
|
+ ServerListPingEvent() {
|
|
+ super(((java.net.InetSocketAddress) networkManager.getRemoteAddress()).getAddress(), response.getServerDescription().getUnformattedText(), response.getPlayers().getOnlinePlayerCount(), response.getPlayers().getMaxPlayers());
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setServerIcon(org.bukkit.util.CachedServerIcon icon) {}
|
|
+
|
|
+ @Override
|
|
+ public Iterator<Player> iterator() throws UnsupportedOperationException {
|
|
+ return new Iterator<Player>() {
|
|
+ int i;
|
|
+ int ret = Integer.MIN_VALUE;
|
|
+ EntityPlayer player;
|
|
+
|
|
+ @Override
|
|
+ public boolean hasNext() {
|
|
+ if (player != null) {
|
|
+ return true;
|
|
+ }
|
|
+ final Object[] currentPlayers = players;
|
|
+ for (int length = currentPlayers.length, i = this.i; i < length; i++) {
|
|
+ final EntityPlayer player = (EntityPlayer) currentPlayers[i];
|
|
+ if (player != null) {
|
|
+ this.i = i + 1;
|
|
+ this.player = player;
|
|
+ return true;
|
|
+ }
|
|
+ }
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public Player next() {
|
|
+ if (!hasNext()) {
|
|
+ throw new java.util.NoSuchElementException();
|
|
+ }
|
|
+ final EntityPlayer player = this.player;
|
|
+ this.player = null;
|
|
+ this.ret = this.i - 1;
|
|
+ return (Player) player.getBukkitEntity();
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void remove() {
|
|
+ final Object[] currentPlayers = players;
|
|
+ final int i = this.ret;
|
|
+ if (i < 0 || currentPlayers[i] == null) {
|
|
+ throw new IllegalStateException();
|
|
+ }
|
|
+ currentPlayers[i] = null;
|
|
+ }
|
|
+ };
|
|
+ }
|
|
+ }
|
|
+
|
|
+ ServerListPingEvent event = new ServerListPingEvent();
|
|
+ this.server.server.getPluginManager().callEvent(event);
|
|
+
|
|
+ java.util.List<GameProfile> profiles = new java.util.ArrayList<GameProfile>(players.length);
|
|
+ for (Object player : players) {
|
|
+ if (player != null) {
|
|
+ profiles.add(((EntityPlayer) player).getGameProfile());
|
|
+ }
|
|
+ }
|
|
+
|
|
+ ServerStatusResponse.Players playerSample = new ServerStatusResponse.Players(event.getMaxPlayers(), profiles.size());
|
|
+ // Spigot Start
|
|
+ if (!profiles.isEmpty())
|
|
+ {
|
|
+ java.util.Collections.shuffle(profiles); // This sucks, its inefficient but we have no simple way of doing it differently
|
|
+ profiles = profiles.subList(0, Math.min( profiles.size(), org.spigotmc.SpigotConfig.playerSample)); // Cap the sample to n (or less) displayed players, ie: Vanilla behaviour
|
|
+ }
|
|
+ // Spigot End
|
|
+
|
|
+ response.setServerDescription(new TextComponentString(event.getMotd()));
|
|
+ response.setPlayers(playerSample);
|
|
+
|
|
this.networkManager.sendPacket(new SPacketServerInfo(this.server.getServerStatusResponse()));
|
|
}
|
|
}
|