blob: cd0630537ceb45e14437a9f12f61bfdffc0aa131 (
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
|
package net.minecraft.server;
import java.net.InetSocketAddress;
// CraftBukkit start
import java.util.Iterator;
import org.bukkit.craftbukkit.util.CraftIconCache;
import org.bukkit.entity.Player;
import net.minecraft.util.com.mojang.authlib.GameProfile;
// CraftBukkit end
import net.minecraft.util.io.netty.util.concurrent.GenericFutureListener;
public class PacketStatusListener implements PacketStatusInListener {
private final MinecraftServer minecraftServer;
private final NetworkManager networkManager;
public PacketStatusListener(MinecraftServer minecraftserver, NetworkManager networkmanager) {
this.minecraftServer = minecraftserver;
this.networkManager = networkmanager;
}
public void a(IChatBaseComponent ichatbasecomponent) {}
public void a(EnumProtocol enumprotocol, EnumProtocol enumprotocol1) {
if (enumprotocol1 != EnumProtocol.STATUS) {
throw new UnsupportedOperationException("Unexpected change in protocol to " + enumprotocol1);
}
}
public void a() {}
public void a(PacketStatusInStart packetstatusinstart) {
// CraftBukkit start - fire ping event
final Object[] players = minecraftServer.getPlayerList().players.toArray();
class ServerListPingEvent extends org.bukkit.event.server.ServerListPingEvent {
CraftIconCache icon = minecraftServer.server.getServerIcon();
ServerListPingEvent() {
super(((InetSocketAddress) networkManager.getSocketAddress()).getAddress(), minecraftServer.getMotd(), minecraftServer.getPlayerList().getMaxPlayers());
}
@Override
public void setServerIcon(org.bukkit.util.CachedServerIcon icon) {
if (!(icon instanceof CraftIconCache)) {
throw new IllegalArgumentException(icon + " was not created by " + org.bukkit.craftbukkit.CraftServer.class);
}
this.icon = (CraftIconCache) 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.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.minecraftServer.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).getProfile());
}
}
ServerPingPlayerSample playerSample = new ServerPingPlayerSample(event.getMaxPlayers(), profiles.size());
playerSample.a(profiles.toArray(new GameProfile[profiles.size()]));
ServerPing ping = new ServerPing();
ping.setFavicon(event.icon.value);
ping.setMOTD(new ChatComponentText(event.getMotd()));
ping.setPlayerSample(playerSample);
ping.setServerInfo(new ServerPingServerData(minecraftServer.getServerModName() + " " + minecraftServer.getVersion(), 5)); // TODO: Update when protocol changes
this.networkManager.handle(new PacketStatusOutServerInfo(ping), new GenericFutureListener[0]);
// CraftBukkit end
}
public void a(PacketStatusInPing packetstatusinping) {
this.networkManager.handle(new PacketStatusOutPong(packetstatusinping.c()), new GenericFutureListener[0]);
}
}
|