From e0fcca4b7fe6f0810563f88aa4c5a7dad71e4f36 Mon Sep 17 00:00:00 2001 From: Mike Primm Date: Tue, 6 Sep 2011 04:39:53 +0800 Subject: [PATCH 01/14] Fix single map render message on single map render of day/night worlds --- src/main/java/org/dynmap/MapManager.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/dynmap/MapManager.java b/src/main/java/org/dynmap/MapManager.java index d5dd3621..e43ad101 100644 --- a/src/main/java/org/dynmap/MapManager.java +++ b/src/main/java/org/dynmap/MapManager.java @@ -268,12 +268,15 @@ public class MapManager { activemaplist = map.getMapNamesSharingRender(world); /* Build active map list */ activemaps = ""; - for(String n : activemaplist) { - if((mapname != null) && (!mapname.equals(n))) - continue; - if(activemaps.length() > 0) - activemaps += ","; - activemaps += n; + if(mapname != null) { + activemaps = mapname; + } + else { + for(String n : activemaplist) { + if(activemaps.length() > 0) + activemaps += ","; + activemaps += n; + } } /* Mark all the concurrently rendering maps rendered */ renderedmaps.addAll(map.getMapsSharingRender(world)); From 20e409b71f9fff5c0b634ed59c4e1d70cb287e47 Mon Sep 17 00:00:00 2001 From: Mike Primm Date: Tue, 6 Sep 2011 06:17:46 +0800 Subject: [PATCH 02/14] Start sign support --- src/main/java/org/dynmap/DynmapPlugin.java | 3 +- .../java/org/dynmap/MarkersComponent.java | 11 +++- .../markers/impl/MarkerSignManager.java | 56 +++++++++++++++++++ 3 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/dynmap/markers/impl/MarkerSignManager.java diff --git a/src/main/java/org/dynmap/DynmapPlugin.java b/src/main/java/org/dynmap/DynmapPlugin.java index e91c964e..ab20f5dc 100644 --- a/src/main/java/org/dynmap/DynmapPlugin.java +++ b/src/main/java/org/dynmap/DynmapPlugin.java @@ -39,6 +39,7 @@ 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.PlayerChatEvent; @@ -1152,7 +1153,7 @@ public class DynmapPlugin extends JavaPlugin { case BLOCK_SPREAD: case BLOCK_PISTON_EXTEND: case BLOCK_PISTON_RETRACT: - pm.registerEvent(type, ourBlockEventHandler, Event.Priority.Monitor, this); + pm.registerEvent(type, ourBlockEventHandler, Event.Priority.Monitor, this); break; case WORLD_LOAD: case CHUNK_LOAD: diff --git a/src/main/java/org/dynmap/MarkersComponent.java b/src/main/java/org/dynmap/MarkersComponent.java index a6d189b5..8586d481 100644 --- a/src/main/java/org/dynmap/MarkersComponent.java +++ b/src/main/java/org/dynmap/MarkersComponent.java @@ -1,21 +1,30 @@ package org.dynmap; import org.dynmap.markers.impl.MarkerAPIImpl; +import org.dynmap.markers.impl.MarkerSignManager; /** * Markers component - ties in the component system, both on the server and client */ public class MarkersComponent extends ClientComponent { private MarkerAPIImpl api; + private MarkerSignManager signmgr; public MarkersComponent(DynmapPlugin plugin, ConfigurationNode configuration) { super(plugin, configuration); /* Register API with plugin */ api = MarkerAPIImpl.initializeMarkerAPI(plugin); plugin.registerMarkerAPI(api); - + /* If configuration has enabled sign support, prime it too */ + if(configuration.getBoolean("enablesigns", true)) { + signmgr = MarkerSignManager.initializeSignManager(plugin); + } } @Override public void dispose() { + if(signmgr != null) { + MarkerSignManager.terminateSignManager(this.plugin); + signmgr = null; + } if(api != null) { /* Clean up API registered with plugin */ plugin.registerMarkerAPI(null); diff --git a/src/main/java/org/dynmap/markers/impl/MarkerSignManager.java b/src/main/java/org/dynmap/markers/impl/MarkerSignManager.java new file mode 100644 index 00000000..72426c04 --- /dev/null +++ b/src/main/java/org/dynmap/markers/impl/MarkerSignManager.java @@ -0,0 +1,56 @@ +package org.dynmap.markers.impl; + +import org.bukkit.Location; +import org.bukkit.block.Block; +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; + +public class MarkerSignManager { + + private static MarkerSignManager mgr = null; + + private static class SignListener extends BlockListener { + @Override + public void onSignChange(SignChangeEvent evt) { + if(evt.isCancelled() || (mgr == null)) + return; + Log.info("onSignChange: '" + evt.getLine(0) + "','" + evt.getLine(1) + "','" + evt.getLine(2) + "','" + evt.getLine(3) + "'"); + } + @Override + public void onBlockPlace(BlockPlaceEvent evt) { + if(evt.isCancelled() || (mgr == null)) + return; + } + @Override + public void onBlockBreak(BlockBreakEvent evt) { + if(evt.isCancelled() || (mgr == null)) + return; + } + } + private static SignListener sl = null; /* Do once - /dynmap reload doesn't reset listeners */ + + public static MarkerSignManager initializeSignManager(DynmapPlugin plugin) { + mgr = new MarkerSignManager(); + if(sl == null) { + sl = new SignListener(); + PluginManager pm = plugin.getServer().getPluginManager(); + pm.registerEvent(Event.Type.BLOCK_PLACE, sl, Event.Priority.Low, plugin); + pm.registerEvent(Event.Type.BLOCK_BREAK, sl, Event.Priority.Low, plugin); + pm.registerEvent(Event.Type.SIGN_CHANGE, sl, Event.Priority.Low, plugin); + } + return mgr; + } + public static void terminateSignManager(DynmapPlugin plugin) { + mgr = null; + } + + private static String getSignMarkerID(Location loc) { + return "$sign-" + loc.getWorld().getName() + "/" + loc.getBlockX() + "/" + loc.getBlockY() + "/" + loc.getBlockZ(); + } +} From 36d983ba282503704f94a8f8d6c89b1a957cd90f Mon Sep 17 00:00:00 2001 From: Mike Primm Date: Tue, 6 Sep 2011 07:36:43 +0800 Subject: [PATCH 03/14] Add support for using signs to define markers --- .../java/org/dynmap/MarkersComponent.java | 2 +- .../java/org/dynmap/markers/MarkerIcon.java | 3 +- .../markers/impl/MarkerSignManager.java | 86 +++++++++++++++++-- src/main/resources/configuration.txt | 2 + src/main/resources/plugin.yml | 6 +- 5 files changed, 89 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/dynmap/MarkersComponent.java b/src/main/java/org/dynmap/MarkersComponent.java index 8586d481..ef8b9481 100644 --- a/src/main/java/org/dynmap/MarkersComponent.java +++ b/src/main/java/org/dynmap/MarkersComponent.java @@ -15,7 +15,7 @@ public class MarkersComponent extends ClientComponent { api = MarkerAPIImpl.initializeMarkerAPI(plugin); plugin.registerMarkerAPI(api); /* If configuration has enabled sign support, prime it too */ - if(configuration.getBoolean("enablesigns", true)) { + if(configuration.getBoolean("enablesigns", false)) { signmgr = MarkerSignManager.initializeSignManager(plugin); } } diff --git a/src/main/java/org/dynmap/markers/MarkerIcon.java b/src/main/java/org/dynmap/markers/MarkerIcon.java index a253a421..24993854 100644 --- a/src/main/java/org/dynmap/markers/MarkerIcon.java +++ b/src/main/java/org/dynmap/markers/MarkerIcon.java @@ -6,7 +6,8 @@ package org.dynmap.markers; public interface MarkerIcon { /** Default marker icon - always exists */ public static final String DEFAULT = "default"; - + /** Default sign marker icon - always exists */ + public static final String SIGN = "sign"; /** * Get ID of the marker icon (unique among marker icons) diff --git a/src/main/java/org/dynmap/markers/impl/MarkerSignManager.java b/src/main/java/org/dynmap/markers/impl/MarkerSignManager.java index 72426c04..f09124cd 100644 --- a/src/main/java/org/dynmap/markers/impl/MarkerSignManager.java +++ b/src/main/java/org/dynmap/markers/impl/MarkerSignManager.java @@ -1,7 +1,12 @@ 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; @@ -10,27 +15,94 @@ 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.markers.Marker; +import org.dynmap.markers.MarkerIcon; +import org.dynmap.markers.MarkerSet; public class MarkerSignManager { private static MarkerSignManager mgr = null; + private static DynmapPlugin plugin = null; private static class SignListener extends BlockListener { @Override public void onSignChange(SignChangeEvent evt) { if(evt.isCancelled() || (mgr == null)) return; - Log.info("onSignChange: '" + evt.getLine(0) + "','" + evt.getLine(1) + "','" + evt.getLine(2) + "','" + evt.getLine(3) + "'"); - } - @Override - public void onBlockPlace(BlockPlaceEvent evt) { - if(evt.isCancelled() || (mgr == null)) + if(!evt.getLine(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 set = MarkerSet.DEFAULT; + String icon = MarkerIcon.SIGN; + String label = ""; + evt.setLine(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)); + if(v.startsWith("icon:")) { /* icon: */ + icon = v.substring(5); + evt.setLine(i, ""); + } + else if(v.startsWith("set:")) { /* set: */ + set = v.substring(4); + evt.setLine(i, ""); + } + else if(label.length() == 0) { + label = v; + } + } + /* Get the set and see if the marker is already defined */ + 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 + ""); + 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 + ""); + return; + } + Marker marker = ms.findMarker(id); + /* If exists, update it */ + if(marker != null) { + marker.setLabel(label); + marker.setMarkerIcon(mi); + } + else { /* Make new marker */ + marker = ms.createMarker(id, label, loc.getWorld().getName(), loc.getX() + 0.5, loc.getY() + 0.5, loc.getZ() + 0.5, + mi, true); + if(marker == null) { + if(p != null) p.sendMessage("Bad marker - [dynmap] sign invalid"); + evt.setLine(0, ChatColor.RED + ""); + return; + } + } + } } @Override public void onBlockBreak(BlockBreakEvent evt) { if(evt.isCancelled() || (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? */ + Set sets = MarkerAPIImpl.api.getMarkerSets(); + for(MarkerSet ms : sets) { + Marker marker = ms.findMarker(id); /* See if in this set */ + if(marker != null) { + marker.deleteMarker(); + } + } + } } } private static SignListener sl = null; /* Do once - /dynmap reload doesn't reset listeners */ @@ -40,10 +112,10 @@ public class MarkerSignManager { if(sl == null) { sl = new SignListener(); PluginManager pm = plugin.getServer().getPluginManager(); - pm.registerEvent(Event.Type.BLOCK_PLACE, sl, Event.Priority.Low, plugin); - pm.registerEvent(Event.Type.BLOCK_BREAK, sl, Event.Priority.Low, plugin); + pm.registerEvent(Event.Type.BLOCK_BREAK, sl, Event.Priority.Monitor, plugin); pm.registerEvent(Event.Type.SIGN_CHANGE, sl, Event.Priority.Low, plugin); } + MarkerSignManager.plugin = plugin; return mgr; } public static void terminateSignManager(DynmapPlugin plugin) { diff --git a/src/main/resources/configuration.txt b/src/main/resources/configuration.txt index 00be9d74..a2014af2 100644 --- a/src/main/resources/configuration.txt +++ b/src/main/resources/configuration.txt @@ -45,6 +45,8 @@ components: type: markers # If set, shows labels all the time (default is only on hover) #showlabel: true + # If set, enables support for using signs for markers + #enablesigns: true - class: org.dynmap.ClientComponent type: chat diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 75bd26b1..71b0e1dd 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -58,6 +58,7 @@ permissions: dynmap.marker.delete: true dynmap.marker.list: true dynmap.marker.icons: true + dynmap.marker.sign: true dynmap.render: description: Allows /dynmap render command default: true @@ -107,4 +108,7 @@ permissions: description: Allows /dmarker list dynmap.marker.icons: description: Allows /dmarker icons - \ No newline at end of file + dynmap.marker.sign: + description: Allows creation of markers using signs + default: op + \ No newline at end of file From 2f7890a40b32281d02a1c6999a53bd2e9dcc53e0 Mon Sep 17 00:00:00 2001 From: Mike Primm Date: Tue, 6 Sep 2011 07:47:27 +0800 Subject: [PATCH 04/14] Remove debug messages, adjust sign ID mapping --- src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java | 2 -- src/main/java/org/dynmap/markers/impl/MarkerSignManager.java | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java b/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java index ac179fe2..c230b1e0 100644 --- a/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java +++ b/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java @@ -369,7 +369,6 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { * @param update - type of update */ static void markerUpdated(MarkerImpl marker, MarkerUpdate update) { - Log.info("markerUpdated(" + marker.getMarkerID() + "," + update + ")"); /* Freshen marker file for the world for this marker */ if(api != null) api.writeMarkersFile(marker.getWorld()); @@ -383,7 +382,6 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { * @param update - type of update */ static void markerSetUpdated(MarkerSetImpl markerset, MarkerUpdate update) { - Log.info("markerSetUpdated(" + markerset.getMarkerSetID() + "," + update + ")"); /* Freshen all marker files */ if(api != null) api.freshenMarkerFiles(); diff --git a/src/main/java/org/dynmap/markers/impl/MarkerSignManager.java b/src/main/java/org/dynmap/markers/impl/MarkerSignManager.java index f09124cd..5445ffc9 100644 --- a/src/main/java/org/dynmap/markers/impl/MarkerSignManager.java +++ b/src/main/java/org/dynmap/markers/impl/MarkerSignManager.java @@ -123,6 +123,6 @@ public class MarkerSignManager { } private static String getSignMarkerID(Location loc) { - return "$sign-" + loc.getWorld().getName() + "/" + loc.getBlockX() + "/" + loc.getBlockY() + "/" + loc.getBlockZ(); + return "_sign_" + loc.getWorld().getName() + "_" + loc.getBlockX() + "_" + loc.getBlockY() + "_" + loc.getBlockZ(); } } From 7bee1dcae547476756c7020b27574d67fbb58119 Mon Sep 17 00:00:00 2001 From: Mike Primm Date: Tue, 6 Sep 2011 09:03:30 +0800 Subject: [PATCH 05/14] Fix markers being left on world changes --- web/js/markers.js | 1 + 1 file changed, 1 insertion(+) diff --git a/web/js/markers.js b/web/js/markers.js index bae135d7..2d760192 100644 --- a/web/js/markers.js +++ b/web/js/markers.js @@ -9,6 +9,7 @@ componentconstructors['markers'] = function(dynmap, configuration) { $.each(set.markers, function(mname, marker) { set.layergroup.removeLayer(marker.our_marker); }); + set.markers = {}; }); } From e7f30153b85824bcd1db31a124bdfca04566353e Mon Sep 17 00:00:00 2001 From: Mike Primm Date: Tue, 6 Sep 2011 14:13:37 +0800 Subject: [PATCH 06/14] Add marker set commands - addset, deleteset, listsets --- .../dynmap/markers/impl/MarkerAPIImpl.java | 79 ++++++++++++++++++- src/main/resources/plugin.yml | 19 +++++ 2 files changed, 97 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java b/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java index c230b1e0..f2764884 100644 --- a/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java +++ b/src/main/java/org/dynmap/markers/impl/MarkerAPIImpl.java @@ -404,7 +404,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { } private static final Set commands = new HashSet(Arrays.asList(new String[] { - "add", "movehere", "update", "delete", "list", "icons" + "add", "movehere", "update", "delete", "list", "icons", "addset", "deleteset", "listsets" })); /* Parse argument strings : handle 'attrib:value' and quoted strings */ @@ -683,6 +683,83 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener { sender.sendMessage(ico.getMarkerIconID() + ": label:\"" + ico.getMarkerIconLabel() + "\", builtin:" + ico.isBuiltIn()); } } + else if(c.equals("addset") && plugin.checkPlayerPermission(sender, "marker.addset")) { + if(args.length > 1) { + /* Parse arguements */ + Map parms = parseArgs(args, sender); + if(parms == null) return true; + if((parms.get("id") == null) && (parms.get("label") == null)) { + sender.sendMessage("