diff --git a/WorldEdit.jar b/WorldEdit.jar
new file mode 100644
index 0000000..87abb69
Binary files /dev/null and b/WorldEdit.jar differ
diff --git a/WorldGuard.jar b/WorldGuard.jar
new file mode 100644
index 0000000..2a24a7f
Binary files /dev/null and b/WorldGuard.jar differ
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..15d6dd9
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,83 @@
+
+ 4.0.0
+ org.dynmap
+ Dynmap-WorldGuard
+ 0.10
+
+
+
+
+ src/main/resources
+ true
+
+ *.yml
+ *.txt
+
+
+
+ src/main/resources
+ false
+
+ *.yml
+ *.txt
+
+
+
+
+
+
+ maven-assembly-plugin
+
+
+ src/main/assembly/package.xml
+
+
+
+ 420
+ 493
+ 493
+
+
+
+
+
+ build
+ package
+
+ single
+
+
+
+
+
+
+
+
+
+ org.dynmap
+ dynmap-api
+ 0.25
+ compile
+
+
+ org.bukkit
+ bukkit
+ 0.0.1-SNAPSHOT
+ compile
+
+
+ com.sk89q
+ WorldGuard
+ 5.3
+ system
+ ${project.basedir}/WorldGuard.jar
+
+
+ com.sk89q
+ WorldEdit
+ 4.7
+ system
+ ${project.basedir}/WorldEdit.jar
+
+
+
\ No newline at end of file
diff --git a/src/main/assembly/package.xml b/src/main/assembly/package.xml
new file mode 100644
index 0000000..2ec55c3
--- /dev/null
+++ b/src/main/assembly/package.xml
@@ -0,0 +1,16 @@
+
+ bin
+ false
+
+ zip
+
+
+
+
+
+ ${project.build.directory}/${artifactId}-${version}.jar
+ /
+ ${artifactId}.jar
+
+
+
diff --git a/src/main/java/org/dynmap/worldguard/DynmapWorldGuardPlugin.java b/src/main/java/org/dynmap/worldguard/DynmapWorldGuardPlugin.java
new file mode 100644
index 0000000..b1d6c4b
--- /dev/null
+++ b/src/main/java/org/dynmap/worldguard/DynmapWorldGuardPlugin.java
@@ -0,0 +1,300 @@
+package org.dynmap.worldguard;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.bukkit.Location;
+import org.bukkit.World;
+import org.bukkit.configuration.ConfigurationSection;
+import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.plugin.java.JavaPlugin;
+import org.bukkit.plugin.Plugin;
+import org.dynmap.DynmapAPI;
+import org.dynmap.markers.AreaMarker;
+import org.dynmap.markers.MarkerAPI;
+import org.dynmap.markers.MarkerSet;
+import org.dynmap.markers.Marker;
+
+import com.sk89q.worldedit.BlockVector;
+import com.sk89q.worldedit.BlockVector2D;
+import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
+import com.sk89q.worldguard.protection.GlobalRegionManager;
+import com.sk89q.worldguard.protection.flags.Flag;
+import com.sk89q.worldguard.protection.managers.RegionManager;
+import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion;
+import com.sk89q.worldguard.protection.regions.ProtectedPolygonalRegion;
+import com.sk89q.worldguard.protection.regions.ProtectedRegion;
+
+public class DynmapWorldGuardPlugin extends JavaPlugin {
+ private static final Logger log = Logger.getLogger("Minecraft");
+ private static final String LOG_PREFIX = "[Dynmap-WorldGuard] ";
+ private static final String DEF_INFOWINDOW = "
%regionname%
Owner %playerowners%
Flags
%flags%
";
+ DynmapAPI api;
+ MarkerAPI markerapi;
+ WorldGuardPlugin wg;
+
+ FileConfiguration cfg;
+ MarkerSet set;
+ long updperiod;
+ boolean use3d;
+ String infowindow;
+ AreaStyle defstyle;
+ Map cusstyle;
+ Set visible;
+ Set hidden;
+
+ private static class AreaStyle {
+ String strokecolor;
+ double strokeopacity;
+ int strokeweight;
+ String fillcolor;
+ double fillopacity;
+
+ AreaStyle(FileConfiguration cfg, String path, AreaStyle def) {
+ strokecolor = cfg.getString(path+".strokeColor", def.strokecolor);
+ strokeopacity = cfg.getDouble(path+".strokeOpacity", def.strokeopacity);
+ strokeweight = cfg.getInt(path+".strokeWeight", def.strokeweight);
+ fillcolor = cfg.getString(path+".fillColor", def.fillcolor);
+ fillopacity = cfg.getDouble(path+".fillOpacity", def.fillopacity);
+ }
+
+ AreaStyle(FileConfiguration cfg, String path) {
+ strokecolor = cfg.getString(path+".strokeColor", "#FF0000");
+ strokeopacity = cfg.getDouble(path+".strokeOpacity", 0.8);
+ strokeweight = cfg.getInt(path+".strokeWeight", 3);
+ fillcolor = cfg.getString(path+".fillColor", "#FF0000");
+ fillopacity = cfg.getDouble(path+".fillOpacity", 0.35);
+ }
+ }
+
+ public static void info(String msg) {
+ log.log(Level.INFO, LOG_PREFIX + msg);
+ }
+ public static void severe(String msg) {
+ log.log(Level.SEVERE, LOG_PREFIX + msg);
+ }
+
+ private class WorldGuardUpdate implements Runnable {
+ public void run() {
+ updateRegions();
+ }
+ }
+
+ private Map resareas = new HashMap();
+
+ private String formatInfoWindow(ProtectedRegion region) {
+ String v = ""+infowindow+"
";
+ v = v.replaceAll("%regionname%", region.getId());
+ v = v.replaceAll("%playerowners%", region.getOwners().toPlayersString());
+ v = v.replaceAll("%groupowners%", region.getOwners().toGroupsString());
+ v = v.replaceAll("%playermembers%", region.getMembers().toPlayersString());
+ v = v.replaceAll("%groupmembers%", region.getMembers().toGroupsString());
+ if(region.getParent() != null)
+ v = v.replaceAll("%parent%", region.getParent().getId());
+ else
+ v = v.replaceAll("%parent%", "");
+ v = v.replaceAll("%priority%", String.valueOf(region.getPriority()));
+ Map, Object> map = region.getFlags();
+ String flgs = "";
+ for(Flag> f : map.keySet()) {
+ flgs += f.getName() + ": " + map.get(f).toString() + "
";
+ }
+ v = v.replaceAll("%flags%", flgs);
+ return v;
+ }
+
+ private boolean isVisible(String id) {
+ if((visible != null) && (visible.size() > 0)) {
+ if(visible.contains(id) == false) {
+ return false;
+ }
+ }
+ if((hidden != null) && (hidden.size() > 0)) {
+ if(hidden.contains(id))
+ return false;
+ }
+ return true;
+ }
+
+ private void addStyle(String resid, AreaMarker m) {
+ AreaStyle as = cusstyle.get(resid);
+ if(as == null)
+ as = defstyle;
+ int sc = 0xFF0000;
+ int fc = 0xFF0000;
+ try {
+ sc = Integer.parseInt(as.strokecolor.substring(1), 16);
+ fc = Integer.parseInt(as.fillcolor.substring(1), 16);
+ } catch (NumberFormatException nfx) {
+ }
+ m.setLineStyle(as.strokeweight, as.strokeopacity, sc);
+ m.setFillStyle(as.fillopacity, fc);
+ }
+
+ /* Handle specific region */
+ private void handleRegion(World world, ProtectedRegion region, Map newmap) {
+ String name = region.getId();
+ double[] x = null;
+ double[] z = null;
+
+ /* Build popup */
+ String desc = formatInfoWindow(region);
+
+ /* Handle areas */
+ if(isVisible(region.getId())) {
+ String id = region.getId();
+ String tn = region.getTypeName();
+ BlockVector l0 = region.getMinimumPoint();
+ BlockVector l1 = region.getMaximumPoint();
+
+ if(tn.equalsIgnoreCase("cuboid")) { /* Cubiod region? */
+ /* Make outline */
+ x = new double[4];
+ z = new double[4];
+ x[0] = l0.getX(); z[0] = l0.getZ();
+ x[1] = l0.getX(); z[1] = l1.getZ()+1.0;
+ x[2] = l1.getX() + 1.0; z[2] = l1.getZ()+1.0;
+ x[3] = l1.getX() + 1.0; z[3] = l0.getZ();
+ }
+ else if(tn.equalsIgnoreCase("polygon")) {
+ ProtectedPolygonalRegion ppr = (ProtectedPolygonalRegion)region;
+ List points = ppr.getPoints();
+ x = new double[points.size()];
+ z = new double[points.size()];
+ for(int i = 0; i < points.size(); i++) {
+ BlockVector2D pt = points.get(i);
+ x[i] = pt.getX(); z[i] = pt.getZ();
+ }
+ }
+ else { /* Unsupported type */
+ return;
+ }
+ AreaMarker m = resareas.remove(id); /* Existing area? */
+ if(m == null) {
+ m = set.createAreaMarker(id, name, false, world.getName(), x, z, false);
+ if(m == null)
+ return;
+ }
+ else {
+ m.setCornerLocations(x, z); /* Replace corner locations */
+ m.setLabel(name); /* Update label */
+ }
+ if(use3d) { /* If 3D? */
+ m.setRangeY(l1.getY()+1.0, l0.getY());
+ }
+ m.setDescription(desc); /* Set popup */
+
+ /* Set line and fill properties */
+ addStyle(id, m);
+
+ /* Add to map */
+ newmap.put(id, m);
+ }
+ }
+
+ /* Update worldguard region information */
+ private void updateRegions() {
+ Map newmap = new HashMap(); /* Build new map */
+
+ /* Loop through worlds */
+ for(World w : getServer().getWorlds()) {
+ RegionManager rm = wg.getRegionManager(w); /* Get region manager for world */
+ if(rm == null) continue;
+
+ Map regions = rm.getRegions(); /* Get all the regions */
+ for(ProtectedRegion pr : regions.values()) {
+ handleRegion(w, pr, newmap);
+ }
+ }
+ /* Now, review old map - anything left is gone */
+ for(AreaMarker oldm : resareas.values()) {
+ oldm.deleteMarker();
+ }
+ /* And replace with new map */
+ resareas = newmap;
+
+ getServer().getScheduler().scheduleSyncDelayedTask(this, new WorldGuardUpdate(), updperiod);
+
+ }
+
+ public void onEnable() {
+ Plugin p = this.getServer().getPluginManager().getPlugin("dynmap"); /* Find dynmap */
+ if(p == null) {
+ severe("Error loading dynmap API!");
+ return;
+ }
+ api = (DynmapAPI)p; /* Get API */
+ /* Now, get markers API */
+ markerapi = api.getMarkerAPI();
+ if(markerapi == null) {
+ severe("Error loading dynmap marker API!");
+ return;
+ }
+ /* Find worldguard */
+ p = this.getServer().getPluginManager().getPlugin("WorldGuard");
+ if(p == null) {
+ severe("Error loading WorldGuard");
+ return;
+ }
+ wg = (WorldGuardPlugin)p;
+
+ /* Load configuration */
+ FileConfiguration cfg = getConfig();
+ cfg.options().copyDefaults(true); /* Load defaults, if needed */
+ this.saveConfig(); /* Save updates, if needed */
+
+ /* Now, add marker set for mobs (make it transient) */
+ set = markerapi.createMarkerSet("worldguard.markerset", cfg.getString("layer.name", "WorldGuard"), null, false);
+ if(set == null) {
+ severe("Error creating marker set");
+ return;
+ }
+ set.setLayerPriority(cfg.getInt("layer.layerprio", 10));
+ set.setHideByDefault(cfg.getBoolean("layer.hidebydefault", false));
+ use3d = cfg.getBoolean("use3dregions", false);
+ infowindow = cfg.getString("infowindow", DEF_INFOWINDOW);
+
+ /* Get style information */
+ defstyle = new AreaStyle(cfg, "regionstyle");
+ cusstyle = new HashMap();
+ ConfigurationSection sect = cfg.getConfigurationSection("custstyle");
+ if(sect != null) {
+ Set ids = sect.getKeys(false);
+
+ for(String id : ids) {
+ cusstyle.put(id, new AreaStyle(cfg, "custstyle." + id, defstyle));
+ }
+ }
+ List vis = cfg.getList("visibleregions");
+ if(vis != null) {
+ visible = new HashSet(vis);
+ }
+ List hid = cfg.getList("hiddenregions");
+ if(hid != null) {
+ hidden = new HashSet(hid);
+ }
+
+ /* Set up update job - based on periond */
+ int per = cfg.getInt("update.period", 300);
+ if(per < 15) per = 15;
+ updperiod = (long)(per*20);
+
+ getServer().getScheduler().scheduleSyncDelayedTask(this, new WorldGuardUpdate(), 40); /* First time is 2 seconds */
+
+ info("version " + this.getDescription().getVersion() + " is enabled");
+ }
+
+ public void onDisable() {
+ if(set != null) {
+ set.deleteMarkerSet();
+ set = null;
+ }
+ resareas.clear();
+ }
+
+}
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
new file mode 100644
index 0000000..c36efff
--- /dev/null
+++ b/src/main/resources/config.yml
@@ -0,0 +1,45 @@
+# Dynmap-WorldGuard configuration
+#
+update:
+ # Seconds between checks for Residence updates
+ period: 300
+
+layer:
+ name: "WorldGuard"
+ # Make mobs layer hidden by default
+ hidebydefault: false
+ # ordering priority in layer menu (low goes before high - default is 0)
+ layerprio: 0
+
+# Set true to show 3D volumes for zones
+use3dregions: false
+
+# Format for popup - substitute values for macros
+infowindow: '%regionname% (%parent) - %priority
Owners %playerowners%
%groupowners%
Members %playermembers%
%groupmembers%
Flags
%flags%
'
+
+regionstyle:
+ strokeColor: "#FF0000"
+ strokeOpacity: 0.8
+ strokeWeight: 3
+ fillColor: "#FF0000"
+ fillOpacity: 0.35
+
+# Optional setting to limit which regions to show, by name - if commented out, all regions are shown
+#visibleregions:
+# - homebase
+# - miningsite
+# - area.subzone1
+
+# Optional setting to hide specific regions, by name
+#hiddenregions:
+# - hiddenplace
+# - secretsite
+
+# Optional per-region overrides for regionstyle (any defined replace those in regionstyle)
+#customstyle:
+# homebase:
+# strokeColor: "#00FF00"
+# homebase.sub1:
+# strokeColor: "#007F00"
+
+
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
new file mode 100644
index 0000000..a5dddbe
--- /dev/null
+++ b/src/main/resources/plugin.yml
@@ -0,0 +1,6 @@
+name: Dynmap-WorldGuard
+main: org.dynmap.worldguard.DynmapWorldGuardPlugin
+version: "${project.version}"
+author: mikeprimm
+depend: [ dynmap, WorldGuard ]
+