Skip to content

Commit 465041b

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 ed56afd commit 465041b

27 files changed

+126
-63
lines changed

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

Lines changed: 2 additions & 2 deletions
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

Lines changed: 57 additions & 2 deletions
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

Lines changed: 2 additions & 3 deletions
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 5 additions & 0 deletions
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

Lines changed: 7 additions & 8 deletions
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

Lines changed: 4 additions & 5 deletions
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

Lines changed: 3 additions & 4 deletions
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

Lines changed: 3 additions & 3 deletions
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

Lines changed: 1 addition & 1 deletion
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
{

0 commit comments

Comments
 (0)