/* * Copyright (c) 2010 SimpleServer authors (see CONTRIBUTORS) * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package simpleserver; import static simpleserver.lang.Translations.t; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; public class PlayerList { private final Server server; private final ConcurrentMap<String, Player> players; public PlayerList(Server server) { this.server = server; players = new ConcurrentHashMap<String, Player>(); } public synchronized Player[] getArray() { return players.values().toArray(new Player[players.size()]); } public int size() { return players.size(); } public synchronized void waitUntilEmpty() { while (players.size() > 0) { try { wait(); } catch (InterruptedException e) { } } } public void updatePlayerGroups() { for (Player p : players.values()) { p.updateGroup(); } } public Player findPlayer(int entityId) { for (Player p : players.values()) { if (p.getEntityId() == entityId) { return p; } } return null; } public Player findPlayer(String prefix) { prefix = prefix.toLowerCase(); for (String name : players.keySet()) { if (name.startsWith(prefix)) { return players.get(name); } } return null; } public Player findPlayerExact(String name) { return players.get(name.toLowerCase()); } public synchronized void removePlayer(Player player) { players.remove(player.getName().toLowerCase()); notifyAll(); } public synchronized void addPlayer(Player player) { if (players.size() < server.config.properties.getInt("maxPlayers")) { players.put(player.getName().toLowerCase(), player); } else { Player playerToKick = null; for (Player friend : players.values()) { if (!((friend.getGroupId() >= player.getGroupId()) || (playerToKick != null) && (friend.getConnectedAt() < playerToKick.getConnectedAt()) && (friend.getGroupId() > playerToKick.getGroupId()))) { playerToKick = friend; } } if (playerToKick == null) { player.kick(t("Sorry, server is full!")); } else { playerToKick.kick(t("Sorry, making space for more senior member.")); players.remove(playerToKick.getName().toLowerCase()); players.put(player.getName().toLowerCase(), player); } } } }