diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/NoCheatPlus.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/NoCheatPlus.java index e69f4ccd..cd9bdf9d 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/NoCheatPlus.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/NoCheatPlus.java @@ -14,7 +14,6 @@ import java.util.Set; import org.bukkit.Bukkit; import org.bukkit.ChatColor; -import org.bukkit.Server; import org.bukkit.command.PluginCommand; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -207,9 +206,8 @@ public class NoCheatPlus extends JavaPlugin implements NoCheatPlusAPI { final Set names = nameSetPerms.getPlayers(Permissions.ADMINISTRATION_NOTIFY); if (names == null) return 0; int done = 0; - final Server server = Bukkit.getServer(); for (final String name : names){ - final Player player = server.getPlayerExact(name); + final Player player = DataManager.getPlayerExact(name); if (player != null){ player.sendMessage(message); done ++; @@ -488,6 +486,9 @@ public class NoCheatPlus extends JavaPlugin implements NoCheatPlusAPI { // Initialize BlockProperties initBlockProperties(config); + + // Initialize data manager. + dataMan.onEnable(); // Allow entries to TickTask (just in case). TickTask.setLocked(false); diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MovingListener.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MovingListener.java index 1352f1d9..36fa20f5 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MovingListener.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MovingListener.java @@ -11,7 +11,6 @@ import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.Server; import org.bukkit.entity.Entity; import org.bukkit.entity.Pig; import org.bukkit.entity.Player; @@ -57,6 +56,7 @@ import fr.neatmonster.nocheatplus.hooks.NCPExemptionManager; import fr.neatmonster.nocheatplus.logging.DebugUtil; import fr.neatmonster.nocheatplus.logging.LogUtil; import fr.neatmonster.nocheatplus.permissions.Permissions; +import fr.neatmonster.nocheatplus.players.DataManager; import fr.neatmonster.nocheatplus.utilities.BlockCache; import fr.neatmonster.nocheatplus.utilities.BlockProperties; import fr.neatmonster.nocheatplus.utilities.CheckUtils; @@ -1141,7 +1141,6 @@ public class MovingListener extends CheckListener implements TickListener, IRemo // Hover checks ! // TODO: Change to ordering such that smallest hover time comes first ? if (hoverTicks.isEmpty()) return; // Seldom or not ? - final Server server = Bukkit.getServer(); final MoveInfo info; if (parkedInfo.isEmpty()) info = new MoveInfo(mcAccess); else info = parkedInfo.remove(parkedInfo.size() - 1); @@ -1149,7 +1148,7 @@ public class MovingListener extends CheckListener implements TickListener, IRemo for (final String playerName : hoverTicks){ // TODO: put players into the set (+- one tick would not matter ?) // TODO: might add an online flag to data ! - final Player player = server.getPlayerExact(playerName); + final Player player = DataManager.getPlayerExact(playerName); if (player == null || !player.isOnline()){ rem.add(playerName); continue; diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/BanCommand.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/BanCommand.java index b1feaea6..4abfca93 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/BanCommand.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/BanCommand.java @@ -10,6 +10,7 @@ import fr.neatmonster.nocheatplus.NoCheatPlus; import fr.neatmonster.nocheatplus.command.DelayableCommand; import fr.neatmonster.nocheatplus.logging.LogUtil; import fr.neatmonster.nocheatplus.permissions.Permissions; +import fr.neatmonster.nocheatplus.players.DataManager; public class BanCommand extends DelayableCommand { @@ -36,7 +37,7 @@ public class BanCommand extends DelayableCommand { } void ban(CommandSender sender, String name, String reason) { - Player player = Bukkit.getPlayerExact(name); + Player player = DataManager.getPlayer(name); if (player != null) player.kickPlayer(reason); OfflinePlayer offlinePlayer = Bukkit.getServer().getOfflinePlayer(name); diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/KickCommand.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/KickCommand.java index c9ba8cb0..dd382c78 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/KickCommand.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/KickCommand.java @@ -1,6 +1,5 @@ package fr.neatmonster.nocheatplus.command.actions; -import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -9,6 +8,7 @@ import fr.neatmonster.nocheatplus.NoCheatPlus; import fr.neatmonster.nocheatplus.command.DelayableCommand; import fr.neatmonster.nocheatplus.logging.LogUtil; import fr.neatmonster.nocheatplus.permissions.Permissions; +import fr.neatmonster.nocheatplus.players.DataManager; public class KickCommand extends DelayableCommand { @@ -35,7 +35,7 @@ public class KickCommand extends DelayableCommand { } void kick(CommandSender sender, String name, String reason) { - Player player = Bukkit.getPlayerExact(name); + Player player = DataManager.getPlayer(name); if (player == null) return; player.kickPlayer(reason); LogUtil.logInfo("[NoCheatPlus] (" + sender.getName() + ") Kicked " + player.getName() + " : " + reason); diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/TellCommand.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/TellCommand.java index 0045fa11..338cf71d 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/TellCommand.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/TellCommand.java @@ -1,6 +1,5 @@ package fr.neatmonster.nocheatplus.command.actions; -import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -8,6 +7,7 @@ import org.bukkit.entity.Player; import fr.neatmonster.nocheatplus.NoCheatPlus; import fr.neatmonster.nocheatplus.command.DelayableCommand; import fr.neatmonster.nocheatplus.permissions.Permissions; +import fr.neatmonster.nocheatplus.players.DataManager; import fr.neatmonster.nocheatplus.utilities.ColorUtil; /** @@ -37,7 +37,7 @@ public class TellCommand extends DelayableCommand { } private void tell(String name, String message) { - Player player = Bukkit.getServer().getPlayerExact(name); + Player player = DataManager.getPlayer(name); if (player != null) player.sendMessage(ColorUtil.replaceColors(message)); } diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/TempKickCommand.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/TempKickCommand.java index 99d899cb..c88496c9 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/TempKickCommand.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/actions/TempKickCommand.java @@ -1,6 +1,5 @@ package fr.neatmonster.nocheatplus.command.actions; -import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -9,6 +8,7 @@ import fr.neatmonster.nocheatplus.NoCheatPlus; import fr.neatmonster.nocheatplus.command.DelayableCommand; import fr.neatmonster.nocheatplus.logging.LogUtil; import fr.neatmonster.nocheatplus.permissions.Permissions; +import fr.neatmonster.nocheatplus.players.DataManager; public class TempKickCommand extends DelayableCommand { @@ -47,7 +47,7 @@ public class TempKickCommand extends DelayableCommand { protected void tempKick(CommandSender sender, String name, long duration, String reason){ - Player player = Bukkit.getPlayerExact(name); + Player player = DataManager.getPlayer(name); NoCheatPlus.denyLogin(name, duration); if (player == null) return; player.kickPlayer(reason); diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/ExemptCommand.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/ExemptCommand.java index b001d70d..2df35a48 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/ExemptCommand.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/ExemptCommand.java @@ -3,7 +3,6 @@ package fr.neatmonster.nocheatplus.command.admin; import java.util.Arrays; import java.util.List; -import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -14,6 +13,7 @@ import fr.neatmonster.nocheatplus.command.CommandUtil; import fr.neatmonster.nocheatplus.command.NCPCommand; import fr.neatmonster.nocheatplus.hooks.NCPExemptionManager; import fr.neatmonster.nocheatplus.permissions.Permissions; +import fr.neatmonster.nocheatplus.players.DataManager; import fr.neatmonster.nocheatplus.utilities.StringUtil; public class ExemptCommand extends NCPCommand { @@ -40,7 +40,7 @@ public class ExemptCommand extends NCPCommand { } else checkType = CheckType.ALL; - final Player player = Bukkit.getPlayerExact(playerName); + final Player player = DataManager.getPlayer(playerName); if (player == null){ sender.sendMessage(TAG + "Player not online: " + playerName); return true; diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/ExemptionsCommand.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/ExemptionsCommand.java index 4c5331a5..76a30753 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/ExemptionsCommand.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/ExemptionsCommand.java @@ -3,7 +3,6 @@ package fr.neatmonster.nocheatplus.command.admin; import java.util.LinkedList; import java.util.List; -import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -13,6 +12,7 @@ import fr.neatmonster.nocheatplus.checks.CheckType; import fr.neatmonster.nocheatplus.command.NCPCommand; import fr.neatmonster.nocheatplus.hooks.NCPExemptionManager; import fr.neatmonster.nocheatplus.permissions.Permissions; +import fr.neatmonster.nocheatplus.players.DataManager; import fr.neatmonster.nocheatplus.utilities.StringUtil; public class ExemptionsCommand extends NCPCommand { @@ -26,7 +26,7 @@ public class ExemptionsCommand extends NCPCommand { String label, String[] args) { if (args.length != 2) return false; String playerName = args[1].trim(); - Player player = Bukkit.getPlayerExact(playerName); + Player player = DataManager.getPlayer(playerName); if (player != null) playerName = player.getName(); final List entries = new LinkedList(); for (CheckType type : CheckType.values()){ diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/InfoCommand.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/InfoCommand.java index dfedcd83..0ac0f056 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/InfoCommand.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/InfoCommand.java @@ -4,7 +4,6 @@ import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; -import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -15,6 +14,7 @@ import fr.neatmonster.nocheatplus.checks.ViolationHistory; import fr.neatmonster.nocheatplus.checks.ViolationHistory.ViolationLevel; import fr.neatmonster.nocheatplus.command.NCPCommand; import fr.neatmonster.nocheatplus.permissions.Permissions; +import fr.neatmonster.nocheatplus.players.DataManager; public class InfoCommand extends NCPCommand { @@ -40,7 +40,7 @@ public class InfoCommand extends NCPCommand { * @return true, if successful */ private void handleInfoCommand(final CommandSender sender, String playerName) { - final Player player = Bukkit.getPlayerExact(playerName); + final Player player = DataManager.getPlayer(playerName); if (player != null) playerName = player.getName(); final ViolationHistory history = ViolationHistory.getHistory(playerName, false); diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/RemovePlayerCommand.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/RemovePlayerCommand.java index dc8c703e..c1cb8e83 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/RemovePlayerCommand.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/RemovePlayerCommand.java @@ -3,7 +3,6 @@ package fr.neatmonster.nocheatplus.command.admin; import java.util.Arrays; import java.util.List; -import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -48,7 +47,7 @@ public class RemovePlayerCommand extends NCPCommand { return true; } - final Player player = Bukkit.getPlayerExact(playerName); + final Player player = DataManager.getPlayer(playerName); if (player != null) playerName = player.getName(); ViolationHistory hist = ViolationHistory.getHistory(playerName, false); diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/UnexemptCommand.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/UnexemptCommand.java index edc05498..1d11c5c5 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/UnexemptCommand.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/command/admin/UnexemptCommand.java @@ -3,7 +3,6 @@ package fr.neatmonster.nocheatplus.command.admin; import java.util.Arrays; import java.util.List; -import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -14,6 +13,7 @@ import fr.neatmonster.nocheatplus.command.CommandUtil; import fr.neatmonster.nocheatplus.command.NCPCommand; import fr.neatmonster.nocheatplus.hooks.NCPExemptionManager; import fr.neatmonster.nocheatplus.permissions.Permissions; +import fr.neatmonster.nocheatplus.players.DataManager; import fr.neatmonster.nocheatplus.utilities.StringUtil; public class UnexemptCommand extends NCPCommand { @@ -47,7 +47,7 @@ public class UnexemptCommand extends NCPCommand { return true; } // Find player. - final Player player = Bukkit.getPlayerExact(playerName); + final Player player = DataManager.getPlayer(playerName); if (player != null) playerName = player.getName(); NCPExemptionManager.unexempt(playerName, checkType); sender.sendMessage(TAG + "Player " + playerName + " will not be exempted from: " + checkType); diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/players/DataManager.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/players/DataManager.java index 0aaeb5a5..70957596 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/players/DataManager.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/players/DataManager.java @@ -10,6 +10,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -66,6 +67,14 @@ public class DataManager implements Listener, INotifyReload, INeedConfig, Compon */ private final Map lastLogout = new LinkedHashMap(50, 0.75f, true); + /** + * Keeping track of online players.
+ * Mappings: + *
  • exact player name -> Player instance
  • + *
  • lower case player name -> Player instance
  • + */ + protected final Map onlinePlayers = new LinkedHashMap(100); + /** * IRemoveData instances. * // TODO: might use a map for those later (extra or not). @@ -131,7 +140,8 @@ public class DataManager implements Listener, INotifyReload, INeedConfig, Compon public void onPlayerJoin(final PlayerJoinEvent event){ final Player player = event.getPlayer(); lastLogout.remove(player.getName()); - CombinedData.getData(player).lastJoinTime = System.currentTimeMillis(); + CombinedData.getData(player).lastJoinTime = System.currentTimeMillis(); + addOnlinePlayer(player); } @EventHandler(priority = EventPriority.MONITOR) @@ -152,8 +162,9 @@ public class DataManager implements Listener, INotifyReload, INeedConfig, Compon final long now = System.currentTimeMillis(); lastLogout.put(player.getName(), now); CombinedData.getData(player).lastLogoutTime = now; + removeOnlinePlayer(player); } - + @Override public void onReload() { // present. @@ -312,6 +323,23 @@ public class DataManager implements Listener, INotifyReload, INeedConfig, Compon MovingConfig.clear(); } + /** + * This gets an online player by exact player name or lower-case player name only [subject to change]. + * @param playerName + * @return + */ + public static Player getPlayerExact(final String playerName){ + return instance.onlinePlayers.get(playerName); + } + + /** + * This gets the online player with the exact name, but transforms the input to lower case. + * @param playerName + * @return + */ + public static Player getPlayer(final String playerName){ + return instance.onlinePlayers.get(playerName.toLowerCase()); + } @Override public boolean addComponent(Object obj) { @@ -336,6 +364,36 @@ public class DataManager implements Listener, INotifyReload, INeedConfig, Compon } } + /** + * Initializing with online players. + */ + public void onEnable(){ + final Player[] players = Bukkit.getOnlinePlayers(); + for (final Player player : players){ + addOnlinePlayer(player); + } + } + + /** + * Add mappings for player names variations. + * @param player + */ + private void addOnlinePlayer(final Player player){ + final String name = player.getName(); + onlinePlayers.put(name, player); + onlinePlayers.put(name.toLowerCase(), player); + } + + /** + * Remove mappings for player names variations. + * @param player + */ + private void removeOnlinePlayer(final Player player){ + final String name = player.getName(); + onlinePlayers.remove(name); + onlinePlayers.remove(name.toLowerCase()); + } + /** * Cleanup method, removes all data and config, but does not call ConfigManager.cleanup. */ @@ -348,10 +406,12 @@ public class DataManager implements Listener, INotifyReload, INeedConfig, Compon clearConfigs(); lastLogout.clear(); executionHistories.clear(); + onlinePlayers.clear(); } @Override public String getComponentName() { return "NoCheatPlus_DataManager"; } + } diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/utilities/TickTask.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/utilities/TickTask.java index 91b65381..9811d2d4 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/utilities/TickTask.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/utilities/TickTask.java @@ -127,7 +127,7 @@ public class TickTask implements Runnable { permissionUpdates.clear(); } for (final PermissionUpdateEntry entry : copyPermissions){ - final Player player = Bukkit.getPlayerExact(entry.playerName); + final Player player = DataManager.getPlayer(entry.playerName); // Might use exact name by contract. if (player == null || !player.isOnline()) continue; final String[] perms = entry.checkType.getConfigFactory().getConfig(player).getCachePermissions(); if (perms == null) continue;