diff options
author | md_5 <git@md-5.net> | 2014-07-12 16:03:36 +1000 |
---|---|---|
committer | KHobbits <rob@khobbits.co.uk> | 2014-07-19 20:07:50 +0100 |
commit | 035182fcda8acf77d3727ce21993e9bb57c90077 (patch) | |
tree | ec572bba04047317cadbf153848c2c08c42d2bca /Essentials/src/com/earth2me/essentials/Essentials.java | |
parent | 310e41396b8122bb4889a6c757597b5ac2db5b78 (diff) | |
download | Essentials-035182fcda8acf77d3727ce21993e9bb57c90077.tar Essentials-035182fcda8acf77d3727ce21993e9bb57c90077.tar.gz Essentials-035182fcda8acf77d3727ce21993e9bb57c90077.tar.lz Essentials-035182fcda8acf77d3727ce21993e9bb57c90077.tar.xz Essentials-035182fcda8acf77d3727ce21993e9bb57c90077.zip |
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
Diffstat (limited to 'Essentials/src/com/earth2me/essentials/Essentials.java')
-rw-r--r-- | Essentials/src/com/earth2me/essentials/Essentials.java | 59 |
1 files changed, 57 insertions, 2 deletions
diff --git a/Essentials/src/com/earth2me/essentials/Essentials.java b/Essentials/src/com/earth2me/essentials/Essentials.java index fbe874f16..fc100ee3d 100644 --- a/Essentials/src/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/com/earth2me/essentials/Essentials.java @@ -35,10 +35,17 @@ import com.earth2me.essentials.textreader.IText; import com.earth2me.essentials.textreader.KeywordReplacer; import com.earth2me.essentials.textreader.SimpleTextInput; import com.earth2me.essentials.utils.DateUtil; +import com.google.common.base.Function; +import com.google.common.base.Throwables; +import com.google.common.collect.Iterables; import java.io.File; import java.io.FileReader; import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.UUID; import java.util.logging.Level; @@ -100,6 +107,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials private transient Metrics metrics; private transient EssentialsTimer timer; private final transient List<String> vanishedPlayers = new ArrayList<String>(); + private transient Method oldGetOnlinePlayers; public Essentials() { @@ -181,6 +189,16 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials LOGGER.log(Level.INFO, getServer().getBukkitVersion()); } execTimer.mark("BukkitCheck"); + + for (Method method : Server.class.getDeclaredMethods()) + { + if (method.getName().endsWith("getOnlinePlayers") && method.getReturnType() == Player[].class) + { + oldGetOnlinePlayers = method; + break; + } + } + try { final EssentialsUpgrade upgrade = new EssentialsUpgrade(this); @@ -784,7 +802,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials IText broadcast = new SimpleTextInput(message); - final Player[] players = getServer().getOnlinePlayers(); + final Collection<Player> players = getOnlinePlayers(); for (Player player : players) { @@ -803,7 +821,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials } } - return players.length; + return players.size(); } @Override @@ -890,6 +908,43 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials return vanishedPlayers; } + @Override + public Collection<Player> getOnlinePlayers() + { + try + { + 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 + } + catch (NoSuchMethodError ex) + { + try + { + return Arrays.asList((Player[])oldGetOnlinePlayers.invoke(getServer())); + } + catch (InvocationTargetException ex1) + { + throw Throwables.propagate(ex.getCause()); + } + catch (IllegalAccessException ex1) + { + throw new RuntimeException("Error invoking oldGetOnlinePlayers", ex1); + } + } + } + + @Override + public Iterable<User> getOnlineUsers() + { + return Iterables.transform(getOnlinePlayers(), new Function<Player, User>() + { + + @Override + public User apply(Player player) + { + return getUser(player); + } + }); + } private static class EssentialsWorldListener implements Listener, Runnable { |