package de.tobiyas.racesandclasses.playermanagement.player; import java.io.File; import java.util.Collection; import java.util.HashSet; import java.util.Set; import java.util.UUID; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import de.tobiyas.racesandclasses.RacesAndClasses; import de.tobiyas.util.config.YAMLConfigExtended; import de.tobiyas.util.player.PlayerUtils; public class RaCPlayerManager { /** * The Set to use. */ private final Set<RaCPlayer> playerSet = new HashSet<RaCPlayer>(); /** * The Cacche to use. */ private YAMLConfigExtended cacheConfig; private static RaCPlayerManager instance; protected RaCPlayerManager() { //nothing to load. if(hasUUIDSupport()) return; File cacheFolder = new File(RacesAndClasses.getPlugin().getDataFolder(), "cache"); if(!cacheFolder.exists()) cacheFolder.mkdirs(); File cacheFile = new File(cacheFolder, "uuid_cache.yml"); cacheConfig = new YAMLConfigExtended(cacheFile).load(); for(String key : cacheConfig.getRootChildren()){ try{ UUID id = UUID.fromString(key); String name = cacheConfig.getString(key); playerSet.add(new RaCPlayer(id, name)); }catch(Throwable exp){} } } /** * Gets a RaCPlayer. * * @param player to get * * @return the player. */ public RaCPlayer getPlayer(Player player){ if(player == null) return null; if(player instanceof RaCPlayer) return (RaCPlayer) player; if(hasUUIDSupport()){ UUID id = player.getUniqueId(); for(RaCPlayer racPlayer : playerSet){ if(racPlayer.getUniqueId().equals(id)){ return racPlayer; } } RaCPlayer neu = createNew(player); playerSet.add(neu); return neu; }else{ String name = player.getName(); for(RaCPlayer racPlayer : playerSet){ if(racPlayer.getName().equals(name)){ return racPlayer; } } RaCPlayer neu = createNew(player); playerSet.add(neu); return neu; } } /** * Gets a RaCPlayer. * * @param player to get * * @return the player. */ public RaCPlayer getPlayerByName(String playerName){ if(playerName == null) return null; //First check the players online. Player player = PlayerUtils.getPlayer(playerName); if(player != null) return getPlayer(player); for(RaCPlayer racPlayer : playerSet){ if(racPlayer.getName().equals(playerName)){ return racPlayer; } } //Can not find the guy! return null; } /** * Gets a RaCPlayer. * <br>WARNING: This will most likely only work for MC 1.7.5 +. * Otherwise it will ALWAYS return null if no player is registered to that UUID. * * @param playerID to get * * @return the player. */ public RaCPlayer getPlayer(UUID playerUuid){ if(playerUuid == null) return null; for(RaCPlayer racPlayer : playerSet){ if(racPlayer.getUniqueId().equals(playerUuid)){ return racPlayer; } } if(!hasUUIDSupport()) return null; Player player = Bukkit.getPlayer(playerUuid); if(player == null) return null; RaCPlayer neu = createNew(player); playerSet.add(neu); return neu; } private RaCPlayer createNew(Player player){ if(player == null) return null; if(hasUUIDSupport()){ return new RaCPlayer(player.getUniqueId(), player.getName()); }else{ UUID newID = UUID.randomUUID(); String playerName = player.getName(); cacheConfig.set(newID.toString(), playerName); cacheConfig.saveAsync(); return new RaCPlayer(newID, playerName); } } /** * If the System has UUID support. * * @return true if has UUID support. */ private boolean hasUUIDSupport(){ try{ Bukkit.getPlayer(UUID.randomUUID()); return true; }catch(Throwable exp) { return false; } } /** * Returns all Online Players as {@link RaCPlayer} * * @return a Collection of RaC Players online. */ public Collection<RaCPlayer> getOnlinePlayers() { Set<RaCPlayer> online = new HashSet<RaCPlayer>(); for(Player pl : PlayerUtils.getOnlinePlayers()){ RaCPlayer racPlayer = getPlayer(pl); if(racPlayer != null) online.add(racPlayer); } return online; } public static RaCPlayerManager get(){ if (instance == null) instance = new RaCPlayerManager(); return instance; } }