mirror of
https://github.com/webbukkit/dynmap.git
synced 2025-02-17 20:31:37 +01:00
Fix off-server-thread calls to get player list
This commit is contained in:
parent
1253ac2e6a
commit
978a203aa9
@ -268,6 +268,16 @@ public class DynmapPlugin extends JavaPlugin {
|
|||||||
|
|
||||||
playerList = new PlayerList(getServer(), getFile("hiddenplayers.txt"), configuration);
|
playerList = new PlayerList(getServer(), getFile("hiddenplayers.txt"), configuration);
|
||||||
playerList.load();
|
playerList.load();
|
||||||
|
PlayerListener pl = new PlayerListener() {
|
||||||
|
public void onPlayerJoin(PlayerJoinEvent evt) {
|
||||||
|
playerList.updateOnlinePlayers(null);
|
||||||
|
}
|
||||||
|
public void onPlayerQuit(PlayerQuitEvent evt) {
|
||||||
|
playerList.updateOnlinePlayers(evt.getPlayer());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
registerEvent(Type.PLAYER_JOIN, pl);
|
||||||
|
registerEvent(Type.PLAYER_QUIT, pl);
|
||||||
|
|
||||||
mapManager = new MapManager(this, configuration);
|
mapManager = new MapManager(this, configuration);
|
||||||
mapManager.startRendering();
|
mapManager.startRendering();
|
||||||
|
@ -19,11 +19,13 @@ public class PlayerList {
|
|||||||
private HashSet<String> hiddenPlayerNames = new HashSet<String>();
|
private HashSet<String> hiddenPlayerNames = new HashSet<String>();
|
||||||
private File hiddenPlayersFile;
|
private File hiddenPlayersFile;
|
||||||
private ConfigurationNode configuration;
|
private ConfigurationNode configuration;
|
||||||
|
private Player[] online;
|
||||||
|
|
||||||
public PlayerList(Server server, File hiddenPlayersFile, ConfigurationNode configuration) {
|
public PlayerList(Server server, File hiddenPlayersFile, ConfigurationNode configuration) {
|
||||||
this.server = server;
|
this.server = server;
|
||||||
this.hiddenPlayersFile = hiddenPlayersFile;
|
this.hiddenPlayersFile = hiddenPlayersFile;
|
||||||
this.configuration = configuration;
|
this.configuration = configuration;
|
||||||
|
updateOnlinePlayers(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void save() {
|
public void save() {
|
||||||
@ -75,10 +77,11 @@ public class PlayerList {
|
|||||||
// TODO: Clean this up... one day
|
// TODO: Clean this up... one day
|
||||||
public Player[] getVisiblePlayers(String worldName) {
|
public Player[] getVisiblePlayers(String worldName) {
|
||||||
ArrayList<Player> visiblePlayers = new ArrayList<Player>();
|
ArrayList<Player> visiblePlayers = new ArrayList<Player>();
|
||||||
Player[] onlinePlayers = server.getOnlinePlayers();
|
Player[] onlinePlayers = online; /* Use copied list - we don't call from server thread */
|
||||||
boolean useWhitelist = configuration.getBoolean("display-whitelist", false);
|
boolean useWhitelist = configuration.getBoolean("display-whitelist", false);
|
||||||
for (int i = 0; i < onlinePlayers.length; i++) {
|
for (int i = 0; i < onlinePlayers.length; i++) {
|
||||||
Player p = onlinePlayers[i];
|
Player p = onlinePlayers[i];
|
||||||
|
if(p == null) continue;
|
||||||
if (p.getWorld().getName().equals(worldName) && !(useWhitelist ^ hiddenPlayerNames.contains(p.getName().toLowerCase()))) {
|
if (p.getWorld().getName().equals(worldName) && !(useWhitelist ^ hiddenPlayerNames.contains(p.getName().toLowerCase()))) {
|
||||||
visiblePlayers.add(p);
|
visiblePlayers.add(p);
|
||||||
}
|
}
|
||||||
@ -90,10 +93,11 @@ public class PlayerList {
|
|||||||
|
|
||||||
public Player[] getVisiblePlayers() {
|
public Player[] getVisiblePlayers() {
|
||||||
ArrayList<Player> visiblePlayers = new ArrayList<Player>();
|
ArrayList<Player> visiblePlayers = new ArrayList<Player>();
|
||||||
Player[] onlinePlayers = server.getOnlinePlayers();
|
Player[] onlinePlayers = online; /* Use copied list - we don't call from server thread */
|
||||||
boolean useWhitelist = configuration.getBoolean("display-whitelist", false);
|
boolean useWhitelist = configuration.getBoolean("display-whitelist", false);
|
||||||
for (int i = 0; i < onlinePlayers.length; i++) {
|
for (int i = 0; i < onlinePlayers.length; i++) {
|
||||||
Player p = onlinePlayers[i];
|
Player p = onlinePlayers[i];
|
||||||
|
if(p == null) continue;
|
||||||
if (!(useWhitelist ^ hiddenPlayerNames.contains(p.getName().toLowerCase()))) {
|
if (!(useWhitelist ^ hiddenPlayerNames.contains(p.getName().toLowerCase()))) {
|
||||||
visiblePlayers.add(p);
|
visiblePlayers.add(p);
|
||||||
}
|
}
|
||||||
@ -105,10 +109,11 @@ public class PlayerList {
|
|||||||
|
|
||||||
public Set<Player> getHiddenPlayers() {
|
public Set<Player> getHiddenPlayers() {
|
||||||
HashSet<Player> hidden = new HashSet<Player>();
|
HashSet<Player> hidden = new HashSet<Player>();
|
||||||
Player[] onlinePlayers = server.getOnlinePlayers();
|
Player[] onlinePlayers = online; /* Use copied list - we don't call from server thread */
|
||||||
boolean useWhitelist = configuration.getBoolean("display-whitelist", false);
|
boolean useWhitelist = configuration.getBoolean("display-whitelist", false);
|
||||||
for (int i = 0; i < onlinePlayers.length; i++) {
|
for (int i = 0; i < onlinePlayers.length; i++) {
|
||||||
Player p = onlinePlayers[i];
|
Player p = onlinePlayers[i];
|
||||||
|
if(p == null) continue;
|
||||||
if (useWhitelist ^ hiddenPlayerNames.contains(p.getName().toLowerCase())) {
|
if (useWhitelist ^ hiddenPlayerNames.contains(p.getName().toLowerCase())) {
|
||||||
hidden.add(p);
|
hidden.add(p);
|
||||||
}
|
}
|
||||||
@ -120,4 +125,19 @@ public class PlayerList {
|
|||||||
boolean useWhitelist = configuration.getBoolean("display-whitelist", false);
|
boolean useWhitelist = configuration.getBoolean("display-whitelist", false);
|
||||||
return (!(useWhitelist ^ hiddenPlayerNames.contains(p.getName().toLowerCase())));
|
return (!(useWhitelist ^ hiddenPlayerNames.contains(p.getName().toLowerCase())));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call this from server thread to update player list safely
|
||||||
|
*/
|
||||||
|
void updateOnlinePlayers(Player skipone) {
|
||||||
|
Player[] players = server.getOnlinePlayers();
|
||||||
|
Player[] pl = new Player[players.length];
|
||||||
|
System.arraycopy(players, 0, pl, 0, pl.length);
|
||||||
|
if(skipone != null) {
|
||||||
|
for(int i = 0; i < pl.length; i++)
|
||||||
|
if(pl[i] == skipone)
|
||||||
|
pl[i] = null;
|
||||||
|
}
|
||||||
|
online = pl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user