|
|
"use strict"; |
|
|
|
|
|
|
|
|
var componentconstructors = {}; |
|
|
var maptypes = {}; |
|
|
var map = null; |
|
|
|
|
|
componentconstructors['testcomponent'] = function(dynmap, configuration) { |
|
|
console.log('initialize'); |
|
|
$(dynmap).bind('worldchanged', function() { console.log('worldchanged'); }); |
|
|
$(dynmap).bind('mapchanging', function() { console.log('mapchanging'); }); |
|
|
$(dynmap).bind('mapchanged', function() { console.log('mapchanged'); }); |
|
|
$(dynmap).bind('zoomchanged', function() { console.log('zoomchanged'); }); |
|
|
$(dynmap).bind('worldupdating', function() { console.log('worldupdating'); }); |
|
|
$(dynmap).bind('worldupdate', function() { console.log('worldupdate'); }); |
|
|
$(dynmap).bind('worldupdated', function() { console.log('worldupdated'); }); |
|
|
$(dynmap).bind('worldupdatefailed', function() { console.log('worldupdatefailed'); }); |
|
|
$(dynmap).bind('playeradded', function() { console.log('playeradded'); }); |
|
|
$(dynmap).bind('playerremoved', function() { console.log('playerremoved'); }); |
|
|
$(dynmap).bind('playerupdated', function() { console.log('playerupdated'); }); |
|
|
}; |
|
|
|
|
|
function DynMap(options) { |
|
|
var me = this; |
|
|
if(me.checkForSavedURL()) |
|
|
return; |
|
|
me.options = options; |
|
|
$.getJSON(me.formatUrl("configuration", { timestamp: me.lasttimestamp }), function(configuration) { |
|
|
if(configuration.error == 'login-required') { |
|
|
me.saveURL(); |
|
|
window.location = 'login.html'; |
|
|
} |
|
|
else if(configuration.error) { |
|
|
alert(configuration.error); |
|
|
} |
|
|
else { |
|
|
me.configure(configuration); |
|
|
me.initialize(); |
|
|
} |
|
|
}, function(status, statusMessage) { |
|
|
alert('Could not retrieve configuration: ' + statusMessage); |
|
|
}); |
|
|
} |
|
|
DynMap.prototype = { |
|
|
components: [], |
|
|
worlds: {}, |
|
|
registeredTiles: [], |
|
|
players: {}, |
|
|
|
|
|
lasttimestamp: new Date().getTime(), |
|
|
reqid: 0, |
|
|
servertime: 0, |
|
|
serverday: false, |
|
|
inittime: new Date().getTime(), |
|
|
|
|
|
followingPlayer: '', |
|
|
initfollow: null, |
|
|
|
|
|
missedupdates: 0, |
|
|
maxcount: -1, |
|
|
currentcount: 0, |
|
|
|
|
|
sidebar: null, |
|
|
sidebarPanel: null, |
|
|
playerlist: null, |
|
|
playerfield: null, |
|
|
layercontrol: undefined, |
|
|
|
|
|
sidebarSections: [], |
|
|
|
|
|
nogui: false, |
|
|
nocompass: false, |
|
|
|
|
|
formatUrl: function(name, options) { |
|
|
var url = this.options.url[name]; |
|
|
$.each(options, function(n,v) { |
|
|
url = url.replace("{" + n + "}", encodeURIComponent(v)); |
|
|
}); |
|
|
return url; |
|
|
}, |
|
|
configure: function(configuration) { |
|
|
var me = this; |
|
|
$.extend(me.options, configuration); |
|
|
|
|
|
$.each(me.options.worlds, function(index, worldentry) { |
|
|
var world = me.worlds[worldentry.name] = $.extend({}, worldentry, { |
|
|
maps: {} |
|
|
}); |
|
|
|
|
|
$.each(worldentry.maps, function(index, mapentry) { |
|
|
var map = $.extend({}, mapentry, { |
|
|
world: world, |
|
|
dynmap: me |
|
|
}); |
|
|
map = world.maps[mapentry.name] = maptypes[mapentry.type](map); |
|
|
if(me.options.defaultmap && me.options.defaultmap == mapentry.name) |
|
|
world.defaultmap = map; |
|
|
world.defaultmap = world.defaultmap || map; |
|
|
}); |
|
|
me.defaultworld = me.defaultworld || world; |
|
|
}); |
|
|
var urlarg = me.getParameterByName('worldname'); |
|
|
if(urlarg == "") |
|
|
urlarg = me.options.defaultworld || ""; |
|
|
if(urlarg != "") { |
|
|
me.defaultworld = me.worlds[urlarg] || me.defaultworld; |
|
|
} |
|
|
urlarg = me.getParameterByName('mapname'); |
|
|
if(urlarg != "") { |
|
|
me.defaultworld.defaultmap = me.defaultworld.maps[urlarg] || me.defaultworld.defaultmap; |
|
|
} |
|
|
urlarg = me.getIntParameterByName('x'); |
|
|
if(urlarg != null) |
|
|
me.defaultworld.center.x = urlarg; |
|
|
urlarg = me.getIntParameterByName('y'); |
|
|
if(urlarg != null) |
|
|
me.defaultworld.center.y = urlarg; |
|
|
urlarg = me.getIntParameterByName('z'); |
|
|
if(urlarg != null) |
|
|
me.defaultworld.center.z = urlarg; |
|
|
urlarg = me.getParameterByName('nogui'); |
|
|
if(urlarg != "") { |
|
|
me.nogui = (urlarg == 'true'); |
|
|
} |
|
|
urlarg = me.getParameterByName('nocompass'); |
|
|
if(urlarg != "") { |
|
|
me.nocompass = (urlarg == 'true'); |
|
|
} |
|
|
}, |
|
|
initialize: function() { |
|
|
var me = this; |
|
|
|
|
|
|
|
|
|
|
|
var container = $(me.options.container); |
|
|
container.addClass('dynmap'); |
|
|
|
|
|
|
|
|
|
|
|
var mapContainer; |
|
|
(mapContainer = $('<div/>')) |
|
|
.addClass('map') |
|
|
.appendTo(container); |
|
|
|
|
|
|
|
|
if(me.options.title) |
|
|
document.title = me.options.title; |
|
|
|
|
|
|
|
|
var urlzoom = me.getIntParameterByName('zoom'); |
|
|
if(urlzoom != null) |
|
|
me.options.defaultzoom = urlzoom; |
|
|
|
|
|
|
|
|
|
|
|
var showlayerctl = me.getParameterByName('showlayercontrol'); |
|
|
if(showlayerctl != "") |
|
|
me.options.showlayercontrol = showlayerctl; |
|
|
|
|
|
|
|
|
if(typeof me.options.defaultzoom == 'undefined') |
|
|
me.options.defaultzoom = 1; |
|
|
|
|
|
|
|
|
var initfollowplayer = me.getParameterByName('playername'); |
|
|
if(initfollowplayer != "") |
|
|
me.initfollow = initfollowplayer; |
|
|
|
|
|
|
|
|
var sidebaropen = me.getParameterByName('sidebaropened'); |
|
|
if(sidebaropen == 'false' || sidebaropen == 'true' || sidebaropen == 'pinned') |
|
|
me.options.sidebaropened = sidebaropen; |
|
|
|
|
|
var map = this.map = new L.Map(mapContainer.get(0), { |
|
|
zoom: me.options.defaultzoom, |
|
|
center: new L.LatLng(0, 0), |
|
|
zoomAnimation: true, |
|
|
zoomControl: !me.nogui, |
|
|
attributionControl: false, |
|
|
crs: L.CRS.Simple, |
|
|
worldCopyJump: false |
|
|
}); |
|
|
window.map = map; |
|
|
|
|
|
map.on('zoomend', function() { |
|
|
$(me).trigger('zoomchanged'); |
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var panel; |
|
|
var sidebar; |
|
|
var pinbutton; |
|
|
var nopanel = (me.getParameterByName('nopanel') == 'true') || me.nogui; |
|
|
|
|
|
var pincls = 'pinned'; |
|
|
if(me.options.sidebaropened == 'false') |
|
|
pincls = ''; |
|
|
sidebar = me.sidebar = $('<div/>') |
|
|
.addClass('sidebar ' + pincls); |
|
|
|
|
|
panel = me.sidebarPanel = $('<div/>') |
|
|
.addClass('panel') |
|
|
.appendTo(sidebar); |
|
|
|
|
|
if(me.options.sidebaropened != 'true') { |
|
|
|
|
|
pinbutton = $('<div/>') |
|
|
.addClass('pin') |
|
|
.click(function() { |
|
|
sidebar.toggleClass('pinned'); |
|
|
}) |
|
|
.appendTo(panel); |
|
|
} |
|
|
|
|
|
if(!nopanel) |
|
|
sidebar.appendTo(container); |
|
|
|
|
|
var worldsSection = SidebarUtils.createListSection(me.options['msg-maptypes']); |
|
|
me.worldlist = worldsSection.content.addClass('worldlist'); |
|
|
worldsSection.section.appendTo(panel); |
|
|
me.sidebarSections.push(worldsSection); |
|
|
|
|
|
var maplists = {}; |
|
|
var worldsadded = {}; |
|
|
$.each(me.worlds, function(index, world) { |
|
|
var maplist; |
|
|
world.element = $('<li/>') |
|
|
.addClass('world subsection') |
|
|
.text(world.title) |
|
|
.append(maplist = $('<ul/>') |
|
|
.addClass('maplist sublist') |
|
|
) |
|
|
.data('world', world); |
|
|
maplists[world.name] = maplist; |
|
|
}); |
|
|
|
|
|
$.each(me.worlds, function(index, world) { |
|
|
var maplist = maplists[world.name]; |
|
|
|
|
|
$.each(world.maps, function(mapindex, map) { |
|
|
|
|
|
var wname = world.name; |
|
|
if(map.options.append_to_world) { |
|
|
wname = map.options.append_to_world; |
|
|
} |
|
|
var mlist = maplists[wname]; |
|
|
if(!mlist) { |
|
|
mlist = maplist; |
|
|
wname = world.name; |
|
|
} |
|
|
if(!worldsadded[wname]) { |
|
|
worldsadded[wname] = true; |
|
|
} |
|
|
|
|
|
var worldName = wname; |
|
|
var mapName = mapindex; |
|
|
if (worldName.endsWith('_nether') || (worldName == 'DIM-1')) { |
|
|
worldName = 'nether'; |
|
|
mapName = (mapindex == 'nether') ? 'surface' : 'flat'; |
|
|
} |
|
|
else if (worldName.endsWith('the_end') || (worldName == 'DIM1')) { |
|
|
worldName = 'the_end'; |
|
|
mapName = (mapindex == 'the_end') ? 'surface' : 'flat'; |
|
|
} |
|
|
else { |
|
|
worldName = 'world'; |
|
|
mapName = [ 'surface', 'flat', 'biome', 'cave' ].includes(mapindex) ? mapindex : 'flat'; |
|
|
} |
|
|
map.element = $('<li/>') |
|
|
.addClass('map item') |
|
|
.append($('<a/>') |
|
|
.attr({ title: map.options.title, href: '#' }) |
|
|
.addClass('maptype') |
|
|
.css({ backgroundImage: 'url(' + (map.options.icon || ('images/block_' + worldName + '_' + mapName + '.png')) + ')' }) |
|
|
.text(map.options.title) |
|
|
) |
|
|
.click(function() { |
|
|
me.selectMap(map); |
|
|
}) |
|
|
.data('map', map) |
|
|
.appendTo(mlist); |
|
|
}); |
|
|
}); |
|
|
$.each(me.worlds, function(index, world) { |
|
|
if(worldsadded[world.name]) { |
|
|
world.element.appendTo(me.worldlist); |
|
|
} |
|
|
}); |
|
|
|
|
|
var playersSection = SidebarUtils.createListSection(me.options['msg-players']); |
|
|
me.playerlist = playersSection.content.addClass('playerlist'); |
|
|
playersSection.section.appendTo(panel); |
|
|
me.playerfield = playersSection.legend; |
|
|
me.sidebarSections.push(playersSection); |
|
|
|
|
|
function upd() { |
|
|
me.updateSidebarHeight(); |
|
|
} |
|
|
$(window).resize(upd); |
|
|
$(dynmap).bind('playeradded playerremoved', upd); |
|
|
upd(); |
|
|
|
|
|
|
|
|
if ((!me.nogui) && (!me.nocompass)) { |
|
|
var compass = $('<div/>'). |
|
|
addClass('compass'); |
|
|
if(L.Browser.mobile) |
|
|
compass.addClass('mobilecompass'); |
|
|
|
|
|
compass.appendTo(container); |
|
|
} |
|
|
|
|
|
if(me.options.sidebaropened != 'true') { |
|
|
var hitbar = $('<div/>') |
|
|
.addClass('hitbar') |
|
|
.click(function() { |
|
|
sidebar.toggleClass('pinned'); |
|
|
}) |
|
|
.appendTo(panel); |
|
|
} |
|
|
|
|
|
var alertbox = me.alertbox = $('<div/>') |
|
|
.addClass('alertbox') |
|
|
.hide() |
|
|
.appendTo(container); |
|
|
|
|
|
if((dynmapversion != me.options.coreversion) && (dynmapversion.indexOf("-Dev") < 0)) { |
|
|
me.alertbox |
|
|
.text('Web files are not matched with plugin version: All files need to be same version (' + me.options.dynmapversion + ') - try refreshing browser cache (shift-reload)') |
|
|
.show(); |
|
|
return; |
|
|
} |
|
|
|
|
|
me.initLogin(); |
|
|
|
|
|
me.selectMap(me.defaultworld.defaultmap); |
|
|
|
|
|
var componentstoload = 0; |
|
|
var configset = { }; |
|
|
if (!me.nogui) { |
|
|
$.each(me.options.components, function(index, configuration) { |
|
|
if(!configset[configuration.type]) { |
|
|
configset[configuration.type] = []; |
|
|
componentstoload++; |
|
|
} |
|
|
configset[configuration.type].push(configuration); |
|
|
}); |
|
|
} |
|
|
|
|
|
var tobeloaded = {}; |
|
|
$.each(configset, function(type, configlist) { |
|
|
tobeloaded[type] = true; |
|
|
loadjs('js/' + type + '.js', function() { |
|
|
var componentconstructor = componentconstructors[type]; |
|
|
if (componentconstructor) { |
|
|
$.each(configlist, function(idx, configuration) { |
|
|
me.components.push(new componentconstructor(me, configuration)); |
|
|
}); |
|
|
} else { |
|
|
|
|
|
} |
|
|
delete tobeloaded[type]; |
|
|
componentstoload--; |
|
|
if (componentstoload == 0) { |
|
|
|
|
|
me.update(); |
|
|
setTimeout(function() { me.update(); }, me.options.updaterate); |
|
|
} |
|
|
}); |
|
|
}); |
|
|
if (me.nogui) { |
|
|
setTimeout(function() { me.update(); }, me.options.updaterate); |
|
|
} |
|
|
else { |
|
|
setTimeout(function() { |
|
|
$.each(configset, function(type, configlist) { |
|
|
if(tobeloaded[type]) { |
|
|
me.alertbox |
|
|
.text('Error loading js/' + type + '.js') |
|
|
.show(); |
|
|
} |
|
|
}); |
|
|
if(componentstoload > 0) |
|
|
setTimeout(function() { me.update(); }, me.options.updaterate); |
|
|
}, 15000); |
|
|
} |
|
|
}, |
|
|
updateSidebarHeight: function () { |
|
|
var me = this; |
|
|
|
|
|
var minContentHeight = 24; |
|
|
|
|
|
var minSectionsHeight = 0; |
|
|
var sectionsHeight = 0; |
|
|
var sectionsHeightWithScrollButtons = 0; |
|
|
var resizeableContentHeight = 0; |
|
|
|
|
|
|
|
|
var nonResizeableSections = []; |
|
|
|
|
|
|
|
|
$.each(me.sidebarSections, function (i, section) { |
|
|
var legend = section.legend.outerHeight(true); |
|
|
var content = section.content.scrollHeight(); |
|
|
var up = section.upBtn.outerHeight(true); |
|
|
var down = section.downBtn.outerHeight(true); |
|
|
var sectionPadding = section.section.outerHeight(true) - section.section.height(); |
|
|
|
|
|
var sHeight = legend + content + sectionPadding; |
|
|
|
|
|
sectionsHeight += sHeight; |
|
|
minSectionsHeight += legend + sectionPadding; |
|
|
sectionsHeightWithScrollButtons += sHeight; |
|
|
|
|
|
if (content < up + down + minContentHeight) { |
|
|
nonResizeableSections.push(i); |
|
|
minSectionsHeight += content; |
|
|
} |
|
|
else { |
|
|
resizeableContentHeight += content; |
|
|
sectionsHeightWithScrollButtons += up + down; |
|
|
minSectionsHeight += up + down + minContentHeight; |
|
|
} |
|
|
}); |
|
|
var sidebarHeight = me.sidebar.height(); |
|
|
|
|
|
|
|
|
if (sectionsHeight > sidebarHeight && sidebarHeight > minSectionsHeight) { |
|
|
var missingHeight = sectionsHeightWithScrollButtons - sidebarHeight; |
|
|
|
|
|
$.each(me.sidebarSections, function (i, section) { |
|
|
if ($.inArray(i, nonResizeableSections) > -1) { |
|
|
section.upBtn.hide(); |
|
|
section.downBtn.hide(); |
|
|
section.content.height('auto'); |
|
|
return; |
|
|
} |
|
|
|
|
|
section.upBtn.show(); |
|
|
section.downBtn.show(); |
|
|
|
|
|
var contentHeight = section.content.scrollHeight(); |
|
|
|
|
|
var proportionalMissingHeight = |
|
|
missingHeight |
|
|
* (contentHeight / resizeableContentHeight); |
|
|
section.content.height(contentHeight - proportionalMissingHeight); |
|
|
}); |
|
|
} |
|
|
else { |
|
|
$.each(me.sidebarSections, function (i, section) { |
|
|
section.upBtn.hide(); |
|
|
section.downBtn.hide(); |
|
|
section.content.height('auto'); |
|
|
}); |
|
|
} |
|
|
|
|
|
if (sidebarHeight < minSectionsHeight) { |
|
|
|
|
|
|
|
|
me.sidebar.css({ |
|
|
'overflow-y': 'scroll', |
|
|
'overflow-x': 'hidden' |
|
|
}); |
|
|
} |
|
|
else { |
|
|
me.sidebar.css({ |
|
|
'overflow-y': '', |
|
|
'overflow-x': '' |
|
|
}); |
|
|
} |
|
|
}, |
|
|
getProjection: function() { return this.maptype.getProjection(); }, |
|
|
selectMapAndPan: function(map, location, completed) { |
|
|
if (!map) { throw "Cannot select map " + map; } |
|
|
var me = this; |
|
|
|
|
|
if (me.maptype === map) { |
|
|
return; |
|
|
} |
|
|
$(me).trigger('mapchanging'); |
|
|
var mapWorld = map.options.world; |
|
|
var compass = $('.compass'); |
|
|
if (me.maptype) { |
|
|
compass.removeClass('compass_' + me.maptype.options.compassview) |
|
|
.removeClass('compass_' + me.maptype.options.name); |
|
|
} |
|
|
compass.addClass('compass_' + map.options.compassview) |
|
|
.addClass('compass_' + map.options.name); |
|
|
var worldChanged = me.world !== map.options.world; |
|
|
var projectionChanged = (me.maptype && me.maptype.getProjection()) !== (map && map.projection); |
|
|
|
|
|
var prevzoom = me.map.getZoom(); |
|
|
|
|
|
var prevworld = me.world; |
|
|
|
|
|
if(worldChanged) { |
|
|
me.registeredTiles = []; |
|
|
me.inittime = new Date().getTime(); |
|
|
} |
|
|
|
|
|
if(worldChanged && me.world) { |
|
|
me.world.lastcenter = me.maptype.getProjection().fromLatLngToLocation(me.map.getCenter(), 64); |
|
|
} |
|
|
|
|
|
if (me.maptype) { |
|
|
me.map.removeLayer(me.maptype); |
|
|
} |
|
|
|
|
|
var prevmap = me.maptype; |
|
|
|
|
|
me.world = mapWorld; |
|
|
me.maptype = map; |
|
|
|
|
|
if(me.maptype.options.maxZoom < prevzoom) |
|
|
prevzoom = me.maptype.options.maxZoom; |
|
|
me.map.options.maxZoom = me.maptype.options.maxZoom; |
|
|
me.map.options.minZoom = me.maptype.options.minZoom; |
|
|
|
|
|
if (projectionChanged || worldChanged || location) { |
|
|
var centerPoint; |
|
|
if(location) { |
|
|
centerPoint = me.getProjection().fromLocationToLatLng(location); |
|
|
} |
|
|
else if(worldChanged) { |
|
|
var centerLocation; |
|
|
if(mapWorld.lastcenter) |
|
|
centerLocation = mapWorld.lastcenter; |
|
|
else |
|
|
centerLocation = $.extend({ x: 0, y: 64, z: 0 }, mapWorld.center); |
|
|
centerPoint = me.getProjection().fromLocationToLatLng(centerLocation); |
|
|
} |
|
|
else { |
|
|
var prevloc = null; |
|
|
if(prevmap != null) |
|
|
prevloc = prevmap.getProjection().fromLatLngToLocation(me.map.getCenter(), 64); |
|
|
if(prevloc != null) |
|
|
centerPoint = me.getProjection().fromLocationToLatLng(prevloc); |
|
|
else |
|
|
centerPoint = me.map.getCenter(); |
|
|
} |
|
|
me.map.setView(centerPoint, prevzoom, true); |
|
|
} |
|
|
else { |
|
|
me.map.setZoom(prevzoom); |
|
|
} |
|
|
me.map.addLayer(me.maptype); |
|
|
|
|
|
if (worldChanged) { |
|
|
$(me).trigger('worldchanged'); |
|
|
} |
|
|
$(me).trigger('mapchanged'); |
|
|
|
|
|
$('.map', me.worldlist).removeClass('selected'); |
|
|
$(map.element).addClass('selected'); |
|
|
me.updateBackground(); |
|
|
|
|
|
|
|
|
if (completed) { |
|
|
completed(); |
|
|
} |
|
|
}, |
|
|
selectMap: function(map, completed) { |
|
|
this.selectMapAndPan(map, null, completed); |
|
|
}, |
|
|
selectWorldAndPan: function(world, location, completed) { |
|
|
var me = this; |
|
|
if (typeof(world) === 'string') { world = me.worlds[world]; } |
|
|
if (me.world === world) { |
|
|
if(location) { |
|
|
var latlng = me.maptype.getProjection().fromLocationToLatLng(location); |
|
|
me.panToLatLng(latlng, completed); |
|
|
} |
|
|
else { |
|
|
if (completed) { completed(); } |
|
|
} |
|
|
return; |
|
|
} |
|
|
me.selectMapAndPan(world.defaultmap, location, completed); |
|
|
}, |
|
|
selectWorld: function(world, completed) { |
|
|
this.selectWorldAndPan(world, null, completed); |
|
|
}, |
|
|
panToLocation: function(location, completed) { |
|
|
var me = this; |
|
|
|
|
|
if (location.world) { |
|
|
me.selectWorldAndPan(location.world, location, function() { |
|
|
if(completed) completed(); |
|
|
}); |
|
|
} |
|
|
}, |
|
|
panToLayerPoint: function(point, completed) { |
|
|
var me = this; |
|
|
var latlng = me.map.layerPointToLatLng(point); |
|
|
me.map.panToLatLng(latlng); |
|
|
if (completed) { |
|
|
completed(); |
|
|
} |
|
|
}, |
|
|
panToLatLng: function(latlng, completed) { |
|
|
this.map.panTo(latlng); |
|
|
if (completed) { |
|
|
completed(); |
|
|
} |
|
|
}, |
|
|
update: function() { |
|
|
var me = this; |
|
|
|
|
|
if (document.visibilityState === "hidden") { |
|
|
setTimeout(function() { me.update(); }, me.options.updaterate); |
|
|
return; |
|
|
} |
|
|
|
|
|
$(me).trigger('worldupdating'); |
|
|
$.getJSON(me.formatUrl('update', { world: me.world.name, timestamp: me.lasttimestamp, reqid: me.reqid }), function(update) { |
|
|
me.reqid++; |
|
|
if (!update) { |
|
|
setTimeout(function() { me.update(); }, me.options.updaterate); |
|
|
return; |
|
|
} |
|
|
me.alertbox.hide(); |
|
|
|
|
|
if(update.error) { |
|
|
if(update.error == 'login-required') { |
|
|
me.saveURL(); |
|
|
window.location = 'login.html'; |
|
|
} |
|
|
else { |
|
|
alert(update.error); |
|
|
} |
|
|
return; |
|
|
} |
|
|
if (me.lasttimestamp == update.timestamp) { |
|
|
setTimeout(function() { me.update(); }, me.options.updaterate); |
|
|
return; |
|
|
} |
|
|
|
|
|
if (!me.options.jsonfile) { |
|
|
me.lasttimestamp = update.timestamp; |
|
|
} |
|
|
if(me.options.confighash != update.confighash) { |
|
|
window.location = me.getLink(); |
|
|
return; |
|
|
} |
|
|
me.playerfield.text(me.options['msg-players'] + " [" + update.currentcount + "/" + me.options.maxcount + "]"); |
|
|
|
|
|
me.servertime = update.servertime; |
|
|
var newserverday = (me.servertime > 23100 || me.servertime < 12900); |
|
|
if(me.serverday != newserverday) { |
|
|
me.serverday = newserverday; |
|
|
|
|
|
me.updateBackground(); |
|
|
if(me.maptype.options.nightandday) { |
|
|
|
|
|
me.map.removeLayer(me.maptype); |
|
|
me.map.addLayer(me.maptype); |
|
|
} |
|
|
} |
|
|
|
|
|
var newplayers = {}; |
|
|
$.each(update.players, function(index, playerUpdate) { |
|
|
var acct = playerUpdate.account; |
|
|
var player = me.players[acct]; |
|
|
if (player) { |
|
|
me.updatePlayer(player, playerUpdate); |
|
|
} else { |
|
|
me.addPlayer(playerUpdate); |
|
|
if(me.initfollow && (me.initfollow == acct)) { |
|
|
me.followPlayer(me.players[acct]); |
|
|
me.initfollow = null; |
|
|
} |
|
|
} |
|
|
newplayers[acct] = player; |
|
|
}); |
|
|
var acct; |
|
|
for(acct in me.players) { |
|
|
var player = me.players[acct]; |
|
|
if(!(acct in newplayers)) { |
|
|
me.removePlayer(player); |
|
|
} |
|
|
} |
|
|
|
|
|
$.each(update.updates, function(index, update) { |
|
|
|
|
|
if(!me.options.jsonfile || me.lasttimestamp <= update.timestamp) { |
|
|
$(me).trigger('worldupdate', [ update ]); |
|
|
|
|
|
swtch(update.type, { |
|
|
tile: function() { |
|
|
me.maptype.updateNamedTile(update.name, update.timestamp); |
|
|
}, |
|
|
playerjoin: function() { |
|
|
$(me).trigger('playerjoin', [ update.playerName ]); |
|
|
}, |
|
|
playerquit: function() { |
|
|
$(me).trigger('playerquit', [ update.playerName ]); |
|
|
}, |
|
|
component: function() { |
|
|
$(me).trigger('component.' + update.ctype, [ update ]); |
|
|
} |
|
|
}); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}); |
|
|
|
|
|
$(me).trigger('worldupdated', [ update ]); |
|
|
|
|
|
me.lasttimestamp = update.timestamp; |
|
|
me.missedupdates = 0; |
|
|
setTimeout(function() { me.update(); }, me.options.updaterate); |
|
|
}, function(status, statusText, request) { |
|
|
me.lasttimestamp--; |
|
|
me.missedupdates++; |
|
|
if(me.missedupdates > 2) { |
|
|
me.alertbox |
|
|
.text('Could not update map: ' + (statusText || 'Could not connect to server')) |
|
|
.show(); |
|
|
$(me).trigger('worldupdatefailed'); |
|
|
} |
|
|
setTimeout(function() { me.update(); }, me.options.updaterate); |
|
|
} |
|
|
); |
|
|
}, |
|
|
getTileUrl: function(tileName) { |
|
|
var me = this; |
|
|
var tile = me.registeredTiles[tileName]; |
|
|
|
|
|
if(tile == null) { |
|
|
var url = me.options.url.tiles; |
|
|
tile = this.registeredTiles[tileName] = url + escape(me.world.name + '/' + tileName); |
|
|
} |
|
|
return tile; |
|
|
}, |
|
|
addPlayer: function(update) { |
|
|
var me = this; |
|
|
var player = me.players[update.account] = { |
|
|
name: update.name, |
|
|
location: new Location(me.worlds[update.world], parseFloat(update.x), parseFloat(update.y), parseFloat(update.z)), |
|
|
health: update.health, |
|
|
armor: update.armor, |
|
|
account: update.account, |
|
|
sort: update.sort |
|
|
}; |
|
|
|
|
|
$(me).trigger('playeradded', [ player ]); |
|
|
|
|
|
|
|
|
var playerIconContainer; |
|
|
var menuitem = player.menuitem = $('<li/>') |
|
|
.addClass('player') |
|
|
.append(playerIconContainer = $('<span/>') |
|
|
.addClass('playerIcon') |
|
|
.append($('<img/>').attr({ src: 'images/player_face.png' })) |
|
|
.attr({ title: 'Follow player' }) |
|
|
.click(function() { |
|
|
var follow = player !== me.followingPlayer; |
|
|
me.followPlayer(follow ? player : null); |
|
|
}) |
|
|
) |
|
|
.append(player.menuname = $('<a/>') |
|
|
.attr({ |
|
|
href: '#', |
|
|
title: 'Center on player' |
|
|
}) |
|
|
.append(player.name) |
|
|
) |
|
|
.click(function(e) { |
|
|
if (me.followingPlayer !== player) { |
|
|
me.followPlayer(null); |
|
|
} |
|
|
me.panToLocation(player.location); |
|
|
}); |
|
|
player.menuname.data('sort', player.sort); |
|
|
|
|
|
var firstNodeAfter = me.playerlist.children().filter(function() { |
|
|
var itm = $('a', this); |
|
|
var sort = itm.data('sort'); |
|
|
if (sort > player.sort) return true; |
|
|
if (sort < player.sort) return false; |
|
|
return (itm.text().toLowerCase() > player.menuname.text().toLowerCase()); |
|
|
}).eq(0); |
|
|
if (firstNodeAfter.length > 0) { |
|
|
firstNodeAfter.before(menuitem); |
|
|
} else { |
|
|
menuitem.appendTo(me.playerlist); |
|
|
} |
|
|
if (me.options.showplayerfacesinmenu) { |
|
|
getMinecraftHead(player.account, 16, function(head) { |
|
|
$('img', playerIconContainer).remove(); |
|
|
$(head).appendTo(playerIconContainer); |
|
|
}); |
|
|
} |
|
|
}, |
|
|
updatePlayer: function(player, update) { |
|
|
var me = this; |
|
|
var location = player.location = new Location(me.worlds[update.world], parseFloat(update.x), parseFloat(update.y), parseFloat(update.z)); |
|
|
player.health = update.health; |
|
|
player.armor = update.armor; |
|
|
player.name = update.name; |
|
|
|
|
|
$(me).trigger('playerupdated', [ player ]); |
|
|
|
|
|
if (player.menuname && (player.menuname.html() != player.name)) { |
|
|
player.menuname.html(player.name); |
|
|
} |
|
|
|
|
|
|
|
|
if(me.options.grayplayerswhenhidden) |
|
|
player.menuitem.toggleClass('otherworld', me.world !== location.world); |
|
|
|
|
|
if (player === me.followingPlayer) { |
|
|
|
|
|
me.panToLocation(player.location); |
|
|
} |
|
|
}, |
|
|
removePlayer: function(player) { |
|
|
var me = this; |
|
|
|
|
|
delete me.players[player.account]; |
|
|
|
|
|
$(me).trigger('playerremoved', [ player ]); |
|
|
|
|
|
|
|
|
player.menuitem.remove(); |
|
|
}, |
|
|
followPlayer: function(player) { |
|
|
var me = this; |
|
|
$('.following', me.playerlist).removeClass('following'); |
|
|
|
|
|
if(player) { |
|
|
if(!player.location.world) |
|
|
return; |
|
|
$(player.menuitem).addClass('following'); |
|
|
me.panToLocation(player.location, function() { |
|
|
if(me.options.followmap && me.world) { |
|
|
var pmap = me.world.maps[me.options.followmap]; |
|
|
if(pmap) |
|
|
me.selectMapAndPan(pmap); |
|
|
} |
|
|
if(me.options.followzoom) |
|
|
me.map.setZoom(me.options.followzoom); |
|
|
}); |
|
|
} |
|
|
me.followingPlayer = player; |
|
|
}, |
|
|
updateBackground: function() { |
|
|
var me = this; |
|
|
var col = "#000000"; |
|
|
if(me.serverday) { |
|
|
if(me.maptype.options.backgroundday) |
|
|
col = me.maptype.options.backgroundday; |
|
|
else if(me.maptype.options.background) |
|
|
col = me.maptype.options.background; |
|
|
} |
|
|
else { |
|
|
if(me.maptype.options.backgroundnight) |
|
|
col = me.maptype.options.backgroundnight; |
|
|
else if(me.maptype.options.background) |
|
|
col = me.maptype.options.background; |
|
|
} |
|
|
$('.map').css('background', col); |
|
|
$('.leaflet-tile').css('background', col); |
|
|
}, |
|
|
getParameterByName: function(name) { |
|
|
name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); |
|
|
var regexS = "[\\?&]"+name+"=([^&#]*)"; |
|
|
var regex = new RegExp( regexS ); |
|
|
var results = regex.exec( window.location.href ); |
|
|
if( results == null ) |
|
|
return ""; |
|
|
else |
|
|
return decodeURIComponent(results[1].replace(/\+/g, " ")); |
|
|
}, |
|
|
getIntParameterByName: function(name) { |
|
|
var v = this.getParameterByName(name); |
|
|
if(v != "") { |
|
|
v = parseInt(v, 10); |
|
|
if(v != NaN) { |
|
|
return v; |
|
|
} |
|
|
} |
|
|
return null; |
|
|
}, |
|
|
getBoolParameterByName: function(name) { |
|
|
var v = this.getParameterByName(name); |
|
|
if(v != "") { |
|
|
if(v == "true") |
|
|
return true; |
|
|
else if(v == "false") |
|
|
return false; |
|
|
} |
|
|
return null; |
|
|
}, |
|
|
|
|
|
layersetlist: [], |
|
|
|
|
|
addToLayerSelector: function(layer, name, priority) { |
|
|
var me = this; |
|
|
|
|
|
if(me.options.showlayercontrol != "false" && (!me.layercontrol)) { |
|
|
me.layercontrol = new DynmapLayerControl(); |
|
|
if(me.options.showlayercontrol == "pinned") |
|
|
me.layercontrol.options.collapsed = false; |
|
|
map.addControl(me.layercontrol); |
|
|
} |
|
|
|
|
|
var i; |
|
|
for(i = 0; i < me.layersetlist.length; i++) { |
|
|
if(me.layersetlist[i].layer === layer) { |
|
|
me.layersetlist[i].priority = priority; |
|
|
me.layersetlist[i].name = name; |
|
|
break; |
|
|
} |
|
|
} |
|
|
if(i >= me.layersetlist.length) { |
|
|
me.layersetlist[i] = { layer: layer, priority: priority, name: name }; |
|
|
} |
|
|
me.layersetlist.sort(function(a, b) { |
|
|
if(a.priority != b.priority) |
|
|
return a.priority - b.priority; |
|
|
else |
|
|
return ((a.name < b.name) ? -1 : ((a.name > b.name) ? 1 : 0)); |
|
|
}); |
|
|
if(me.options.showlayercontrol != "false") { |
|
|
for(i = 0; i < me.layersetlist.length; i++) { |
|
|
me.layercontrol.removeLayer(me.layersetlist[i].layer); |
|
|
} |
|
|
for(i = 0; i < me.layersetlist.length; i++) { |
|
|
me.layercontrol.addOverlay(me.layersetlist[i].layer, me.layersetlist[i].name, i); |
|
|
} |
|
|
} |
|
|
}, |
|
|
removeFromLayerSelector: function(layer) { |
|
|
var me = this; |
|
|
var i; |
|
|
for(i = 0; i < me.layersetlist.length; i++) { |
|
|
if(me.layersetlist[i].layer === layer) { |
|
|
me.layersetlist.splice(i, 1); |
|
|
if(me.options.showlayercontrol != "false") |
|
|
me.layercontrol.removeLayer(layer); |
|
|
break; |
|
|
} |
|
|
} |
|
|
}, |
|
|
getLink: function() { |
|
|
var me = this; |
|
|
var url = window.location.pathname; |
|
|
var center = me.maptype.getProjection().fromLatLngToLocation(me.map.getCenter(), 64); |
|
|
if(me.options['round-coordinates']) |
|
|
url = url + "?worldname=" + me.world.name + "&mapname=" + me.maptype.options.name + "&zoom=" + me.map.getZoom() + "&x=" + center.x + "&y=" + |
|
|
center.y + "&z=" + center.z; |
|
|
else |
|
|
url = url + "?worldname=" + me.world.name + "&mapname=" + me.maptype.options.name + "&zoom=" + me.map.getZoom() + "&x=" + |
|
|
Math.round(center.x) + "&y=" + Math.round(center.y) + "&z=" + Math.round(center.z); |
|
|
return url; |
|
|
}, |
|
|
initLogin: function() { |
|
|
var me = this; |
|
|
if(!me.options['login-enabled']) |
|
|
return; |
|
|
|
|
|
var login = L.Control.extend({ |
|
|
onAdd: function(map) { |
|
|
this._container = L.DomUtil.create('div', 'logincontainer'); |
|
|
this._map = map; |
|
|
this._update(); |
|
|
return this._container; |
|
|
}, |
|
|
getPosition: function() { |
|
|
return 'bottomright'; |
|
|
}, |
|
|
getContainer: function() { |
|
|
return this._container; |
|
|
}, |
|
|
_update: function() { |
|
|
if (!this._map) return; |
|
|
var c = this._container; |
|
|
var cls = 'loginbutton'; |
|
|
if(me.options.sidebaropened != 'false') { |
|
|
cls = 'loginbutton pinnedloginbutton'; |
|
|
} |
|
|
if (me.options.loggedin) { |
|
|
c = $('<button/>').addClass(cls).click(function(event) { |
|
|
$.ajax({ |
|
|
type: 'POST', |
|
|
contentType: "application/json; charset=utf-8", |
|
|
url: config.url.login, |
|
|
success: function(response) { |
|
|
window.location = "index.html"; |
|
|
} |
|
|
}); |
|
|
}).text('Logout').appendTo(c)[0]; |
|
|
} |
|
|
else { |
|
|
c = $('<button/>').addClass(cls).click(function(event) { |
|
|
me.saveURL(); |
|
|
window.location = "login.html"; |
|
|
}).text('Login').appendTo(c)[0]; |
|
|
} |
|
|
} |
|
|
}); |
|
|
var l = new login(); |
|
|
me.map.addControl(l); |
|
|
}, |
|
|
saveURL : function() { |
|
|
if(window.location.href.indexOf('?') > 0) { |
|
|
document.cookie="dynmapurl=" + escape(window.location); |
|
|
} |
|
|
}, |
|
|
checkForSavedURL : function() { |
|
|
var i,x,y,ourcookies=document.cookie.split(";"); |
|
|
for (i=0;i<ourcookies.length;i++) { |
|
|
x=ourcookies[i].substr(0,ourcookies[i].indexOf("=")); |
|
|
y=ourcookies[i].substr(ourcookies[i].indexOf("=")+1); |
|
|
x=x.replace(/^\s+|\s+$/g,""); |
|
|
if (x == "dynmapurl") { |
|
|
var v = unescape(y); |
|
|
document.cookie='dynmapurl=; expires=Thu, 01-Jan-70 00:00:01 GMT;'; |
|
|
if((v.indexOf('?') >= 0) && (v != window.location)) { |
|
|
window.location = v; |
|
|
return true; |
|
|
} |
|
|
} |
|
|
} |
|
|
return false; |
|
|
} |
|
|
}; |
|
|
|