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 ] +