diff --git a/src/main/resources/configuration.txt b/src/main/resources/configuration.txt index 938367df..18cc1ee8 100644 --- a/src/main/resources/configuration.txt +++ b/src/main/resources/configuration.txt @@ -68,11 +68,12 @@ components: # 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 + # stroke: true + # color: "#FF0000" + # opacity: 0.8 + # weight: 3 + # fill: true # fillColor: "#FF0000" # fillOpacity: 0.35 # # Optional setting to limit which regions to show, by name - if commented out, all regions are shown diff --git a/web/css/regions.css b/web/css/regions.css new file mode 100644 index 00000000..8a3cb79b --- /dev/null +++ b/web/css/regions.css @@ -0,0 +1,39 @@ +.regioninfo > * { + display: block; +} + +.regioninfo > *:empty { + display: none; +} + +.regioninfo .regionname { + font-size: 120%; + font-weight: bold; +} + +.regioninfo .owners { + margin-left: 20px; +} + +.regioninfo .regionflags .regionflag { + display: block; + font-size: 90%; + color: gray; + margin-left: 5px; +} + +.regioninfo .owners:before { + content: "Owners: "; +} + +.regioninfo .members:before { + content: "Members: "; +} + +.regioninfo .regionflags:before { + content: "Flags: "; +} + +.regioninfo .regionpriority:before { + content: "Priority: "; +} \ No newline at end of file diff --git a/web/js/dynmaputils.js b/web/js/dynmaputils.js index 9b628133..07ace996 100644 --- a/web/js/dynmaputils.js +++ b/web/js/dynmaputils.js @@ -154,6 +154,27 @@ function loadjs(url, completed) { (document.head || document.getElementsByTagName('head')[0]).appendChild(script); } +function loadcss(url, completed) { + var script = document.createElement('link'); + script.setAttribute('href', url); + script.setAttribute('rel', 'stylesheet'); + var isloaded = false; + if (completed) { + script.onload = function() { + if (isloaded) { return; } + isloaded = true; + completed(); + }; + + // Hack for IE, don't know whether this still applies to IE9. + script.onreadystatechange = function() { + script.onload(); + }; + } + + (document.head || document.getElementsByTagName('head')[0]).appendChild(script); +} + function splitArgs(s) { var r = s.split(' '); delete arguments[0]; diff --git a/web/js/regions.js b/web/js/regions.js index 1c12e377..fd1426a5 100644 --- a/web/js/regions.js +++ b/web/js/regions.js @@ -1,70 +1,110 @@ var regionConstructors = {}; -function createPolygonSurfaces(latlng, maxx, minx, maxy, miny, maxz, minz) { - return [ - new L.Polygon([ - latlng(minx,miny,minz), - latlng(maxx,miny,minz), - latlng(maxx,miny,maxz), - latlng(minx,miny,maxz) - ], {}), - new L.Polygon([ - latlng(minx,maxy,minz), - latlng(maxx,maxy,minz), - latlng(maxx,maxy,maxz), - latlng(minx,maxy,maxz) - ], {}), - new L.Polygon([ - latlng(minx,miny,minz), - latlng(minx,maxy,minz), - latlng(maxx,maxy,minz), - latlng(maxx,miny,minz) - ], {}), - new L.Polygon([ - latlng(maxx,miny,minz), - latlng(maxx,maxy,minz), - latlng(maxx,maxy,maxz), - latlng(maxx,miny,maxz) - ], {}), - new L.Polygon([ - latlng(minx,miny,maxz), - latlng(minx,maxy,maxz), - latlng(maxx,maxy,maxz), - latlng(maxx,miny,maxz) - ], {}), - new L.Polygon([ - latlng(minx,miny,minz), - latlng(minx,maxy,minz), - latlng(minx,maxy,maxz), - latlng(minx,miny,maxz) - ], {}) - ]; -} - componentconstructors['regions'] = function(dynmap, configuration) { - regionCfg = configuration; - var regionType = regionCfg.name; + + // Helper functions + latlng = function(x, y, z) { + return dynmap.getProjection().fromLocationToLatLng(new Location(undefined, x,y,z)); + } + + function create3DBoxLayer(maxx, minx, maxy, miny, maxz, minz) { + return new L.FeatureGroup([ + new L.Polygon([ + latlng(minx,miny,minz), + latlng(maxx,miny,minz), + latlng(maxx,miny,maxz), + latlng(minx,miny,maxz) + ], configuration.regionstyle), + new L.Polygon([ + latlng(minx,maxy,minz), + latlng(maxx,maxy,minz), + latlng(maxx,maxy,maxz), + latlng(minx,maxy,maxz) + ], configuration.regionstyle), + new L.Polygon([ + latlng(minx,miny,minz), + latlng(minx,maxy,minz), + latlng(maxx,maxy,minz), + latlng(maxx,miny,minz) + ], configuration.regionstyle), + new L.Polygon([ + latlng(maxx,miny,minz), + latlng(maxx,maxy,minz), + latlng(maxx,maxy,maxz), + latlng(maxx,miny,maxz) + ], configuration.regionstyle), + new L.Polygon([ + latlng(minx,miny,maxz), + latlng(minx,maxy,maxz), + latlng(maxx,maxy,maxz), + latlng(maxx,miny,maxz) + ], configuration.regionstyle), + new L.Polygon([ + latlng(minx,miny,minz), + latlng(minx,maxy,minz), + latlng(minx,maxy,maxz), + latlng(minx,miny,maxz) + ], configuration.regionstyle) + ]); + } + + function create2DBoxLayer(maxx, minx, maxy, miny, maxz, minz) { + return new L.Polygon([ + latlng(minx,64,minz), + latlng(maxx,64,minz), + latlng(maxx,64,maxz), + latlng(minx,64,maxz) + ], configuration.regionstyle); + } + + function createPopupContent(name, region) { + return $('
').addClass('regioninfo') + .append($('').addClass('regionname').text(name)) + .append($('').addClass('owners') + .append(region.owners.players && $('').addClass('playerowners').text(region.owners.players.concat())) + .append(region.owners.groups && $('').addClass('groupowners').text(region.owners.groups.concat())) + ) + .append($('').addClass('members') + .append(region.members.players && $('').addClass('playermembers').text(region.members.players.concat())) + .append(region.members.groups && $('').addClass('groupmembers').text(region.members.groups.concat())) + ) + .append(region.parent && $('').addClass('regionparent').text(region.parent)) + .append(region.flags && function() { + var regionflags = $('').addClass('regionflags'); + $.each(region.flags, function(name, value) { + regionflags.append($('').addClass('regionflag').text(name + ': ' + value)); + }); + return regionflags; + }()) + .append($('').addClass('regionpriority').text(region.priority)) + [0]; + } + + var self = this; + loadcss('css/regions.css'); + var regionType = configuration.name; loadjs('js/regions_' + regionType + '.js', function() { - var regionsLayer = undefined; + var activeLayer = undefined; function undraw() { - if (regionsLayer) { - dynmap.map.removeLayer(regionsLayer); - regionsLayer = undefined; + if (activeLayer) { + dynmap.map.removeLayer(activeLayer); + activeLayer = undefined; } } function redraw() { undraw(); var worldName = dynmap.world && dynmap.world.name; if (worldName) { - regionConstructors[regionType](dynmap, worldName, function(regionLayers) { - var newRegionsLayer = new L.LayerGroup(); - $.each(regionLayers, function(name, layer) { - console.log(name, layer); - newRegionsLayer.addLayer(layer); - }); - regionsLayer = newRegionsLayer; - dynmap.map.addLayer(newRegionsLayer); - }); + regionConstructors[regionType](dynmap, $.extend({}, configuration, { + component: self, + worldName: worldName, + createPopupContent: createPopupContent, + createBoxLayer: configuration.use3dregions ? create3DBoxLayer : create2DBoxLayer, + result: function(regionsLayer) { + activeLayer = regionsLayer; + dynmap.map.addLayer(activeLayer); + } + })); } } $(dynmap).bind('mapchanged', redraw); diff --git a/web/js/regions_Residence.js b/web/js/regions_Residence.js index 8df9672a..406ce240 100644 --- a/web/js/regions_Residence.js +++ b/web/js/regions_Residence.js @@ -1,31 +1,26 @@ -function createPolygonsFromResidence(latlng, name, residence) { - return createPolygonSurfaces(residence.X1, residence.X2, residence.Y1, residence.Y2, residence.Z1, residence.Z2); -} -function createPopupContent(name, region) { - return $('
') - .append($('').addClass('regionname').text(name)) - .append(region.owners.players && $('').addClass('playerowners').text(region.permissions.owner)) - [0]; -}; +regionConstructors['Residence'] = function(dynmap, configuration) { + // Helper function. + function createBoxFromArea(area, boxCreator) { + return boxCreator(area.X1, area.X2, area.Y1, area.Y2, area.Z1, area.Z2); + } -regionConstructors['Residence'] = function(dynmap, worldName, result) { - var latlng = function(x, y, z) { - return dynmap.getProjection().fromLocationToLatLng(new Location(undefined, x,y,z)); - }; - $.getJSON('standalone/res_' + worldName + '.json', function(data) { - var regionLayers = {}; + var boxLayers = []; $.each(data, function(name, residence) { - if(map === residence.Permissions.World) { - var polygons = createPolygonsFromResidence(latlng, name, residence); - var regionLayer = new L.FeatureGroup(polygons); - - regionLayer.bindPopup(createPopupContent(name, region)); - - regionLayers[name] = regionLayer; + if(worldName == residence.Permissions.World) { + $.each(residence.Areas, function(name, area) { + var boxLayer = configuration.createBoxLayer(area.X1, area.X2, area.Y1, area.Y2, area.Z1, area.Z2); + + boxLayer.bindPopup(configuration.createPopupContent(name, $.extend(residence, { + owners: { players: [residence.Permissions.Owner] }, + flags: region.Permissions.AreaFlags + }))); + + boxLayers.push(boxLayer); + }); } }); - result(regionLayers); + configuration.result(new L.LayerGroup(boxLayers)); }); }; diff --git a/web/js/regions_WorldGuard.js b/web/js/regions_WorldGuard.js index 0684f3a1..90e5d6a7 100644 --- a/web/js/regions_WorldGuard.js +++ b/web/js/regions_WorldGuard.js @@ -1,68 +1,37 @@ -Array.max = function( array ) { - return Math.max.apply( Math, array ); -}; -Array.min = function( array ) { - return Math.min.apply( Math, array ); -}; - -function createPolygonsFromWorldGuardRegion(latlng, name, region) { - if(region.points) { - var i; - var xs = region.points.map(function(p) { return p.x; }); - var zs = region.points.map(function(p) { return p.z; }); - return createPolygonSurfaces(latlng, Array.max(xs), Array.min(xs), region['max-y'], region['min-y'], Array.max(zs), Array.min(zs)); - } - if(!region.min || !region.max) - return []; - if(region.max.y <= region.min.y) - region.min.y = region.max.y - 1; - return createPolygonSurfaces(latlng, region.max.x, region.min.x, region.max.y, region.min.y, region.max.z, region.min.z); -} - -function createPopupContent(name, region) { - - return $('
') - .append($('').addClass('regionname').text(name)) - .append(region.owners.players && $('').addClass('playerowners').text(region.owners.players.concat())) - .append(region.owners.groups && $('').addClass('groupowners').text(region.owners.groups.concat())) - .append(region.members.players && $('').addClass('playermembers').text(region.members.players.concat())) - .append(region.members.groups && $('').addClass('groupmembers').text(region.members.groups.concat())) - .append(region.parent && $('').addClass('regionparent').text(region.parent)) - .append(region.flags && function() { - var regionflags = $('').addClass('regionflags'); - $.each(region.flags, function(name, value) { - regionflags.append($('').addClass('regionflag').text(name + ': ' + value)); - }); - return regionflags; - }()) - .append($('').addClass('regionpriority').text(region.priority)) - [0]; -}; - -regionConstructors['WorldGuard'] = function(dynmap, worldName, result) { - var latlng = function(x, y, z) { - var l; - if (typeof x === 'Object' && !y && !z) { - l = x; - } else { - l = new Location(undefined, x,y,z); +regionConstructors['WorldGuard'] = function(dynmap, configuration) { + // Helper function. + function createBoxFromRegion(region, boxCreator) { + function ArrayMax( array ) { + return Math.max.apply( Math, array ); } - return dynmap.getProjection().fromLocationToLatLng(l); - }; + function ArrayMin( array ) { + return Math.min.apply( Math, array ); + } + if(region.points) { + var i; + var xs = region.points.map(function(p) { return p.x; }); + var zs = region.points.map(function(p) { return p.z; }); + return boxCreator(ArrayMax(xs), ArrayMin(xs), region['max-y'], region['min-y'], ArrayMax(zs), ArrayMin(zs)); + } + if(!region.min || !region.max) + return []; + if(region.max.y <= region.min.y) + region.min.y = region.max.y - 1; + return boxCreator(region.max.x, region.min.x, region.max.y, region.min.y, region.max.z, region.min.z); + } - regionFile = regionCfg.filename.substr(0, regionCfg.filename.lastIndexOf('.')); - regionFile += '_'+worldName+'.json'; + var regionFile = configuration.filename.substr(0, configuration.filename.lastIndexOf('.')); + regionFile += '_'+configuration.worldName+'.json'; $.getJSON('standalone/'+regionFile, function(data) { - var regionLayers = {}; + var boxLayers = []; $.each(data, function(name, region) { - var polygons = createPolygonsFromWorldGuardRegion(latlng, name, region); - var regionLayer = new L.FeatureGroup(polygons); + var boxLayer = createBoxFromRegion(region, configuration.createBoxLayer); - regionLayer.bindPopup(createPopupContent(name, region)); + boxLayer.bindPopup(configuration.createPopupContent(name, region)); - regionLayers[name] = regionLayer; + boxLayers.push(boxLayer); }); - result(regionLayers); + configuration.result(new L.LayerGroup(boxLayers)); }); }; \ No newline at end of file