From b64094795e143ff24b3fc2b7f53a5ba3f460ff8d Mon Sep 17 00:00:00 2001 From: Mike Primm Date: Sun, 15 Jan 2012 16:58:19 -0600 Subject: [PATCH] Checkpoint on split between bukkit-specific and common code core --- src/main/java/org/dynmap/ClientComponent.java | 2 +- .../dynmap/ClientConfigurationComponent.java | 17 +- .../org/dynmap/ClientUpdateComponent.java | 49 +- src/main/java/org/dynmap/ColorScheme.java | 12 +- src/main/java/org/dynmap/Component.java | 6 +- .../{DynmapPlugin.java => DynmapCore.java} | 1080 +++-------------- .../org/dynmap/DynmapPlayerChatListener.java | 4 +- src/main/java/org/dynmap/DynmapWorld.java | 73 +- .../dynmap/InternalClientUpdateComponent.java | 10 +- .../dynmap/JsonFileClientUpdateComponent.java | 35 +- src/main/java/org/dynmap/MapManager.java | 114 +- .../java/org/dynmap/MarkersComponent.java | 162 ++- src/main/java/org/dynmap/PlayerFaces.java | 36 +- src/main/java/org/dynmap/PlayerList.java | 67 +- .../org/dynmap/SimpleWebChatComponent.java | 62 +- src/main/java/org/dynmap/TestComponent.java | 2 +- .../java/org/dynmap/{ => bukkit}/Armor.java | 2 +- .../dynmap/bukkit/BukkitEventProcessor.java | 416 +++++++ .../java/org/dynmap/bukkit/BukkitWorld.java | 94 ++ .../java/org/dynmap/bukkit/DynmapPlugin.java | 846 +++++++++++++ .../{utils => bukkit}/NewMapChunkCache.java | 12 +- .../org/dynmap/common/DynmapChatColor.java | 37 + .../dynmap/common/DynmapCommandSender.java | 24 + .../dynmap/common/DynmapListenerManager.java | 124 ++ .../java/org/dynmap/common/DynmapPlayer.java | 57 + .../dynmap/common/DynmapServerInterface.java | 75 ++ src/main/java/org/dynmap/flat/FlatMap.java | 7 +- .../java/org/dynmap/hdmap/CaveHDShader.java | 3 +- .../org/dynmap/hdmap/DefaultHDLighting.java | 3 +- .../org/dynmap/hdmap/DefaultHDShader.java | 5 +- src/main/java/org/dynmap/hdmap/HDMap.java | 3 +- .../java/org/dynmap/hdmap/HDMapManager.java | 44 +- .../org/dynmap/hdmap/IsoHDPerspective.java | 5 +- .../org/dynmap/hdmap/ShadowHDLighting.java | 5 +- .../java/org/dynmap/hdmap/TexturePack.java | 14 +- .../org/dynmap/hdmap/TexturePackHDShader.java | 5 +- .../java/org/dynmap/hdmap/TopoHDShader.java | 3 +- .../org/dynmap/herochat/HeroChatHandler.java | 25 +- .../dynmap/herochat/HeroWebChatComponent.java | 50 +- .../org/dynmap/kzedmap/CaveTileRenderer.java | 5 +- .../dynmap/kzedmap/DefaultTileRenderer.java | 7 +- .../dynmap/kzedmap/HighlightTileRenderer.java | 5 +- src/main/java/org/dynmap/kzedmap/KzedMap.java | 5 +- .../dynmap/markers/impl/MarkerAPIImpl.java | 96 +- .../markers/impl/MarkerSignManager.java | 76 +- .../org/dynmap/regions/RegionsComponent.java | 4 +- .../servlet/ClientConfigurationServlet.java | 6 +- .../dynmap/servlet/ClientUpdateServlet.java | 6 +- .../dynmap/servlet/SendMessageServlet.java | 8 +- src/main/resources/plugin.yml | 2 +- 50 files changed, 2333 insertions(+), 1477 deletions(-) rename src/main/java/org/dynmap/{DynmapPlugin.java => DynmapCore.java} (55%) rename src/main/java/org/dynmap/{ => bukkit}/Armor.java (98%) create mode 100644 src/main/java/org/dynmap/bukkit/BukkitEventProcessor.java create mode 100644 src/main/java/org/dynmap/bukkit/BukkitWorld.java create mode 100644 src/main/java/org/dynmap/bukkit/DynmapPlugin.java rename src/main/java/org/dynmap/{utils => bukkit}/NewMapChunkCache.java (98%) create mode 100644 src/main/java/org/dynmap/common/DynmapChatColor.java create mode 100644 src/main/java/org/dynmap/common/DynmapCommandSender.java create mode 100644 src/main/java/org/dynmap/common/DynmapListenerManager.java create mode 100644 src/main/java/org/dynmap/common/DynmapPlayer.java create mode 100644 src/main/java/org/dynmap/common/DynmapServerInterface.java diff --git a/src/main/java/org/dynmap/ClientComponent.java b/src/main/java/org/dynmap/ClientComponent.java index 7e4e1db8..f27cf284 100644 --- a/src/main/java/org/dynmap/ClientComponent.java +++ b/src/main/java/org/dynmap/ClientComponent.java @@ -11,7 +11,7 @@ import org.json.simple.JSONObject; public class ClientComponent extends Component { private boolean disabled; - public ClientComponent(final DynmapPlugin plugin, final ConfigurationNode configuration) { + public ClientComponent(final DynmapCore plugin, final ConfigurationNode configuration) { super(plugin, configuration); plugin.events.addListener("buildclientconfiguration", new Event.Listener() { @Override diff --git a/src/main/java/org/dynmap/ClientConfigurationComponent.java b/src/main/java/org/dynmap/ClientConfigurationComponent.java index 333edf12..ec1d52eb 100644 --- a/src/main/java/org/dynmap/ClientConfigurationComponent.java +++ b/src/main/java/org/dynmap/ClientConfigurationComponent.java @@ -3,18 +3,17 @@ package org.dynmap; import static org.dynmap.JSONUtils.a; import static org.dynmap.JSONUtils.s; -import org.bukkit.Location; import org.dynmap.Event.Listener; import org.json.simple.JSONObject; public class ClientConfigurationComponent extends Component { - public ClientConfigurationComponent(final DynmapPlugin plugin, ConfigurationNode configuration) { - super(plugin, configuration); - plugin.events.addListener("buildclientconfiguration", new Listener() { + public ClientConfigurationComponent(final DynmapCore core, ConfigurationNode configuration) { + super(core, configuration); + core.events.addListener("buildclientconfiguration", new Listener() { @Override public void triggered(JSONObject t) { - ConfigurationNode c = plugin.configuration; - s(t, "confighash", plugin.getConfigHashcode()); + ConfigurationNode c = core.configuration; + s(t, "confighash", core.getConfigHashcode()); s(t, "updaterate", c.getFloat("updaterate", 1.0f)); s(t, "showplayerfacesinmenu", c.getBoolean("showplayerfacesinmenu", true)); s(t, "joinmessage", c.getString("joinmessage", "%playername% joined")); @@ -23,11 +22,11 @@ public class ClientConfigurationComponent extends Component { s(t, "webprefix", unescapeString(c.getString("webprefix", "[WEB] "))); s(t, "defaultzoom", c.getInteger("defaultzoom", 0)); s(t, "sidebaropened", c.getString("sidebaropened", "false")); - s(t, "dynmapversion", plugin.getDescription().getVersion()); + s(t, "dynmapversion", core.getDynmapCoreVersion()); s(t, "cyrillic", c.getBoolean("cyrillic-support", false)); s(t, "showlayercontrol", c.getString("showlayercontrol", "true")); s(t, "grayplayerswhenhidden", c.getBoolean("grayplayerswhenhidden", true)); - String sn = plugin.getServer().getServerName(); + String sn = core.getServer().getServerName(); if(sn.equals("Unknown Server")) sn = "Minecraft Dynamic Map"; s(t, "title", c.getString("webpage-title", sn)); @@ -36,7 +35,7 @@ public class ClientConfigurationComponent extends Component { DynmapWorld defaultWorld = null; String defmap = null; - for(DynmapWorld world : plugin.mapManager.getWorlds()) { + for(DynmapWorld world : core.mapManager.getWorlds()) { if (defaultWorld == null) defaultWorld = world; ConfigurationNode wn = world.configuration; JSONObject wo = new JSONObject(); diff --git a/src/main/java/org/dynmap/ClientUpdateComponent.java b/src/main/java/org/dynmap/ClientUpdateComponent.java index 75a4d08c..ea60abc9 100644 --- a/src/main/java/org/dynmap/ClientUpdateComponent.java +++ b/src/main/java/org/dynmap/ClientUpdateComponent.java @@ -3,19 +3,14 @@ package org.dynmap; import static org.dynmap.JSONUtils.a; import static org.dynmap.JSONUtils.s; -import java.util.Set; - -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.entity.Player; -import org.dynmap.utils.BlockLightLevel; +import java.util.List; +import org.dynmap.common.DynmapPlayer; import org.json.simple.JSONArray; import org.json.simple.JSONObject; public class ClientUpdateComponent extends Component { - private BlockLightLevel bll = new BlockLightLevel(); - public ClientUpdateComponent(final DynmapPlugin plugin, ConfigurationNode configuration) { + public ClientUpdateComponent(final DynmapCore plugin, ConfigurationNode configuration) { super(plugin, configuration); plugin.events.addListener("buildclientupdate", new Event.Listener() { @Override @@ -34,17 +29,19 @@ public class ClientUpdateComponent extends Component { int hideifunder = configuration.getInteger("hideifundercover", 15); boolean hideifsneaking = configuration.getBoolean("hideifsneaking", false); - s(u, "confighash", plugin.getConfigHashcode()); + s(u, "confighash", core.getConfigHashcode()); s(u, "servertime", world.getTime() % 24000); s(u, "hasStorm", world.hasStorm()); s(u, "isThundering", world.isThundering()); s(u, "players", new JSONArray()); - Player[] players = plugin.playerList.getVisiblePlayers(); - for(int i=0;i players = core.playerList.getVisiblePlayers(); + for(DynmapPlayer p : players) { + DynmapLocation pl = p.getLocation(); + DynmapWorld pw = core.getWorld(pl.world); + if(pw == null) + continue; JSONObject jp = new JSONObject(); boolean hide = false; @@ -52,16 +49,16 @@ public class ClientUpdateComponent extends Component { s(jp, "name", Client.stripColor(p.getDisplayName())); s(jp, "account", p.getName()); if(hideifshadow < 15) { - if(pl.getBlock().getLightLevel() <= hideifshadow) + if(pw.getLightLevel((int)pl.x, (int)pl.y, (int)pl.z) <= hideifshadow) hide = true; } if(hideifunder < 15) { - if(bll.isReady()) { /* If we can get real sky level */ - if(bll.getSkyLightLevel(pl.getBlock()) <= hideifunder) + if(pw.canGetSkyLightLevel()) { /* If we can get real sky level */ + if(pw.getSkyLightLevel((int)pl.x, (int)pl.y, (int)pl.z) <= hideifunder) hide = true; } else { - if(pl.getWorld().getHighestBlockYAt(pl) > pl.getBlockY()) + if(pw.getHighestBlockYAt((int)pl.x, (int)pl.z) > pl.y) hide = true; } } @@ -69,14 +66,14 @@ public class ClientUpdateComponent extends Component { hide = true; /* Don't leak player location for world not visible on maps, or if sendposition disbaled */ - DynmapWorld pworld = MapManager.mapman.worldsLookup.get(p.getWorld().getName()); + DynmapWorld pworld = MapManager.mapman.worldsLookup.get(pl.world); /* Fix typo on 'sendpositon' to 'sendposition', keep bad one in case someone used it */ if(configuration.getBoolean("sendposition", true) && configuration.getBoolean("sendpositon", true) && (pworld != null) && pworld.sendposition && (!hide)) { - s(jp, "world", p.getWorld().getName()); - s(jp, "x", pl.getX()); - s(jp, "y", pl.getY()); - s(jp, "z", pl.getZ()); + s(jp, "world", pl.world); + s(jp, "x", pl.x); + s(jp, "y", pl.y); + s(jp, "z", pl.z); } else { s(jp, "world", "-some-other-bogus-world-"); @@ -87,7 +84,7 @@ public class ClientUpdateComponent extends Component { /* Only send health if enabled AND we're on visible world */ if (configuration.getBoolean("sendhealth", false) && (pworld != null) && pworld.sendhealth && (!hide)) { s(jp, "health", p.getHealth()); - s(jp, "armor", Armor.getArmorPoints(p)); + s(jp, "armor", p.getArmorPoints()); } else { s(jp, "health", 0); @@ -96,8 +93,8 @@ public class ClientUpdateComponent extends Component { a(u, "players", jp); } if(configuration.getBoolean("includehiddenplayers", false)) { - Set hidden = plugin.playerList.getHiddenPlayers(); - for(Player p : hidden) { + List hidden = core.playerList.getHiddenPlayers(); + for(DynmapPlayer p : hidden) { JSONObject jp = new JSONObject(); s(jp, "type", "player"); s(jp, "name", Client.stripColor(p.getDisplayName())); @@ -113,7 +110,7 @@ public class ClientUpdateComponent extends Component { } s(u, "updates", new JSONArray()); - for(Object update : plugin.mapManager.getWorldUpdates(worldName, since)) { + for(Object update : core.mapManager.getWorldUpdates(worldName, since)) { a(u, "updates", (Client.Update)update); } } diff --git a/src/main/java/org/dynmap/ColorScheme.java b/src/main/java/org/dynmap/ColorScheme.java index 1636bfc3..926ab184 100644 --- a/src/main/java/org/dynmap/ColorScheme.java +++ b/src/main/java/org/dynmap/ColorScheme.java @@ -39,23 +39,23 @@ public class ColorScheme { } } - private static File getColorSchemeDirectory() { - return new File(DynmapPlugin.dataDirectory, "colorschemes"); + private static File getColorSchemeDirectory(DynmapCore core) { + return new File(core.getDataFolder(), "colorschemes"); } - public static ColorScheme getScheme(String name) { + public static ColorScheme getScheme(DynmapCore core, String name) { if (name == null) name = "default"; ColorScheme scheme = cache.get(name); if (scheme == null) { - scheme = loadScheme(name); + scheme = loadScheme(core, name); cache.put(name, scheme); } return scheme; } - public static ColorScheme loadScheme(String name) { - File colorSchemeFile = new File(getColorSchemeDirectory(), name + ".txt"); + public static ColorScheme loadScheme(DynmapCore core, String name) { + File colorSchemeFile = new File(getColorSchemeDirectory(core), name + ".txt"); Color[][] colors = new Color[256][]; Color[][][] datacolors = new Color[256][][]; Color[][] biomecolors = new Color[Biome.values().length][]; diff --git a/src/main/java/org/dynmap/Component.java b/src/main/java/org/dynmap/Component.java index 9267ecbf..0d6a47f6 100644 --- a/src/main/java/org/dynmap/Component.java +++ b/src/main/java/org/dynmap/Component.java @@ -1,10 +1,10 @@ package org.dynmap; public abstract class Component { - protected DynmapPlugin plugin; + protected DynmapCore core; protected ConfigurationNode configuration; - public Component(DynmapPlugin plugin, ConfigurationNode configuration) { - this.plugin = plugin; + public Component(DynmapCore core, ConfigurationNode configuration) { + this.core = core; this.configuration = configuration; } diff --git a/src/main/java/org/dynmap/DynmapPlugin.java b/src/main/java/org/dynmap/DynmapCore.java similarity index 55% rename from src/main/java/org/dynmap/DynmapPlugin.java rename to src/main/java/org/dynmap/DynmapCore.java index 4cb5c7c3..0b14d4e6 100644 --- a/src/main/java/org/dynmap/DynmapPlugin.java +++ b/src/main/java/org/dynmap/DynmapCore.java @@ -17,50 +17,12 @@ import java.util.List; import java.util.Map; import java.util.Set; -import org.bukkit.Chunk; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.World.Environment; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.entity.Player; -import org.bukkit.event.CustomEventListener; -import org.bukkit.event.Event; -import org.bukkit.event.Event.Type; -import org.bukkit.event.Listener; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockBurnEvent; -import org.bukkit.event.block.BlockFadeEvent; -import org.bukkit.event.block.BlockFormEvent; -import org.bukkit.event.block.BlockFromToEvent; -import org.bukkit.event.block.BlockListener; -import org.bukkit.event.block.BlockPhysicsEvent; -import org.bukkit.event.block.BlockPistonExtendEvent; -import org.bukkit.event.block.BlockPistonRetractEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.block.BlockSpreadEvent; -import org.bukkit.event.block.LeavesDecayEvent; -import org.bukkit.event.entity.EntityExplodeEvent; -import org.bukkit.event.entity.EntityListener; -import org.bukkit.event.player.PlayerBedLeaveEvent; -import org.bukkit.event.player.PlayerChatEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerListener; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerMoveEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.world.ChunkLoadEvent; -import org.bukkit.event.world.ChunkPopulateEvent; -import org.bukkit.event.world.SpawnChangeEvent; -import org.bukkit.event.world.WorldListener; -import org.bukkit.event.world.WorldLoadEvent; -import org.bukkit.event.world.WorldUnloadEvent; -import org.bukkit.plugin.PluginDescriptionFile; -import org.bukkit.plugin.PluginManager; -import org.bukkit.plugin.java.JavaPlugin; +import org.dynmap.common.DynmapCommandSender; +import org.dynmap.common.DynmapListenerManager; +import org.dynmap.common.DynmapListenerManager.EventType; +import org.dynmap.common.DynmapPlayer; +import org.dynmap.common.DynmapServerInterface; import org.dynmap.debug.Debug; import org.dynmap.debug.Debugger; import org.dynmap.hdmap.HDBlockModels; @@ -68,10 +30,6 @@ import org.dynmap.hdmap.HDMapManager; import org.dynmap.hdmap.TexturePack; import org.dynmap.markers.MarkerAPI; import org.dynmap.markers.impl.MarkerAPIImpl; -import org.dynmap.permissions.BukkitPermissions; -import org.dynmap.permissions.NijikokunPermissions; -import org.dynmap.permissions.OpPermissions; -import org.dynmap.permissions.PermissionProvider; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.ServletContextHandler; @@ -82,16 +40,16 @@ import javax.servlet.*; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletResponse; -public class DynmapPlugin extends JavaPlugin implements DynmapAPI { - private String version; +public class DynmapCore { + private DynmapServerInterface server; + private String version = "0.30-dev"; private Server webServer = null; private ServletContextHandler webServerContextHandler = null; public MapManager mapManager = null; public PlayerList playerList; public ConfigurationNode configuration; - public HashSet enabledTriggers = new HashSet(); - public PermissionProvider permissions; public ComponentManager componentManager = new ComponentManager(); + public DynmapListenerManager listenerManager = new DynmapListenerManager(this); public PlayerFaces playerfacemgr; public Events events = new Events(); public String deftemplatesuffix = ""; @@ -99,6 +57,7 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { boolean waterbiomeshading = false; boolean fencejoin = false; boolean bettergrass = false; + private HashSet enabledTriggers = new HashSet(); public CompassMode compassmode = CompassMode.PRE19; private int config_hashcode; /* Used to signal need to reload web configuration (world changes, config update, etc) */ @@ -115,16 +74,47 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { /* Flag to let code know that we're doing reload - make sure we don't double-register event handlers */ public boolean is_reload = false; - private static boolean ignore_chunk_loads = false; /* Flag keep us from processing our own chunk loads */ - - private HashMap> event_handlers = new HashMap>(); + public static boolean ignore_chunk_loads = false; /* Flag keep us from processing our own chunk loads */ private MarkerAPIImpl markerapi; - public static File dataDirectory; - public static File tilesDirectory; + private File dataDirectory; + private File tilesDirectory; + private String plugin_ver; + private String mc_ver; + + /* Constructor for core */ + public DynmapCore() { + } - public MapManager getMapManager() { + /* Cleanup method */ + public void cleanup() { + server = null; + markerapi = null; + } + + /* Dependencies - need to be supplied by plugin wrapper */ + public void setPluginVersion(String pluginver) { + plugin_ver = pluginver; + } + public void setDataFolder(File dir) { + dataDirectory = dir; + } + public final File getDataFolder() { + return dataDirectory; + } + public final File getTilesFolder() { + return tilesDirectory; + } + public void setMinecraftVersion(String mcver) { + mc_ver = mcver; + } + public void setServer(DynmapServerInterface srv) { + server = srv; + } + public final DynmapServerInterface getServer() { return server; } + + public final MapManager getMapManager() { return mapManager; } @@ -228,31 +218,17 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { } } } - - @Override - public void onEnable() { - PluginDescriptionFile pdfFile = this.getDescription(); - version = pdfFile.getVersion(); - + + public boolean enableCore() { /* Start with clean events */ events = new Events(); - permissions = NijikokunPermissions.create(getServer(), "dynmap"); - if (permissions == null) - permissions = BukkitPermissions.create("dynmap"); - if (permissions == null) - permissions = new OpPermissions(new String[] { "fullrender", "cancelrender", "radiusrender", "resetstats", "reload", "purgequeue", "pause", "ips-for-id", "ids-for-ip", "add-id-for-ip", "del-id-for-ip" }); - - dataDirectory = this.getDataFolder(); - if(dataDirectory.exists() == false) - dataDirectory.mkdirs(); - /* Initialize confguration.txt if needed */ - File f = new File(this.getDataFolder(), "configuration.txt"); + File f = new File(dataDirectory, "configuration.txt"); if(!createDefaultFileFromResource("/configuration.txt", f)) { - this.setEnabled(false); - return; + return false; } + /* Load configuration.txt */ org.bukkit.util.config.Configuration bukkitConfiguration = new org.bukkit.util.config.Configuration(f); bukkitConfiguration.load(); @@ -269,10 +245,9 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { TexturePack.loadTextureMapping(dataDirectory, configuration); /* Now, process worlds.txt - merge it in as an override of existing values (since it is only user supplied values) */ - f = new File(this.getDataFolder(), "worlds.txt"); + f = new File(dataDirectory, "worlds.txt"); if(!createDefaultFileFromResource("/worlds.txt", f)) { - this.setEnabled(false); - return; + return false; } org.bukkit.util.config.Configuration cfg = new org.bukkit.util.config.Configuration(f); cfg.load(); @@ -285,14 +260,15 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { Log.verbose = configuration.getBoolean("verbose", true); deftemplatesuffix = configuration.getString("deftemplatesuffix", ""); /* Default swamp shading off for 1.8, on after */ - swampshading = configuration.getBoolean("swampshaded", !getServer().getVersion().contains("(MC: 1.8")); + boolean post_1_8 = mc_ver.contains("1.8."); + swampshading = configuration.getBoolean("swampshaded", post_1_8); /* Default water biome shading off for 1.8, on after */ - waterbiomeshading = configuration.getBoolean("waterbiomeshaded", !getServer().getVersion().contains("(MC: 1.8")); + waterbiomeshading = configuration.getBoolean("waterbiomeshaded", post_1_8); /* Default fence-to-block-join off for 1.8, on after */ - fencejoin = configuration.getBoolean("fence-to-block-join", !getServer().getVersion().contains("(MC: 1.8")); + fencejoin = configuration.getBoolean("fence-to-block-join", post_1_8); /* Default compassmode to pre19, to newrose after */ - String cmode = configuration.getString("compass-mode", getServer().getVersion().contains("(MC: 1.8")?"pre19":"newrose"); + String cmode = configuration.getString("compass-mode", post_1_8?"newrose":"pre19"); if(cmode.equals("newnorth")) compassmode = CompassMode.NEWNORTH; else if(cmode.equals("newrose")) @@ -317,53 +293,6 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { playerList = new PlayerList(getServer(), getFile("hiddenplayers.txt"), configuration); playerList.load(); - PlayerListener pl = new PlayerListener() { - public void onPlayerJoin(PlayerJoinEvent evt) { - Player p = evt.getPlayer(); - playerList.updateOnlinePlayers(null); - if(fullrenderplayerlimit > 0) { - if((getServer().getOnlinePlayers().length+1) >= fullrenderplayerlimit) { - if(getPauseFullRadiusRenders() == false) { /* If not paused, pause it */ - setPauseFullRadiusRenders(true); - Log.info("Pause full/radius renders - player limit reached"); - didfullpause = true; - } - } - } - /* Add player info to IP-to-ID table */ - InetSocketAddress addr = p.getAddress(); - if(addr != null) { - String ip = addr.getAddress().getHostAddress(); - LinkedList ids = ids_by_ip.get(ip); - if(ids == null) { - ids = new LinkedList(); - ids_by_ip.put(ip, ids); - } - String pid = p.getName(); - if(ids.indexOf(pid) != 0) { - ids.remove(pid); /* Remove from list */ - ids.addFirst(pid); /* Put us first on list */ - } - } - /* And re-attach to active jobs */ - if(mapManager != null) - mapManager.connectTasksToPlayer(p); - } - public void onPlayerQuit(PlayerQuitEvent evt) { - playerList.updateOnlinePlayers(evt.getPlayer()); - if(fullrenderplayerlimit > 0) { - if((getServer().getOnlinePlayers().length-1) < fullrenderplayerlimit) { - if(didfullpause) { /* Only unpause if we did the pause */ - setPauseFullRadiusRenders(false); - Log.info("Resume full/radius renders - below player limit"); - didfullpause = false; - } - } - } - } - }; - registerEvent(Type.PLAYER_JOIN, pl); - registerEvent(Type.PLAYER_QUIT, pl); mapManager = new MapManager(this, configuration); mapManager.startRendering(); @@ -384,23 +313,82 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { } // Load components. - for(Component component : configuration.createInstances("components", new Class[] { DynmapPlugin.class }, new Object[] { this })) { + for(Component component : configuration.createInstances("components", new Class[] { DynmapCore.class }, new Object[] { this })) { componentManager.add(component); } Log.verboseinfo("Loaded " + componentManager.components.size() + " components."); - registerEvents(); - if (!configuration.getBoolean("disable-webserver", false)) { startWebserver(); } + /* Add login/logoff listeners */ + listenerManager.addListener(EventType.PLAYER_JOIN, new DynmapListenerManager.PlayerEventListener() { + @Override + public void playerEvent(DynmapPlayer p) { + playerJoined(p); + } + }); + listenerManager.addListener(EventType.PLAYER_QUIT, new DynmapListenerManager.PlayerEventListener() { + @Override + public void playerEvent(DynmapPlayer p) { + playerQuit(p); + } + }); + /* Print version info */ Log.info("version " + version + " is enabled" ); events.trigger("initialized", null); + + return true; } + private void playerJoined(DynmapPlayer p) { + playerList.updateOnlinePlayers(null); + if(fullrenderplayerlimit > 0) { + if((getServer().getOnlinePlayers().length+1) >= fullrenderplayerlimit) { + if(getPauseFullRadiusRenders() == false) { /* If not paused, pause it */ + setPauseFullRadiusRenders(true); + Log.info("Pause full/radius renders - player limit reached"); + didfullpause = true; + } + } + } + /* Add player info to IP-to-ID table */ + InetSocketAddress addr = p.getAddress(); + if(addr != null) { + String ip = addr.getAddress().getHostAddress(); + LinkedList ids = ids_by_ip.get(ip); + if(ids == null) { + ids = new LinkedList(); + ids_by_ip.put(ip, ids); + } + String pid = p.getName(); + if(ids.indexOf(pid) != 0) { + ids.remove(pid); /* Remove from list */ + ids.addFirst(pid); /* Put us first on list */ + } + } + /* And re-attach to active jobs */ + if(mapManager != null) + mapManager.connectTasksToPlayer(p); + } + + /* Called by plugin each time a player quits the server */ + private void playerQuit(DynmapPlayer p) { + playerList.updateOnlinePlayers(p.getName()); + if(fullrenderplayerlimit > 0) { + if((getServer().getOnlinePlayers().length-1) < fullrenderplayerlimit) { + if(didfullpause) { /* Only unpause if we did the pause */ + setPauseFullRadiusRenders(false); + Log.info("Resume full/radius renders - below player limit"); + didfullpause = false; + } + } + } + } + public void updateConfigHashcode() { config_hashcode = (int)System.currentTimeMillis(); } @@ -436,7 +424,6 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { private HashSet banned_ips = new HashSet(); private HashSet banned_ips_notified = new HashSet(); private long last_loaded = 0; - private long lastmod = 0; private static final long BANNED_RELOAD_INTERVAL = 15000; /* Every 15 seconds */ @Override @@ -527,8 +514,7 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { } } - @Override - public void onDisable() { + public void disableCore() { if(persist_ids_by_ip) saveIDsByIP(); if (componentManager != null) { @@ -553,342 +539,14 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { } webServer = null; } - /* Clean up all registered handlers */ - for(Event.Type t : event_handlers.keySet()) { - List ll = event_handlers.get(t); - ll.clear(); /* Empty list - we use presence of list to remember that we've registered with Bukkit */ - } playerfacemgr = null; + /* Clean up registered listeners */ + listenerManager.cleanup(); /* Don't clean up markerAPI - other plugins may still be accessing it */ Debug.clearDebuggers(); } - - public boolean isTrigger(String s) { - return enabledTriggers.contains(s); - } - - private boolean onplace; - private boolean onbreak; - private boolean onblockform; - private boolean onblockfade; - private boolean onblockspread; - private boolean onblockfromto; - private boolean onblockphysics; - private boolean onleaves; - private boolean onburn; - private boolean onpiston; - private boolean onplayerjoin; - private boolean onplayermove; - private boolean ongeneratechunk; - private boolean onloadchunk; - private boolean onexplosion; - - public void registerEvents() { - - - BlockListener blockTrigger = new BlockListener() { - @Override - public void onBlockPlace(BlockPlaceEvent event) { - if(event.isCancelled()) - return; - Location loc = event.getBlock().getLocation(); - String wn = loc.getWorld().getName(); - mapManager.sscache.invalidateSnapshot(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); - if(onplace) { - mapManager.touch(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), "blockplace"); - } - } - - @Override - public void onBlockBreak(BlockBreakEvent event) { - if(event.isCancelled()) - return; - Location loc = event.getBlock().getLocation(); - String wn = loc.getWorld().getName(); - mapManager.sscache.invalidateSnapshot(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); - if(onbreak) { - mapManager.touch(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), "blockbreak"); - } - } - - @Override - public void onLeavesDecay(LeavesDecayEvent event) { - if(event.isCancelled()) - return; - Location loc = event.getBlock().getLocation(); - String wn = loc.getWorld().getName(); - mapManager.sscache.invalidateSnapshot(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); - if(onleaves) { - mapManager.touch(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), "leavesdecay"); - } - } - - @Override - public void onBlockBurn(BlockBurnEvent event) { - if(event.isCancelled()) - return; - Location loc = event.getBlock().getLocation(); - String wn = loc.getWorld().getName(); - mapManager.sscache.invalidateSnapshot(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); - if(onburn) { - mapManager.touch(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), "blockburn"); - } - } - - @Override - public void onBlockForm(BlockFormEvent event) { - if(event.isCancelled()) - return; - Location loc = event.getBlock().getLocation(); - String wn = loc.getWorld().getName(); - mapManager.sscache.invalidateSnapshot(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); - if(onblockform) { - mapManager.touch(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), "blockform"); - } - } - - @Override - public void onBlockFade(BlockFadeEvent event) { - if(event.isCancelled()) - return; - Location loc = event.getBlock().getLocation(); - String wn = loc.getWorld().getName(); - mapManager.sscache.invalidateSnapshot(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); - if(onblockfade) { - mapManager.touch(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), "blockfade"); - } - } - - @Override - public void onBlockSpread(BlockSpreadEvent event) { - if(event.isCancelled()) - return; - Location loc = event.getBlock().getLocation(); - String wn = loc.getWorld().getName(); - mapManager.sscache.invalidateSnapshot(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); - if(onblockspread) { - mapManager.touch(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), "blockspread"); - } - } - - @Override - public void onBlockFromTo(BlockFromToEvent event) { - if(event.isCancelled()) - return; - Location loc = event.getToBlock().getLocation(); - String wn = loc.getWorld().getName(); - mapManager.sscache.invalidateSnapshot(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); - if(onblockfromto) - mapManager.touch(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), "blockfromto"); - loc = event.getBlock().getLocation(); - wn = loc.getWorld().getName(); - mapManager.sscache.invalidateSnapshot(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); - if(onblockfromto) - mapManager.touch(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), "blockfromto"); - } - - @Override - public void onBlockPhysics(BlockPhysicsEvent event) { - if(event.isCancelled()) - return; - Location loc = event.getBlock().getLocation(); - String wn = loc.getWorld().getName(); - mapManager.sscache.invalidateSnapshot(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); - if(onblockphysics) { - mapManager.touch(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), "blockphysics"); - } - } - - @Override - public void onBlockPistonRetract(BlockPistonRetractEvent event) { - if(event.isCancelled()) - return; - Block b = event.getBlock(); - Location loc = b.getLocation(); - BlockFace dir; - try { /* Workaround Bukkit bug = http://leaky.bukkit.org/issues/1227 */ - dir = event.getDirection(); - } catch (ClassCastException ccx) { - dir = BlockFace.NORTH; - } - String wn = loc.getWorld().getName(); - int x = loc.getBlockX(), y = loc.getBlockY(), z = loc.getBlockZ(); - mapManager.sscache.invalidateSnapshot(wn, x, y, z); - if(onpiston) - mapManager.touch(wn, x, y, z, "pistonretract"); - for(int i = 0; i < 2; i++) { - x += dir.getModX(); - y += dir.getModY(); - z += dir.getModZ(); - mapManager.sscache.invalidateSnapshot(wn, x, y, z); - if(onpiston) - mapManager.touch(wn, x, y, z, "pistonretract"); - } - } - @Override - public void onBlockPistonExtend(BlockPistonExtendEvent event) { - if(event.isCancelled()) - return; - Block b = event.getBlock(); - Location loc = b.getLocation(); - BlockFace dir; - try { /* Workaround Bukkit bug = http://leaky.bukkit.org/issues/1227 */ - dir = event.getDirection(); - } catch (ClassCastException ccx) { - dir = BlockFace.NORTH; - } - String wn = loc.getWorld().getName(); - int x = loc.getBlockX(), y = loc.getBlockY(), z = loc.getBlockZ(); - mapManager.sscache.invalidateSnapshot(wn, x, y, z); - if(onpiston) - mapManager.touch(wn, x, y, z, "pistonretract"); - for(int i = 0; i < 1+event.getLength(); i++) { - x += dir.getModX(); - y += dir.getModY(); - z += dir.getModZ(); - mapManager.sscache.invalidateSnapshot(wn, x, y, z); - if(onpiston) - mapManager.touch(wn, x, y, z, "pistonretract"); - } - } - }; - - // To trigger rendering. - onplace = isTrigger("blockplaced"); - registerEvent(Event.Type.BLOCK_PLACE, blockTrigger); - - onbreak = isTrigger("blockbreak"); - registerEvent(Event.Type.BLOCK_BREAK, blockTrigger); - - if(isTrigger("snowform")) Log.info("The 'snowform' trigger has been deprecated due to Bukkit changes - use 'blockformed'"); - - onleaves = isTrigger("leavesdecay"); - registerEvent(Event.Type.LEAVES_DECAY, blockTrigger); - - onburn = isTrigger("blockburn"); - registerEvent(Event.Type.BLOCK_BURN, blockTrigger); - - onblockform = isTrigger("blockformed"); - registerEvent(Event.Type.BLOCK_FORM, blockTrigger); - - onblockfade = isTrigger("blockfaded"); - registerEvent(Event.Type.BLOCK_FADE, blockTrigger); - - onblockspread = isTrigger("blockspread"); - registerEvent(Event.Type.BLOCK_SPREAD, blockTrigger); - - onblockfromto = isTrigger("blockfromto"); - registerEvent(Event.Type.BLOCK_FROMTO, blockTrigger); - - onblockphysics = isTrigger("blockphysics"); - registerEvent(Event.Type.BLOCK_PHYSICS, blockTrigger); - - onpiston = isTrigger("pistonmoved"); - registerEvent(Event.Type.BLOCK_PISTON_EXTEND, blockTrigger); - registerEvent(Event.Type.BLOCK_PISTON_RETRACT, blockTrigger); - /* Register player event trigger handlers */ - PlayerListener playerTrigger = new PlayerListener() { - @Override - public void onPlayerJoin(PlayerJoinEvent event) { - Location loc = event.getPlayer().getLocation(); - mapManager.touch(loc.getWorld().getName(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), "playerjoin"); - } - - @Override - public void onPlayerMove(PlayerMoveEvent event) { - Location loc = event.getPlayer().getLocation(); - mapManager.touch(loc.getWorld().getName(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), "playermove"); - } - }; - - onplayerjoin = isTrigger("playerjoin"); - onplayermove = isTrigger("playermove"); - if(onplayerjoin) - registerEvent(Event.Type.PLAYER_JOIN, playerTrigger); - if(onplayermove) - registerEvent(Event.Type.PLAYER_MOVE, playerTrigger); - - /* Register entity event triggers */ - EntityListener entityTrigger = new EntityListener() { - @Override - public void onEntityExplode(EntityExplodeEvent event) { - Location loc = event.getLocation(); - String wname = loc.getWorld().getName(); - int minx, maxx, miny, maxy, minz, maxz; - minx = maxx = loc.getBlockX(); - miny = maxy = loc.getBlockY(); - minz = maxz = loc.getBlockZ(); - /* Calculate volume impacted by explosion */ - List blocks = event.blockList(); - for(Block b: blocks) { - Location l = b.getLocation(); - int x = l.getBlockX(); - if(x < minx) minx = x; - if(x > maxx) maxx = x; - int y = l.getBlockY(); - if(y < miny) miny = y; - if(y > maxy) maxy = y; - int z = l.getBlockZ(); - if(z < minz) minz = z; - if(z > maxz) maxz = z; - } - mapManager.sscache.invalidateSnapshot(wname, minx, miny, minz, maxx, maxy, maxz); - if(onexplosion) { - mapManager.touchVolume(wname, minx, miny, minz, maxx, maxy, maxz, "entityexplode"); - } - } - }; - onexplosion = isTrigger("explosion"); - registerEvent(Event.Type.ENTITY_EXPLODE, entityTrigger); - - - /* Register world event triggers */ - WorldListener worldTrigger = new WorldListener() { - @Override - public void onChunkLoad(ChunkLoadEvent event) { - if(ignore_chunk_loads) - return; - Chunk c = event.getChunk(); - /* Touch extreme corners */ - int x = c.getX() << 4; - int z = c.getZ() << 4; - mapManager.touchVolume(event.getWorld().getName(), x, 0, z, x+15, 128, z+16, "chunkload"); - } - @Override - public void onChunkPopulate(ChunkPopulateEvent event) { - Chunk c = event.getChunk(); - /* Touch extreme corners */ - int x = c.getX() << 4; - int z = c.getZ() << 4; - mapManager.touchVolume(event.getWorld().getName(), x, 0, z, x+15, 128, z+16, "chunkpopulate"); - } - @Override - public void onWorldLoad(WorldLoadEvent event) { - updateConfigHashcode(); - mapManager.activateWorld(event.getWorld()); - } - @Override - public void onWorldUnload(WorldUnloadEvent event) { - updateConfigHashcode(); - mapManager.deactivateWorld(event.getWorld().getName()); - } - }; - - ongeneratechunk = isTrigger("chunkgenerated"); - if(ongeneratechunk) { - registerEvent(Event.Type.CHUNK_POPULATED, worldTrigger); - } - onloadchunk = isTrigger("chunkloaded"); - if(onloadchunk) { - registerEvent(Event.Type.CHUNK_LOAD, worldTrigger); - } - - // To link configuration to real loaded worlds. - registerEvent(Event.Type.WORLD_LOAD, worldTrigger); - registerEvent(Event.Type.WORLD_UNLOAD, worldTrigger); - } private static File combinePaths(File parent, String path) { return combinePaths(parent, new File(path)); @@ -910,7 +568,7 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { for (ConfigurationNode debuggerConfiguration : debuggersConfiguration) { try { Class debuggerClass = Class.forName((String) debuggerConfiguration.getString("class")); - Constructor constructor = debuggerClass.getConstructor(JavaPlugin.class, ConfigurationNode.class); + Constructor constructor = debuggerClass.getConstructor(DynmapCore.class, ConfigurationNode.class); Debugger debugger = (Debugger) constructor.newInstance(this, debuggerConfiguration); Debug.addDebugger(debugger); } catch (Exception e) { @@ -922,7 +580,7 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { } /* Parse argument strings : handle quoted strings */ - public static String[] parseArgs(String[] args, CommandSender snd) { + public static String[] parseArgs(String[] args, DynmapCommandSender snd) { ArrayList rslt = new ArrayList(); /* Build command line, so we can parse our way - make sure there is trailing space */ String cmdline = ""; @@ -979,16 +637,15 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { "add-id-for-ip", "del-id-for-ip"})); - @Override - public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) { - if(cmd.getName().equalsIgnoreCase("dmarker")) { + public boolean processCommand(DynmapCommandSender sender, String cmd, String commandLabel, String[] args) { + if(cmd.equalsIgnoreCase("dmarker")) { return MarkerAPIImpl.onCommand(this, sender, cmd, commandLabel, args); } - if (!cmd.getName().equalsIgnoreCase("dynmap")) + if (!cmd.equalsIgnoreCase("dynmap")) return false; - Player player = null; - if (sender instanceof Player) - player = (Player) sender; + DynmapPlayer player = null; + if (sender instanceof DynmapPlayer) + player = (DynmapPlayer) sender; /* Re-parse args - handle doublequotes */ args = parseArgs(args, sender); @@ -1003,9 +660,9 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { if (c.equals("render") && checkPlayerPermission(sender,"render")) { if (player != null) { - Location loc = player.getLocation(); + DynmapLocation loc = player.getLocation(); - mapManager.touch(loc.getWorld().getName(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), "render"); + mapManager.touch(loc.world, (int)loc.x, (int)loc.y, (int)loc.z, "render"); sender.sendMessage("Tile render queued."); } @@ -1024,7 +681,7 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { if(args.length > 2) mapname = args[2]; if (player != null) - loc = toLoc(player.getLocation()); + loc = player.getLocation(); else sender.sendMessage("Command require if issued from console."); } @@ -1052,7 +709,7 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { if(args.length > 2) mapname = args[2]; if (player != null) - loc = toLoc(player.getLocation()); + loc = player.getLocation(); else sender.sendMessage("Command require if issued from console."); } @@ -1116,7 +773,7 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { sender.sendMessage("World '" + wname + "' not defined/loaded"); } } else if (player != null) { - DynmapLocation loc = toLoc(player.getLocation()); + DynmapLocation loc = player.getLocation(); if(args.length > 1) map = args[1]; if(loc != null) @@ -1127,16 +784,16 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { } else if (c.equals("cancelrender") && checkPlayerPermission(sender,"cancelrender")) { if (args.length > 1) { for (int i = 1; i < args.length; i++) { - World w = getServer().getWorld(args[i]); + DynmapWorld w = mapManager.getWorld(args[i]); if(w != null) - mapManager.cancelRender(w,sender); + mapManager.cancelRender(w.getName(), sender); else sender.sendMessage("World '" + args[i] + "' not defined/loaded"); } } else if (player != null) { - Location loc = player.getLocation(); + DynmapLocation loc = player.getLocation(); if(loc != null) - mapManager.cancelRender(loc.getWorld(), sender); + mapManager.cancelRender(loc.world, sender); } else { sender.sendMessage("World name is required"); } @@ -1144,7 +801,7 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { mapManager.purgeQueue(sender); } else if (c.equals("reload") && checkPlayerPermission(sender, "reload")) { sender.sendMessage("Reloading Dynmap..."); - reload(); + getServer().reload(); sender.sendMessage("Dynmap reloaded"); } else if (c.equals("stats") && checkPlayerPermission(sender, "stats")) { if(args.length == 1) @@ -1251,17 +908,17 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { return false; } - public boolean checkPlayerPermission(CommandSender sender, String permission) { - if (!(sender instanceof Player) || sender.isOp()) { + public boolean checkPlayerPermission(DynmapCommandSender sender, String permission) { + if (!(sender instanceof DynmapPlayer) || sender.isOp()) { return true; - } else if (!permissions.has(sender, permission.toLowerCase())) { + } else if (!sender.hasPrivilege(permission.toLowerCase())) { sender.sendMessage("You don't have permission to use this command!"); return false; } return true; } - public ConfigurationNode getWorldConfiguration(World world) { + public ConfigurationNode getWorldConfiguration(DynmapWorld world) { ConfigurationNode finalConfiguration = new ConfigurationNode(); finalConfiguration.put("name", world.getName()); finalConfiguration.put("title", world.getName()); @@ -1294,9 +951,8 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { return finalConfiguration; } - private ConfigurationNode getDefaultTemplateConfigurationNode(World world) { - Environment environment = world.getEnvironment(); - String environmentName = environment.name().toLowerCase(); + private ConfigurationNode getDefaultTemplateConfigurationNode(DynmapWorld world) { + String environmentName = world.getEnvironment(); if(deftemplatesuffix.length() > 0) { environmentName += "-" + deftemplatesuffix; } @@ -1321,11 +977,6 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { return null; } - public void reload() { - PluginManager pluginManager = getServer().getPluginManager(); - pluginManager.disablePlugin(this); - pluginManager.enablePlugin(this); - } public String getWebPath() { return configuration.getString("webpath", "web"); @@ -1422,345 +1073,7 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { return true; } - private BlockListener ourBlockEventHandler = new BlockListener() { - - @Override - public void onBlockPlace(BlockPlaceEvent event) { - if(event.isCancelled()) - return; - /* Call listeners */ - List ll = event_handlers.get(event.getType()); - if(ll != null) { - for(Listener l : ll) { - ((BlockListener)l).onBlockPlace(event); - } - } - } - @Override - public void onBlockBreak(BlockBreakEvent event) { - if(event.isCancelled()) - return; - /* Call listeners */ - List ll = event_handlers.get(event.getType()); - if(ll != null) { - for(Listener l : ll) { - ((BlockListener)l).onBlockBreak(event); - } - } - } - - @Override - public void onLeavesDecay(LeavesDecayEvent event) { - if(event.isCancelled()) - return; - /* Call listeners */ - List ll = event_handlers.get(event.getType()); - if(ll != null) { - for(Listener l : ll) { - ((BlockListener)l).onLeavesDecay(event); - } - } - } - - @Override - public void onBlockBurn(BlockBurnEvent event) { - if(event.isCancelled()) - return; - /* Call listeners */ - List ll = event_handlers.get(event.getType()); - if(ll != null) { - for(Listener l : ll) { - ((BlockListener)l).onBlockBurn(event); - } - } - } - - @Override - public void onBlockForm(BlockFormEvent event) { - if(event.isCancelled()) - return; - /* Call listeners */ - List ll = event_handlers.get(event.getType()); - if(ll != null) { - for(Listener l : ll) { - ((BlockListener)l).onBlockForm(event); - } - } - } - @Override - public void onBlockFade(BlockFadeEvent event) { - if(event.isCancelled()) - return; - /* Call listeners */ - List ll = event_handlers.get(event.getType()); - if(ll != null) { - for(Listener l : ll) { - ((BlockListener)l).onBlockFade(event); - } - } - } - @Override - public void onBlockSpread(BlockSpreadEvent event) { - if(event.isCancelled()) - return; - /* Call listeners */ - List ll = event_handlers.get(event.getType()); - if(ll != null) { - for(Listener l : ll) { - ((BlockListener)l).onBlockSpread(event); - } - } - } - @Override - public void onBlockFromTo(BlockFromToEvent event) { - if(event.isCancelled()) - return; - /* Call listeners */ - List ll = event_handlers.get(event.getType()); - if(ll != null) { - for(Listener l : ll) { - ((BlockListener)l).onBlockFromTo(event); - } - } - } - @Override - public void onBlockPhysics(BlockPhysicsEvent event) { - if(event.isCancelled()) - return; - /* Call listeners */ - List ll = event_handlers.get(event.getType()); - if(ll != null) { - for(Listener l : ll) { - ((BlockListener)l).onBlockPhysics(event); - } - } - } - @Override - public void onBlockPistonRetract(BlockPistonRetractEvent event) { - if(event.isCancelled()) - return; - /* Call listeners */ - List ll = event_handlers.get(event.getType()); - if(ll != null) { - for(Listener l : ll) { - ((BlockListener)l).onBlockPistonRetract(event); - } - } - } - @Override - public void onBlockPistonExtend(BlockPistonExtendEvent event) { - if(event.isCancelled()) - return; - /* Call listeners */ - List ll = event_handlers.get(event.getType()); - if(ll != null) { - for(Listener l : ll) { - ((BlockListener)l).onBlockPistonExtend(event); - } - } - } - }; - private PlayerListener ourPlayerEventHandler = new PlayerListener() { - @Override - public void onPlayerJoin(PlayerJoinEvent event) { - /* Call listeners */ - List ll = event_handlers.get(event.getType()); - if(ll != null) { - for(Listener l : ll) { - ((PlayerListener)l).onPlayerJoin(event); - } - } - } - @Override - public void onPlayerLogin(PlayerLoginEvent event) { - /* Call listeners */ - List ll = event_handlers.get(event.getType()); - if(ll != null) { - for(Listener l : ll) { - ((PlayerListener)l).onPlayerLogin(event); - } - } - } - - @Override - public void onPlayerMove(PlayerMoveEvent event) { - /* Call listeners */ - List ll = event_handlers.get(event.getType()); - if(ll != null) { - for(Listener l : ll) { - ((PlayerListener)l).onPlayerMove(event); - } - } - } - - @Override - public void onPlayerQuit(PlayerQuitEvent event) { - /* Call listeners */ - List ll = event_handlers.get(event.getType()); - if(ll != null) { - for(Listener l : ll) { - ((PlayerListener)l).onPlayerQuit(event); - } - } - } - - @Override - public void onPlayerBedLeave(PlayerBedLeaveEvent event) { - /* Call listeners */ - List ll = event_handlers.get(event.getType()); - if(ll != null) { - for(Listener l : ll) { - ((PlayerListener)l).onPlayerBedLeave(event); - } - } - } - - @Override - public void onPlayerChat(PlayerChatEvent event) { - /* Call listeners */ - List ll = event_handlers.get(event.getType()); - if(ll != null) { - for(Listener l : ll) { - ((PlayerListener)l).onPlayerChat(event); - } - } - } - }; - - private WorldListener ourWorldEventHandler = new WorldListener() { - @Override - public void onWorldLoad(WorldLoadEvent event) { - /* Call listeners */ - List ll = event_handlers.get(event.getType()); - if(ll != null) { - for(Listener l : ll) { - ((WorldListener)l).onWorldLoad(event); - } - } - } - @Override - public void onWorldUnload(WorldUnloadEvent event) { - /* Call listeners */ - List ll = event_handlers.get(event.getType()); - if(ll != null) { - for(Listener l : ll) { - ((WorldListener)l).onWorldUnload(event); - } - } - } - @Override - public void onChunkLoad(ChunkLoadEvent event) { - /* Call listeners */ - List ll = event_handlers.get(event.getType()); - if(ll != null) { - for(Listener l : ll) { - ((WorldListener)l).onChunkLoad(event); - } - } - } - @Override - public void onChunkPopulate(ChunkPopulateEvent event) { - /* Call listeners */ - List ll = event_handlers.get(event.getType()); - if(ll != null) { - for(Listener l : ll) { - ((WorldListener)l).onChunkPopulate(event); - } - } - } - @Override - public void onSpawnChange(SpawnChangeEvent event) { - /* Call listeners */ - List ll = event_handlers.get(event.getType()); - if(ll != null) { - for(Listener l : ll) { - ((WorldListener)l).onSpawnChange(event); - } - } - } - }; - - private CustomEventListener ourCustomEventHandler = new CustomEventListener() { - @Override - public void onCustomEvent(Event event) { - /* Call listeners */ - List ll = event_handlers.get(event.getType()); - if(ll != null) { - for(Listener l : ll) { - ((CustomEventListener)l).onCustomEvent(event); - } - } - } - }; - - private EntityListener ourEntityEventHandler = new EntityListener() { - @Override - public void onEntityExplode(EntityExplodeEvent event) { - if(event.isCancelled()) - return; - /* Call listeners */ - List ll = event_handlers.get(event.getType()); - if(ll != null) { - for(Listener l : ll) { - ((EntityListener)l).onEntityExplode(event); - } - } - } - }; - - /** - * Register event listener - this will be cleaned up properly on a /dynmap reload, unlike - * registering with Bukkit directly - */ - public void registerEvent(Event.Type type, Listener listener) { - List ll = event_handlers.get(type); - PluginManager pm = getServer().getPluginManager(); - if(ll == null) { - switch(type) { /* See if it is a type we're brokering */ - case PLAYER_LOGIN: - case PLAYER_CHAT: - case PLAYER_JOIN: - case PLAYER_QUIT: - case PLAYER_MOVE: - case PLAYER_BED_LEAVE: - pm.registerEvent(type, ourPlayerEventHandler, Event.Priority.Monitor, this); - break; - case BLOCK_PLACE: - case BLOCK_BREAK: - case LEAVES_DECAY: - case BLOCK_BURN: - case BLOCK_FORM: - case BLOCK_FADE: - case BLOCK_SPREAD: - case BLOCK_FROMTO: - case BLOCK_PHYSICS: - case BLOCK_PISTON_EXTEND: - case BLOCK_PISTON_RETRACT: - pm.registerEvent(type, ourBlockEventHandler, Event.Priority.Monitor, this); - break; - case WORLD_LOAD: - case WORLD_UNLOAD: - case CHUNK_LOAD: - case CHUNK_POPULATED: - case SPAWN_CHANGE: - pm.registerEvent(type, ourWorldEventHandler, Event.Priority.Monitor, this); - break; - case CUSTOM_EVENT: - pm.registerEvent(type, ourCustomEventHandler, Event.Priority.Monitor, this); - break; - case ENTITY_EXPLODE: - pm.registerEvent(type, ourEntityEventHandler, Event.Priority.Monitor, this); - break; - default: - Log.severe("registerEvent() in DynmapPlugin does not handle " + type); - return; - } - ll = new ArrayList(); - event_handlers.put(type, ll); /* Add list for this event */ - } - ll.add(listener); - } /** * ** This is the public API for other plugins to use for accessing the Marker API ** * This method can return null if the 'markers' component has not been configured - @@ -1789,32 +1102,6 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { } return false; } - /** - * Trigger update on tiles associated with given locations. If two locations provided, - * the volume is the rectangular prism ("cuboid") with the two locations on opposite corners. - * - * @param l0 - first location (required) - * @param l1 - second location (if null, only single point invalidated (l0)) - * @return zero or higher if request queued, -1 if error - */ - public int triggerRenderOfVolume(Location l0, Location l1) { - if(mapManager != null) { - if(l1 == null) - mapManager.touch(l0.getWorld().getName(), l0.getBlockX(), l0.getBlockY(), l0.getBlockZ(), "api"); - else { - int minx = Math.min(l0.getBlockX(), l1.getBlockX()); - int maxx = Math.max(l0.getBlockX(), l1.getBlockX()); - int miny = Math.min(l0.getBlockY(), l1.getBlockY()); - int maxy = Math.max(l0.getBlockY(), l1.getBlockY()); - int minz = Math.min(l0.getBlockZ(), l1.getBlockZ()); - int maxz = Math.max(l0.getBlockZ(), l1.getBlockZ()); - - mapManager.touchVolume(l0.getWorld().getName(), minx, miny, minz, maxx, maxy, maxz, "api"); - } - } - return 0; - } - /** * Register markers API - used by component to supply marker API to plugin */ @@ -1847,43 +1134,6 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { public boolean getPauseUpdateRenders() { return mapManager.getPauseUpdateRenders(); } - /** - * Set player visibility - * @param player - player - * @param is_visible - true if visible, false if hidden - */ - public void setPlayerVisiblity(Player player, boolean is_visible) { - playerList.setVisible(player.getName(), is_visible); - } - /** - * Test if player is visible - * @return true if visible, false if not - */ - public boolean getPlayerVisbility(Player player) { - return playerList.isVisiblePlayer(player); - } - /** - * Post message from player to web - * @param player - player - * @param message - message text - */ - public void postPlayerMessageToWeb(Player player, String message) { - if(mapManager != null) - mapManager.pushUpdate(new Client.ChatMessage("player", "", player.getDisplayName(), message, player.getName())); - } - /** - * Post join/quit message for player to web - * @param player - player - * @param isjoin - if true, join message; if false, quit message - */ - public void postPlayerJoinQuitToWeb(Player player, boolean isjoin) { - if((mapManager != null) && (playerList != null) && (playerList.isVisiblePlayer(player))) { - if(isjoin) - mapManager.pushUpdate(new Client.PlayerJoinMessage(player.getDisplayName(), player.getName())); - else - mapManager.pushUpdate(new Client.PlayerQuitMessage(player.getDisplayName(), player.getName())); - } - } /** * Get list of IDs seen on give IP (most recent to least recent) */ @@ -1937,26 +1187,20 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { } } - @Override public void setPlayerVisiblity(String player, boolean is_visible) { - // TODO Auto-generated method stub - + playerList.setVisible(player, is_visible); } - @Override public boolean getPlayerVisbility(String player) { - // TODO Auto-generated method stub - return false; + return playerList.isVisiblePlayer(player); } - @Override public void postPlayerMessageToWeb(String playerid, String playerdisplay, String message) { if(playerdisplay == null) playerdisplay = playerid; if(mapManager != null) mapManager.pushUpdate(new Client.ChatMessage("player", "", playerid, message, playerdisplay)); } - @Override public void postPlayerJoinQuitToWeb(String playerid, String playerdisplay, boolean isjoin) { if(playerdisplay == null) playerdisplay = playerid; if((mapManager != null) && (playerList != null) && (playerList.isVisiblePlayer(playerid))) { @@ -1967,24 +1211,16 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { } } - @Override public String getDynmapCoreVersion() { return version; } - @Override - public String getDynmapVersion() { - return version; - } - - @Override public int triggerRenderOfBlock(String wid, int x, int y, int z) { if(mapManager != null) mapManager.touch(wid, x, y, z, "api"); return 0; } - @Override public int triggerRenderOfVolume(String wid, int minx, int miny, int minz, int maxx, int maxy, int maxz) { if(mapManager != null) { if((minx == maxx) && (miny == maxy) && (minz == maxz)) @@ -1993,9 +1229,19 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { mapManager.touchVolume(wid, minx, miny, minz, maxx, maxy, maxz, "api"); } return 0; + } + + public boolean isTrigger(String s) { + return enabledTriggers.contains(s); } - private DynmapLocation toLoc(Location l) { - return new DynmapLocation(l.getWorld().getName(), l.getBlockX(), l.getBlockY(), l.getBlockZ()); - } + public DynmapWorld getWorld(String wid) { + if(mapManager != null) + return mapManager.getWorld(wid); + return null; + } + /* Called by plugin when world loaded */ + public boolean processWorldLoad(DynmapWorld w) { + return mapManager.activateWorld(w); + } } diff --git a/src/main/java/org/dynmap/DynmapPlayerChatListener.java b/src/main/java/org/dynmap/DynmapPlayerChatListener.java index f367c630..56ba239c 100644 --- a/src/main/java/org/dynmap/DynmapPlayerChatListener.java +++ b/src/main/java/org/dynmap/DynmapPlayerChatListener.java @@ -6,9 +6,9 @@ import org.bukkit.event.player.PlayerListener; import org.bukkit.event.player.PlayerQuitEvent; public class DynmapPlayerChatListener extends PlayerListener { - DynmapPlugin plugin; + DynmapCore plugin; - public DynmapPlayerChatListener(DynmapPlugin plugin) { + public DynmapPlayerChatListener(DynmapCore plugin) { this.plugin = plugin; } diff --git a/src/main/java/org/dynmap/DynmapWorld.java b/src/main/java/org/dynmap/DynmapWorld.java index e9e89179..2c56c98f 100644 --- a/src/main/java/org/dynmap/DynmapWorld.java +++ b/src/main/java/org/dynmap/DynmapWorld.java @@ -8,7 +8,9 @@ import java.util.List; import org.bukkit.World; import org.bukkit.Location; +import org.dynmap.bukkit.NewMapChunkCache; import org.dynmap.debug.Debug; +import org.dynmap.utils.BlockLightLevel; import org.dynmap.utils.DynmapBufferedImage; import org.dynmap.utils.FileLockManager; import org.dynmap.utils.MapChunkCache; @@ -22,13 +24,13 @@ import java.util.HashSet; import javax.imageio.ImageIO; -public class DynmapWorld { +public abstract class DynmapWorld { + public enum AutoGenerateOption { NONE, FORMAPONLY, PERMANENT } - private World world; public List maps = new ArrayList(); public UpdateQueue updates = new UpdateQueue(); public ConfigurationNode configuration; @@ -50,9 +52,8 @@ public class DynmapWorld { private boolean cancelled; private String wname; - public DynmapWorld(World w) { - world = w; - wname = w.getName(); + protected DynmapWorld(String wname) { + this.wname = wname; } @SuppressWarnings("unchecked") public void setExtraZoomOutLevels(int lvl) { @@ -170,7 +171,7 @@ public class DynmapWorld { public boolean freshenZoomOutFilesByLevel(int zoomlevel) { int cnt = 0; - Debug.debug("freshenZoomOutFiles(" + world.getName() + "," + zoomlevel + ")"); + Debug.debug("freshenZoomOutFiles(" + wname + "," + zoomlevel + ")"); if(worldtilepath.exists() == false) /* Quit if not found */ return true; HashMap maptab = buildPrefixData(zoomlevel); @@ -195,7 +196,7 @@ public class DynmapWorld { cnt += processZoomDirectory(worldtilepath, maptab.get(pfx)); } } - Debug.debug("freshenZoomOutFiles(" + world.getName() + "," + zoomlevel + ") - done (" + cnt + " updated files)"); + Debug.debug("freshenZoomOutFiles(" + wname + "," + zoomlevel + ") - done (" + cnt + " updated files)"); } else { /* Else, only process updates */ String[] paths = peekQueuedUpdates(zoomlevel); /* Get pending updates */ @@ -461,7 +462,7 @@ public class DynmapWorld { long crc = hashman.calculateTileHash(kzIm.argb_buf); /* Get hash of tile */ int tilex = ztx/step/2; int tiley = zty/step/2; - String key = world.getName()+".z"+pd.zoomprefix+pd.baseprefix; + String key = wname+".z"+pd.zoomprefix+pd.baseprefix; if(blank) { if(zf.exists()) { zf.delete(); @@ -490,43 +491,41 @@ public class DynmapWorld { DynmapBufferedImage.freeBufferedImage(kzIm); } } - /* Test if world is nether */ - public boolean isNether() { - return world.getEnvironment() == World.Environment.NETHER; - } /* Get world name */ public String getName() { return wname; } + /* Test if world is nether */ + public abstract boolean isNether(); /* Get world spawn location */ - public DynmapLocation getSpawnLocation() { - DynmapLocation dloc = new DynmapLocation(); - Location sloc = world.getSpawnLocation(); - dloc.x = sloc.getBlockX(); dloc.y = sloc.getBlockY(); - dloc.z = sloc.getBlockZ(); dloc.world = sloc.getWorld().getName(); - return dloc; - } + public abstract DynmapLocation getSpawnLocation(); public int hashCode() { return wname.hashCode(); } - - public long getTime() { - return world.getTime(); - } + /* Get world time */ + public abstract long getTime(); + /* World is storming */ + public abstract boolean hasStorm(); + /* World is thundering */ + public abstract boolean isThundering(); + /* World is loaded */ + public abstract boolean isLoaded(); + /* Get light level of block */ + public abstract int getLightLevel(int x, int y, int z); + /* Get highest Y coord of given location */ + public abstract int getHighestBlockYAt(int x, int z); + /* Test if sky light level is requestable */ + public abstract boolean canGetSkyLightLevel(); + /* Return sky light level */ + public abstract int getSkyLightLevel(int x, int y, int z); + /** + * Get world environment ID (lower case - normal, the_end, nether) + */ + public abstract String getEnvironment(); + /** + * Get map chunk cache for world + */ + public abstract MapChunkCache getChunkCache(List chunks); - public boolean hasStorm() { - return world.hasStorm(); - } - - public boolean isThundering() { - return world.isThundering(); - } - - public World getWorld() { - return world; - } - public boolean isLoaded() { - return (world != null); - } } diff --git a/src/main/java/org/dynmap/InternalClientUpdateComponent.java b/src/main/java/org/dynmap/InternalClientUpdateComponent.java index 34e723fb..b9620c80 100644 --- a/src/main/java/org/dynmap/InternalClientUpdateComponent.java +++ b/src/main/java/org/dynmap/InternalClientUpdateComponent.java @@ -7,7 +7,7 @@ import static org.dynmap.JSONUtils.*; public class InternalClientUpdateComponent extends ClientUpdateComponent { - public InternalClientUpdateComponent(final DynmapPlugin plugin, final ConfigurationNode configuration) { + public InternalClientUpdateComponent(final DynmapCore plugin, final ConfigurationNode configuration) { super(plugin, configuration); plugin.addServlet("/up/world/*", new ClientUpdateServlet(plugin)); @@ -43,12 +43,12 @@ public class InternalClientUpdateComponent extends ClientUpdateComponent { } protected void webChat(String name, String message) { - if(plugin.mapManager == null) + if(core.mapManager == null) return; // TODO: Change null to something meaningful. - plugin.mapManager.pushUpdate(new Client.ChatMessage("web", null, name, message, null)); - Log.info(unescapeString(plugin.configuration.getString("webprefix", "\u00A72[WEB] ")) + name + ": " + unescapeString(plugin.configuration.getString("websuffix", "\u00A7f")) + message); + core.mapManager.pushUpdate(new Client.ChatMessage("web", null, name, message, null)); + Log.info(unescapeString(core.configuration.getString("webprefix", "\u00A72[WEB] ")) + name + ": " + unescapeString(core.configuration.getString("websuffix", "\u00A7f")) + message); ChatEvent event = new ChatEvent("web", name, message); - plugin.events.trigger("webchat", event); + core.events.trigger("webchat", event); } } diff --git a/src/main/java/org/dynmap/JsonFileClientUpdateComponent.java b/src/main/java/org/dynmap/JsonFileClientUpdateComponent.java index 1ffc519b..96221878 100644 --- a/src/main/java/org/dynmap/JsonFileClientUpdateComponent.java +++ b/src/main/java/org/dynmap/JsonFileClientUpdateComponent.java @@ -10,8 +10,6 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; import org.dynmap.web.Json; import org.json.simple.JSONArray; import org.json.simple.JSONObject; @@ -36,7 +34,7 @@ public class JsonFileClientUpdateComponent extends ClientUpdateComponent { private long last_confighash; private Charset cs_utf8 = Charset.forName("UTF-8"); - public JsonFileClientUpdateComponent(final DynmapPlugin plugin, final ConfigurationNode configuration) { + public JsonFileClientUpdateComponent(final DynmapCore plugin, final ConfigurationNode configuration) { super(plugin, configuration); final boolean allowwebchat = configuration.getBoolean("allowwebchat", false); jsonInterval = (long)(configuration.getFloat("writeinterval", 1) * 1000); @@ -85,11 +83,11 @@ public class JsonFileClientUpdateComponent extends ClientUpdateComponent { } protected File getStandaloneFile(String filename) { - File webpath = new File(plugin.configuration.getString("webpath", "web"), "standalone/" + filename); + File webpath = new File(core.configuration.getString("webpath", "web"), "standalone/" + filename); if (webpath.isAbsolute()) return webpath; else - return new File(plugin.getDataFolder(), webpath.toString()); + return new File(core.getDataFolder(), webpath.toString()); } private static final int RETRY_LIMIT = 5; @@ -97,10 +95,10 @@ public class JsonFileClientUpdateComponent extends ClientUpdateComponent { File outputFile; File outputTempFile; JSONObject clientConfiguration = new JSONObject(); - plugin.events.trigger("buildclientconfiguration", clientConfiguration); + core.events.trigger("buildclientconfiguration", clientConfiguration); outputFile = getStandaloneFile("dynmap_config.json"); outputTempFile = getStandaloneFile("dynmap_config.json.new"); - last_confighash = plugin.getConfigHashcode(); + last_confighash = core.getConfigHashcode(); int retrycnt = 0; boolean done = false; @@ -139,13 +137,13 @@ public class JsonFileClientUpdateComponent extends ClientUpdateComponent { protected void writeUpdates() { File outputFile; File outputTempFile; - if(plugin.mapManager == null) return; + if(core.mapManager == null) return; //Handles Updates - for (DynmapWorld dynmapWorld : plugin.mapManager.getWorlds()) { + for (DynmapWorld dynmapWorld : core.mapManager.getWorlds()) { JSONObject update = new JSONObject(); update.put("timestamp", currentTimestamp); ClientUpdateEvent clientUpdate = new ClientUpdateEvent(currentTimestamp - 30000, dynmapWorld, update); - plugin.events.trigger("buildclientupdate", clientUpdate); + core.events.trigger("buildclientupdate", clientUpdate); outputFile = getStandaloneFile("dynmap_" + dynmapWorld.getName() + ".json"); outputTempFile = getStandaloneFile("dynmap_" + dynmapWorld.getName() + ".json.new"); @@ -180,10 +178,10 @@ public class JsonFileClientUpdateComponent extends ClientUpdateComponent { } } } - plugin.events.trigger("clientupdatewritten", clientUpdate); + core.events.trigger("clientupdatewritten", clientUpdate); } - plugin.events.trigger("clientupdateswritten", null); + core.events.trigger("clientupdateswritten", null); } protected void handleWebChat() { @@ -224,13 +222,12 @@ public class JsonFileClientUpdateComponent extends ClientUpdateComponent { name = ip; } if(useplayerloginip) { /* Try to match using IPs of player logins */ - List ids = plugin.getIDsForIP(name); + List ids = core.getIDsForIP(name); if(ids != null) { name = ids.get(0); isip = false; if(checkuserban) { - OfflinePlayer p = plugin.getServer().getOfflinePlayer(name); - if((p != null) && p.isBanned()) { + if(core.getServer().isPlayerBanned(name)) { Log.info("Ignore message from '" + ip + "' - banned player (" + name + ")"); return; } @@ -259,12 +256,12 @@ public class JsonFileClientUpdateComponent extends ClientUpdateComponent { } protected void webChat(String name, String message) { - if(plugin.mapManager == null) return; + if(core.mapManager == null) return; // TODO: Change null to something meaningful. - plugin.mapManager.pushUpdate(new Client.ChatMessage("web", null, name, message, null)); - Log.info(unescapeString(plugin.configuration.getString("webprefix", "\u00A2[WEB] ")) + name + ": " + unescapeString(plugin.configuration.getString("websuffix", "\u00A7f")) + message); + core.mapManager.pushUpdate(new Client.ChatMessage("web", null, name, message, null)); + Log.info(unescapeString(core.configuration.getString("webprefix", "\u00A2[WEB] ")) + name + ": " + unescapeString(core.configuration.getString("websuffix", "\u00A7f")) + message); ChatEvent event = new ChatEvent("web", name, message); - plugin.events.trigger("webchat", event); + core.events.trigger("webchat", event); } @Override diff --git a/src/main/java/org/dynmap/MapManager.java b/src/main/java/org/dynmap/MapManager.java index 5996994d..3a8cab9b 100644 --- a/src/main/java/org/dynmap/MapManager.java +++ b/src/main/java/org/dynmap/MapManager.java @@ -22,16 +22,13 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; -import org.bukkit.World; -import org.bukkit.scheduler.BukkitScheduler; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.dynmap.DynmapPlugin.CompassMode; +import org.dynmap.DynmapCore.CompassMode; import org.dynmap.DynmapWorld.AutoGenerateOption; +import org.dynmap.common.DynmapCommandSender; +import org.dynmap.common.DynmapPlayer; import org.dynmap.debug.Debug; import org.dynmap.hdmap.HDMapManager; import org.dynmap.utils.MapChunkCache; -import org.dynmap.utils.NewMapChunkCache; import org.dynmap.utils.SnapshotCache; import org.dynmap.utils.TileFlags; @@ -42,8 +39,7 @@ public class MapManager { private static final int DEFAULT_ZOOMOUT_PERIOD = 60; public List worlds = new ArrayList(); public Map worldsLookup = new HashMap(); - private BukkitScheduler scheduler; - private DynmapPlugin plug_in; + private DynmapCore core; private long timeslice_int = 0; /* In milliseconds */ private int max_chunk_loads_per_tick = DEFAULT_CHUNKS_PER_TICK; private int parallelrendercnt = 0; @@ -221,7 +217,7 @@ public class MapManager { LinkedList renderQueue = null; MapTile tile0 = null; int rendercnt = 0; - CommandSender sender; + DynmapCommandSender sender; String player; long timeaccum; HashSet renderedmaps = new HashSet(); @@ -237,7 +233,7 @@ public class MapManager { AtomicInteger rendercalls = new AtomicInteger(0); /* Full world, all maps render */ - FullWorldRenderState(DynmapWorld dworld, DynmapLocation l, CommandSender sender, String mapname, boolean updaterender) { + FullWorldRenderState(DynmapWorld dworld, DynmapLocation l, DynmapCommandSender sender, String mapname, boolean updaterender) { this(dworld, l, sender, mapname, -1); if(updaterender) { rendertype = RENDERTYPE_UPDATERENDER; @@ -248,15 +244,15 @@ public class MapManager { } /* Full world, all maps render, with optional render radius */ - FullWorldRenderState(DynmapWorld dworld, DynmapLocation l, CommandSender sender, String mapname, int radius) { + FullWorldRenderState(DynmapWorld dworld, DynmapLocation l, DynmapCommandSender sender, String mapname, int radius) { world = dworld; loc = l; found = new TileFlags(); rendered = new TileFlags(); renderQueue = new LinkedList(); this.sender = sender; - if(sender instanceof Player) - this.player = ((Player)sender).getName(); + if(sender instanceof DynmapPlayer) + this.player = ((DynmapPlayer)sender).getName(); else this.player = ""; if(radius < 0) { @@ -343,7 +339,7 @@ public class MapManager { updaterender = rendertype.equals(RENDERTYPE_UPDATERENDER); sender = null; if(player.length() > 0) { - sender = plug_in.getServer().getPlayerExact(player); + sender = core.getServer().getPlayer(player); } } @@ -681,7 +677,7 @@ public class MapManager { private class CheckWorldTimes implements Runnable { public void run() { - Future f = scheduler.callSyncMethod(plug_in, new Callable() { + Future f = core.getServer().callSyncMethod(new Callable() { public Integer call() throws Exception { for(DynmapWorld w : worlds) { int new_servertime = (int)(w.getTime() % 24000); @@ -724,8 +720,8 @@ public class MapManager { } } - public MapManager(DynmapPlugin plugin, ConfigurationNode configuration) { - plug_in = plugin; + public MapManager(DynmapCore core, ConfigurationNode configuration) { + this.core = core; mapman = this; /* Get block hiding data, if any */ @@ -739,9 +735,9 @@ public class MapManager { /* Initialize HD map manager */ hdmapman = new HDMapManager(); - hdmapman.loadHDShaders(plugin); - hdmapman.loadHDPerspectives(plugin); - hdmapman.loadHDLightings(plugin); + hdmapman.loadHDShaders(core); + hdmapman.loadHDPerspectives(core); + hdmapman.loadHDLightings(core); sscache = new SnapshotCache(configuration.getInteger("snapshotcachesize", 500)); parallelrendercnt = configuration.getInteger("parallelrendercnt", 0); progressinterval = configuration.getInteger("progressloginterval", 100); @@ -771,18 +767,12 @@ public class MapManager { zoomout_period = configuration.getInteger("zoomoutperiod", DEFAULT_ZOOMOUT_PERIOD); if(zoomout_period < 5) zoomout_period = 5; - scheduler = plugin.getServer().getScheduler(); - - hashman = new TileHashManager(DynmapPlugin.tilesDirectory, configuration.getBoolean("enabletilehash", true)); + hashman = new TileHashManager(core.getTilesFolder(), configuration.getBoolean("enabletilehash", true)); tileQueue.start(); - - for (World world : plug_in.getServer().getWorlds()) { - activateWorld(world); - } } - void renderFullWorld(DynmapLocation l, CommandSender sender, String mapname, boolean update) { + void renderFullWorld(DynmapLocation l, DynmapCommandSender sender, String mapname, boolean update) { DynmapWorld world = getWorld(l.world); if (world == null) { sender.sendMessage("Could not render: world '" + l.world + "' not defined in configuration."); @@ -808,7 +798,7 @@ public class MapManager { sender.sendMessage("Full render starting on world '" + wname + "'..."); } - void renderWorldRadius(DynmapLocation l, CommandSender sender, String mapname, int radius) { + void renderWorldRadius(DynmapLocation l, DynmapCommandSender sender, String mapname, int radius) { DynmapWorld world = getWorld(l.world); if (world == null) { sender.sendMessage("Could not render: world '" + l.world + "' not defined in configuration."); @@ -830,15 +820,15 @@ public class MapManager { sender.sendMessage("Render of " + radius + " block radius starting on world '" + wname + "'..."); } - void cancelRender(World w, CommandSender sender) { + void cancelRender(String w, DynmapCommandSender sender) { synchronized(lock) { if(w != null) { FullWorldRenderState rndr; - rndr = active_renders.get(w.getName()); + rndr = active_renders.get(w); if(rndr != null) { rndr.cancelRender(); /* Cancel render */ if(sender != null) { - sender.sendMessage("Cancelled render for '" + w.getName() + "'"); + sender.sendMessage("Cancelled render for '" + w + "'"); } } } @@ -854,7 +844,7 @@ public class MapManager { } } - void purgeQueue(CommandSender sender) { + void purgeQueue(DynmapCommandSender sender) { if(tileQueue != null) { int cnt = 0; List popped = tileQueue.popAll(); @@ -866,18 +856,17 @@ public class MapManager { } } - public void activateWorld(World w) { - ConfigurationNode worldConfiguration = plug_in.getWorldConfiguration(w); + public boolean activateWorld(DynmapWorld dynmapWorld) { + ConfigurationNode worldConfiguration = core.getWorldConfiguration(dynmapWorld); if (!worldConfiguration.getBoolean("enabled", false)) { - Log.info("World '" + w.getName() + "' disabled"); - return; + Log.info("World '" + dynmapWorld.getName() + "' disabled"); + return false; } - String worldName = w.getName(); + String worldName = dynmapWorld.getName(); - DynmapWorld dynmapWorld = new DynmapWorld(w); dynmapWorld.configuration = worldConfiguration; Log.verboseinfo("Loading maps of world '" + worldName + "'..."); - for(MapType map : worldConfiguration.createInstances("maps", new Class[0], new Object[0])) { + for(MapType map : worldConfiguration.createInstances("maps", new Class[] { DynmapCore.class }, new Object[] { core })) { if(map.getName() != null) dynmapWorld.maps.add(map); } @@ -885,15 +874,15 @@ public class MapManager { List loclist = worldConfiguration.getNodes("fullrenderlocations"); dynmapWorld.seedloc = new ArrayList(); - dynmapWorld.servertime = (int)(w.getTime() % 24000); + dynmapWorld.servertime = (int)(dynmapWorld.getTime() % 24000); dynmapWorld.sendposition = worldConfiguration.getBoolean("sendposition", true); dynmapWorld.sendhealth = worldConfiguration.getBoolean("sendhealth", true); dynmapWorld.bigworld = worldConfiguration.getBoolean("bigworld", false); dynmapWorld.setExtraZoomOutLevels(worldConfiguration.getInteger("extrazoomout", 0)); - dynmapWorld.worldtilepath = new File(DynmapPlugin.tilesDirectory, w.getName()); + dynmapWorld.worldtilepath = new File(core.getTilesFolder(), worldName); if(loclist != null) { for(ConfigurationNode loc : loclist) { - DynmapLocation lx = new DynmapLocation(w.getName(), loc.getInteger("x", 0), loc.getInteger("y", 64), loc.getInteger("z", 0)); + DynmapLocation lx = new DynmapLocation(worldName, loc.getInteger("x", 0), loc.getInteger("y", 64), loc.getInteger("z", 0)); dynmapWorld.seedloc.add(lx); } } @@ -909,7 +898,7 @@ public class MapManager { lim.z1 = vis.getInteger("z1", 0); dynmapWorld.visibility_limits.add(lim); /* Also, add a seed location for the middle of each visible area */ - dynmapWorld.seedloc.add(new DynmapLocation(w.getName(), (lim.x0+lim.x1)/2, 64, (lim.z0+lim.z1)/2)); + dynmapWorld.seedloc.add(new DynmapLocation(worldName, (lim.x0+lim.x1)/2, 64, (lim.z0+lim.z1)/2)); } } /* Load hidden limits, if any are defined */ @@ -951,7 +940,7 @@ public class MapManager { // TODO: Make this less... weird... // Insert the world on the same spot as in the configuration. HashMap indexLookup = new HashMap(); - List nodes = plug_in.configuration.getNodes("worlds"); + List nodes = core.configuration.getNodes("worlds"); for (int i = 0; i < nodes.size(); i++) { ConfigurationNode node = nodes.get(i); indexLookup.put(node.getString("name"), i); @@ -970,11 +959,12 @@ public class MapManager { } worlds.add(insertIndex, dynmapWorld); } - worldsLookup.put(w.getName(), dynmapWorld); - plug_in.events.trigger("worldactivated", dynmapWorld); + worldsLookup.put(worldName, dynmapWorld); + core.events.trigger("worldactivated", dynmapWorld); /* Now, restore any pending renders for this world */ if(saverestorepending) loadPending(dynmapWorld); + return true; } public void deactivateWorld(String wname) { @@ -983,7 +973,7 @@ public class MapManager { private void loadPending(DynmapWorld w) { String wname = w.getName(); - File f = new File(plug_in.getDataFolder(), wname + ".pending"); + File f = new File(core.getDataFolder(), wname + ".pending"); if(f.exists()) { org.bukkit.util.config.Configuration saved = new org.bukkit.util.config.Configuration(f); saved.load(); @@ -1021,7 +1011,7 @@ public class MapManager { List mt = tileQueue.popAll(); for(DynmapWorld w : worlds) { boolean dosave = false; - File f = new File(plug_in.getDataFolder(), w.getName() + ".pending"); + File f = new File(core.getDataFolder(), w.getName() + ".pending"); org.bukkit.util.config.Configuration saved = new org.bukkit.util.config.Configuration(f); ArrayList savedtiles = new ArrayList(); for(MapTile tile : mt) { @@ -1159,9 +1149,9 @@ public class MapManager { /** * Render processor helper - used by code running on render threads to request chunk snapshot cache from server/sync thread */ - public MapChunkCache createMapChunkCache(DynmapWorld w, List chunks, + public MapChunkCache createMapChunkCache(DynmapWorld w, List chunks, boolean blockdata, boolean highesty, boolean biome, boolean rawbiome) { - MapChunkCache c = new NewMapChunkCache(); + MapChunkCache c = w.getChunkCache(chunks); if(w.visibility_limits != null) { for(MapChunkCache.VisibilityLimit limit: w.visibility_limits) { c.setVisibleRange(limit); @@ -1175,8 +1165,6 @@ public class MapManager { } c.setHiddenFillStyle(w.hiddenchunkstyle); } - - c.setChunks(w.getWorld(), chunks); if(c.setChunkDataTypes(blockdata, biome, highesty, rawbiome) == false) Log.severe("CraftBukkit build does not support biome APIs"); if(chunks.size() == 0) { /* No chunks to get? */ @@ -1194,7 +1182,7 @@ public class MapManager { cur_tick = now/50; } } - Future f = scheduler.callSyncMethod(plug_in, new Callable() { + Future f = core.getServer().callSyncMethod(new Callable() { public Boolean call() throws Exception { boolean exhausted; synchronized(loadlock) { @@ -1240,7 +1228,7 @@ public class MapManager { /** * Print statistics command */ - public void printStats(CommandSender sender, String prefix) { + public void printStats(DynmapCommandSender sender, String prefix) { sender.sendMessage("Tile Render Statistics:"); MapStats tot = new MapStats(); synchronized(lock) { @@ -1283,7 +1271,7 @@ public class MapManager { /** * Print trigger statistics command */ - public void printTriggerStats(CommandSender sender) { + public void printTriggerStats(DynmapCommandSender sender) { sender.sendMessage("Render Trigger Statistics:"); synchronized(lock) { for(String k: new TreeSet(trigstats.keySet())) { @@ -1296,7 +1284,7 @@ public class MapManager { /** * Reset statistics */ - public void resetStats(CommandSender sender, String prefix) { + public void resetStats(DynmapCommandSender sender, String prefix) { synchronized(lock) { for(String k : mapstats.keySet()) { if((prefix != null) && !k.startsWith(prefix)) @@ -1327,23 +1315,23 @@ public class MapManager { } public boolean getSwampShading() { - return plug_in.swampshading; + return core.swampshading; } public boolean getWaterBiomeShading() { - return plug_in.waterbiomeshading; + return core.waterbiomeshading; } public boolean getFenceJoin() { - return plug_in.fencejoin; + return core.fencejoin; } public boolean getBetterGrass() { - return plug_in.bettergrass; + return core.bettergrass; } public CompassMode getCompassMode() { - return plug_in.compassmode; + return core.compassmode; } public boolean getHideOres() { @@ -1400,7 +1388,7 @@ public class MapManager { ticklistcalls.incrementAndGet(); } /* Connect any jobs tied to this player back to the player (resumes output to player) */ - void connectTasksToPlayer(Player p) { + void connectTasksToPlayer(DynmapPlayer p) { String pn = p.getName(); for(FullWorldRenderState job : active_renders.values()) { if(pn.equals(job.player)) { diff --git a/src/main/java/org/dynmap/MarkersComponent.java b/src/main/java/org/dynmap/MarkersComponent.java index dbd29be1..f5515816 100644 --- a/src/main/java/org/dynmap/MarkersComponent.java +++ b/src/main/java/org/dynmap/MarkersComponent.java @@ -1,17 +1,10 @@ package org.dynmap; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.entity.Player; -import org.bukkit.event.Event.Type; -import org.bukkit.event.player.PlayerBedLeaveEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerListener; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.world.SpawnChangeEvent; -import org.bukkit.event.world.WorldListener; -import org.bukkit.event.world.WorldLoadEvent; +import org.dynmap.common.DynmapListenerManager; +import org.dynmap.common.DynmapListenerManager.EventType; +import org.dynmap.common.DynmapListenerManager.WorldEventListener; +import org.dynmap.common.DynmapListenerManager.PlayerEventListener; +import org.dynmap.common.DynmapPlayer; import org.dynmap.markers.Marker; import org.dynmap.markers.MarkerIcon; import org.dynmap.markers.MarkerSet; @@ -30,23 +23,23 @@ public class MarkersComponent extends ClientComponent { private MarkerIcon offlineicon; private MarkerSet spawnbedset; private MarkerIcon spawnbedicon; - + private String spawnbedformat; private static final String OFFLINE_PLAYERS_SETID = "offline_players"; private static final String PLAYER_SPAWN_BED_SETID = "spawn_beds"; - public MarkersComponent(final DynmapPlugin plugin, ConfigurationNode configuration) { - super(plugin, configuration); + public MarkersComponent(final DynmapCore core, ConfigurationNode configuration) { + super(core, configuration); /* Register API with plugin, if needed */ - if(plugin.markerAPIInitialized()) { - api = (MarkerAPIImpl)plugin.getMarkerAPI(); + if(core.markerAPIInitialized()) { + api = (MarkerAPIImpl)core.getMarkerAPI(); } else { - api = MarkerAPIImpl.initializeMarkerAPI(plugin); - plugin.registerMarkerAPI(api); + api = MarkerAPIImpl.initializeMarkerAPI(core); + core.registerMarkerAPI(api); } /* If configuration has enabled sign support, prime it too */ if(configuration.getBoolean("enablesigns", false)) { - signmgr = MarkerSignManager.initializeSignManager(plugin); + signmgr = MarkerSignManager.initializeSignManager(core); } /* If we're posting spawn point markers, initialize and add world listener */ if(configuration.getBoolean("showspawn", false)) { @@ -56,27 +49,24 @@ public class MarkersComponent extends ClientComponent { if(spawnicon == null) { spawnicon = api.getMarkerIcon(MarkerIcon.WORLD); } - WorldListener wl = new WorldListener() { - public void onWorldLoad(WorldLoadEvent event) { - World w = event.getWorld(); /* Get the world */ - Location loc = w.getSpawnLocation(); /* Get location of spawn */ + /* Add listener for world loads */ + WorldEventListener wel = new WorldEventListener() { + @Override + public void worldEvent(DynmapWorld w) { + DynmapLocation loc = w.getSpawnLocation(); /* Get location of spawn */ if(loc != null) - addUpdateWorld(w, new DynmapLocation(w.getName(), loc.getX(), loc.getY(), loc.getZ())); - } - public void onSpawnChange(SpawnChangeEvent event) { - World w = event.getWorld(); /* Get the world */ - Location loc = w.getSpawnLocation(); /* Get location of spawn */ - if(loc != null) - addUpdateWorld(w, new DynmapLocation(w.getName(), loc.getX(), loc.getY(), loc.getZ())); + addUpdateWorld(w, loc); } }; - plugin.registerEvent(org.bukkit.event.Event.Type.WORLD_LOAD, wl); - plugin.registerEvent(org.bukkit.event.Event.Type.SPAWN_CHANGE, wl); + core.listenerManager.addListener(EventType.WORLD_LOAD, wel); + /* Add listener for spawn changes */ + core.listenerManager.addListener(EventType.WORLD_SPAWN_CHANGE, wel); + /* Initialize already loaded worlds */ - for(DynmapWorld w : plugin.getMapManager().getWorlds()) { + for(DynmapWorld w : core.getMapManager().getWorlds()) { DynmapLocation loc = w.getSpawnLocation(); if(loc != null) - addUpdateWorld(w.getWorld(), loc); + addUpdateWorld(w, loc); } } /* If showing offline players as markers */ @@ -92,32 +82,30 @@ public class MarkersComponent extends ClientComponent { offlineicon = api.getMarkerIcon(configuration.getString("offlineicon", "offlineuser")); /* Add listener for players coming and going */ - PlayerListener pl = new PlayerListener() { + core.listenerManager.addListener(EventType.PLAYER_JOIN, new PlayerEventListener() { @Override - public void onPlayerJoin(PlayerJoinEvent event) { - Player p = event.getPlayer(); + public void playerEvent(DynmapPlayer p) { Marker m = offlineset.findMarker(p.getName()); if(m != null) { m.deleteMarker(); } } + }); + core.listenerManager.addListener(EventType.PLAYER_QUIT, new PlayerEventListener() { @Override - public void onPlayerQuit(PlayerQuitEvent event) { - Player p = event.getPlayer(); - Marker m = offlineset.findMarker(p.getName()); + public void playerEvent(DynmapPlayer p) { + String pname = p.getName(); + Marker m = offlineset.findMarker(pname); if(m != null) { m.deleteMarker(); } - if(plugin.playerList.isVisiblePlayer(p)) { - Location loc = p.getLocation(); - m = offlineset.createMarker(p.getName(), ChatColor.stripColor(p.getDisplayName()), false, - loc.getWorld().getName(), loc.getX(), loc.getY(), loc.getZ(), - offlineicon, true); + if(core.playerList.isVisiblePlayer(pname)) { + DynmapLocation loc = p.getLocation(); + m = offlineset.createMarker(p.getName(), core.getServer().stripChatColor(p.getDisplayName()), false, + loc.world, loc.x, loc.y, loc.z, offlineicon, true); } } - }; - plugin.registerEvent(Type.PLAYER_JOIN, pl); - plugin.registerEvent(Type.PLAYER_QUIT, pl); + }); } else { /* Make set, if needed */ @@ -137,53 +125,34 @@ public class MarkersComponent extends ClientComponent { spawnbedset.setMinZoom(configuration.getInteger("spawnbedminzoom", 0)); spawnbedicon = api.getMarkerIcon(configuration.getString("spawnbedicon", "bed")); - final String spawnbedformat = configuration.getString("spawnbedformat", "%name%'s bed"); + spawnbedformat = configuration.getString("spawnbedformat", "%name%'s bed"); /* Add listener for players coming and going */ - PlayerListener pl = new PlayerListener() { - private void updatePlayer(Player p) { - Location bl = p.getBedSpawnLocation(); - Marker m = spawnbedset.findMarker(p.getName()+"_bed"); - if(bl == null) { /* No bed location */ - if(m != null) { - m.deleteMarker(); - } - } - else { - if(m != null) - m.setLocation(bl.getWorld().getName(), bl.getX(), bl.getY(), bl.getZ()); - else - m = spawnbedset.createMarker(p.getName()+"_bed", spawnbedformat.replace("%name%", ChatColor.stripColor(p.getDisplayName())), false, - bl.getWorld().getName(), bl.getX(), bl.getY(), bl.getZ(), - spawnbedicon, true); - } - } + core.listenerManager.addListener(EventType.PLAYER_JOIN, new PlayerEventListener() { @Override - public void onPlayerJoin(PlayerJoinEvent event) { - Player p = event.getPlayer(); + public void playerEvent(DynmapPlayer p) { updatePlayer(p); } + }); + core.listenerManager.addListener(EventType.PLAYER_QUIT, new PlayerEventListener() { @Override - public void onPlayerBedLeave(PlayerBedLeaveEvent event) { - final Player p = event.getPlayer(); - plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { - public void run() { - updatePlayer(p); - } - }); - } - @Override - public void onPlayerQuit(PlayerQuitEvent event) { - Player p = event.getPlayer(); + public void playerEvent(DynmapPlayer p) { Marker m = spawnbedset.findMarker(p.getName()+"_bed"); if(m != null) { m.deleteMarker(); } } - }; - plugin.registerEvent(Type.PLAYER_JOIN, pl); - plugin.registerEvent(Type.PLAYER_QUIT, pl); - plugin.registerEvent(Type.PLAYER_BED_LEAVE, pl); + }); + core.listenerManager.addListener(EventType.PLAYER_BED_LEAVE, new PlayerEventListener() { + @Override + public void playerEvent(final DynmapPlayer p) { + core.getServer().scheduleServerTask(new Runnable() { + public void run() { + updatePlayer(p); + } + }, 0); + } + }); } else { /* Make set, if needed */ @@ -194,7 +163,26 @@ public class MarkersComponent extends ClientComponent { } } - private void addUpdateWorld(World w, DynmapLocation loc) { + private void updatePlayer(DynmapPlayer p) { + DynmapLocation bl = p.getBedSpawnLocation(); + Marker m = spawnbedset.findMarker(p.getName()+"_bed"); + if(bl == null) { /* No bed location */ + if(m != null) { + m.deleteMarker(); + } + } + else { + if(m != null) + m.setLocation(bl.world, bl.x, bl.y, bl.z); + else + m = spawnbedset.createMarker(p.getName()+"_bed", spawnbedformat.replace("%name%", core.getServer().stripChatColor(p.getDisplayName())), false, + bl.world, bl.x, bl.y, bl.z, + spawnbedicon, true); + } + } + + + private void addUpdateWorld(DynmapWorld w, DynmapLocation loc) { MarkerSet ms = api.getMarkerSet(MarkerSet.DEFAULT); if(ms != null) { String spawnid = "_spawn_" + w.getName(); @@ -212,7 +200,7 @@ public class MarkersComponent extends ClientComponent { @Override public void dispose() { if(signmgr != null) { - MarkerSignManager.terminateSignManager(this.plugin); + MarkerSignManager.terminateSignManager(this.core); signmgr = null; } /* Don't unregister API - other plugins might be using it, and we want to keep non-persistent markers */ diff --git a/src/main/java/org/dynmap/PlayerFaces.java b/src/main/java/org/dynmap/PlayerFaces.java index b5e3613a..d817dac9 100644 --- a/src/main/java/org/dynmap/PlayerFaces.java +++ b/src/main/java/org/dynmap/PlayerFaces.java @@ -8,10 +8,10 @@ import java.net.URL; import javax.imageio.ImageIO; -import org.bukkit.event.Event.Type; -import org.bukkit.event.player.PlayerListener; -import org.bukkit.event.player.PlayerLoginEvent; import org.dynmap.MapType.ImageFormat; +import org.dynmap.common.DynmapListenerManager.EventType; +import org.dynmap.common.DynmapListenerManager.PlayerEventListener; +import org.dynmap.common.DynmapPlayer; import org.dynmap.debug.Debug; import org.dynmap.utils.DynmapBufferedImage; import org.dynmap.utils.FileLockManager; @@ -133,22 +133,22 @@ public class PlayerFaces { /* TODO: signal update for player icon to client */ } } - private class LoginListener extends PlayerListener { - @Override - public void onPlayerLogin(PlayerLoginEvent event) { - Runnable job = new LoadPlayerImages(event.getPlayer().getName()); - if(fetchskins) - MapManager.scheduleDelayedJob(job, 0); - else - job.run(); - } - } - public PlayerFaces(DynmapPlugin plugin) { - fetchskins = plugin.configuration.getBoolean("fetchskins", true); /* Control whether to fetch skins */ - refreshskins = plugin.configuration.getBoolean("refreshskins", true); /* Control whether to update existing fetched skins or faces */ + public PlayerFaces(DynmapCore core) { + fetchskins = core.configuration.getBoolean("fetchskins", true); /* Control whether to fetch skins */ + refreshskins = core.configuration.getBoolean("refreshskins", true); /* Control whether to update existing fetched skins or faces */ - plugin.registerEvent(Type.PLAYER_LOGIN, new LoginListener()); - facesdir = new File(DynmapPlugin.tilesDirectory, "faces"); + core.listenerManager.addListener(EventType.PLAYER_JOIN, new PlayerEventListener() { + @Override + public void playerEvent(DynmapPlayer p) { + Runnable job = new LoadPlayerImages(p.getName()); + if(fetchskins) + MapManager.scheduleDelayedJob(job, 0); + else + job.run(); + } + }); + facesdir = new File(core.getTilesFolder(), "faces"); + facesdir.mkdirs(); /* Make sure directory exists */ faces8x8dir = new File(facesdir, "8x8"); faces8x8dir.mkdirs(); diff --git a/src/main/java/org/dynmap/PlayerList.java b/src/main/java/org/dynmap/PlayerList.java index 144ae8f3..8328e2ac 100644 --- a/src/main/java/org/dynmap/PlayerList.java +++ b/src/main/java/org/dynmap/PlayerList.java @@ -8,20 +8,20 @@ import java.io.OutputStream; import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Scanner; -import java.util.Set; -import org.bukkit.Server; -import org.bukkit.entity.Player; +import org.dynmap.common.DynmapPlayer; +import org.dynmap.common.DynmapServerInterface; public class PlayerList { - private Server server; + private DynmapServerInterface server; private HashSet hiddenPlayerNames = new HashSet(); private File hiddenPlayersFile; private ConfigurationNode configuration; - private Player[] online; + private DynmapPlayer[] online; - public PlayerList(Server server, File hiddenPlayersFile, ConfigurationNode configuration) { + public PlayerList(DynmapServerInterface server, File hiddenPlayersFile, ConfigurationNode configuration) { this.server = server; this.hiddenPlayersFile = hiddenPlayersFile; this.configuration = configuration; @@ -74,45 +74,32 @@ public class PlayerList { hide(playerName); } - // TODO: Clean this up... one day - public Player[] getVisiblePlayers(String worldName) { - ArrayList visiblePlayers = new ArrayList(); - Player[] onlinePlayers = online; /* Use copied list - we don't call from server thread */ + public List getVisiblePlayers(String worldName) { + ArrayList visiblePlayers = new ArrayList(); + DynmapPlayer[] onlinePlayers = online; /* Use copied list - we don't call from server thread */ boolean useWhitelist = configuration.getBoolean("display-whitelist", false); for (int i = 0; i < onlinePlayers.length; i++) { - Player p = onlinePlayers[i]; - if(p == null) continue; - if (p.getWorld().getName().equals(worldName) && !(useWhitelist ^ hiddenPlayerNames.contains(p.getName().toLowerCase()))) { - visiblePlayers.add(p); - } - } - Player[] result = new Player[visiblePlayers.size()]; - visiblePlayers.toArray(result); - return result; - } - - public Player[] getVisiblePlayers() { - ArrayList visiblePlayers = new ArrayList(); - Player[] onlinePlayers = online; /* Use copied list - we don't call from server thread */ - boolean useWhitelist = configuration.getBoolean("display-whitelist", false); - for (int i = 0; i < onlinePlayers.length; i++) { - Player p = onlinePlayers[i]; + DynmapPlayer p = onlinePlayers[i]; if(p == null) continue; + if((worldName != null) && (p.getWorld().equals(worldName) == false)) continue; + if (!(useWhitelist ^ hiddenPlayerNames.contains(p.getName().toLowerCase()))) { visiblePlayers.add(p); } } - Player[] result = new Player[visiblePlayers.size()]; - visiblePlayers.toArray(result); - return result; + return visiblePlayers; + } + + public List getVisiblePlayers() { + return getVisiblePlayers(null); } - public Set getHiddenPlayers() { - HashSet hidden = new HashSet(); - Player[] onlinePlayers = online; /* Use copied list - we don't call from server thread */ + public List getHiddenPlayers() { + ArrayList hidden = new ArrayList(); + DynmapPlayer[] onlinePlayers = online; /* Use copied list - we don't call from server thread */ boolean useWhitelist = configuration.getBoolean("display-whitelist", false); for (int i = 0; i < onlinePlayers.length; i++) { - Player p = onlinePlayers[i]; + DynmapPlayer p = onlinePlayers[i]; if(p == null) continue; if (useWhitelist ^ hiddenPlayerNames.contains(p.getName().toLowerCase())) { hidden.add(p); @@ -120,10 +107,6 @@ public class PlayerList { } return hidden; } - - public boolean isVisiblePlayer(Player p) { - return isVisiblePlayer(p.getName()); - } public boolean isVisiblePlayer(String p) { boolean useWhitelist = configuration.getBoolean("display-whitelist", false); @@ -133,13 +116,13 @@ public class PlayerList { /** * Call this from server thread to update player list safely */ - void updateOnlinePlayers(Player skipone) { - Player[] players = server.getOnlinePlayers(); - Player[] pl = new Player[players.length]; + void updateOnlinePlayers(String skipone) { + DynmapPlayer[] players = server.getOnlinePlayers(); + DynmapPlayer[] pl = new DynmapPlayer[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) + if(pl[i].getName().equals(skipone)) pl[i] = null; } online = pl; diff --git a/src/main/java/org/dynmap/SimpleWebChatComponent.java b/src/main/java/org/dynmap/SimpleWebChatComponent.java index f9fd70cd..8e3e6d42 100644 --- a/src/main/java/org/dynmap/SimpleWebChatComponent.java +++ b/src/main/java/org/dynmap/SimpleWebChatComponent.java @@ -6,18 +6,20 @@ import org.bukkit.event.player.PlayerChatEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerListener; import org.bukkit.event.player.PlayerQuitEvent; +import org.dynmap.common.DynmapListenerManager; +import org.dynmap.common.DynmapListenerManager.ChatEventListener; +import org.dynmap.common.DynmapListenerManager.EventType; +import org.dynmap.common.DynmapPlayer; import org.json.simple.JSONObject; public class SimpleWebChatComponent extends Component { - public SimpleWebChatComponent(final DynmapPlugin plugin, final ConfigurationNode configuration) { + public SimpleWebChatComponent(final DynmapCore plugin, final ConfigurationNode configuration) { super(plugin, configuration); plugin.events.addListener("webchat", new Event.Listener() { @Override public void triggered(ChatEvent t) { - DynmapWebChatEvent evt = new DynmapWebChatEvent(t.source, t.name, t.message); - plugin.getServer().getPluginManager().callEvent(evt); - if(evt.isCancelled() == false) { + if(plugin.getServer().sendWebChatEvent(t.source, t.name, t.message)) { String msg; String msgfmt = plugin.configuration.getString("webmsgformat", null); if(msgfmt != null) { @@ -40,35 +42,29 @@ public class SimpleWebChatComponent extends Component { }); if (configuration.getBoolean("allowchat", false)) { - PlayerChatListener playerListener = new PlayerChatListener(); - plugin.registerEvent(org.bukkit.event.Event.Type.PLAYER_CHAT, playerListener); - plugin.registerEvent(org.bukkit.event.Event.Type.PLAYER_LOGIN, playerListener); - plugin.registerEvent(org.bukkit.event.Event.Type.PLAYER_JOIN, playerListener); - plugin.registerEvent(org.bukkit.event.Event.Type.PLAYER_QUIT, playerListener); + plugin.listenerManager.addListener(EventType.PLAYER_CHAT, new ChatEventListener() { + @Override + public void chatEvent(DynmapPlayer p, String msg) { + if(core.mapManager != null) + core.mapManager.pushUpdate(new Client.ChatMessage("player", "", p.getDisplayName(), msg, p.getName())); + } + }); + plugin.listenerManager.addListener(EventType.PLAYER_JOIN, new DynmapListenerManager.PlayerEventListener() { + @Override + public void playerEvent(DynmapPlayer p) { + if((core.mapManager != null) && (core.playerList != null) && (core.playerList.isVisiblePlayer(p.getName()))) { + core.mapManager.pushUpdate(new Client.PlayerJoinMessage(p.getDisplayName(), p.getName())); + } + } + }); + plugin.listenerManager.addListener(EventType.PLAYER_QUIT, new DynmapListenerManager.PlayerEventListener() { + @Override + public void playerEvent(DynmapPlayer p) { + if((core.mapManager != null) && (core.playerList != null) && (core.playerList.isVisiblePlayer(p.getName()))) { + core.mapManager.pushUpdate(new Client.PlayerQuitMessage(p.getDisplayName(), p.getName())); + } + } + }); } } - - protected class PlayerChatListener extends PlayerListener { - @Override - public void onPlayerChat(PlayerChatEvent event) { - if(event.isCancelled()) return; - if(plugin.mapManager != null) - plugin.mapManager.pushUpdate(new Client.ChatMessage("player", "", event.getPlayer().getDisplayName(), event.getMessage(), event.getPlayer().getName())); - } - - @Override - public void onPlayerJoin(PlayerJoinEvent event) { - if((plugin.mapManager != null) && (plugin.playerList != null) && (plugin.playerList.isVisiblePlayer(event.getPlayer()))) { - plugin.mapManager.pushUpdate(new Client.PlayerJoinMessage(event.getPlayer().getDisplayName(), event.getPlayer().getName())); - } - } - - @Override - public void onPlayerQuit(PlayerQuitEvent event) { - if((plugin.mapManager != null) && (plugin.playerList != null) && (plugin.playerList.isVisiblePlayer(event.getPlayer()))) { - plugin.mapManager.pushUpdate(new Client.PlayerQuitMessage(event.getPlayer().getDisplayName(), event.getPlayer().getName())); - } - } - } - } diff --git a/src/main/java/org/dynmap/TestComponent.java b/src/main/java/org/dynmap/TestComponent.java index 304679c2..92ce77cd 100644 --- a/src/main/java/org/dynmap/TestComponent.java +++ b/src/main/java/org/dynmap/TestComponent.java @@ -2,7 +2,7 @@ package org.dynmap; public class TestComponent extends Component { - public TestComponent(DynmapPlugin plugin, ConfigurationNode configuration) { + public TestComponent(DynmapCore plugin, ConfigurationNode configuration) { super(plugin, configuration); Log.info("Hello! I'm a component that does stuff! Like saying what is in my configuration: " + configuration.getString("stuff")); } diff --git a/src/main/java/org/dynmap/Armor.java b/src/main/java/org/dynmap/bukkit/Armor.java similarity index 98% rename from src/main/java/org/dynmap/Armor.java rename to src/main/java/org/dynmap/bukkit/Armor.java index ae799c57..edd4bd3c 100644 --- a/src/main/java/org/dynmap/Armor.java +++ b/src/main/java/org/dynmap/bukkit/Armor.java @@ -1,4 +1,4 @@ -package org.dynmap; +package org.dynmap.bukkit; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; diff --git a/src/main/java/org/dynmap/bukkit/BukkitEventProcessor.java b/src/main/java/org/dynmap/bukkit/BukkitEventProcessor.java new file mode 100644 index 00000000..3d696d9d --- /dev/null +++ b/src/main/java/org/dynmap/bukkit/BukkitEventProcessor.java @@ -0,0 +1,416 @@ +package org.dynmap.bukkit; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.bukkit.event.CustomEventListener; +import org.bukkit.event.Event; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockBurnEvent; +import org.bukkit.event.block.BlockFadeEvent; +import org.bukkit.event.block.BlockFormEvent; +import org.bukkit.event.block.BlockFromToEvent; +import org.bukkit.event.block.BlockListener; +import org.bukkit.event.block.BlockPhysicsEvent; +import org.bukkit.event.block.BlockPistonExtendEvent; +import org.bukkit.event.block.BlockPistonRetractEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.block.BlockSpreadEvent; +import org.bukkit.event.block.LeavesDecayEvent; +import org.bukkit.event.block.SignChangeEvent; +import org.bukkit.event.entity.EntityExplodeEvent; +import org.bukkit.event.entity.EntityListener; +import org.bukkit.event.player.PlayerBedLeaveEvent; +import org.bukkit.event.player.PlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerListener; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.world.ChunkLoadEvent; +import org.bukkit.event.world.ChunkPopulateEvent; +import org.bukkit.event.world.SpawnChangeEvent; +import org.bukkit.event.world.WorldListener; +import org.bukkit.event.world.WorldLoadEvent; +import org.bukkit.event.world.WorldUnloadEvent; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.PluginManager; +import org.dynmap.Log; + +public class BukkitEventProcessor { + private Plugin plugin; + private PluginManager pm; + + private HashMap> event_handlers = new HashMap>(); + + public BukkitEventProcessor(Plugin plugin) { + this.plugin = plugin; + this.pm = plugin.getServer().getPluginManager(); + } + + public void cleanup() { + /* Clean up all registered handlers */ + for(Event.Type t : event_handlers.keySet()) { + List ll = event_handlers.get(t); + ll.clear(); /* Empty list - we use presence of list to remember that we've registered with Bukkit */ + } + pm = null; + plugin = null; + } + + private BlockListener ourBlockEventHandler = new BlockListener() { + + @Override + public void onBlockPlace(BlockPlaceEvent event) { + if(event.isCancelled()) + return; + /* Call listeners */ + List ll = event_handlers.get(event.getType()); + if(ll != null) { + for(Listener l : ll) { + ((BlockListener)l).onBlockPlace(event); + } + } + } + + @Override + public void onBlockBreak(BlockBreakEvent event) { + if(event.isCancelled()) + return; + /* Call listeners */ + List ll = event_handlers.get(event.getType()); + if(ll != null) { + for(Listener l : ll) { + ((BlockListener)l).onBlockBreak(event); + } + } + } + + @Override + public void onLeavesDecay(LeavesDecayEvent event) { + if(event.isCancelled()) + return; + /* Call listeners */ + List ll = event_handlers.get(event.getType()); + if(ll != null) { + for(Listener l : ll) { + ((BlockListener)l).onLeavesDecay(event); + } + } + } + + @Override + public void onBlockBurn(BlockBurnEvent event) { + if(event.isCancelled()) + return; + /* Call listeners */ + List ll = event_handlers.get(event.getType()); + if(ll != null) { + for(Listener l : ll) { + ((BlockListener)l).onBlockBurn(event); + } + } + } + + @Override + public void onBlockForm(BlockFormEvent event) { + if(event.isCancelled()) + return; + /* Call listeners */ + List ll = event_handlers.get(event.getType()); + if(ll != null) { + for(Listener l : ll) { + ((BlockListener)l).onBlockForm(event); + } + } + } + @Override + public void onBlockFade(BlockFadeEvent event) { + if(event.isCancelled()) + return; + /* Call listeners */ + List ll = event_handlers.get(event.getType()); + if(ll != null) { + for(Listener l : ll) { + ((BlockListener)l).onBlockFade(event); + } + } + } + @Override + public void onBlockSpread(BlockSpreadEvent event) { + if(event.isCancelled()) + return; + /* Call listeners */ + List ll = event_handlers.get(event.getType()); + if(ll != null) { + for(Listener l : ll) { + ((BlockListener)l).onBlockSpread(event); + } + } + } + @Override + public void onBlockFromTo(BlockFromToEvent event) { + if(event.isCancelled()) + return; + /* Call listeners */ + List ll = event_handlers.get(event.getType()); + if(ll != null) { + for(Listener l : ll) { + ((BlockListener)l).onBlockFromTo(event); + } + } + } + @Override + public void onBlockPhysics(BlockPhysicsEvent event) { + if(event.isCancelled()) + return; + /* Call listeners */ + List ll = event_handlers.get(event.getType()); + if(ll != null) { + for(Listener l : ll) { + ((BlockListener)l).onBlockPhysics(event); + } + } + } + @Override + public void onBlockPistonRetract(BlockPistonRetractEvent event) { + if(event.isCancelled()) + return; + /* Call listeners */ + List ll = event_handlers.get(event.getType()); + if(ll != null) { + for(Listener l : ll) { + ((BlockListener)l).onBlockPistonRetract(event); + } + } + } + @Override + public void onBlockPistonExtend(BlockPistonExtendEvent event) { + if(event.isCancelled()) + return; + /* Call listeners */ + List ll = event_handlers.get(event.getType()); + if(ll != null) { + for(Listener l : ll) { + ((BlockListener)l).onBlockPistonExtend(event); + } + } + } + @Override + public void onSignChange(SignChangeEvent event) { + if(event.isCancelled()) + return; + /* Call listeners */ + List ll = event_handlers.get(event.getType()); + if(ll != null) { + for(Listener l : ll) { + ((BlockListener)l).onSignChange(event); + } + } + } + }; + private PlayerListener ourPlayerEventHandler = new PlayerListener() { + @Override + public void onPlayerJoin(PlayerJoinEvent event) { + /* Call listeners */ + List ll = event_handlers.get(event.getType()); + if(ll != null) { + for(Listener l : ll) { + ((PlayerListener)l).onPlayerJoin(event); + } + } + } + @Override + public void onPlayerLogin(PlayerLoginEvent event) { + /* Call listeners */ + List ll = event_handlers.get(event.getType()); + if(ll != null) { + for(Listener l : ll) { + ((PlayerListener)l).onPlayerLogin(event); + } + } + } + + @Override + public void onPlayerMove(PlayerMoveEvent event) { + /* Call listeners */ + List ll = event_handlers.get(event.getType()); + if(ll != null) { + for(Listener l : ll) { + ((PlayerListener)l).onPlayerMove(event); + } + } + } + + @Override + public void onPlayerQuit(PlayerQuitEvent event) { + /* Call listeners */ + List ll = event_handlers.get(event.getType()); + if(ll != null) { + for(Listener l : ll) { + ((PlayerListener)l).onPlayerQuit(event); + } + } + } + + @Override + public void onPlayerBedLeave(PlayerBedLeaveEvent event) { + /* Call listeners */ + List ll = event_handlers.get(event.getType()); + if(ll != null) { + for(Listener l : ll) { + ((PlayerListener)l).onPlayerBedLeave(event); + } + } + } + + @Override + public void onPlayerChat(PlayerChatEvent event) { + /* Call listeners */ + List ll = event_handlers.get(event.getType()); + if(ll != null) { + for(Listener l : ll) { + ((PlayerListener)l).onPlayerChat(event); + } + } + } + }; + + private WorldListener ourWorldEventHandler = new WorldListener() { + @Override + public void onWorldLoad(WorldLoadEvent event) { + /* Call listeners */ + List ll = event_handlers.get(event.getType()); + if(ll != null) { + for(Listener l : ll) { + ((WorldListener)l).onWorldLoad(event); + } + } + } + @Override + public void onWorldUnload(WorldUnloadEvent event) { + /* Call listeners */ + List ll = event_handlers.get(event.getType()); + if(ll != null) { + for(Listener l : ll) { + ((WorldListener)l).onWorldUnload(event); + } + } + } + @Override + public void onChunkLoad(ChunkLoadEvent event) { + /* Call listeners */ + List ll = event_handlers.get(event.getType()); + if(ll != null) { + for(Listener l : ll) { + ((WorldListener)l).onChunkLoad(event); + } + } + } + @Override + public void onChunkPopulate(ChunkPopulateEvent event) { + /* Call listeners */ + List ll = event_handlers.get(event.getType()); + if(ll != null) { + for(Listener l : ll) { + ((WorldListener)l).onChunkPopulate(event); + } + } + } + @Override + public void onSpawnChange(SpawnChangeEvent event) { + /* Call listeners */ + List ll = event_handlers.get(event.getType()); + if(ll != null) { + for(Listener l : ll) { + ((WorldListener)l).onSpawnChange(event); + } + } + } + }; + + private CustomEventListener ourCustomEventHandler = new CustomEventListener() { + @Override + public void onCustomEvent(Event event) { + /* Call listeners */ + List ll = event_handlers.get(event.getType()); + if(ll != null) { + for(Listener l : ll) { + ((CustomEventListener)l).onCustomEvent(event); + } + } + } + }; + + private EntityListener ourEntityEventHandler = new EntityListener() { + @Override + public void onEntityExplode(EntityExplodeEvent event) { + if(event.isCancelled()) + return; + /* Call listeners */ + List ll = event_handlers.get(event.getType()); + if(ll != null) { + for(Listener l : ll) { + ((EntityListener)l).onEntityExplode(event); + } + } + } + }; + + /** + * Register event listener - this will be cleaned up properly on a /dynmap reload, unlike + * registering with Bukkit directly + */ + public void registerEvent(Event.Type type, Listener listener) { + List ll = event_handlers.get(type); + if(ll == null) { + switch(type) { /* See if it is a type we're brokering */ + case PLAYER_LOGIN: + case PLAYER_CHAT: + case PLAYER_JOIN: + case PLAYER_QUIT: + case PLAYER_MOVE: + case PLAYER_BED_LEAVE: + pm.registerEvent(type, ourPlayerEventHandler, Event.Priority.Monitor, plugin); + break; + case BLOCK_PLACE: + case BLOCK_BREAK: + case LEAVES_DECAY: + case BLOCK_BURN: + case BLOCK_FORM: + case BLOCK_FADE: + case BLOCK_SPREAD: + case BLOCK_FROMTO: + case BLOCK_PHYSICS: + case BLOCK_PISTON_EXTEND: + case BLOCK_PISTON_RETRACT: + pm.registerEvent(type, ourBlockEventHandler, Event.Priority.Monitor, plugin); + break; + case SIGN_CHANGE: + pm.registerEvent(type, ourBlockEventHandler, Event.Priority.Low, plugin); + break; + case WORLD_LOAD: + case WORLD_UNLOAD: + case CHUNK_LOAD: + case CHUNK_POPULATED: + case SPAWN_CHANGE: + pm.registerEvent(type, ourWorldEventHandler, Event.Priority.Monitor, plugin); + break; + case CUSTOM_EVENT: + pm.registerEvent(type, ourCustomEventHandler, Event.Priority.Monitor, plugin); + break; + case ENTITY_EXPLODE: + pm.registerEvent(type, ourEntityEventHandler, Event.Priority.Monitor, plugin); + break; + default: + Log.severe("registerEvent() in DynmapPlugin does not handle " + type); + return; + } + ll = new ArrayList(); + event_handlers.put(type, ll); /* Add list for this event */ + } + ll.add(listener); + } +} diff --git a/src/main/java/org/dynmap/bukkit/BukkitWorld.java b/src/main/java/org/dynmap/bukkit/BukkitWorld.java new file mode 100644 index 00000000..1d86cee5 --- /dev/null +++ b/src/main/java/org/dynmap/bukkit/BukkitWorld.java @@ -0,0 +1,94 @@ +package org.dynmap.bukkit; +/** + * Bukkit specific implementation of DynmapWorld + */ +import java.util.List; + +import org.bukkit.Location; +import org.bukkit.World; +import org.dynmap.DynmapChunk; +import org.dynmap.DynmapLocation; +import org.dynmap.DynmapWorld; +import org.dynmap.utils.BlockLightLevel; +import org.dynmap.utils.MapChunkCache; + +public class BukkitWorld extends DynmapWorld { + private World world; + private static BlockLightLevel bll = new BlockLightLevel(); + + public BukkitWorld(World w) { + super(w.getName()); + + world = w; + } + /* Test if world is nether */ + @Override + public boolean isNether() { + return world.getEnvironment() == World.Environment.NETHER; + } + /* Get world spawn location */ + @Override + public DynmapLocation getSpawnLocation() { + DynmapLocation dloc = new DynmapLocation(); + Location sloc = world.getSpawnLocation(); + dloc.x = sloc.getBlockX(); dloc.y = sloc.getBlockY(); + dloc.z = sloc.getBlockZ(); dloc.world = sloc.getWorld().getName(); + return dloc; + } + /* Get world time */ + @Override + public long getTime() { + return world.getTime(); + } + /* World is storming */ + @Override + public boolean hasStorm() { + return world.hasStorm(); + } + /* World is thundering */ + @Override + public boolean isThundering() { + return world.isThundering(); + } + /* World is loaded */ + @Override + public boolean isLoaded() { + return (world != null); + } + /* Get light level of block */ + @Override + public int getLightLevel(int x, int y, int z) { + return world.getBlockAt(x, y, z).getLightLevel(); + } + /* Get highest Y coord of given location */ + @Override + public int getHighestBlockYAt(int x, int z) { + return world.getHighestBlockYAt(x, z); + } + /* Test if sky light level is requestable */ + @Override + public boolean canGetSkyLightLevel() { + return bll.isReady(); + } + /* Return sky light level */ + @Override + public int getSkyLightLevel(int x, int y, int z) { + return bll.getSkyLightLevel(world.getBlockAt(x, y, z)); + } + /** + * Get world environment ID (lower case - normal, the_end, nether) + */ + @Override + public String getEnvironment() { + return world.getEnvironment().name().toLowerCase(); + } + /** + * Get map chunk cache for world + */ + @Override + public MapChunkCache getChunkCache(List chunks) { + MapChunkCache c = new NewMapChunkCache(); + c.setChunks(world, chunks); + return c; + } +} diff --git a/src/main/java/org/dynmap/bukkit/DynmapPlugin.java b/src/main/java/org/dynmap/bukkit/DynmapPlugin.java new file mode 100644 index 00000000..13f4822d --- /dev/null +++ b/src/main/java/org/dynmap/bukkit/DynmapPlugin.java @@ -0,0 +1,846 @@ +package org.dynmap.bukkit; + +import java.io.File; +import java.net.InetSocketAddress; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.Callable; +import java.util.concurrent.Future; + +import org.bukkit.ChatColor; +import org.bukkit.Chunk; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.Event.Type; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockBurnEvent; +import org.bukkit.event.block.BlockFadeEvent; +import org.bukkit.event.block.BlockFormEvent; +import org.bukkit.event.block.BlockFromToEvent; +import org.bukkit.event.block.BlockListener; +import org.bukkit.event.block.BlockPhysicsEvent; +import org.bukkit.event.block.BlockPistonExtendEvent; +import org.bukkit.event.block.BlockPistonRetractEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.block.BlockSpreadEvent; +import org.bukkit.event.block.LeavesDecayEvent; +import org.bukkit.event.block.SignChangeEvent; +import org.bukkit.event.entity.EntityExplodeEvent; +import org.bukkit.event.entity.EntityListener; +import org.bukkit.event.player.PlayerBedLeaveEvent; +import org.bukkit.event.player.PlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerListener; +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.world.ChunkLoadEvent; +import org.bukkit.event.world.ChunkPopulateEvent; +import org.bukkit.event.world.SpawnChangeEvent; +import org.bukkit.event.world.WorldListener; +import org.bukkit.event.world.WorldLoadEvent; +import org.bukkit.event.world.WorldUnloadEvent; +import org.bukkit.plugin.PluginDescriptionFile; +import org.bukkit.plugin.PluginManager; +import org.bukkit.plugin.java.JavaPlugin; +import org.dynmap.DynmapAPI; +import org.dynmap.DynmapCore; +import org.dynmap.DynmapLocation; +import org.dynmap.DynmapWebChatEvent; +import org.dynmap.DynmapWorld; +import org.dynmap.Log; +import org.dynmap.MapManager; +import org.dynmap.common.DynmapCommandSender; +import org.dynmap.common.DynmapPlayer; +import org.dynmap.common.DynmapServerInterface; +import org.dynmap.common.DynmapListenerManager.EventType; +import org.dynmap.markers.MarkerAPI; +import org.dynmap.permissions.BukkitPermissions; +import org.dynmap.permissions.NijikokunPermissions; +import org.dynmap.permissions.OpPermissions; +import org.dynmap.permissions.PermissionProvider; + +public class DynmapPlugin extends JavaPlugin implements DynmapAPI { + private DynmapCore core; + private PermissionProvider permissions; + private String version; + public BukkitEventProcessor bep; + + private MapManager mapManager; + public static DynmapPlugin plugin; + + public DynmapPlugin() { + plugin = this; + } + + /** + * Server access abstraction class + */ + public class BukkitServer implements DynmapServerInterface { + @Override + public void scheduleServerTask(Runnable run, long delay) { + getServer().getScheduler().scheduleSyncDelayedTask(DynmapPlugin.this, run, delay); + } + @Override + public DynmapPlayer[] getOnlinePlayers() { + Player[] players = getServer().getOnlinePlayers(); + DynmapPlayer[] dplay = new DynmapPlayer[players.length]; + for(int i = 0; i < players.length; i++) + dplay[i] = new BukkitPlayer(players[i]); + return dplay; + } + @Override + public void reload() { + PluginManager pluginManager = getServer().getPluginManager(); + pluginManager.disablePlugin(DynmapPlugin.this); + pluginManager.enablePlugin(DynmapPlugin.this); + } + @Override + public DynmapPlayer getPlayer(String name) { + Player p = getServer().getPlayerExact(name); + if(p != null) { + return new BukkitPlayer(p); + } + return null; + } + @Override + public Set getIPBans() { + return getServer().getIPBans(); + } + @Override + public Future callSyncMethod(Callable task) { + return getServer().getScheduler().callSyncMethod(DynmapPlugin.this, task); + } + @Override + public String getServerName() { + return getServer().getServerName(); + } + @Override + public boolean isPlayerBanned(String pid) { + OfflinePlayer p = getServer().getOfflinePlayer(pid); + if((p != null) && p.isBanned()) + return true; + return false; + } + @Override + public String stripChatColor(String s) { + return ChatColor.stripColor(s); + } + private Set registered = new HashSet(); + @Override + public boolean requestEventNotification(EventType type) { + if(registered.contains(type)) + return true; + switch(type) { + case WORLD_LOAD: + case WORLD_UNLOAD: + /* Already called for normal world activation/deactivation */ + break; + case WORLD_SPAWN_CHANGE: + bep.registerEvent(Type.SPAWN_CHANGE, new WorldListener() { + public void onWorldSpawnChange(SpawnChangeEvent evt) { + DynmapWorld w = new BukkitWorld(evt.getWorld()); + core.listenerManager.processWorldEvent(EventType.WORLD_SPAWN_CHANGE, w); + } + }); + break; + case PLAYER_JOIN: + case PLAYER_QUIT: + /* Already handled */ + break; + case PLAYER_BED_LEAVE: + bep.registerEvent(Type.PLAYER_BED_LEAVE, new PlayerListener() { + @Override + public void onPlayerBedLeave(PlayerBedLeaveEvent evt) { + DynmapPlayer p = new BukkitPlayer(evt.getPlayer()); + core.listenerManager.processPlayerEvent(EventType.PLAYER_BED_LEAVE, p); + } + }); + break; + case PLAYER_CHAT: + bep.registerEvent(Type.PLAYER_CHAT, new PlayerListener() { + @Override + public void onPlayerChat(PlayerChatEvent evt) { + DynmapPlayer p = null; + if(evt.getPlayer() != null) + p = new BukkitPlayer(evt.getPlayer()); + core.listenerManager.processChatEvent(EventType.PLAYER_CHAT, p, evt.getMessage()); + } + }); + break; + case BLOCK_BREAK: + bep.registerEvent(Type.BLOCK_BREAK, new BlockListener() { + @Override + public void onBlockBreak(BlockBreakEvent evt) { + Block b = evt.getBlock(); + Location l = b.getLocation(); + core.listenerManager.processBlockEvent(EventType.BLOCK_BREAK, b.getType().getId(), + l.getWorld().getName(), l.getBlockX(), l.getBlockY(), l.getBlockZ()); + } + }); + break; + case SIGN_CHANGE: + bep.registerEvent(Type.SIGN_CHANGE, new BlockListener() { + @Override + public void onSignChange(SignChangeEvent evt) { + Block b = evt.getBlock(); + Location l = b.getLocation(); + String[] lines = evt.getLines(); /* Note: changes to this change event - intentional */ + DynmapPlayer dp = null; + Player p = evt.getPlayer(); + if(p != null) dp = new BukkitPlayer(p); + core.listenerManager.processSignChangeEvent(EventType.SIGN_CHANGE, b.getType().getId(), + l.getWorld().getName(), l.getBlockX(), l.getBlockY(), l.getBlockZ(), lines, dp); + } + }); + break; + default: + Log.severe("Unhandled event type: " + type); + return false; + } + return true; + } + @Override + public boolean sendWebChatEvent(String source, String name, String msg) { + DynmapWebChatEvent evt = new DynmapWebChatEvent(source, name, msg); + getServer().getPluginManager().callEvent(evt); + return (evt.isCancelled() == false); + } + @Override + public void broadcastMessage(String msg) { + getServer().broadcastMessage(msg); + } + } + /** + * Player access abstraction class + */ + public class BukkitPlayer extends BukkitCommandSender implements DynmapPlayer { + private Player player; + + public BukkitPlayer(Player p) { + super(p); + player = p; + } + @Override + public boolean isConnected() { + return player.isOnline(); + } + @Override + public String getName() { + return player.getName(); + } + @Override + public String getDisplayName() { + return player.getDisplayName(); + } + @Override + public boolean isOnline() { + return player.isOnline(); + } + @Override + public DynmapLocation getLocation() { + Location loc = player.getLocation(); + return toLoc(loc); + } + @Override + public String getWorld() { + World w = player.getWorld(); + if(w != null) + return w.getName(); + return null; + } + @Override + public InetSocketAddress getAddress() { + return player.getAddress(); + } + @Override + public boolean isSneaking() { + return player.isSneaking(); + } + @Override + public int getHealth() { + return player.getHealth(); + } + @Override + public int getArmorPoints() { + return Armor.getArmorPoints(player); + } + @Override + public DynmapLocation getBedSpawnLocation() { + Location loc = player.getBedSpawnLocation(); + if(loc != null) { + return toLoc(loc); + } + return null; + } + } + /* Handler for generic console command sender */ + public class BukkitCommandSender implements DynmapCommandSender { + private CommandSender sender; + + public BukkitCommandSender(CommandSender send) { + sender = send; + } + + @Override + public boolean hasPrivilege(String privid) { + return permissions.has(sender, privid); + } + + @Override + public void sendMessage(String msg) { + sender.sendMessage(msg); + } + + @Override + public boolean isConnected() { + return true; + } + @Override + public boolean isOp() { + return sender.isOp(); + } + } + + @Override + public void onEnable() { + PluginDescriptionFile pdfFile = this.getDescription(); + version = pdfFile.getVersion(); + + /* Initialize event processor */ + if(bep == null) + bep = new BukkitEventProcessor(this); + + /* Set up player login/quit event handler */ + registerPlayerLoginListener(); + + permissions = NijikokunPermissions.create(getServer(), "dynmap"); + if (permissions == null) + permissions = BukkitPermissions.create("dynmap"); + if (permissions == null) + permissions = new OpPermissions(new String[] { "fullrender", "cancelrender", "radiusrender", "resetstats", "reload", "purgequeue", "pause", "ips-for-id", "ids-for-ip", "add-id-for-ip", "del-id-for-ip" }); + /* Get and initialize data folder */ + File dataDirectory = this.getDataFolder(); + if(dataDirectory.exists() == false) + dataDirectory.mkdirs(); + /* Get MC version */ + String bukkitver = getServer().getVersion(); + String mcver = "1.0.0"; + int idx = bukkitver.indexOf("(MC: "); + if(idx > 0) { + mcver = bukkitver.substring(idx+5); + idx = mcver.indexOf(")"); + if(idx > 0) mcver = mcver.substring(0, idx); + } + + /* Instantiate core */ + if(core == null) + core = new DynmapCore(); + /* Inject dependencies */ + core.setPluginVersion(version); + core.setMinecraftVersion(mcver); + core.setDataFolder(dataDirectory); + core.setServer(new BukkitServer()); + + /* Enable core */ + if(!core.enableCore()) { + this.setEnabled(false); + return; + } + /* Get map manager from core */ + mapManager = core.getMapManager(); + /* Initialized the currently loaded worlds */ + for (World world : getServer().getWorlds()) { + BukkitWorld w = new BukkitWorld(world); + if(core.processWorldLoad(w)) /* Have core process load first - fire event listeners if good load after */ + core.listenerManager.processWorldEvent(EventType.WORLD_LOAD, w); + } + + /* Register our update trigger events */ + registerEvents(); + } + + @Override + public void onDisable() { + /* Reset registered listeners */ + bep.cleanup(); + /* Disable core */ + core.disableCore(); + } + @Override + public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) { + DynmapCommandSender dsender; + if(sender instanceof Player) { + dsender = new BukkitPlayer((Player)sender); + } + else { + dsender = new BukkitCommandSender(sender); + } + return core.processCommand(dsender, cmd.getName(), commandLabel, args); + } + + + @Override + public final MarkerAPI getMarkerAPI() { + return core.getMarkerAPI(); + } + + @Override + public final boolean markerAPIInitialized() { + return core.markerAPIInitialized(); + } + + @Override + public final boolean sendBroadcastToWeb(String sender, String msg) { + return core.sendBroadcastToWeb(sender, msg); + } + + @Override + public final int triggerRenderOfVolume(String wid, int minx, int miny, int minz, + int maxx, int maxy, int maxz) { + return core.triggerRenderOfVolume(wid, minx, miny, minz, maxx, maxy, maxz); + } + + @Override + public final int triggerRenderOfBlock(String wid, int x, int y, int z) { + return core.triggerRenderOfBlock(wid, x, y, z); + } + + @Override + public final void setPauseFullRadiusRenders(boolean dopause) { + core.setPauseFullRadiusRenders(dopause); + } + + @Override + public final boolean getPauseFullRadiusRenders() { + return core.getPauseFullRadiusRenders(); + } + + @Override + public final void setPauseUpdateRenders(boolean dopause) { + core.setPauseUpdateRenders(dopause); + } + + @Override + public final boolean getPauseUpdateRenders() { + return core.getPauseUpdateRenders(); + } + + @Override + public final void setPlayerVisiblity(String player, boolean is_visible) { + core.setPlayerVisiblity(player, is_visible); + } + + @Override + public final boolean getPlayerVisbility(String player) { + return core.getPlayerVisbility(player); + } + + @Override + public final void postPlayerMessageToWeb(String playerid, String playerdisplay, + String message) { + core.postPlayerMessageToWeb(playerid, playerdisplay, message); + } + + @Override + public final void postPlayerJoinQuitToWeb(String playerid, String playerdisplay, + boolean isjoin) { + core.postPlayerJoinQuitToWeb(playerid, playerdisplay, isjoin); + } + + @Override + public final String getDynmapCoreVersion() { + return core.getDynmapCoreVersion(); + } + + @Override + public final int triggerRenderOfVolume(Location l0, Location l1) { + int x0 = l0.getBlockX(), y0 = l0.getBlockY(), z0 = l0.getBlockZ(); + int x1 = l1.getBlockX(), y1 = l1.getBlockY(), z1 = l1.getBlockZ(); + + return core.triggerRenderOfVolume(l0.getWorld().getName(), Math.min(x0, x1), Math.min(y0, y1), + Math.min(z0, z1), Math.max(x0, x1), Math.max(y0, y1), Math.max(z0, z1)); + } + + @Override + public final void setPlayerVisiblity(Player player, boolean is_visible) { + core.setPlayerVisiblity(player.getName(), is_visible); + } + + @Override + public final boolean getPlayerVisbility(Player player) { + return core.getPlayerVisbility(player.getName()); + } + + @Override + public final void postPlayerMessageToWeb(Player player, String message) { + core.postPlayerMessageToWeb(player.getName(), player.getDisplayName(), message); + } + + @Override + public void postPlayerJoinQuitToWeb(Player player, boolean isjoin) { + core.postPlayerJoinQuitToWeb(player.getName(), player.getDisplayName(), isjoin); + } + + @Override + public String getDynmapVersion() { + return version; + } + + private static DynmapLocation toLoc(Location l) { + return new DynmapLocation(l.getWorld().getName(), l.getBlockX(), l.getBlockY(), l.getBlockZ()); + } + + private void registerPlayerLoginListener() { + PlayerListener pl = new PlayerListener() { + public void onPlayerJoin(PlayerJoinEvent evt) { + DynmapPlayer dp = new BukkitPlayer(evt.getPlayer()); + core.listenerManager.processPlayerEvent(EventType.PLAYER_JOIN, dp); + } + public void onPlayerQuit(PlayerQuitEvent evt) { + DynmapPlayer dp = new BukkitPlayer(evt.getPlayer()); + core.listenerManager.processPlayerEvent(EventType.PLAYER_QUIT, dp); + } + }; + bep.registerEvent(Type.PLAYER_JOIN, pl); + bep.registerEvent(Type.PLAYER_QUIT, pl); + } + + private boolean onplace; + private boolean onbreak; + private boolean onblockform; + private boolean onblockfade; + private boolean onblockspread; + private boolean onblockfromto; + private boolean onblockphysics; + private boolean onleaves; + private boolean onburn; + private boolean onpiston; + private boolean onplayerjoin; + private boolean onplayermove; + private boolean ongeneratechunk; + private boolean onloadchunk; + private boolean onexplosion; + + private void registerEvents() { + BlockListener blockTrigger = new BlockListener() { + @Override + public void onBlockPlace(BlockPlaceEvent event) { + if(event.isCancelled()) + return; + Location loc = event.getBlock().getLocation(); + String wn = loc.getWorld().getName(); + mapManager.sscache.invalidateSnapshot(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); + if(onplace) { + mapManager.touch(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), "blockplace"); + } + } + + @Override + public void onBlockBreak(BlockBreakEvent event) { + if(event.isCancelled()) + return; + Location loc = event.getBlock().getLocation(); + String wn = loc.getWorld().getName(); + mapManager.sscache.invalidateSnapshot(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); + if(onbreak) { + mapManager.touch(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), "blockbreak"); + } + } + + @Override + public void onLeavesDecay(LeavesDecayEvent event) { + if(event.isCancelled()) + return; + Location loc = event.getBlock().getLocation(); + String wn = loc.getWorld().getName(); + mapManager.sscache.invalidateSnapshot(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); + if(onleaves) { + mapManager.touch(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), "leavesdecay"); + } + } + + @Override + public void onBlockBurn(BlockBurnEvent event) { + if(event.isCancelled()) + return; + Location loc = event.getBlock().getLocation(); + String wn = loc.getWorld().getName(); + mapManager.sscache.invalidateSnapshot(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); + if(onburn) { + mapManager.touch(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), "blockburn"); + } + } + + @Override + public void onBlockForm(BlockFormEvent event) { + if(event.isCancelled()) + return; + Location loc = event.getBlock().getLocation(); + String wn = loc.getWorld().getName(); + mapManager.sscache.invalidateSnapshot(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); + if(onblockform) { + mapManager.touch(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), "blockform"); + } + } + + @Override + public void onBlockFade(BlockFadeEvent event) { + if(event.isCancelled()) + return; + Location loc = event.getBlock().getLocation(); + String wn = loc.getWorld().getName(); + mapManager.sscache.invalidateSnapshot(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); + if(onblockfade) { + mapManager.touch(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), "blockfade"); + } + } + + @Override + public void onBlockSpread(BlockSpreadEvent event) { + if(event.isCancelled()) + return; + Location loc = event.getBlock().getLocation(); + String wn = loc.getWorld().getName(); + mapManager.sscache.invalidateSnapshot(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); + if(onblockspread) { + mapManager.touch(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), "blockspread"); + } + } + + @Override + public void onBlockFromTo(BlockFromToEvent event) { + if(event.isCancelled()) + return; + Location loc = event.getToBlock().getLocation(); + String wn = loc.getWorld().getName(); + mapManager.sscache.invalidateSnapshot(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); + if(onblockfromto) + mapManager.touch(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), "blockfromto"); + loc = event.getBlock().getLocation(); + wn = loc.getWorld().getName(); + mapManager.sscache.invalidateSnapshot(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); + if(onblockfromto) + mapManager.touch(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), "blockfromto"); + } + + @Override + public void onBlockPhysics(BlockPhysicsEvent event) { + if(event.isCancelled()) + return; + Location loc = event.getBlock().getLocation(); + String wn = loc.getWorld().getName(); + mapManager.sscache.invalidateSnapshot(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); + if(onblockphysics) { + mapManager.touch(wn, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), "blockphysics"); + } + } + + @Override + public void onBlockPistonRetract(BlockPistonRetractEvent event) { + if(event.isCancelled()) + return; + Block b = event.getBlock(); + Location loc = b.getLocation(); + BlockFace dir; + try { /* Workaround Bukkit bug = http://leaky.bukkit.org/issues/1227 */ + dir = event.getDirection(); + } catch (ClassCastException ccx) { + dir = BlockFace.NORTH; + } + String wn = loc.getWorld().getName(); + int x = loc.getBlockX(), y = loc.getBlockY(), z = loc.getBlockZ(); + mapManager.sscache.invalidateSnapshot(wn, x, y, z); + if(onpiston) + mapManager.touch(wn, x, y, z, "pistonretract"); + for(int i = 0; i < 2; i++) { + x += dir.getModX(); + y += dir.getModY(); + z += dir.getModZ(); + mapManager.sscache.invalidateSnapshot(wn, x, y, z); + if(onpiston) + mapManager.touch(wn, x, y, z, "pistonretract"); + } + } + @Override + public void onBlockPistonExtend(BlockPistonExtendEvent event) { + if(event.isCancelled()) + return; + Block b = event.getBlock(); + Location loc = b.getLocation(); + BlockFace dir; + try { /* Workaround Bukkit bug = http://leaky.bukkit.org/issues/1227 */ + dir = event.getDirection(); + } catch (ClassCastException ccx) { + dir = BlockFace.NORTH; + } + String wn = loc.getWorld().getName(); + int x = loc.getBlockX(), y = loc.getBlockY(), z = loc.getBlockZ(); + mapManager.sscache.invalidateSnapshot(wn, x, y, z); + if(onpiston) + mapManager.touch(wn, x, y, z, "pistonretract"); + for(int i = 0; i < 1+event.getLength(); i++) { + x += dir.getModX(); + y += dir.getModY(); + z += dir.getModZ(); + mapManager.sscache.invalidateSnapshot(wn, x, y, z); + if(onpiston) + mapManager.touch(wn, x, y, z, "pistonretract"); + } + } + }; + + // To trigger rendering. + onplace = core.isTrigger("blockplaced"); + bep.registerEvent(Event.Type.BLOCK_PLACE, blockTrigger); + + onbreak = core.isTrigger("blockbreak"); + bep.registerEvent(Event.Type.BLOCK_BREAK, blockTrigger); + + if(core.isTrigger("snowform")) Log.info("The 'snowform' trigger has been deprecated due to Bukkit changes - use 'blockformed'"); + + onleaves = core.isTrigger("leavesdecay"); + bep.registerEvent(Event.Type.LEAVES_DECAY, blockTrigger); + + onburn = core.isTrigger("blockburn"); + bep.registerEvent(Event.Type.BLOCK_BURN, blockTrigger); + + onblockform = core.isTrigger("blockformed"); + bep.registerEvent(Event.Type.BLOCK_FORM, blockTrigger); + + onblockfade = core.isTrigger("blockfaded"); + bep.registerEvent(Event.Type.BLOCK_FADE, blockTrigger); + + onblockspread = core.isTrigger("blockspread"); + bep.registerEvent(Event.Type.BLOCK_SPREAD, blockTrigger); + + onblockfromto = core.isTrigger("blockfromto"); + bep.registerEvent(Event.Type.BLOCK_FROMTO, blockTrigger); + + onblockphysics = core.isTrigger("blockphysics"); + bep.registerEvent(Event.Type.BLOCK_PHYSICS, blockTrigger); + + onpiston = core.isTrigger("pistonmoved"); + bep.registerEvent(Event.Type.BLOCK_PISTON_EXTEND, blockTrigger); + bep.registerEvent(Event.Type.BLOCK_PISTON_RETRACT, blockTrigger); + /* Register player event trigger handlers */ + PlayerListener playerTrigger = new PlayerListener() { + @Override + public void onPlayerJoin(PlayerJoinEvent event) { + if(onplayerjoin) { + Location loc = event.getPlayer().getLocation(); + mapManager.touch(loc.getWorld().getName(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), "playerjoin"); + } + core.listenerManager.processPlayerEvent(EventType.PLAYER_JOIN, new BukkitPlayer(event.getPlayer())); + } + @Override + public void onPlayerQuit(PlayerQuitEvent event) { + core.listenerManager.processPlayerEvent(EventType.PLAYER_QUIT, new BukkitPlayer(event.getPlayer())); + } + + @Override + public void onPlayerMove(PlayerMoveEvent event) { + Location loc = event.getPlayer().getLocation(); + mapManager.touch(loc.getWorld().getName(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), "playermove"); + } + }; + + onplayerjoin = core.isTrigger("playerjoin"); + onplayermove = core.isTrigger("playermove"); + bep.registerEvent(Event.Type.PLAYER_JOIN, playerTrigger); + bep.registerEvent(Event.Type.PLAYER_QUIT, playerTrigger); + if(onplayermove) + bep.registerEvent(Event.Type.PLAYER_MOVE, playerTrigger); + + /* Register entity event triggers */ + EntityListener entityTrigger = new EntityListener() { + @Override + public void onEntityExplode(EntityExplodeEvent event) { + Location loc = event.getLocation(); + String wname = loc.getWorld().getName(); + int minx, maxx, miny, maxy, minz, maxz; + minx = maxx = loc.getBlockX(); + miny = maxy = loc.getBlockY(); + minz = maxz = loc.getBlockZ(); + /* Calculate volume impacted by explosion */ + List blocks = event.blockList(); + for(Block b: blocks) { + Location l = b.getLocation(); + int x = l.getBlockX(); + if(x < minx) minx = x; + if(x > maxx) maxx = x; + int y = l.getBlockY(); + if(y < miny) miny = y; + if(y > maxy) maxy = y; + int z = l.getBlockZ(); + if(z < minz) minz = z; + if(z > maxz) maxz = z; + } + mapManager.sscache.invalidateSnapshot(wname, minx, miny, minz, maxx, maxy, maxz); + if(onexplosion) { + mapManager.touchVolume(wname, minx, miny, minz, maxx, maxy, maxz, "entityexplode"); + } + } + }; + onexplosion = core.isTrigger("explosion"); + bep.registerEvent(Event.Type.ENTITY_EXPLODE, entityTrigger); + + + /* Register world event triggers */ + WorldListener worldTrigger = new WorldListener() { + @Override + public void onChunkLoad(ChunkLoadEvent event) { + if(core.ignore_chunk_loads) + return; + Chunk c = event.getChunk(); + /* Touch extreme corners */ + int x = c.getX() << 4; + int z = c.getZ() << 4; + mapManager.touchVolume(event.getWorld().getName(), x, 0, z, x+15, 128, z+16, "chunkload"); + } + @Override + public void onChunkPopulate(ChunkPopulateEvent event) { + Chunk c = event.getChunk(); + /* Touch extreme corners */ + int x = c.getX() << 4; + int z = c.getZ() << 4; + mapManager.touchVolume(event.getWorld().getName(), x, 0, z, x+15, 128, z+16, "chunkpopulate"); + } + @Override + public void onWorldLoad(WorldLoadEvent event) { + core.updateConfigHashcode(); + BukkitWorld w = new BukkitWorld(event.getWorld()); + if(core.processWorldLoad(w)) /* Have core process load first - fire event listeners if good load after */ + core.listenerManager.processWorldEvent(EventType.WORLD_LOAD, w); + } + @Override + public void onWorldUnload(WorldUnloadEvent event) { + core.updateConfigHashcode(); + DynmapWorld w = core.getWorld(event.getWorld().getName()); + if(w != null) + core.listenerManager.processWorldEvent(EventType.WORLD_UNLOAD, w); + } + }; + + ongeneratechunk = core.isTrigger("chunkgenerated"); + if(ongeneratechunk) { + bep.registerEvent(Event.Type.CHUNK_POPULATED, worldTrigger); + } + onloadchunk = core.isTrigger("chunkloaded"); + if(onloadchunk) { + bep.registerEvent(Event.Type.CHUNK_LOAD, worldTrigger); + } + + // To link configuration to real loaded worlds. + bep.registerEvent(Event.Type.WORLD_LOAD, worldTrigger); + bep.registerEvent(Event.Type.WORLD_UNLOAD, worldTrigger); + } + +} diff --git a/src/main/java/org/dynmap/utils/NewMapChunkCache.java b/src/main/java/org/dynmap/bukkit/NewMapChunkCache.java similarity index 98% rename from src/main/java/org/dynmap/utils/NewMapChunkCache.java rename to src/main/java/org/dynmap/bukkit/NewMapChunkCache.java index 6cfa8f8e..3466c6c8 100644 --- a/src/main/java/org/dynmap/utils/NewMapChunkCache.java +++ b/src/main/java/org/dynmap/bukkit/NewMapChunkCache.java @@ -1,4 +1,4 @@ -package org.dynmap.utils; +package org.dynmap.bukkit; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; @@ -14,10 +14,14 @@ import org.bukkit.block.Biome; import org.bukkit.entity.Entity; import org.bukkit.ChunkSnapshot; import org.dynmap.DynmapChunk; -import org.dynmap.DynmapPlugin; +import org.dynmap.DynmapCore; import org.dynmap.DynmapWorld; import org.dynmap.Log; import org.dynmap.MapManager; +import org.dynmap.utils.MapChunkCache; +import org.dynmap.utils.MapIterator; +import org.dynmap.utils.MapChunkCache.HiddenChunkStyle; +import org.dynmap.utils.MapChunkCache.VisibilityLimit; import org.dynmap.utils.MapIterator.BlockStep; /** @@ -446,7 +450,7 @@ public class NewMapChunkCache implements MapChunkCache { checkTickList(); - DynmapPlugin.setIgnoreChunkLoads(true); + DynmapCore.setIgnoreChunkLoads(true); //boolean isnormral = w.getEnvironment() == Environment.NORMAL; // Load the required chunks. while((cnt < max_to_load) && iterator.hasNext()) { @@ -556,7 +560,7 @@ public class NewMapChunkCache implements MapChunkCache { } cnt++; } - DynmapPlugin.setIgnoreChunkLoads(false); + DynmapCore.setIgnoreChunkLoads(false); if(iterator.hasNext() == false) { /* If we're done */ isempty = true; diff --git a/src/main/java/org/dynmap/common/DynmapChatColor.java b/src/main/java/org/dynmap/common/DynmapChatColor.java new file mode 100644 index 00000000..780e0d34 --- /dev/null +++ b/src/main/java/org/dynmap/common/DynmapChatColor.java @@ -0,0 +1,37 @@ +package org.dynmap.common; + +import java.util.HashMap; +import java.util.Map; + +import org.bukkit.ChatColor; + +public enum DynmapChatColor { + BLACK(0x0), + DARK_BLUE(0x1), + DARK_GREEN(0x2), + DARK_AQUA(0x3), + DARK_RED(0x4), + DARK_PURPLE(0x5), + GOLD(0x6), + GRAY(0x7), + DARK_GRAY(0x8), + BLUE(0x9), + GREEN(0xA), + AQUA(0xB), + RED(0xC), + LIGHT_PURPLE(0xD), + YELLOW(0xE), + WHITE(0xF); + + private final int code; + private final String str; + + private DynmapChatColor(final int code) { + this.code = code; + this.str = String.format("\u00A7%x", code); + } + @Override + public String toString() { + return str; + } +} diff --git a/src/main/java/org/dynmap/common/DynmapCommandSender.java b/src/main/java/org/dynmap/common/DynmapCommandSender.java new file mode 100644 index 00000000..aa0f16cb --- /dev/null +++ b/src/main/java/org/dynmap/common/DynmapCommandSender.java @@ -0,0 +1,24 @@ +package org.dynmap.common; + +public interface DynmapCommandSender { + /** + * Does command sender have given security privilege + * @param privid - privilege ID + * @return true if it does, false if it doesn't + */ + public boolean hasPrivilege(String privid); + /** + * Send given message to command sender + * @param msg - message to be sent (with color codes marked &0 to &F) + */ + public void sendMessage(String msg); + /** + * Test if command sender is still connected/online + * @return true if connected, false if not + */ + public boolean isConnected(); + /** + * Is operator privilege + */ + public boolean isOp(); +} diff --git a/src/main/java/org/dynmap/common/DynmapListenerManager.java b/src/main/java/org/dynmap/common/DynmapListenerManager.java new file mode 100644 index 00000000..d130bb56 --- /dev/null +++ b/src/main/java/org/dynmap/common/DynmapListenerManager.java @@ -0,0 +1,124 @@ +package org.dynmap.common; + +import java.util.ArrayList; +import java.util.EnumMap; +import java.util.List; +import java.util.Map; + +import org.dynmap.DynmapCore; +import org.dynmap.DynmapWorld; + +/** + * Simple handler for managing event listeners and dispatch in a neutral fashion + * + */ +public class DynmapListenerManager { + private DynmapCore core; + + public DynmapListenerManager(DynmapCore core) { + this.core = core; + } + public interface EventListener { + } + public interface WorldEventListener extends EventListener { + public void worldEvent(DynmapWorld w); + } + public interface PlayerEventListener extends EventListener { + public void playerEvent(DynmapPlayer p); + } + public interface ChatEventListener extends EventListener { + public void chatEvent(DynmapPlayer p, String msg); + } + public interface BlockEventListener extends EventListener { + public void blockEvent(int blkid, String w, int x, int y, int z); + } + public interface SignChangeEventListener extends EventListener { + public void signChangeEvent(int blkid, String w, int x, int y, int z, String[] lines, DynmapPlayer p); + } + public enum EventType { + WORLD_LOAD, + WORLD_UNLOAD, + WORLD_SPAWN_CHANGE, + PLAYER_JOIN, + PLAYER_QUIT, + PLAYER_BED_LEAVE, + PLAYER_CHAT, + BLOCK_BREAK, + SIGN_CHANGE + } + private Map> listeners = new EnumMap>(EventType.class); + + public void addListener(EventType type, EventListener listener) { + ArrayList lst = listeners.get(type); + if(lst == null) { + lst = new ArrayList(); + listeners.put(type, lst); + core.getServer().requestEventNotification(type); + } + lst.add(listener); + } + + public void processWorldEvent(EventType type, DynmapWorld w) { + ArrayList lst = listeners.get(type); + if(lst == null) return; + int sz = lst.size(); + for(int i = 0; i < sz; i++) { + EventListener el = lst.get(i); + if(el instanceof WorldEventListener) { + ((WorldEventListener)el).worldEvent(w); + } + } + } + public void processPlayerEvent(EventType type, DynmapPlayer p) { + ArrayList lst = listeners.get(type); + if(lst == null) return; + int sz = lst.size(); + for(int i = 0; i < sz; i++) { + EventListener el = lst.get(i); + if(el instanceof PlayerEventListener) { + ((PlayerEventListener)el).playerEvent(p); + } + } + } + public void processChatEvent(EventType type, DynmapPlayer p, String msg) { + ArrayList lst = listeners.get(type); + if(lst == null) return; + int sz = lst.size(); + for(int i = 0; i < sz; i++) { + EventListener el = lst.get(i); + if(el instanceof ChatEventListener) { + ((ChatEventListener)el).chatEvent(p, msg); + } + } + } + public void processBlockEvent(EventType type, int blkid, String world, int x, int y, int z) + { + ArrayList lst = listeners.get(type); + if(lst == null) return; + int sz = lst.size(); + for(int i = 0; i < sz; i++) { + EventListener el = lst.get(i); + if(el instanceof BlockEventListener) { + ((BlockEventListener)el).blockEvent(blkid, world, x, y, z); + } + } + } + public void processSignChangeEvent(EventType type, int blkid, String world, int x, int y, int z, String[] lines, DynmapPlayer p) + { + ArrayList lst = listeners.get(type); + if(lst == null) return; + int sz = lst.size(); + for(int i = 0; i < sz; i++) { + EventListener el = lst.get(i); + if(el instanceof SignChangeEventListener) { + ((SignChangeEventListener)el).signChangeEvent(blkid, world, x, y, z, lines, p); + } + } + } + /* Clean up registered listeners */ + public void cleanup() { + for(ArrayList l : listeners.values()) + l.clear(); + listeners.clear(); + } +} diff --git a/src/main/java/org/dynmap/common/DynmapPlayer.java b/src/main/java/org/dynmap/common/DynmapPlayer.java new file mode 100644 index 00000000..ae643897 --- /dev/null +++ b/src/main/java/org/dynmap/common/DynmapPlayer.java @@ -0,0 +1,57 @@ +package org.dynmap.common; + +import java.net.InetSocketAddress; + +import org.bukkit.Location; +import org.dynmap.DynmapLocation; + +/** + * Player (server neutral) - represents online or offline player + */ +public interface DynmapPlayer extends DynmapCommandSender { + /** + * Get player ID + * @return ID (case insensitive) + */ + public String getName(); + /** + * Get player display name + * @return display name + */ + public String getDisplayName(); + /** + * Is player online? + * @return true if online + */ + public boolean isOnline(); + /** + * Get current location of player + * @return location + */ + public DynmapLocation getLocation(); + /** + * Get world ID of player + * @return id + */ + public String getWorld(); + /** + * Get connected address for player + */ + public InetSocketAddress getAddress(); + /** + * Check if player is sneaking + */ + public boolean isSneaking(); + /** + * Get health + */ + public int getHealth(); + /** + * Get armor points + */ + public int getArmorPoints(); + /** + * Get spawn bed location + */ + public DynmapLocation getBedSpawnLocation(); +} diff --git a/src/main/java/org/dynmap/common/DynmapServerInterface.java b/src/main/java/org/dynmap/common/DynmapServerInterface.java new file mode 100644 index 00000000..53265e0a --- /dev/null +++ b/src/main/java/org/dynmap/common/DynmapServerInterface.java @@ -0,0 +1,75 @@ +package org.dynmap.common; + +import java.util.Set; +import java.util.concurrent.Callable; +import java.util.concurrent.Future; + +import org.dynmap.DynmapWorld; +import org.dynmap.common.DynmapListenerManager.EventType; + +/** + * This interface defines a server-neutral interface for the DynmapCore and other neutral components to use to access server provided + * services. Platform-specific plugin must supply DynmapCore with an instance of an object implementing this interface. + */ +public interface DynmapServerInterface { + /** + * Schedule task to run on server-safe thread (one suitable for other server API calls) + * @param run - runnable method + * @param delay - delay in server ticks (50msec) + */ + public void scheduleServerTask(Runnable run, long delay); + /** + * Call method on server-safe thread + * @param call - Callable method + * @return future for completion of call + */ + public Future callSyncMethod(Callable task); + /** + * Get list of online players + * @return list of online players + */ + public DynmapPlayer[] getOnlinePlayers(); + /** + * Request reload of plugin + */ + public void reload(); + /** + * Get active player + * @param name - player name + * @return player + */ + public DynmapPlayer getPlayer(String name); + /** + * Get banned IPs + */ + public Set getIPBans(); + /** + * Get server name + */ + public String getServerName(); + /** + * Test if player ID is banned + */ + public boolean isPlayerBanned(String pid); + /** + * Strip out chat color + */ + public String stripChatColor(String s); + /** + * Request notificiation for given events (used by DynmapListenerManager) + */ + public boolean requestEventNotification(EventType type); + /** + * Send notification of web chat message + * @param source - source + * @param name - name + * @param msg - message text + * @return true if not cancelled + */ + public boolean sendWebChatEvent(String source, String name, String msg); + /** + * Broadcast message to players + * @param msg + */ + public void broadcastMessage(String msg); +} diff --git a/src/main/java/org/dynmap/flat/FlatMap.java b/src/main/java/org/dynmap/flat/FlatMap.java index fbbf9f9f..b290af28 100644 --- a/src/main/java/org/dynmap/flat/FlatMap.java +++ b/src/main/java/org/dynmap/flat/FlatMap.java @@ -14,8 +14,9 @@ import org.dynmap.Color; import org.dynmap.ColorScheme; import org.dynmap.ConfigurationNode; import org.dynmap.DynmapChunk; +import org.dynmap.DynmapCore; import org.dynmap.DynmapLocation; -import org.dynmap.DynmapPlugin.CompassMode; +import org.dynmap.DynmapCore.CompassMode; import org.dynmap.MapManager; import org.dynmap.TileHashManager; import org.dynmap.MapTile; @@ -42,11 +43,11 @@ public class FlatMap extends MapType { private Texture textured = Texture.NONE; private boolean isbigmap; - public FlatMap(ConfigurationNode configuration) { + public FlatMap(DynmapCore core, ConfigurationNode configuration) { this.configuration = configuration; name = configuration.getString("name", null); prefix = configuration.getString("prefix", name); - colorScheme = ColorScheme.getScheme((String) configuration.get("colorscheme")); + colorScheme = ColorScheme.getScheme(core, (String) configuration.get("colorscheme")); Object o = configuration.get("maximumheight"); if (o != null) { maximumHeight = Integer.parseInt(String.valueOf(o)); diff --git a/src/main/java/org/dynmap/hdmap/CaveHDShader.java b/src/main/java/org/dynmap/hdmap/CaveHDShader.java index 05fa0d55..cdeb5f83 100644 --- a/src/main/java/org/dynmap/hdmap/CaveHDShader.java +++ b/src/main/java/org/dynmap/hdmap/CaveHDShader.java @@ -3,6 +3,7 @@ package org.dynmap.hdmap; import static org.dynmap.JSONUtils.s; import org.dynmap.Color; import org.dynmap.ConfigurationNode; +import org.dynmap.DynmapCore; import org.dynmap.utils.MapChunkCache; import org.dynmap.utils.MapIterator; import org.json.simple.JSONObject; @@ -12,7 +13,7 @@ public class CaveHDShader implements HDShader { private boolean iflit; - public CaveHDShader(ConfigurationNode configuration) { + public CaveHDShader(DynmapCore core, ConfigurationNode configuration) { name = (String) configuration.get("name"); iflit = configuration.getBoolean("onlyiflit", false); } diff --git a/src/main/java/org/dynmap/hdmap/DefaultHDLighting.java b/src/main/java/org/dynmap/hdmap/DefaultHDLighting.java index 1513261c..54f182b4 100644 --- a/src/main/java/org/dynmap/hdmap/DefaultHDLighting.java +++ b/src/main/java/org/dynmap/hdmap/DefaultHDLighting.java @@ -2,13 +2,14 @@ package org.dynmap.hdmap; import org.dynmap.Color; import org.dynmap.ConfigurationNode; +import org.dynmap.DynmapCore; import org.json.simple.JSONObject; import static org.dynmap.JSONUtils.s; public class DefaultHDLighting implements HDLighting { private String name; - public DefaultHDLighting(ConfigurationNode configuration) { + public DefaultHDLighting(DynmapCore core, ConfigurationNode configuration) { name = (String) configuration.get("name"); } diff --git a/src/main/java/org/dynmap/hdmap/DefaultHDShader.java b/src/main/java/org/dynmap/hdmap/DefaultHDShader.java index 3693af87..cdab5484 100644 --- a/src/main/java/org/dynmap/hdmap/DefaultHDShader.java +++ b/src/main/java/org/dynmap/hdmap/DefaultHDShader.java @@ -5,6 +5,7 @@ import org.bukkit.block.Biome; import org.dynmap.Color; import org.dynmap.ColorScheme; import org.dynmap.ConfigurationNode; +import org.dynmap.DynmapCore; import org.dynmap.utils.MapChunkCache; import org.dynmap.utils.MapIterator; import org.json.simple.JSONObject; @@ -19,9 +20,9 @@ public class DefaultHDShader implements HDShader { } protected BiomeColorOption biomecolored = BiomeColorOption.NONE; /* Use biome for coloring */ - public DefaultHDShader(ConfigurationNode configuration) { + public DefaultHDShader(DynmapCore core, ConfigurationNode configuration) { name = (String) configuration.get("name"); - colorScheme = ColorScheme.getScheme(configuration.getString("colorscheme", "default")); + colorScheme = ColorScheme.getScheme(core, configuration.getString("colorscheme", "default")); transparency = configuration.getBoolean("transparency", true); /* Default on */ String biomeopt = configuration.getString("biomecolored", "none"); if(biomeopt.equals("biome")) { diff --git a/src/main/java/org/dynmap/hdmap/HDMap.java b/src/main/java/org/dynmap/hdmap/HDMap.java index 2d30b639..733baf45 100644 --- a/src/main/java/org/dynmap/hdmap/HDMap.java +++ b/src/main/java/org/dynmap/hdmap/HDMap.java @@ -9,6 +9,7 @@ import java.util.List; import org.dynmap.Client; import org.dynmap.ConfigurationNode; import org.dynmap.DynmapChunk; +import org.dynmap.DynmapCore; import org.dynmap.DynmapLocation; import org.dynmap.DynmapWorld; import org.dynmap.Log; @@ -36,7 +37,7 @@ public class HDMap extends MapType { public static final String IMGFORMAT_JPG = "jpg"; - public HDMap(ConfigurationNode configuration) { + public HDMap(DynmapCore core, ConfigurationNode configuration) { name = configuration.getString("name", null); if(name == null) { Log.severe("HDMap missing required attribute 'name' - disabled"); diff --git a/src/main/java/org/dynmap/hdmap/HDMapManager.java b/src/main/java/org/dynmap/hdmap/HDMapManager.java index a7a6d37a..c23b08ed 100644 --- a/src/main/java/org/dynmap/hdmap/HDMapManager.java +++ b/src/main/java/org/dynmap/hdmap/HDMapManager.java @@ -6,7 +6,7 @@ import java.util.HashMap; import java.util.HashSet; import org.dynmap.ConfigurationNode; -import org.dynmap.DynmapPlugin; +import org.dynmap.DynmapCore; import org.dynmap.DynmapWorld; import org.dynmap.Log; import org.dynmap.MapManager; @@ -25,29 +25,29 @@ public class HDMapManager { public static boolean waterlightingfix; public static boolean biomeshadingfix; - public void loadHDShaders(DynmapPlugin plugin) { + public void loadHDShaders(DynmapCore core) { Log.verboseinfo("Loading shaders..."); - File f = new File(plugin.getDataFolder(), "shaders.txt"); - if(!plugin.updateUsingDefaultResource("/shaders.txt", f, "shaders")) { + File f = new File(core.getDataFolder(), "shaders.txt"); + if(!core.updateUsingDefaultResource("/shaders.txt", f, "shaders")) { return; } org.bukkit.util.config.Configuration bukkitShaderConfig = new org.bukkit.util.config.Configuration(f); bukkitShaderConfig.load(); ConfigurationNode shadercfg = new ConfigurationNode(bukkitShaderConfig); - for(HDShader shader : shadercfg.createInstances("shaders", new Class[0], new Object[0])) { + for(HDShader shader : shadercfg.createInstances("shaders", new Class[] { DynmapCore.class }, new Object[] { core })) { if(shader.getName() == null) continue; shaders.put(shader.getName(), shader); } /* Load custom shaders, if file is defined - or create empty one if not */ - f = new File(plugin.getDataFolder(), "custom-shaders.txt"); - plugin.createDefaultFileFromResource("/custom-shaders.txt", f); + f = new File(core.getDataFolder(), "custom-shaders.txt"); + core.createDefaultFileFromResource("/custom-shaders.txt", f); if(f.exists()) { bukkitShaderConfig = new org.bukkit.util.config.Configuration(f); bukkitShaderConfig.load(); ConfigurationNode customshadercfg = new ConfigurationNode(bukkitShaderConfig); - for(HDShader shader : customshadercfg.createInstances("shaders", new Class[0], new Object[0])) { + for(HDShader shader : customshadercfg.createInstances("shaders", new Class[] { DynmapCore.class }, new Object[] { core })) { if(shader.getName() == null) continue; shaders.put(shader.getName(), shader); } @@ -57,27 +57,27 @@ public class HDMapManager { TexturePack.handleHideOres(); } - public void loadHDPerspectives(DynmapPlugin plugin) { + public void loadHDPerspectives(DynmapCore core) { Log.verboseinfo("Loading perspectives..."); - File f = new File(plugin.getDataFolder(), "perspectives.txt"); - if(!plugin.updateUsingDefaultResource("/perspectives.txt", f, "perspectives")) { + File f = new File(core.getDataFolder(), "perspectives.txt"); + if(!core.updateUsingDefaultResource("/perspectives.txt", f, "perspectives")) { return; } org.bukkit.util.config.Configuration bukkitPerspectiveConfig = new org.bukkit.util.config.Configuration(f); bukkitPerspectiveConfig.load(); ConfigurationNode perspectivecfg = new ConfigurationNode(bukkitPerspectiveConfig); - for(HDPerspective perspective : perspectivecfg.createInstances("perspectives", new Class[0], new Object[0])) { + for(HDPerspective perspective : perspectivecfg.createInstances("perspectives", new Class[] { DynmapCore.class }, new Object[] { core })) { if(perspective.getName() == null) continue; perspectives.put(perspective.getName(), perspective); } /* Load custom perspectives, if file is defined - or create empty one if not */ - f = new File(plugin.getDataFolder(), "custom-perspectives.txt"); - plugin.createDefaultFileFromResource("/custom-perspectives.txt", f); + f = new File(core.getDataFolder(), "custom-perspectives.txt"); + core.createDefaultFileFromResource("/custom-perspectives.txt", f); if(f.exists()) { bukkitPerspectiveConfig = new org.bukkit.util.config.Configuration(f); bukkitPerspectiveConfig.load(); perspectivecfg = new ConfigurationNode(bukkitPerspectiveConfig); - for(HDPerspective perspective : perspectivecfg.createInstances("perspectives", new Class[0], new Object[0])) { + for(HDPerspective perspective : perspectivecfg.createInstances("perspectives", new Class[] { DynmapCore.class }, new Object[] { core })) { if(perspective.getName() == null) continue; perspectives.put(perspective.getName(), perspective); } @@ -85,28 +85,28 @@ public class HDMapManager { Log.info("Loaded " + perspectives.size() + " perspectives."); } - public void loadHDLightings(DynmapPlugin plugin) { + public void loadHDLightings(DynmapCore core) { Log.verboseinfo("Loading lightings..."); - File f = new File(plugin.getDataFolder(), "lightings.txt"); - if(!plugin.updateUsingDefaultResource("/lightings.txt", f, "lightings")) { + File f = new File(core.getDataFolder(), "lightings.txt"); + if(!core.updateUsingDefaultResource("/lightings.txt", f, "lightings")) { return; } org.bukkit.util.config.Configuration bukkitLightingsConfig = new org.bukkit.util.config.Configuration(f); bukkitLightingsConfig.load(); ConfigurationNode lightingcfg = new ConfigurationNode(bukkitLightingsConfig); - for(HDLighting lighting : lightingcfg.createInstances("lightings", new Class[0], new Object[0])) { + for(HDLighting lighting : lightingcfg.createInstances("lightings", new Class[] { DynmapCore.class }, new Object[] { core })) { if(lighting.getName() == null) continue; lightings.put(lighting.getName(), lighting); } /* Load custom lightings, if file is defined - or create empty one if not */ - f = new File(plugin.getDataFolder(), "custom-lightings.txt"); - plugin.createDefaultFileFromResource("/custom-lightings.txt", f); + f = new File(core.getDataFolder(), "custom-lightings.txt"); + core.createDefaultFileFromResource("/custom-lightings.txt", f); if(f.exists()) { bukkitLightingsConfig = new org.bukkit.util.config.Configuration(f); bukkitLightingsConfig.load(); lightingcfg = new ConfigurationNode(bukkitLightingsConfig); - for(HDLighting lighting : lightingcfg.createInstances("lightings", new Class[0], new Object[0])) { + for(HDLighting lighting : lightingcfg.createInstances("lightings", new Class[] { DynmapCore.class }, new Object[] { core })) { if(lighting.getName() == null) continue; lightings.put(lighting.getName(), lighting); } diff --git a/src/main/java/org/dynmap/hdmap/IsoHDPerspective.java b/src/main/java/org/dynmap/hdmap/IsoHDPerspective.java index 1cbacd2d..8f3145eb 100644 --- a/src/main/java/org/dynmap/hdmap/IsoHDPerspective.java +++ b/src/main/java/org/dynmap/hdmap/IsoHDPerspective.java @@ -14,8 +14,9 @@ import org.dynmap.Client; import org.dynmap.Color; import org.dynmap.ConfigurationNode; import org.dynmap.DynmapChunk; +import org.dynmap.DynmapCore; import org.dynmap.DynmapLocation; -import org.dynmap.DynmapPlugin.CompassMode; +import org.dynmap.DynmapCore.CompassMode; import org.dynmap.Log; import org.dynmap.MapManager; import org.dynmap.MapTile; @@ -762,7 +763,7 @@ public class IsoHDPerspective implements HDPerspective { } } - public IsoHDPerspective(ConfigurationNode configuration) { + public IsoHDPerspective(DynmapCore core, ConfigurationNode configuration) { name = configuration.getString("name", null); if(name == null) { Log.severe("Perspective definition missing name - must be defined and unique"); diff --git a/src/main/java/org/dynmap/hdmap/ShadowHDLighting.java b/src/main/java/org/dynmap/hdmap/ShadowHDLighting.java index e80c0297..f0d0461d 100644 --- a/src/main/java/org/dynmap/hdmap/ShadowHDLighting.java +++ b/src/main/java/org/dynmap/hdmap/ShadowHDLighting.java @@ -2,6 +2,7 @@ package org.dynmap.hdmap; import org.dynmap.Color; import org.dynmap.ConfigurationNode; +import org.dynmap.DynmapCore; import org.dynmap.Log; public class ShadowHDLighting extends DefaultHDLighting { @@ -10,8 +11,8 @@ public class ShadowHDLighting extends DefaultHDLighting { protected int lightscale[]; /* scale skylight level (light = lightscale[skylight] */ protected boolean night_and_day; /* If true, render both day (prefix+'-day') and night (prefix) tiles */ - public ShadowHDLighting(ConfigurationNode configuration) { - super(configuration); + public ShadowHDLighting(DynmapCore core, ConfigurationNode configuration) { + super(core, configuration); double shadowweight = configuration.getDouble("shadowstrength", 0.0); if(shadowweight > 0.0) { shadowscale = new int[16]; diff --git a/src/main/java/org/dynmap/hdmap/TexturePack.java b/src/main/java/org/dynmap/hdmap/TexturePack.java index 9e6877e8..58391551 100644 --- a/src/main/java/org/dynmap/hdmap/TexturePack.java +++ b/src/main/java/org/dynmap/hdmap/TexturePack.java @@ -22,7 +22,7 @@ import javax.imageio.ImageIO; import org.bukkit.block.Biome; import org.dynmap.Color; import org.dynmap.ConfigurationNode; -import org.dynmap.DynmapPlugin; +import org.dynmap.DynmapCore; import org.dynmap.Log; import org.dynmap.MapManager; import org.dynmap.utils.DynmapBufferedImage; @@ -219,12 +219,12 @@ public class TexturePack { } /** Get or load texture pack */ - public static TexturePack getTexturePack(String tpname) { + public static TexturePack getTexturePack(DynmapCore core, String tpname) { TexturePack tp = packs.get(tpname); if(tp != null) return tp; try { - tp = new TexturePack(tpname); /* Attempt to load pack */ + tp = new TexturePack(core, tpname); /* Attempt to load pack */ packs.put(tpname, tp); return tp; } catch (FileNotFoundException fnfx) { @@ -235,9 +235,9 @@ public class TexturePack { /** * Constructor for texture pack, by name */ - private TexturePack(String tpname) throws FileNotFoundException { + private TexturePack(DynmapCore core, String tpname) throws FileNotFoundException { ZipFile zf = null; - File texturedir = getTexturePackDirectory(); + File texturedir = getTexturePackDirectory(core); boolean use_generate = HDMapManager.usegeneratedtextures; if(HDMapManager.biomeshadingfix == false) water_toned_op = COLORMOD_OLD_WATERSHADED; @@ -650,8 +650,8 @@ public class TexturePack { } /* Get texture pack directory */ - private static File getTexturePackDirectory() { - return new File(DynmapPlugin.dataDirectory, "texturepacks"); + private static File getTexturePackDirectory(DynmapCore core) { + return new File(core.getDataFolder(), "texturepacks"); } /** diff --git a/src/main/java/org/dynmap/hdmap/TexturePackHDShader.java b/src/main/java/org/dynmap/hdmap/TexturePackHDShader.java index 2c1031bb..f4b86322 100644 --- a/src/main/java/org/dynmap/hdmap/TexturePackHDShader.java +++ b/src/main/java/org/dynmap/hdmap/TexturePackHDShader.java @@ -4,6 +4,7 @@ import static org.dynmap.JSONUtils.s; import org.dynmap.Color; import org.dynmap.ConfigurationNode; +import org.dynmap.DynmapCore; import org.dynmap.Log; import org.dynmap.MapManager; import org.dynmap.utils.MapChunkCache; @@ -19,10 +20,10 @@ public class TexturePackHDShader implements HDShader { private boolean waterbiomeshaded; private boolean bettergrass; - public TexturePackHDShader(ConfigurationNode configuration) { + public TexturePackHDShader(DynmapCore core, ConfigurationNode configuration) { tpname = configuration.getString("texturepack", "minecraft"); name = configuration.getString("name", tpname); - tp = TexturePack.getTexturePack(tpname); + tp = TexturePack.getTexturePack(core, tpname); biome_shaded = configuration.getBoolean("biomeshaded", true); swamp_shaded = configuration.getBoolean("swampshaded", MapManager.mapman.getSwampShading()); waterbiomeshaded = configuration.getBoolean("waterbiomeshaded", MapManager.mapman.getWaterBiomeShading()); diff --git a/src/main/java/org/dynmap/hdmap/TopoHDShader.java b/src/main/java/org/dynmap/hdmap/TopoHDShader.java index 1b0db397..0fd6adb2 100644 --- a/src/main/java/org/dynmap/hdmap/TopoHDShader.java +++ b/src/main/java/org/dynmap/hdmap/TopoHDShader.java @@ -4,6 +4,7 @@ import static org.dynmap.JSONUtils.s; import org.dynmap.Color; import org.dynmap.ConfigurationNode; +import org.dynmap.DynmapCore; import org.dynmap.Log; import org.dynmap.utils.MapChunkCache; import org.dynmap.utils.MapIterator; @@ -28,7 +29,7 @@ public class TopoHDShader implements HDShader { } return null; } - public TopoHDShader(ConfigurationNode configuration) { + public TopoHDShader(DynmapCore core, ConfigurationNode configuration) { name = (String) configuration.get("name"); fillcolor = new Color[128]; /* Color by Y */ diff --git a/src/main/java/org/dynmap/herochat/HeroChatHandler.java b/src/main/java/org/dynmap/herochat/HeroChatHandler.java index cdc6fe87..b344867a 100644 --- a/src/main/java/org/dynmap/herochat/HeroChatHandler.java +++ b/src/main/java/org/dynmap/herochat/HeroChatHandler.java @@ -4,7 +4,6 @@ import java.lang.reflect.Method; import java.util.Collections; import java.util.List; -import org.bukkit.Server; import org.bukkit.event.CustomEventListener; import org.bukkit.event.Event; import org.bukkit.event.server.PluginEnableEvent; @@ -12,9 +11,13 @@ import org.bukkit.event.server.ServerListener; import org.bukkit.plugin.Plugin; import org.dynmap.Client; import org.dynmap.ConfigurationNode; -import org.dynmap.DynmapPlugin; +import org.dynmap.DynmapCore; import org.dynmap.Log; +import org.dynmap.bukkit.DynmapPlugin; +/** + * Bukkit specific module - alternate chat handler for interfacing with HeroChat + */ public class HeroChatHandler { private static final String DEF_CHANNEL = "Global"; private static final List DEF_CHANNELS = Collections @@ -22,7 +25,7 @@ public class HeroChatHandler { private List hcchannels; private String hcwebinputchannel; - private DynmapPlugin plugin; + private DynmapCore core; private HeroChatChannel hcwebinputchan; private class OurPluginListener extends ServerListener { @@ -229,9 +232,9 @@ public class HeroChatHandler { if (hcchannels.contains(c.getName()) || hcchannels.contains(c.getNick())) { if(cce.isSentByPlayer()) { /* Player message? */ - org.bukkit.entity.Player p = plugin.getServer().getPlayer(cce.getSource()); - if((p != null) && (plugin.mapManager != null)) { - plugin.mapManager.pushUpdate(new Client.ChatMessage("player", + org.bukkit.entity.Player p = DynmapPlugin.plugin.getServer().getPlayer(cce.getSource()); + if((p != null) && (core.mapManager != null)) { + core.mapManager.pushUpdate(new Client.ChatMessage("player", c.getNick(), p.getDisplayName(), cce.getMessage(), @@ -244,21 +247,21 @@ public class HeroChatHandler { } } - public HeroChatHandler(ConfigurationNode cfg, DynmapPlugin plugin, Server server) { + public HeroChatHandler(ConfigurationNode cfg, DynmapCore core) { /* If we're enabling hero chat support */ Log.verboseinfo("HeroChat support configured"); - this.plugin = plugin; + this.core = core; /* Now, get the monitored channel list */ hcchannels = cfg.getStrings("herochatchannels", DEF_CHANNELS); /* And get channel to send web messages */ hcwebinputchannel = cfg.getString("herochatwebchannel", DEF_CHANNEL); - Plugin hc = server.getPluginManager().getPlugin("HeroChat"); + Plugin hc = DynmapPlugin.plugin.getServer().getPluginManager().getPlugin("HeroChat"); if(hc != null) { activateHeroChat(hc); } else { /* Set up to hear when HeroChat is enabled */ - plugin.registerEvent(Event.Type.PLUGIN_ENABLE, new OurPluginListener()); + DynmapPlugin.plugin.bep.registerEvent(Event.Type.PLUGIN_ENABLE, new OurPluginListener()); } } @@ -276,7 +279,7 @@ public class HeroChatHandler { return; } /* Register event handler */ - plugin.registerEvent(Event.Type.CUSTOM_EVENT, new OurEventListener()); + DynmapPlugin.plugin.bep.registerEvent(Event.Type.CUSTOM_EVENT, new OurEventListener()); Log.verboseinfo("HeroChat integration active"); } /** diff --git a/src/main/java/org/dynmap/herochat/HeroWebChatComponent.java b/src/main/java/org/dynmap/herochat/HeroWebChatComponent.java index 34cc86ba..440df745 100644 --- a/src/main/java/org/dynmap/herochat/HeroWebChatComponent.java +++ b/src/main/java/org/dynmap/herochat/HeroWebChatComponent.java @@ -2,29 +2,26 @@ package org.dynmap.herochat; import static org.dynmap.JSONUtils.s; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerListener; -import org.bukkit.event.player.PlayerQuitEvent; import org.dynmap.ChatEvent; import org.dynmap.Client; import org.dynmap.Component; import org.dynmap.ConfigurationNode; -import org.dynmap.DynmapPlugin; -import org.dynmap.DynmapWebChatEvent; +import org.dynmap.DynmapCore; import org.dynmap.Event; +import org.dynmap.common.DynmapListenerManager; +import org.dynmap.common.DynmapListenerManager.EventType; +import org.dynmap.common.DynmapPlayer; import org.json.simple.JSONObject; public class HeroWebChatComponent extends Component { HeroChatHandler handler; - public HeroWebChatComponent(final DynmapPlugin plugin, ConfigurationNode configuration) { + public HeroWebChatComponent(final DynmapCore plugin, ConfigurationNode configuration) { super(plugin, configuration); - handler = new HeroChatHandler(configuration, plugin, plugin.getServer()); + handler = new HeroChatHandler(configuration, plugin); plugin.events.addListener("webchat", new Event.Listener() { @Override public void triggered(ChatEvent t) { - DynmapWebChatEvent evt = new DynmapWebChatEvent(t.source, t.name, t.message); - plugin.getServer().getPluginManager().callEvent(evt); - if(evt.isCancelled() == false) { + if(plugin.getServer().sendWebChatEvent(t.source, t.name, t.message)) { /* Let HeroChat take a look - only broadcast to players if it doesn't handle it */ if (!handler.sendWebMessageToHeroChat(t.name, t.message)) { String msg; @@ -50,25 +47,22 @@ public class HeroWebChatComponent extends Component { }); // Also make HeroChat announce joins and quits. - PlayerChatListener playerListener = new PlayerChatListener(); - plugin.registerEvent(org.bukkit.event.Event.Type.PLAYER_LOGIN, playerListener); - plugin.registerEvent(org.bukkit.event.Event.Type.PLAYER_JOIN, playerListener); - plugin.registerEvent(org.bukkit.event.Event.Type.PLAYER_QUIT, playerListener); - } - - protected class PlayerChatListener extends PlayerListener { - @Override - public void onPlayerJoin(PlayerJoinEvent event) { - if((plugin.mapManager != null) && (plugin.playerList != null) && (plugin.playerList.isVisiblePlayer(event.getPlayer()))) { - plugin.mapManager.pushUpdate(new Client.PlayerJoinMessage(event.getPlayer().getDisplayName(), event.getPlayer().getName())); + core.listenerManager.addListener(EventType.PLAYER_JOIN, new DynmapListenerManager.PlayerEventListener() { + @Override + public void playerEvent(DynmapPlayer p) { + if((core.mapManager != null) && (core.playerList != null) && (core.playerList.isVisiblePlayer(p.getName()))) { + core.mapManager.pushUpdate(new Client.PlayerJoinMessage(p.getDisplayName(), p.getName())); + } } - } - - @Override - public void onPlayerQuit(PlayerQuitEvent event) { - if((plugin.mapManager != null) && (plugin.playerList != null) && (plugin.playerList.isVisiblePlayer(event.getPlayer()))) { - plugin.mapManager.pushUpdate(new Client.PlayerQuitMessage(event.getPlayer().getDisplayName(), event.getPlayer().getName())); + }); + core.listenerManager.addListener(EventType.PLAYER_QUIT, new DynmapListenerManager.PlayerEventListener() { + @Override + public void playerEvent(DynmapPlayer p) { + if((core.mapManager != null) && (core.playerList != null) && (core.playerList.isVisiblePlayer(p.getName()))) { + core.mapManager.pushUpdate(new Client.PlayerQuitMessage(p.getDisplayName(), p.getName())); + } } - } + }); + } } diff --git a/src/main/java/org/dynmap/kzedmap/CaveTileRenderer.java b/src/main/java/org/dynmap/kzedmap/CaveTileRenderer.java index d39eb5f6..1821329b 100644 --- a/src/main/java/org/dynmap/kzedmap/CaveTileRenderer.java +++ b/src/main/java/org/dynmap/kzedmap/CaveTileRenderer.java @@ -2,14 +2,15 @@ package org.dynmap.kzedmap; import org.dynmap.Color; import org.dynmap.ConfigurationNode; +import org.dynmap.DynmapCore; import org.dynmap.DynmapWorld; import org.dynmap.utils.MapIterator; import org.dynmap.utils.MapIterator.BlockStep; public class CaveTileRenderer extends DefaultTileRenderer { private boolean iflit; - public CaveTileRenderer(ConfigurationNode configuration) { - super(configuration); + public CaveTileRenderer(DynmapCore core, ConfigurationNode configuration) { + super(core, configuration); iflit = configuration.getBoolean("onlyiflit", false); } diff --git a/src/main/java/org/dynmap/kzedmap/DefaultTileRenderer.java b/src/main/java/org/dynmap/kzedmap/DefaultTileRenderer.java index d7d3910d..981a5c75 100644 --- a/src/main/java/org/dynmap/kzedmap/DefaultTileRenderer.java +++ b/src/main/java/org/dynmap/kzedmap/DefaultTileRenderer.java @@ -14,9 +14,10 @@ import org.dynmap.Client; import org.dynmap.Color; import org.dynmap.ColorScheme; import org.dynmap.ConfigurationNode; +import org.dynmap.DynmapCore; import org.dynmap.DynmapWorld; import org.dynmap.MapManager; -import org.dynmap.DynmapPlugin.CompassMode; +import org.dynmap.DynmapCore.CompassMode; import org.dynmap.MapType.ImageFormat; import org.dynmap.TileHashManager; import org.dynmap.debug.Debug; @@ -58,7 +59,7 @@ public class DefaultTileRenderer implements MapTileRenderer { public boolean isNightAndDayEnabled() { return night_and_day; } - public DefaultTileRenderer(ConfigurationNode configuration) { + public DefaultTileRenderer(DynmapCore core, ConfigurationNode configuration) { this.configuration = configuration; name = configuration.getString("name", null); prefix = configuration.getString("prefix", name); @@ -94,7 +95,7 @@ public class DefaultTileRenderer implements MapTileRenderer { lightscale[i] = i - (15-v); } } - colorScheme = ColorScheme.getScheme((String)configuration.get("colorscheme")); + colorScheme = ColorScheme.getScheme(core, (String)configuration.get("colorscheme")); night_and_day = configuration.getBoolean("night-and-day", false); transparency = configuration.getBoolean("transparency", true); /* Default on */ String biomeopt = configuration.getString("biomecolored", "none"); diff --git a/src/main/java/org/dynmap/kzedmap/HighlightTileRenderer.java b/src/main/java/org/dynmap/kzedmap/HighlightTileRenderer.java index 360e7683..8d66340a 100644 --- a/src/main/java/org/dynmap/kzedmap/HighlightTileRenderer.java +++ b/src/main/java/org/dynmap/kzedmap/HighlightTileRenderer.java @@ -5,6 +5,7 @@ import java.util.List; import org.dynmap.Color; import org.dynmap.ConfigurationNode; +import org.dynmap.DynmapCore; import org.dynmap.DynmapWorld; import org.dynmap.utils.MapIterator; import org.dynmap.utils.MapIterator.BlockStep; @@ -12,8 +13,8 @@ import org.dynmap.utils.MapIterator.BlockStep; public class HighlightTileRenderer extends DefaultTileRenderer { protected HashSet highlightBlocks = new HashSet(); - public HighlightTileRenderer(ConfigurationNode configuration) { - super(configuration); + public HighlightTileRenderer(DynmapCore core, ConfigurationNode configuration) { + super(core, configuration); List highlight = configuration.getList("highlight"); for(Integer i : highlight) { highlightBlocks.add(i); diff --git a/src/main/java/org/dynmap/kzedmap/KzedMap.java b/src/main/java/org/dynmap/kzedmap/KzedMap.java index a473db7c..32bf1e51 100644 --- a/src/main/java/org/dynmap/kzedmap/KzedMap.java +++ b/src/main/java/org/dynmap/kzedmap/KzedMap.java @@ -9,6 +9,7 @@ import java.util.logging.Logger; import org.dynmap.ConfigurationNode; import org.dynmap.DynmapChunk; +import org.dynmap.DynmapCore; import org.dynmap.DynmapLocation; import org.dynmap.Log; import org.dynmap.MapManager; @@ -40,9 +41,9 @@ public class KzedMap extends MapType { MapTileRenderer[] renderers; private boolean isbigmap; - public KzedMap(ConfigurationNode configuration) { + public KzedMap(DynmapCore core, ConfigurationNode configuration) { Log.verboseinfo("Loading renderers for map '" + getClass().toString() + "'..."); - List renderers = configuration.createInstances("renderers", new Class[0], new Object[0]); + List renderers = configuration.createInstances("renderers", new Class[] { DynmapCore.class }, new Object[] { core } ); this.renderers = new MapTileRenderer[renderers.size()]; renderers.toArray(this.renderers); Log.verboseinfo("Loaded " + renderers.size() + " renderers for map '" + getClass().toString() + "'."); diff --git a/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java b/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java index 1a2ff996..48171fab 100644 --- a/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java +++ b/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java @@ -20,24 +20,17 @@ import java.util.TreeSet; import javax.imageio.ImageIO; -import org.bukkit.Location; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; import org.bukkit.util.config.Configuration; import org.bukkit.util.config.ConfigurationNode; -import org.dynmap.Client; -import org.dynmap.ClientUpdateEvent; -import org.dynmap.DynmapPlugin; +import org.dynmap.DynmapCore; +import org.dynmap.DynmapLocation; import org.dynmap.DynmapWorld; import org.dynmap.Event; import org.dynmap.Log; import org.dynmap.MapManager; import org.dynmap.Client.ComponentMessage; -import org.dynmap.Client.PlayerJoinMessage; +import org.dynmap.common.DynmapCommandSender; +import org.dynmap.common.DynmapPlayer; import org.dynmap.markers.AreaMarker; import org.dynmap.markers.Marker; import org.dynmap.markers.MarkerAPI; @@ -56,9 +49,8 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { private File markertiledir; /* Marker directory for web server (under tiles) */ private HashMap markericons = new HashMap(); private HashMap markersets = new HashMap(); - private HashMap> pointaccum = new HashMap>(); - private Server server; - private Plugin dynmap; + private HashMap> pointaccum = new HashMap>(); + private DynmapCore core; static MarkerAPIImpl api; /* Built-in icons */ @@ -224,23 +216,22 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { } dirty_worlds.clear(); } - server.getScheduler().scheduleSyncDelayedTask(dynmap, this, 20); + core.getServer().scheduleServerTask(this, 20); } } /** * Singleton initializer */ - public static MarkerAPIImpl initializeMarkerAPI(DynmapPlugin plugin) { + public static MarkerAPIImpl initializeMarkerAPI(DynmapCore core) { if(api != null) { - api.cleanup(plugin); + api.cleanup(core); } api = new MarkerAPIImpl(); - api.dynmap = plugin; - api.server = plugin.getServer(); + api.core = core; /* Initialize persistence file name */ - api.markerpersist = new File(plugin.getDataFolder(), "markers.yml"); - api.markerpersist_old = new File(plugin.getDataFolder(), "markers.yml.old"); + api.markerpersist = new File(core.getDataFolder(), "markers.yml"); + api.markerpersist_old = new File(core.getDataFolder(), "markers.yml.old"); /* Fill in default icons and sets, if needed */ for(int i = 0; i < builtin_icons.length; i++) { String id = builtin_icons[i]; @@ -255,13 +246,13 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { } /* Build paths for markers */ - api.markerdir = new File(plugin.getDataFolder(), "markers"); + api.markerdir = new File(core.getDataFolder(), "markers"); if(api.markerdir.isDirectory() == false) { if(api.markerdir.mkdirs() == false) { /* Create directory if needed */ Log.severe("Error creating markers directory - " + api.markerdir.getPath()); } } - api.markertiledir = new File(DynmapPlugin.tilesDirectory, "_markers_"); + api.markertiledir = new File(core.getTilesFolder(), "_markers_"); if(api.markertiledir.isDirectory() == false) { if(api.markertiledir.mkdirs() == false) { /* Create directory if needed */ Log.severe("Error creating markers directory - " + api.markertiledir.getPath()); @@ -274,7 +265,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { /* Freshen files */ api.freshenMarkerFiles(); /* Add listener so we update marker files for other worlds as they become active */ - plugin.events.addListener("worldactivated", api); + core.events.addListener("worldactivated", api); api.scheduleWriteJob(); /* Start write job */ @@ -282,13 +273,13 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { } private void scheduleWriteJob() { - server.getScheduler().scheduleSyncDelayedTask(dynmap, new DoFileWrites(), 20); + core.getServer().scheduleServerTask(new DoFileWrites(), 20); } /** * Cleanup */ - public void cleanup(DynmapPlugin plugin) { + public void cleanup(DynmapCore plugin) { plugin.events.removeListener("worldactivated", api); stop = true; @@ -589,7 +580,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { } } - private static boolean processAreaArgs(CommandSender sender, AreaMarker marker, Map parms) { + private static boolean processAreaArgs(DynmapCommandSender sender, AreaMarker marker, Map parms) { String val = null; try { double ytop = marker.getTopY(); @@ -656,7 +647,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { private static final String ARG_YBOTTOM = "ybottom"; /* Parse argument strings : handle 'attrib:value' and quoted strings */ - private static Map parseArgs(String[] args, CommandSender snd) { + private static Map parseArgs(String[] args, DynmapCommandSender snd) { HashMap rslt = new HashMap(); /* Build command line, so we can parse our way - make sure there is trailing space */ String cmdline = ""; @@ -716,9 +707,8 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { - public static boolean onCommand(DynmapPlugin plugin, CommandSender sender, Command cmd, String commandLabel, String[] args) { + public static boolean onCommand(DynmapCore plugin, DynmapCommandSender sender, String cmd, String commandLabel, String[] args) { String id, setid, file, label, newlabel, iconid, prio, minzoom; - String val; if(api == null) { sender.sendMessage("Markers component is not enabled."); @@ -726,16 +716,16 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { } if(args.length == 0) return false; - Player player = null; - if (sender instanceof Player) - player = (Player) sender; + DynmapPlayer player = null; + if (sender instanceof DynmapPlayer) + player = (DynmapPlayer) sender; /* Check if valid command */ String c = args[0]; if (!commands.contains(c)) { return false; } /* Process commands */ - if(c.equals("add") && plugin.checkPlayerPermission(sender, "marker.add")) { + if(c.equals("add") && api.core.checkPlayerPermission(sender, "marker.add")) { if(player == null) { sender.sendMessage("Command can only be used by player"); } @@ -748,7 +738,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { id = parms.get(ARG_ID); label = parms.get(ARG_LABEL); - Location loc = player.getLocation(); + DynmapLocation loc = player.getLocation(); /* Fill in defaults for missing parameters */ if(iconid == null) { iconid = MarkerIcon.DEFAULT; @@ -768,7 +758,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { return true; } Marker m = set.createMarker(id, label, - loc.getWorld().getName(), loc.getX(), loc.getY(), loc.getZ(), ico, true); + loc.world, loc.x, loc.y, loc.z, ico, true); if(m == null) { sender.sendMessage("Error creating marker"); } @@ -819,8 +809,8 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { return true; } } - Location loc = player.getLocation(); - marker.setLocation(loc.getWorld().getName(), loc.getX(), loc.getY(), loc.getZ()); + DynmapLocation loc = player.getLocation(); + marker.setLocation(loc.world, loc.x, loc.y, loc.z); sender.sendMessage("Updated location of marker id:" + marker.getMarkerID() + " (" + marker.getLabel() + ")"); } else { @@ -1268,7 +1258,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { } /* Add point to accumulator */ else if(c.equals("addcorner") && plugin.checkPlayerPermission(sender, "marker.addarea")) { - Location loc = null; + DynmapLocation loc = null; if(player == null) { id = "-console-"; } @@ -1276,28 +1266,28 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { id = player.getName(); loc = player.getLocation(); } - List ll = api.pointaccum.get(id); /* Find list */ + List ll = api.pointaccum.get(id); /* Find list */ if(args.length > 2) { /* Enough for coord */ - World w = null; + String w = null; if(args.length == 3) { /* No world */ if(ll == null) { /* No points? Error */ sender.sendMessage("First added corner needs world ID after coordinates"); return true; } else { - w = ll.get(0).getWorld(); /* Use same world */ + w = ll.get(0).world; /* Use same world */ } } else { /* Get world ID */ - w = api.server.getWorld(args[3]); - if(w == null) { + w = args[3]; + if(api.core.getWorld(w) == null) { sender.sendMessage("Invalid world ID: " + args[3]); return true; } } try { - loc = new Location(w, Double.parseDouble(args[1]), 64.0, Double.parseDouble(args[2])); + loc = new DynmapLocation(w, Double.parseDouble(args[1]), 64.0, Double.parseDouble(args[2])); } catch (NumberFormatException nfx) { sender.sendMessage("Bad format: /dmarker addcorner "); return true; @@ -1308,16 +1298,16 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { return true; } if(ll == null) { - ll = new ArrayList(); + ll = new ArrayList(); api.pointaccum.put(id, ll); } else { /* Else, if list exists, see if world matches */ - if(ll.get(0).getWorld().equals(loc.getWorld()) == false) { + if(ll.get(0).world.equals(loc.world) == false) { ll.clear(); /* Reset list - point on new world */ } } ll.add(loc); - sender.sendMessage("Added corner #" + ll.size() + " at {" + loc.getX() + "," + loc.getY() + "," + loc.getZ() + "} to list"); + sender.sendMessage("Added corner #" + ll.size() + " at {" + loc.x + "," + loc.y + "," + loc.z + "} to list"); } else if(c.equals("clearcorners") && plugin.checkPlayerPermission(sender, "marker.addarea")) { if(player == null) { @@ -1337,7 +1327,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { else { pid = player.getName(); } - List ll = api.pointaccum.get(pid); /* Find list */ + List ll = api.pointaccum.get(pid); /* Find list */ if((ll == null) || (ll.size() < 2)) { /* Not enough points? */ sender.sendMessage("At least two corners must be added with /dmarker addcorner before an area can be added"); return true; @@ -1362,12 +1352,12 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { double[] xx = new double[ll.size()]; double[] zz = new double[ll.size()]; for(int i = 0; i < ll.size(); i++) { - Location loc = ll.get(i); - xx[i] = loc.getX(); - zz[i] = loc.getZ(); + DynmapLocation loc = ll.get(i); + xx[i] = loc.x; + zz[i] = loc.z; } /* Make area marker */ - AreaMarker m = set.createAreaMarker(id, label, false, ll.get(0).getWorld().getName(), xx, zz, true); + AreaMarker m = set.createAreaMarker(id, label, false, ll.get(0).world, xx, zz, true); if(m == null) { sender.sendMessage("Error creating area"); } diff --git a/src/main/java/org/dynmap/markers/impl/MarkerSignManager.java b/src/main/java/org/dynmap/markers/impl/MarkerSignManager.java index ac43bfa9..54a97b01 100644 --- a/src/main/java/org/dynmap/markers/impl/MarkerSignManager.java +++ b/src/main/java/org/dynmap/markers/impl/MarkerSignManager.java @@ -2,20 +2,11 @@ package org.dynmap.markers.impl; import java.util.Set; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.event.Event; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockListener; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.block.SignChangeEvent; -import org.bukkit.plugin.PluginManager; -import org.dynmap.DynmapPlugin; -import org.dynmap.Log; -import org.dynmap.MapManager; +import org.dynmap.DynmapCore; +import org.dynmap.common.DynmapChatColor; +import org.dynmap.common.DynmapListenerManager; +import org.dynmap.common.DynmapListenerManager.EventType; +import org.dynmap.common.DynmapPlayer; import org.dynmap.markers.Marker; import org.dynmap.markers.MarkerIcon; import org.dynmap.markers.MarkerSet; @@ -23,34 +14,35 @@ import org.dynmap.markers.MarkerSet; public class MarkerSignManager { private static MarkerSignManager mgr = null; - private static DynmapPlugin plugin = null; + private static DynmapCore plugin = null; - private static class SignListener extends BlockListener { + private static final int SIGNPOST_ID = 63; + private static final int WALLSIGN_ID = 68; + + private static class SignListener implements DynmapListenerManager.BlockEventListener, DynmapListenerManager.SignChangeEventListener { @Override - public void onSignChange(SignChangeEvent evt) { - if(evt.isCancelled() || (mgr == null)) + public void signChangeEvent(int blkid, String wname, int x, int y, int z, String[] lines, DynmapPlayer p) { + if(mgr == null) return; - if(!evt.getLine(0).equalsIgnoreCase("[dynmap]")) { /* If not dynmap sign, quit */ + if(!lines[0].equalsIgnoreCase("[dynmap]")) { /* If not dynmap sign, quit */ return; } - Player p = evt.getPlayer(); /* If allowed to do marker signs */ if((p == null) || ((plugin != null) && (plugin.checkPlayerPermission(p, "marker.sign")))) { - Location loc = evt.getBlock().getLocation(); - String id = getSignMarkerID(loc); /* Get marker ID */ + String id = getSignMarkerID(wname, x, y, z); /* Get marker ID */ String set = MarkerSet.DEFAULT; String icon = MarkerIcon.SIGN; String label = ""; - evt.setLine(0, ""); /* Blank out [dynmap] */ + lines[0] = ""; /* Blank out [dynmap] */ for(int i = 1; i < 4; i++) { /* Check other lines for icon: or set: */ - String v = ChatColor.stripColor(evt.getLine(i)); + String v = plugin.getServer().stripChatColor(lines[i]); if(v.startsWith("icon:")) { /* icon: */ icon = v.substring(5); - evt.setLine(i, ""); + lines[i] = ""; } else if(v.startsWith("set:")) { /* set: */ set = v.substring(4); - evt.setLine(i, ""); + lines[i] = ""; } else if(v.length() > 0) { if(label.length() > 0) { @@ -63,13 +55,13 @@ public class MarkerSignManager { MarkerSet ms = MarkerAPIImpl.api.getMarkerSet(set); if(ms == null) { if(p != null) p.sendMessage("Bad marker set - [dynmap] sign invalid"); - evt.setLine(0, ChatColor.RED + ""); + lines[0] = DynmapChatColor.RED + ""; return; } MarkerIcon mi = MarkerAPIImpl.api.getMarkerIcon(icon); /* Get icon */ if(mi == null) { if(p != null) p.sendMessage("Bad marker icon - [dynmap] sign invalid"); - evt.setLine(0, ChatColor.RED + ""); + lines[0] = DynmapChatColor.RED + ""; return; } Marker marker = ms.findMarker(id); @@ -79,25 +71,22 @@ public class MarkerSignManager { marker.setMarkerIcon(mi); } else { /* Make new marker */ - marker = ms.createMarker(id, label, true, loc.getWorld().getName(), loc.getX() + 0.5, loc.getY() + 0.5, loc.getZ() + 0.5, + marker = ms.createMarker(id, label, true, wname, (double)x + 0.5, (double)y + 0.5, (double)z + 0.5, mi, true); if(marker == null) { if(p != null) p.sendMessage("Bad marker - [dynmap] sign invalid"); - evt.setLine(0, ChatColor.RED + ""); + lines[0] = DynmapChatColor.RED + ""; return; } } } } @Override - public void onBlockBreak(BlockBreakEvent evt) { - if(evt.isCancelled() || (mgr == null)) + public void blockEvent(int blkid, String wname, int x, int y, int z) { + if(mgr == null) return; - Block blk = evt.getBlock(); - Material m = blk.getType(); - if((m == Material.SIGN) || (m == Material.SIGN_POST) || (m == Material.WALL_SIGN)) { /* If sign */ - Location loc = blk.getLocation(); - String id = getSignMarkerID(loc); /* Marker sign? */ + if((blkid == WALLSIGN_ID) || (blkid == SIGNPOST_ID)) { /* If sign */ + String id = getSignMarkerID(wname, x, y, z); /* Marker sign? */ Set sets = MarkerAPIImpl.api.getMarkerSets(); for(MarkerSet ms : sets) { Marker marker = ms.findMarker(id); /* See if in this set */ @@ -118,22 +107,21 @@ public class MarkerSignManager { return v; } - public static MarkerSignManager initializeSignManager(DynmapPlugin plugin) { + public static MarkerSignManager initializeSignManager(DynmapCore plugin) { mgr = new MarkerSignManager(); if(sl == null) { sl = new SignListener(); - PluginManager pm = plugin.getServer().getPluginManager(); - pm.registerEvent(Event.Type.BLOCK_BREAK, sl, Event.Priority.Monitor, plugin); - pm.registerEvent(Event.Type.SIGN_CHANGE, sl, Event.Priority.Low, plugin); + plugin.listenerManager.addListener(EventType.BLOCK_BREAK, sl); + plugin.listenerManager.addListener(EventType.SIGN_CHANGE, sl); } MarkerSignManager.plugin = plugin; return mgr; } - public static void terminateSignManager(DynmapPlugin plugin) { + public static void terminateSignManager(DynmapCore plugin) { mgr = null; } - private static String getSignMarkerID(Location loc) { - return "_sign_" + loc.getWorld().getName() + "_" + loc.getBlockX() + "_" + loc.getBlockY() + "_" + loc.getBlockZ(); + private static String getSignMarkerID(String wname, int x, int y, int z) { + return "_sign_" + wname + "_" + x + "_" + y + "_" + z; } } diff --git a/src/main/java/org/dynmap/regions/RegionsComponent.java b/src/main/java/org/dynmap/regions/RegionsComponent.java index 96c152f0..32c7dfdb 100644 --- a/src/main/java/org/dynmap/regions/RegionsComponent.java +++ b/src/main/java/org/dynmap/regions/RegionsComponent.java @@ -2,14 +2,14 @@ package org.dynmap.regions; import org.dynmap.Component; import org.dynmap.ConfigurationNode; -import org.dynmap.DynmapPlugin; +import org.dynmap.DynmapCore; import org.dynmap.Log; public class RegionsComponent extends Component { private static String deprecated_ids[] = { "Residence", "Factions", "Towny", "WorldGuard" }; private static String deprecated_new_plugins[] = { "dynmap-residence", "Dynmap-Factions", "Dynmap-Towny", "Dynmap-WorldGuard" }; - public RegionsComponent(final DynmapPlugin plugin, final ConfigurationNode configuration) { + public RegionsComponent(final DynmapCore plugin, final ConfigurationNode configuration) { super(plugin, configuration); String regiontype = configuration.getString("name", "WorldGuard"); diff --git a/src/main/java/org/dynmap/servlet/ClientConfigurationServlet.java b/src/main/java/org/dynmap/servlet/ClientConfigurationServlet.java index 9748db77..53dd13d2 100644 --- a/src/main/java/org/dynmap/servlet/ClientConfigurationServlet.java +++ b/src/main/java/org/dynmap/servlet/ClientConfigurationServlet.java @@ -8,18 +8,18 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.dynmap.DynmapPlugin; +import org.dynmap.DynmapCore; import org.dynmap.DynmapWorld; import org.dynmap.Event; import org.json.simple.JSONObject; public class ClientConfigurationServlet extends HttpServlet { private static final long serialVersionUID = 9106801553080522469L; - private DynmapPlugin plugin; + private DynmapCore plugin; private byte[] cachedConfiguration = null; private int cached_config_hashcode = 0; - public ClientConfigurationServlet(DynmapPlugin plugin) { + public ClientConfigurationServlet(DynmapCore plugin) { this.plugin = plugin; plugin.events.addListener("worldactivated", new Event.Listener() { @Override diff --git a/src/main/java/org/dynmap/servlet/ClientUpdateServlet.java b/src/main/java/org/dynmap/servlet/ClientUpdateServlet.java index 7b386b00..3c3d7779 100644 --- a/src/main/java/org/dynmap/servlet/ClientUpdateServlet.java +++ b/src/main/java/org/dynmap/servlet/ClientUpdateServlet.java @@ -13,16 +13,16 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.dynmap.ClientUpdateEvent; -import org.dynmap.DynmapPlugin; +import org.dynmap.DynmapCore; import org.dynmap.DynmapWorld; import org.dynmap.Log; import org.dynmap.web.HttpField; import org.json.simple.JSONObject; public class ClientUpdateServlet extends HttpServlet { - private DynmapPlugin plugin; + private DynmapCore plugin; - public ClientUpdateServlet(DynmapPlugin plugin) { + public ClientUpdateServlet(DynmapCore plugin) { this.plugin = plugin; } diff --git a/src/main/java/org/dynmap/servlet/SendMessageServlet.java b/src/main/java/org/dynmap/servlet/SendMessageServlet.java index f6b2efc7..ba91cd70 100644 --- a/src/main/java/org/dynmap/servlet/SendMessageServlet.java +++ b/src/main/java/org/dynmap/servlet/SendMessageServlet.java @@ -1,7 +1,6 @@ package org.dynmap.servlet; -import org.bukkit.OfflinePlayer; -import org.dynmap.DynmapPlugin; +import org.dynmap.DynmapCore; import org.dynmap.Event; import org.dynmap.Log; import org.dynmap.web.HttpStatus; @@ -40,7 +39,7 @@ public class SendMessageServlet extends HttpServlet { public boolean use_player_login_ip = false; public boolean require_player_login_ip = false; public boolean check_user_ban = false; - public DynmapPlugin plug_in; + public DynmapCore plug_in; @Override @@ -77,8 +76,7 @@ public class SendMessageServlet extends HttpServlet { if (ids != null) { String id = ids.get(0); if (check_user_ban) { - OfflinePlayer p = plug_in.getServer().getOfflinePlayer(id); - if ((p != null) && p.isBanned()) { + if (plug_in.getServer().isPlayerBanned(id)) { Log.info("Ignore message from '" + message.name + "' - banned player (" + id + ")"); response.sendError(HttpStatus.Forbidden.getCode()); return; diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 59f21e2c..93c5a20d 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ name: dynmap -main: org.dynmap.DynmapPlugin +main: org.dynmap.bukkit.DynmapPlugin version: "${project.version}-${BUILD_NUMBER}" authors: [FrozenCow, mikeprimm] softdepend: [ Permissions, PermissionEx, bPermissions, PermissionsBukkit]