Skip to content

Commit 035182f

Browse files
md-5khobbits
authored andcommitted
Optimize player / user iteration.
* Add a method for backwards compatability with unmapped code. * Convert all getOnlinePlayers() calls to use this method, part of the IEssentials interface * Add a new method getOnlineUsers() Ljava/lang/Iterable; * Convert appropriate calls to use this method * Update Bukkit to #1945 * Update CraftBukkit to #3103
1 parent 310e413 commit 035182f

25 files changed

+126
-63
lines changed

Essentials/src/com/earth2me/essentials/Backup.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public Backup(final IEssentials ess)
2424
{
2525
this.ess = ess;
2626
server = ess.getServer();
27-
if (server.getOnlinePlayers().length > 0)
27+
if (!ess.getOnlinePlayers().isEmpty())
2828
{
2929
ess.runTaskAsynchronously(new Runnable()
3030
{
@@ -152,7 +152,7 @@ class BackupEnableSaveTask implements Runnable
152152
public void run()
153153
{
154154
server.dispatchCommand(cs, "save-on");
155-
if (server.getOnlinePlayers().length == 0)
155+
if (ess.getOnlinePlayers().isEmpty())
156156
{
157157
stopTask();
158158
}

Essentials/src/com/earth2me/essentials/Essentials.java

+57-2
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,17 @@
3535
import com.earth2me.essentials.textreader.KeywordReplacer;
3636
import com.earth2me.essentials.textreader.SimpleTextInput;
3737
import com.earth2me.essentials.utils.DateUtil;
38+
import com.google.common.base.Function;
39+
import com.google.common.base.Throwables;
40+
import com.google.common.collect.Iterables;
3841
import java.io.File;
3942
import java.io.FileReader;
4043
import java.io.IOException;
44+
import java.lang.reflect.InvocationTargetException;
45+
import java.lang.reflect.Method;
4146
import java.util.ArrayList;
47+
import java.util.Arrays;
48+
import java.util.Collection;
4249
import java.util.List;
4350
import java.util.UUID;
4451
import java.util.logging.Level;
@@ -100,6 +107,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials
100107
private transient Metrics metrics;
101108
private transient EssentialsTimer timer;
102109
private final transient List<String> vanishedPlayers = new ArrayList<String>();
110+
private transient Method oldGetOnlinePlayers;
103111

104112
public Essentials()
105113
{
@@ -181,6 +189,16 @@ public void onEnable()
181189
LOGGER.log(Level.INFO, getServer().getBukkitVersion());
182190
}
183191
execTimer.mark("BukkitCheck");
192+
193+
for (Method method : Server.class.getDeclaredMethods())
194+
{
195+
if (method.getName().endsWith("getOnlinePlayers") && method.getReturnType() == Player[].class)
196+
{
197+
oldGetOnlinePlayers = method;
198+
break;
199+
}
200+
}
201+
184202
try
185203
{
186204
final EssentialsUpgrade upgrade = new EssentialsUpgrade(this);
@@ -784,7 +802,7 @@ private int broadcastMessage(final IUser sender, final String permission, final
784802

785803
IText broadcast = new SimpleTextInput(message);
786804

787-
final Player[] players = getServer().getOnlinePlayers();
805+
final Collection<Player> players = getOnlinePlayers();
788806

789807
for (Player player : players)
790808
{
@@ -803,7 +821,7 @@ private int broadcastMessage(final IUser sender, final String permission, final
803821
}
804822
}
805823

806-
return players.length;
824+
return players.size();
807825
}
808826

809827
@Override
@@ -890,6 +908,43 @@ public List<String> getVanishedPlayers()
890908
return vanishedPlayers;
891909
}
892910

911+
@Override
912+
public Collection<Player> getOnlinePlayers()
913+
{
914+
try
915+
{
916+
return (Collection<Player>)getServer().getOnlinePlayers(); // Needed for sanity here, the Bukkit API is a bit broken in the sense it only allows subclasses of Player to this list
917+
}
918+
catch (NoSuchMethodError ex)
919+
{
920+
try
921+
{
922+
return Arrays.asList((Player[])oldGetOnlinePlayers.invoke(getServer()));
923+
}
924+
catch (InvocationTargetException ex1)
925+
{
926+
throw Throwables.propagate(ex.getCause());
927+
}
928+
catch (IllegalAccessException ex1)
929+
{
930+
throw new RuntimeException("Error invoking oldGetOnlinePlayers", ex1);
931+
}
932+
}
933+
}
934+
935+
@Override
936+
public Iterable<User> getOnlineUsers()
937+
{
938+
return Iterables.transform(getOnlinePlayers(), new Function<Player, User>()
939+
{
940+
941+
@Override
942+
public User apply(Player player)
943+
{
944+
return getUser(player);
945+
}
946+
});
947+
}
893948

894949
private static class EssentialsWorldListener implements Listener, Runnable
895950
{

Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -435,10 +435,9 @@ public void onPlayerCommandPreprocess(final PlayerCommandPreprocessEvent event)
435435
final String cmd = event.getMessage().toLowerCase(Locale.ENGLISH).split(" ")[0].replace("/", "").toLowerCase(Locale.ENGLISH);
436436
if (ess.getSettings().getSocialSpyCommands().contains(cmd) || ess.getSettings().getSocialSpyCommands().contains("*"))
437437
{
438-
for (Player onlinePlayer : ess.getServer().getOnlinePlayers())
438+
for (User spyer : ess.getOnlineUsers())
439439
{
440-
final User spyer = ess.getUser(onlinePlayer);
441-
if (spyer.isSocialSpyEnabled() && !player.equals(onlinePlayer))
440+
if (spyer.isSocialSpyEnabled() && !player.equals(spyer.getBase()))
442441
{
443442
spyer.sendMessage(player.getDisplayName() + " : " + event.getMessage());
444443
}

Essentials/src/com/earth2me/essentials/EssentialsTimer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public void run()
4848
}
4949
lastPoll = startTime;
5050
int count = 0;
51-
for (Player player : ess.getServer().getOnlinePlayers())
51+
for (Player player : ess.getOnlinePlayers())
5252
{
5353
count++;
5454
if (skip1 > 0)

Essentials/src/com/earth2me/essentials/IEssentials.java

+5
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.earth2me.essentials.metrics.Metrics;
77
import com.earth2me.essentials.perm.PermissionsHandler;
88
import com.earth2me.essentials.register.payment.Methods;
9+
import java.util.Collection;
910
import java.util.List;
1011
import java.util.UUID;
1112
import org.bukkit.World;
@@ -91,4 +92,8 @@ public interface IEssentials extends Plugin
9192
EssentialsTimer getTimer();
9293

9394
List<String> getVanishedPlayers();
95+
96+
Collection<Player> getOnlinePlayers();
97+
98+
Iterable<User> getOnlineUsers();
9499
}

Essentials/src/com/earth2me/essentials/PlayerList.java

+7-8
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,12 @@ public static String listSummary(final IEssentials ess, final User user, final b
4949
Server server = ess.getServer();
5050
int playerHidden = 0;
5151
int hiddenCount = 0;
52-
for (Player onlinePlayer : server.getOnlinePlayers())
52+
for (User onlinePlayer : ess.getOnlineUsers())
5353
{
54-
if (ess.getUser(onlinePlayer).isHidden() || (user != null && !user.getBase().canSee(onlinePlayer)))
54+
if (onlinePlayer.isHidden() || (user != null && !user.getBase().canSee(onlinePlayer.getBase())))
5555
{
5656
playerHidden++;
57-
if (showHidden || user.getBase().canSee(onlinePlayer))
57+
if (showHidden || user.getBase().canSee(onlinePlayer.getBase()))
5858
{
5959
hiddenCount++;
6060
}
@@ -63,11 +63,11 @@ public static String listSummary(final IEssentials ess, final User user, final b
6363
String online;
6464
if (hiddenCount > 0)
6565
{
66-
online = tl("listAmountHidden", server.getOnlinePlayers().length - playerHidden, hiddenCount, server.getMaxPlayers());
66+
online = tl("listAmountHidden", ess.getOnlinePlayers().size() - playerHidden, hiddenCount, server.getMaxPlayers());
6767
}
6868
else
6969
{
70-
online = tl("listAmount", server.getOnlinePlayers().length - playerHidden, server.getMaxPlayers());
70+
online = tl("listAmount", ess.getOnlinePlayers().size() - playerHidden, server.getMaxPlayers());
7171
}
7272
return online;
7373
}
@@ -77,11 +77,10 @@ public static Map<String, List<User>> getPlayerLists(final IEssentials ess, fina
7777
{
7878
Server server = ess.getServer();
7979
final Map<String, List<User>> playerList = new HashMap<String, List<User>>();
80-
for (Player onlinePlayer : server.getOnlinePlayers())
80+
for (User onlineUser : ess.getOnlineUsers())
8181
{
82-
final User onlineUser = ess.getUser(onlinePlayer);
8382
if ((sender == null && !showHidden && onlineUser.isHidden()) ||
84-
(sender != null && !showHidden && !sender.getBase().canSee(onlinePlayer)))
83+
(sender != null && !showHidden && !sender.getBase().canSee(onlineUser.getBase())))
8584
{
8685
continue;
8786
}

Essentials/src/com/earth2me/essentials/User.java

+4-5
Original file line numberDiff line numberDiff line change
@@ -623,9 +623,8 @@ public void checkActivity()
623623
this.getBase().kickPlayer(kickReason);
624624

625625

626-
for (Player player : ess.getServer().getOnlinePlayers())
626+
for (User user : ess.getOnlineUsers())
627627
{
628-
final User user = ess.getUser(player);
629628
if (user.isAuthorized("essentials.kick.notify"))
630629
{
631630
user.sendMessage(tl("playerKicked", Console.NAME, getName(), kickReason));
@@ -765,11 +764,11 @@ public void setVanished(final boolean set)
765764
vanished = set;
766765
if (set)
767766
{
768-
for (Player p : ess.getServer().getOnlinePlayers())
767+
for (User user : ess.getOnlineUsers())
769768
{
770-
if (!ess.getUser(p).isAuthorized("essentials.vanish.see"))
769+
if (!user.isAuthorized("essentials.vanish.see"))
771770
{
772-
p.hidePlayer(getBase());
771+
user.getBase().hidePlayer(getBase());
773772
}
774773
}
775774
setHidden(true);

Essentials/src/com/earth2me/essentials/commands/Commandclearinventory.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55
import com.earth2me.essentials.User;
66
import com.earth2me.essentials.utils.NumberUtil;
77
import java.util.ArrayList;
8-
import java.util.Arrays;
9-
import java.util.List;
8+
import java.util.Collection;
109
import java.util.Locale;
1110
import org.bukkit.Server;
1211
import org.bukkit.entity.Player;
@@ -36,7 +35,7 @@ protected void run(Server server, CommandSource sender, String commandLabel, Str
3635

3736
private void parseCommand(Server server, CommandSource sender, String[] args, boolean allowOthers, boolean allowAll) throws Exception
3837
{
39-
List<Player> players = new ArrayList<Player>();
38+
Collection<Player> players = new ArrayList<Player>();
4039
int offset = 0;
4140

4241
if (sender.isPlayer())
@@ -48,7 +47,7 @@ private void parseCommand(Server server, CommandSource sender, String[] args, bo
4847
{
4948
sender.sendMessage(tl("inventoryClearingFromAll"));
5049
offset = 1;
51-
players = Arrays.asList(server.getOnlinePlayers());
50+
players = ess.getOnlinePlayers();
5251
}
5352
else if (allowOthers && args.length > 0 && args[0].trim().length() > 2)
5453
{

Essentials/src/com/earth2me/essentials/commands/Commandessentials.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ public void run()
165165
{
166166
return;
167167
}
168-
for (Player onlinePlayer : server.getOnlinePlayers())
168+
for (Player onlinePlayer : ess.getOnlinePlayers())
169169
{
170170
onlinePlayer.playSound(onlinePlayer.getLocation(), Sound.NOTE_PIANO, 1, noteMap.get(note));
171171
}
@@ -214,7 +214,7 @@ private void run_moo(final Server server, final CommandSource sender, final Stri
214214
{
215215
logger.info(s);
216216
}
217-
for (Player player : ess.getServer().getOnlinePlayers())
217+
for (Player player : ess.getOnlinePlayers())
218218
{
219219
player.sendMessage(playerMoo);
220220
player.playSound(player.getLocation(), Sound.COW_IDLE, 1, 1.0f);
@@ -348,7 +348,7 @@ private void run_uuidtest(final Server server, final CommandSource sender, final
348348

349349
UUID onlineUUID = null;
350350

351-
for (Player player : server.getOnlinePlayers())
351+
for (Player player : ess.getOnlinePlayers())
352352
{
353353
if (player.getName().equalsIgnoreCase(name))
354354
{

Essentials/src/com/earth2me/essentials/commands/Commandkickall.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public void run(final Server server, final CommandSource sender, final String co
2020
String kickReason = args.length > 0 ? getFinalArg(args, 0) : tl("kickDefault");
2121
kickReason = FormatUtil.replaceFormat(kickReason.replace("\\n", "\n").replace("|", "\n"));
2222

23-
for (Player onlinePlayer : server.getOnlinePlayers())
23+
for (Player onlinePlayer : ess.getOnlinePlayers())
2424
{
2525
if (!sender.isPlayer() || !onlinePlayer.getName().equalsIgnoreCase(sender.getPlayer().getName()))
2626
{

Essentials/src/com/earth2me/essentials/commands/Commandnick.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ else if (FormatUtil.stripFormat(newNick).length() < 1)
109109
private boolean nickInUse(final Server server, final User target, String nick)
110110
{
111111
final String lowerNick = FormatUtil.stripFormat(nick.toLowerCase(Locale.ENGLISH));
112-
for (final Player onlinePlayer : server.getOnlinePlayers())
112+
for (final Player onlinePlayer : ess.getOnlinePlayers())
113113
{
114114
if (target.getBase().getName().equals(onlinePlayer.getName()))
115115
{

Essentials/src/com/earth2me/essentials/commands/Commandnuke.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
import com.earth2me.essentials.CommandSource;
44
import static com.earth2me.essentials.I18n.tl;
55
import java.util.ArrayList;
6-
import java.util.Arrays;
7-
import java.util.List;
6+
import java.util.Collection;
87
import org.bukkit.Location;
98
import org.bukkit.Server;
109
import org.bukkit.World;
@@ -22,7 +21,7 @@ public Commandnuke()
2221
@Override
2322
protected void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws NoSuchFieldException, NotEnoughArgumentsException
2423
{
25-
List<Player> targets;
24+
Collection<Player> targets;
2625
if (args.length > 0)
2726
{
2827
targets = new ArrayList<Player>();
@@ -35,7 +34,7 @@ protected void run(final Server server, final CommandSource sender, final String
3534
}
3635
else
3736
{
38-
targets = Arrays.asList(server.getOnlinePlayers());
37+
targets = ess.getOnlinePlayers();
3938
}
4039
ess.getTNTListener().enable();
4140
for (Player player : targets)

Essentials/src/com/earth2me/essentials/commands/Commandptime.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -197,9 +197,9 @@ private Set<User> getUsers(final Server server, final CommandSource sender, fina
197197
}
198198
else
199199
{
200-
for (Player player : server.getOnlinePlayers())
200+
for (User user : ess.getOnlineUsers())
201201
{
202-
users.add(ess.getUser(player));
202+
users.add(user);
203203
}
204204
}
205205
return users;

Essentials/src/com/earth2me/essentials/commands/Commandpweather.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -147,9 +147,9 @@ private Set<User> getUsers(final Server server, final CommandSource sender, fina
147147
}
148148
else
149149
{
150-
for (Player player : server.getOnlinePlayers())
150+
for (User user : ess.getOnlineUsers())
151151
{
152-
users.add(ess.getUser(player));
152+
users.add(user);
153153
}
154154
}
155155
return users;

Essentials/src/com/earth2me/essentials/commands/Commandrealname.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,9 @@ protected void run(final Server server, final CommandSource sender, final String
2626
final String whois = args[0].toLowerCase(Locale.ENGLISH);
2727
boolean skipHidden = sender.isPlayer() && !ess.getUser(sender.getPlayer()).canInteractVanished();
2828
boolean foundUser = false;
29-
for (Player onlinePlayer : server.getOnlinePlayers())
29+
for (User u: ess.getOnlineUsers())
3030
{
31-
final User u = ess.getUser(onlinePlayer);
32-
if (skipHidden && u.isHidden(sender.getPlayer()) && !sender.getPlayer().canSee(onlinePlayer))
31+
if (skipHidden && u.isHidden(sender.getPlayer()) && !sender.getPlayer().canSee(u.getBase()))
3332
{
3433
continue;
3534
}

Essentials/src/com/earth2me/essentials/commands/Commandtpaall.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,8 @@ public void run(final Server server, final CommandSource sender, final String co
3434
private void teleportAAllPlayers(final Server server, final CommandSource sender, final User target)
3535
{
3636
sender.sendMessage(tl("teleportAAll"));
37-
for (Player onlinePlayer : server.getOnlinePlayers())
37+
for (User player : ess.getOnlineUsers())
3838
{
39-
final User player = ess.getUser(onlinePlayer);
4039
if (target == player)
4140
{
4241
continue;

Essentials/src/com/earth2me/essentials/commands/Commandtpall.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,8 @@ private void teleportAllPlayers(Server server, CommandSource sender, User target
3737
{
3838
sender.sendMessage(tl("teleportAll"));
3939
final Location loc = target.getLocation();
40-
for (Player onlinePlayer : server.getOnlinePlayers())
40+
for (User player : ess.getOnlineUsers())
4141
{
42-
final User player = ess.getUser(onlinePlayer);
4342
if (target == player)
4443
{
4544
continue;

0 commit comments

Comments
 (0)