Added ability to hide players (/map hide, /map hide playername(s) and /map show).

This commit is contained in:
FrozenCow 2011-01-20 22:56:39 +01:00
parent 68412ae27d
commit 6419469be3
6 changed files with 117 additions and 12 deletions

View File

@ -6,20 +6,34 @@ import org.bukkit.event.player.PlayerListener;
public class DynmapPlayerListener extends PlayerListener {
private MapManager mgr;
private PlayerList playerList;
public DynmapPlayerListener(MapManager mgr) {
public DynmapPlayerListener(MapManager mgr, PlayerList playerList) {
this.mgr = mgr;
this.playerList = playerList;
}
@Override
public void onPlayerCommand(PlayerChatEvent event) {
String[] split = event.getMessage().split(" ");
Player player = event.getPlayer();
if (split[0].equalsIgnoreCase("/map")) {
if (split.length > 1) {
if (split[1].equals("render")) {
Player player = event.getPlayer();
mgr.touch(player.getLocation().getBlockX(), player.getLocation().getBlockY(), player.getLocation().getBlockZ());
event.setCancelled(true);
} else if (split[1].equals("hide")) {
if (split.length == 2) {
playerList.hide(event.getPlayer().getName());
} else for (int i=2;i<split.length;i++)
playerList.hide(split[i]);
event.setCancelled(true);
} else if (split[1].equals("show")) {
if (split.length == 2) {
playerList.show(event.getPlayer().getName());
} else for (int i=2;i<split.length;i++)
playerList.show(split[i]);
event.setCancelled(true);
}
}
}

View File

@ -17,8 +17,9 @@ public class DynmapPlugin extends JavaPlugin {
protected static final Logger log = Logger.getLogger("Minecraft");
private WebServer server = null;
private WebServer webserver = null;
private MapManager mgr = null;
private PlayerList playerList;
private BukkitPlayerDebugger debugger = new BukkitPlayerDebugger(this);
@ -38,11 +39,14 @@ public class DynmapPlugin extends JavaPlugin {
configuration.load();
debugger.enable();
playerList = new PlayerList(getServer());
playerList.load();
mgr = new MapManager(getWorld(), debugger, configuration);
mgr.startManager();
try {
server = new WebServer(mgr, getServer(), debugger, configuration);
webserver = new WebServer(mgr, getServer(), playerList, debugger, configuration);
} catch(IOException e) {
log.info("position failed to start WebServer (IOException)");
}
@ -53,9 +57,9 @@ public class DynmapPlugin extends JavaPlugin {
public void onDisable() {
mgr.stopManager();
if(server != null) {
server.shutdown();
server = null;
if(webserver != null) {
webserver.shutdown();
webserver = null;
}
debugger.disable();
}
@ -65,7 +69,7 @@ public class DynmapPlugin extends JavaPlugin {
getServer().getPluginManager().registerEvent(Event.Type.BLOCK_PLACED, blockListener, Priority.Normal, this);
getServer().getPluginManager().registerEvent(Event.Type.BLOCK_DAMAGED, blockListener, Priority.Normal, this);
getServer().getPluginManager().registerEvent(Event.Type.PLAYER_COMMAND, new DynmapPlayerListener(mgr), Priority.Normal, this);
getServer().getPluginManager().registerEvent(Event.Type.PLAYER_COMMAND, new DynmapPlayerListener(mgr, playerList), Priority.Normal, this);
//getServer().getPluginManager().registerEvent(Event.Type.BLOCK_DESTROYED, listener, Priority.Normal, this);
/* etc.getLoader().addListener(PluginLoader.Hook.COMMAND, listener, this, PluginListener.Priority.MEDIUM);
etc.getLoader().addListener(PluginLoader.Hook.BLOCK_CREATED, listener, this, PluginListener.Priority.MEDIUM);

View File

@ -16,6 +16,7 @@ public class MapManager extends Thread {
private Debugger debugger;
private MapType map;
public StaleQueue staleQueue;
public PlayerList playerList;
/* lock for our data structures */
public static final Object lock = new Object();
@ -55,6 +56,7 @@ public class MapManager extends Thread {
if (!tileDirectory.isDirectory())
tileDirectory.mkdirs();
map = new KzedMap(this, world, debugger, configuration);
}

View File

@ -0,0 +1,81 @@
package org.dynmap;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
import org.bukkit.Server;
import org.bukkit.entity.Player;
public class PlayerList {
private Server server;
private HashSet<String> hiddenPlayerNames = new HashSet<String>();
private File hiddenPlayersFile = new File(DynmapPlugin.dataRoot, "hiddenplayers.txt");
public PlayerList(Server server) {
this.server = server;
}
public void save() {
OutputStream stream;
try {
stream = new FileOutputStream(hiddenPlayersFile);
OutputStreamWriter writer = new OutputStreamWriter(stream);
for(String player : hiddenPlayerNames) {
writer.write(player);
writer.write("\n");
}
writer.close();
stream.close();
} catch(IOException e) {
e.printStackTrace();
}
}
public void load() {
try {
Scanner scanner = new Scanner(hiddenPlayersFile);
while(scanner.hasNextLine()) {
String line = scanner.nextLine();
hiddenPlayerNames.add(line);
}
scanner.close();
} catch (FileNotFoundException e) {
return;
}
}
public void hide(String playerName) {
hiddenPlayerNames.add(playerName);
save();
}
public void show(String playerName) {
hiddenPlayerNames.remove(playerName);
save();
}
public void setVisible(String playerName, boolean visible) {
if (visible) show(playerName); else hide(playerName);
}
public Player[] getVisiblePlayers() {
ArrayList<Player> visiblePlayers = new ArrayList<Player>();
Player[] onlinePlayers = server.getOnlinePlayers();
for(int i=0;i<onlinePlayers.length;i++){
Player p = onlinePlayers[i];
if (!hiddenPlayerNames.contains(p.getName())) {
visiblePlayers.add(p);
}
}
Player[] result = new Player[visiblePlayers.size()];
visiblePlayers.toArray(result);
return result;
}
}

View File

@ -22,11 +22,13 @@ public class WebServer extends Thread {
private MapManager mgr;
private Server server;
private PlayerList playerList;
public WebServer(MapManager mgr, Server server, Debugger debugger, ConfigurationNode configuration) throws IOException
public WebServer(MapManager mgr, Server server, PlayerList playerList, Debugger debugger, ConfigurationNode configuration) throws IOException
{
this.mgr = mgr;
this.server = server;
this.playerList = playerList;
this.debugger = debugger;
String bindAddress = configuration.getString("webserver-bindaddress", "0.0.0.0");
@ -44,7 +46,7 @@ public class WebServer extends Thread {
while (running) {
try {
Socket socket = sock.accept();
WebServerRequest requestThread = new WebServerRequest(socket, mgr, server, debugger);
WebServerRequest requestThread = new WebServerRequest(socket, mgr, server, playerList, debugger);
requestThread.start();
}
catch (IOException e) {

View File

@ -24,13 +24,15 @@ public class WebServerRequest extends Thread {
private Socket socket;
private MapManager mgr;
private Server server;
private PlayerList playerList;
public WebServerRequest(Socket socket, MapManager mgr, Server server, Debugger debugger)
public WebServerRequest(Socket socket, MapManager mgr, Server server, PlayerList playerList, Debugger debugger)
{
this.debugger = debugger;
this.socket = socket;
this.mgr = mgr;
this.server = server;
this.playerList = playerList;
}
private static void writeHttpHeader(BufferedOutputStream out, int statusCode, String statusText) throws IOException {
@ -112,7 +114,7 @@ public class WebServerRequest extends Thread {
long relativeTime = server.getTime() % 24000;
sb.append(current + " " + relativeTime + "\n");
Player[] players = server.getOnlinePlayers();
Player[] players = playerList.getVisiblePlayers();
for(Player player : players) {
sb.append("player " + player.getName() + " " + player.getLocation().getX() + " " + player.getLocation().getY() + " " + player.getLocation().getZ() + "\n");
}