Performance: Faster player name lookup.

Especially beneficial to /trustlist and error messages (like trying to
do something in a land claim without permission).
This commit is contained in:
ryanhamshire 2014-10-09 15:39:16 -07:00
parent e7b649810e
commit 67978608d8
2 changed files with 38 additions and 8 deletions

View File

@ -25,6 +25,7 @@ import java.util.Calendar;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.logging.Logger; import java.util.logging.Logger;
@ -2173,22 +2174,48 @@ public class GriefPrevention extends JavaPlugin
//parameter validation //parameter validation
if(playerID == null) return "someone"; 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); Player player = GriefPrevention.instance.getServer().getPlayer(playerID);
if(player != null) return player.getName(); if(player != null) playerName = player.getName();
//then search offline players //then search offline players
OfflinePlayer [] players = GriefPrevention.instance.getServer().getOfflinePlayers(); if(playerName == null)
for(int i = 0; i < players.length; i++)
{ {
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 if(playerName == null)
return "someone"; {
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<UUID, String> uuidToNameMap = new ConcurrentHashMap<UUID, String>();
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 //string overload for above helper

View File

@ -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... //when a player dies...