From 8e59f37995790719d28e3c59bf9c3cd689c78ac9 Mon Sep 17 00:00:00 2001 From: Jason Booth Date: Wed, 13 Apr 2011 19:58:25 -0500 Subject: [PATCH] Initial Support for Regions system on dynmap Included Worldguard support(default) Also residence support(incomplete) --- configuration.txt | 13 ++ src/main/java/org/dynmap/JsonTimerTask.java | 56 +++++++ web/css/dynmap_style.css | 3 + web/js/regions.js | 36 ++++ web/js/regions_Residence.js | 144 ++++++++++++++++ web/js/regions_WorldGuard.js | 173 ++++++++++++++++++++ 6 files changed, 425 insertions(+) create mode 100644 web/js/regions.js create mode 100644 web/js/regions_Residence.js create mode 100644 web/js/regions_WorldGuard.js 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