diff --git a/configuration.txt b/configuration.txt
index e2c581cd..7cf8ca37 100644
--- a/configuration.txt
+++ b/configuration.txt
@@ -95,6 +95,19 @@ web:
#- type: digitalclock
- type: timeofdayclock
showdigitalclock: true
+ - type: regions
+ name: WorldGuard
+ useworldpath: true
+ filename: regions.yml
+ basenode: regions
+ use3dregions: true
+ infowindow: '
%regionname% - %priority% (%parent%)
Owners %playerowners% %groupowners%
Members %playermembers% %groupmembers%
Flags
%flags%
'
+ regionstyle:
+ strokeColor: "#FF0000"
+ strokeOpacity: 0.8
+ strokeWeight: 3
+ fillColor: "#FF0000"
+ fillOpacity: 0.35
defaultworld: world
worlds:
diff --git a/src/main/java/org/dynmap/JsonTimerTask.java b/src/main/java/org/dynmap/JsonTimerTask.java
index 615d5d6f..a16ab144 100644
--- a/src/main/java/org/dynmap/JsonTimerTask.java
+++ b/src/main/java/org/dynmap/JsonTimerTask.java
@@ -6,6 +6,8 @@ import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
import java.util.TimerTask;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -15,6 +17,7 @@ import org.bukkit.Server;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.util.config.Configuration;
+import org.bukkit.util.config.ConfigurationNode;
import org.dynmap.web.Json;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
@@ -28,6 +31,7 @@ class JsonTimerTask extends TimerTask {
private Server server;
private MapManager mapManager;
private Configuration configuration;
+ private ConfigurationNode regions;
private static final JSONParser parser = new JSONParser();
private long lastTimestamp = 0;
@@ -36,6 +40,14 @@ class JsonTimerTask extends TimerTask {
this.server = this.plugin.getServer();
this.mapManager = this.plugin.getMapManager();
this.configuration = config;
+ //this.regions = configuration.getNode("web").getNode("components").getNode("regions");
+ System.out.println();
+ for(ConfigurationNode type : configuration.getNodeList("web.components", null))
+ if(type.getString("type").equalsIgnoreCase("regions"))
+ {
+ this.regions = type;
+ break;
+ }
}
public void run() {
@@ -77,6 +89,9 @@ class JsonTimerTask extends TimerTask {
//Handles Updates
for (World world : this.server.getWorlds()) {
+ if(regions.getBoolean("useworldpath", false))
+ parseRegionFile(world.getName() + "/" + regions.getString("filename", "regions.yml"), regions.getString("filename", "regions.yml").replace(".", "_" + world.getName() + ".yml"));
+
current = System.currentTimeMillis();
Client.Update update = new Client.Update();
@@ -111,5 +126,46 @@ class JsonTimerTask extends TimerTask {
}
}
lastTimestamp = System.currentTimeMillis();
+
+ if (!regions.getBoolean("useworldpath", false))
+ parseRegionFile(regions.getString("filename", "regions.yml"), regions.getString("filename", "regions.yml"));
}
+
+ private void parseRegionFile(String regionFile, String outputFileName)
+ {
+ File outputFile;
+ Configuration regionConfig = null;
+ if(regions.getBoolean("useworldpath", false))
+ {
+ if(new File("plugins/"+regions.getString("name", "WorldGuard"), regionFile).exists())
+ regionConfig = new Configuration(new File("plugins/"+regions.getString("name", "WorldGuard"), regionFile));
+ else if(new File("plugins/"+regions.getString("name", "WorldGuard")+"/worlds", regionFile).exists())
+ regionConfig = new Configuration(new File("plugins/"+regions.getString("name", "WorldGuard")+"/worlds", regionFile));
+ }
+ else
+ regionConfig = new Configuration(new File("plugins/"+regions.getString("name", "WorldGuard"), regionFile));
+ //File didn't exist
+ if(regionConfig == null)
+ return;
+ regionConfig.load();
+
+ outputFileName = outputFileName.substring(0, outputFileName.lastIndexOf("."))+".json";
+
+ File webWorldPath = new File(this.configuration.getString("webpath", "web")+"/standalone/", outputFileName);
+ Map, ?> regionData = (Map, ?>) regionConfig.getProperty(regions.getString("basenode", "regions"));
+ if (webWorldPath.isAbsolute())
+ outputFile = webWorldPath;
+ else {
+ outputFile = new File(plugin.getDataFolder(), webWorldPath.toString());
+ }
+ try {
+ FileOutputStream fos = new FileOutputStream(outputFile);
+ fos.write(Json.stringifyJson(regionData).getBytes());
+ fos.close();
+ } catch (FileNotFoundException ex) {
+ log.log(Level.SEVERE, "Exception while writing JSON-file.", ex);
+ } catch (IOException ioe) {
+ log.log(Level.SEVERE, "Exception while writing JSON-file.", ioe);
+ }
+ }
}
diff --git a/web/css/dynmap_style.css b/web/css/dynmap_style.css
index 96ddcef8..a6bff0f0 100644
--- a/web/css/dynmap_style.css
+++ b/web/css/dynmap_style.css
@@ -587,4 +587,7 @@
position: relative;
top: -3px;
left: 0px;
+}
+.infowindow {
+color:black;
}
\ No newline at end of file
diff --git a/web/js/regions.js b/web/js/regions.js
new file mode 100644
index 00000000..3fd8a76c
--- /dev/null
+++ b/web/js/regions.js
@@ -0,0 +1,36 @@
+// Author: nidefawl. contact me at bukkit.org or irc.esper.net #nide
+
+var regionCfg;
+var regionPolygons = {} ;
+var regionInfoWindow = new google.maps.InfoWindow();
+var regionConstructors = {};
+function makeRegionPolygonCube(map, name, region)
+{
+ new regionConstructors['polygon'](map, name, region);
+}
+function regionInfo(event, name, region)
+{
+ new regionConstructors['info'](event, name, region);
+}
+componentconstructors['regions'] = function(dynmap, configuration)
+{
+ regionCfg = configuration;
+
+ loadjs('js/regions_' + regionCfg.name + '.js', function()
+ {
+ var world_info = dynmap.map.mapTypeId.split('.');
+ new regionConstructors['update'](world_info[0]);
+
+ $(dynmap).bind('mapchanged', function() {
+ var world_info = dynmap.map.mapTypeId.split('.');
+ new regionConstructors['update'](world_info[0]);
+ });
+ });
+}
+
+function arrayReplace(replace, by, str)
+{
+ for (var i=0; i 64)
+ region.max.y = 64;
+ if(regionCfg.use3dregions)
+ {
+ regionPolygons[name+'_bottom'] = new google.maps.Polygon($.extend(regionCfg.regionstyle, {
+ paths: [
+ map.getProjection().fromWorldToLatLng(region.min.x,region.min.y,region.min.z),
+ map.getProjection().fromWorldToLatLng(region.max.x,region.min.y,region.min.z),
+ map.getProjection().fromWorldToLatLng(region.max.x,region.min.y,region.max.z),
+ map.getProjection().fromWorldToLatLng(region.min.x,region.min.y,region.max.z)
+ ],
+ map: map
+ }));
+ regionPolygons[name+'_top'] = new google.maps.Polygon($.extend(regionCfg.regionstyle, {
+ paths: [
+ map.getProjection().fromWorldToLatLng(region.min.x,region.max.y,region.min.z),
+ map.getProjection().fromWorldToLatLng(region.max.x,region.max.y,region.min.z),
+ map.getProjection().fromWorldToLatLng(region.max.x,region.max.y,region.max.z),
+ map.getProjection().fromWorldToLatLng(region.min.x,region.max.y,region.max.z)
+ ],
+ map: map
+ }));
+ regionPolygons[name+'_east'] = new google.maps.Polygon($.extend(regionCfg.regionstyle, {
+ paths: [
+ map.getProjection().fromWorldToLatLng(region.min.x,region.min.y,region.min.z),
+ map.getProjection().fromWorldToLatLng(region.min.x,region.max.y,region.min.z),
+ map.getProjection().fromWorldToLatLng(region.max.x,region.max.y,region.min.z),
+ map.getProjection().fromWorldToLatLng(region.max.x,region.min.y,region.min.z)
+ ],
+ map: map
+ }));
+ regionPolygons[name+'_south'] = new google.maps.Polygon($.extend(regionCfg.regionstyle, {
+ paths: [
+ map.getProjection().fromWorldToLatLng(region.max.x,region.min.y,region.min.z),
+ map.getProjection().fromWorldToLatLng(region.max.x,region.max.y,region.min.z),
+ map.getProjection().fromWorldToLatLng(region.max.x,region.max.y,region.max.z),
+ map.getProjection().fromWorldToLatLng(region.max.x,region.min.y,region.max.z)
+ ],
+ map: map
+ }));
+ regionPolygons[name+'_west'] = new google.maps.Polygon($.extend(regionCfg.regionstyle, {
+ paths: [
+ map.getProjection().fromWorldToLatLng(region.min.x,region.min.y,region.max.z),
+ map.getProjection().fromWorldToLatLng(region.min.x,region.max.y,region.max.z),
+ map.getProjection().fromWorldToLatLng(region.max.x,region.max.y,region.max.z),
+ map.getProjection().fromWorldToLatLng(region.max.x,region.min.y,region.max.z)
+ ],
+ map: map
+ }));
+ regionPolygons[name+'_north'] = new google.maps.Polygon($.extend(regionCfg.regionstyle, {
+ paths: [
+ map.getProjection().fromWorldToLatLng(region.min.x,region.min.y,region.min.z),
+ map.getProjection().fromWorldToLatLng(region.min.x,region.max.y,region.min.z),
+ map.getProjection().fromWorldToLatLng(region.min.x,region.max.y,region.max.z),
+ map.getProjection().fromWorldToLatLng(region.min.x,region.min.y,region.max.z)
+ ],
+ map: map
+ }));
+ google.maps.event.addListener(regionPolygons[name+'_bottom'] , 'click', function(event) {
+ regionInfo(event, name, region);
+ });
+ google.maps.event.addListener(regionPolygons[name+'_top'] , 'click', function(event) {
+ regionInfo(event, name, region);
+ });
+ google.maps.event.addListener(regionPolygons[name+'_east'] , 'click', function(event) {
+ regionInfo(event, name, region);
+ });
+ google.maps.event.addListener(regionPolygons[name+'_south'] , 'click', function(event) {
+ regionInfo(event, name, region);
+ });
+ google.maps.event.addListener(regionPolygons[name+'_west'] , 'click', function(event) {
+ regionInfo(event, name, region);
+ });
+ google.maps.event.addListener(regionPolygons[name+'_north'] , 'click', function(event) {
+ regionInfo(event, name, region);
+ });
+ }
+ else
+ {
+ regionPolygons[name+'_bottom'] = new google.maps.Polygon($.extend(regionCfg.regionstyle, {
+ paths: [
+ map.getProjection().fromWorldToLatLng(region.min.x,region.max.y,region.min.z),
+ map.getProjection().fromWorldToLatLng(region.max.x,region.max.y,region.min.z),
+ map.getProjection().fromWorldToLatLng(region.max.x,region.max.y,region.max.z),
+ map.getProjection().fromWorldToLatLng(region.min.x,region.max.y,region.max.z)
+ ],
+ map: map
+ }));
+
+ google.maps.event.addListener(regionPolygons[name+'_bottom'] , 'click', function(event) {
+ regionInfo(event, name, region);
+ });
+ }
+}
+regionConstructors['info'] = function(event, name, region)
+{
+ var owners = {'players':'', 'groups':''};
+ $.each(region.owners, function(type, names)
+ {
+ $.each(names, function(index, name)
+ {
+ if(type == 'players')
+ owners['players'] += name+' ';
+ else if(type == 'groups')
+ owners['groups'] += name+' ';
+ });
+ });
+ var members = {'players':'', 'groups':''};
+ $.each(region.members, function(type, names)
+ {
+ $.each(names, function(index, name)
+ {
+ if(type == 'players')
+ members['players'] += name+' ';
+ else if(type == 'groups')
+ members['groups'] += name+' ';
+ });
+ });
+ var flags = '';
+ $.each(region.flags, function(name, value)
+ {
+ flags += name+': '+value+'
';
+ });
+
+ name = ''+name+'';
+ owners['players'] = ''+owners['players']+'';
+ owners['groups'] = ''+owners['groups']+'';
+ members['players'] = ''+members['players']+'';
+ members['groups'] = ''+members['groups']+'';
+ var region_parent = (region.parent) ? ''+region.parent+'' : '';
+ flags = ''+flags+'';
+ var region_priority = ''+region.priority+'';
+
+ var replace = ['%regionname%','%playerowners%','%groupowners%','%playermembers%','%groupmembers%','%parent%','%flags%','%priority%'];
+ var by = [name,owners['players'],owners['groups'],members['players'], members['groups'],region_parent,flags,region_priority];
+
+ var contentString = arrayReplace(replace, by, regionCfg.infowindow)
+
+ regionInfoWindow.setContent(contentString);
+ regionInfoWindow.setPosition(event.latLng);
+
+ regionInfoWindow.open(dynmap.map);
+}
+
+regionConstructors['update'] = function(map)
+{
+ if(regionInfoWindow)
+ regionInfoWindow.close();
+ $.each(regionPolygons, function(index, region)
+ {
+ region.setMap(null);
+ });
+ regionPolygons = {};
+
+ regionFile = regionCfg.filename.substr(0, regionCfg.filename.lastIndexOf('.'));
+ regionFile += '_'+map+'.json';
+
+ $.getJSON('standalone/'+regionFile, function(data)
+ {
+ var regionnames = '';
+ var count = 0;
+ $.each(data, function(name, residence)
+ {
+ count += 1;
+ regionnames += ", "+name;
+ makeRegionPolygonCube(dynmap.map, name, residence);
+ });
+ });
+}
\ No newline at end of file