From 67978608d80ab30bd76b8a2fad189b885982cf4a Mon Sep 17 00:00:00 2001 From: ryanhamshire Date: Thu, 9 Oct 2014 15:39:16 -0700 Subject: [PATCH] Performance: Faster player name lookup. Especially beneficial to /trustlist and error messages (like trying to do something in a land claim without permission). --- .../GriefPrevention/GriefPrevention.java | 43 +++++++++++++++---- .../GriefPrevention/PlayerEventHandler.java | 3 ++ 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java b/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java index 579f5dd..a6fd6b2 100644 --- a/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java +++ b/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java @@ -25,6 +25,7 @@ import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.logging.Logger; @@ -2173,24 +2174,50 @@ public class GriefPrevention extends JavaPlugin //parameter validation if(playerID == null) return "someone"; - //try online players first + //check the cache + String playerName = GriefPrevention.uuidToNameMap.get(playerID); + if(playerName != null) return playerName; + + //try online players next Player player = GriefPrevention.instance.getServer().getPlayer(playerID); - if(player != null) return player.getName(); + if(player != null) playerName = player.getName(); //then search offline players - OfflinePlayer [] players = GriefPrevention.instance.getServer().getOfflinePlayers(); - for(int i = 0; i < players.length; i++) + if(playerName == null) { - if(players[i].getUniqueId().equals(playerID)) + OfflinePlayer [] players = GriefPrevention.instance.getServer().getOfflinePlayers(); + for(int i = 0; i < players.length; i++) { - return players[i].getName(); + if(players[i].getUniqueId().equals(playerID)) + { + playerName = players[i].getName(); + break; + } } } - //if none found - return "someone"; + if(playerName == null) + { + playerName = "someone"; + } + + //cache the result + GriefPrevention.cacheUUIDNamePair(playerID, playerName); + + //return result + return playerName; } + //cache for player name lookups, to save searches of all offline players + static ConcurrentHashMap uuidToNameMap = new ConcurrentHashMap(); + static void cacheUUIDNamePair(UUID playerID, String playerName) + { + //limit memory footprint + if(GriefPrevention.uuidToNameMap.size() >= 500) GriefPrevention.uuidToNameMap.clear(); + + GriefPrevention.uuidToNameMap.put(playerID, playerName); + } + //string overload for above helper static String lookupPlayerName(String playerID) { diff --git a/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java b/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java index 9c10595..4ead8db 100644 --- a/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java +++ b/src/me/ryanhamshire/GriefPrevention/PlayerEventHandler.java @@ -557,6 +557,9 @@ class PlayerEventHandler implements Listener } } } + + //in case player has changed his name, on successful login, update UUID > Name mapping + GriefPrevention.cacheUUIDNamePair(player.getUniqueId(), player.getName()); } //when a player dies...