2011-02-17 20:08:50 +01:00
"use strict" ;
2011-01-15 02:11:31 +01:00
//if (!console) console = { log: function() {} };
2011-01-10 23:58:39 +01:00
2011-03-21 20:46:53 +01:00
var componentconstructors = { } ;
2011-02-06 15:09:15 +01:00
var maptypes = { } ;
2011-03-21 20:46:53 +01:00
componentconstructors [ 'testcomponent' ] = function ( dynmap , configuration ) {
2011-03-31 15:52:35 +02:00
console . log ( 'initialize' ) ;
$ ( dynmap ) . bind ( 'worldchanged' , function ( ) { console . log ( 'worldchanged' ) ; } ) ;
2011-06-03 07:39:21 +02:00
$ ( dynmap ) . bind ( 'mapchanging' , function ( ) { console . log ( 'mapchanging' ) ; } ) ;
2011-03-31 15:52:35 +02:00
$ ( 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' ) ; } ) ;
2011-03-21 20:46:53 +01:00
} ;
2011-03-31 13:06:34 +02:00
function loadjs ( url , completed ) {
var script = document . createElement ( 'script' ) ;
script . setAttribute ( 'src' , url ) ;
script . setAttribute ( 'type' , 'text/javascript' ) ;
var isloaded = false ;
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 ( ) ;
} ;
2011-04-02 00:52:24 +02:00
( document . head || document . getElementsByTagName ( 'head' ) [ 0 ] ) . appendChild ( script ) ;
2011-03-31 13:06:34 +02:00
}
2011-01-14 20:08:23 +01:00
function splitArgs ( s ) {
var r = s . split ( ' ' ) ;
delete arguments [ 0 ] ;
var obj = { } ;
var index = 0 ;
2011-01-15 02:11:31 +01:00
$ . each ( arguments , function ( argumentIndex , argument ) {
2011-02-22 15:38:49 +01:00
if ( ! argumentIndex ) { return ; }
2011-01-14 20:08:23 +01:00
var value = r [ argumentIndex - 1 ] ;
obj [ argument ] = value ;
2011-01-15 02:11:31 +01:00
} ) ;
2011-01-14 20:08:23 +01:00
return obj ;
}
function swtch ( value , options , defaultOption ) {
2011-03-29 23:42:56 +02:00
return ( options [ value ] || defaultOption || function ( ) { } ) ( value ) ;
2011-01-14 20:08:23 +01:00
}
2011-03-17 21:10:35 +01:00
( function ( $ ) {
$ . fn . scrollHeight = function ( height ) {
return this [ 0 ] . scrollHeight ;
} ;
} ) ( $ ) ;
2011-01-14 20:08:23 +01:00
2011-01-12 01:28:45 +01:00
function DynMapType ( ) { }
DynMapType . prototype = {
onTileUpdated : function ( tile , tileName ) {
2011-01-14 20:08:23 +01:00
var src = this . dynmap . getTileUrl ( tileName ) ;
2011-01-12 01:28:45 +01:00
tile . attr ( 'src' , src ) ;
tile . show ( ) ;
2011-02-17 20:08:50 +01:00
} ,
updateTileSize : function ( zoom ) { }
2011-01-12 01:28:45 +01:00
} ;
2010-12-31 13:33:51 +01:00
2011-02-22 14:49:03 +01:00
function Location ( world , x , y , z ) {
this . world = world ;
this . x = x ;
this . y = y ;
this . z = z ;
}
2011-01-14 20:08:23 +01:00
function DynMap ( options ) {
2011-02-01 15:16:54 +01:00
var me = this ;
me . options = options ;
2011-05-26 13:54:08 +02:00
$ . getJSON ( me . options . url . configuration , function ( configuration ) {
2011-02-01 15:16:54 +01:00
me . configure ( configuration ) ;
me . initialize ( ) ;
2011-02-26 20:27:54 +01:00
} , function ( status , statusMessage ) {
alert ( 'Could not retrieve configuration: ' + statusMessage ) ;
2011-02-22 15:38:49 +01:00
} ) ;
2010-12-31 13:33:51 +01:00
}
2011-01-14 20:08:23 +01:00
DynMap . prototype = {
2011-03-21 20:46:53 +01:00
components : [ ] ,
2011-02-17 20:08:50 +01:00
worlds : { } ,
2011-02-22 15:38:49 +01:00
registeredTiles : [ ] ,
2011-02-22 14:49:03 +01:00
players : { } ,
2011-06-03 15:42:24 +02:00
lasttimestamp : new Date ( ) . getUTCMilliseconds ( ) , /* Pseudorandom - prevent cached '?0' */
2011-05-30 00:24:46 +02:00
servertime : 0 ,
serverday : false ,
2011-06-02 20:14:38 +02:00
inittime : new Date ( ) . getTime ( ) ,
2011-01-14 20:08:23 +01:00
followingPlayer : '' ,
2011-05-26 13:54:08 +02:00
formatUrl : function ( name , options ) {
var url = this . options . url [ name ] ;
$ . each ( options , function ( n , v ) {
url = url . replace ( "{" + n + "}" , v ) ;
} ) ;
return url ;
} ,
2011-02-01 14:17:08 +01:00
configure : function ( configuration ) {
2011-02-01 15:16:54 +01:00
var me = this ;
$ . extend ( me . options , configuration ) ;
2011-02-17 20:08:50 +01:00
$ . 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 ) ;
world . defaultmap = world . defaultmap || map ;
} ) ;
me . defaultworld = me . defaultworld || world ;
2011-02-01 14:17:08 +01:00
} ) ;
2011-06-27 05:05:43 +02:00
var urlarg = me . getParameterByName ( 'worldname' ) ;
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 = parseInt ( me . getParameterByName ( 'x' ) , 10 ) ;
if ( urlarg != NaN ) {
me . defaultworld . center . x = urlarg ;
}
urlarg = parseInt ( me . getParameterByName ( 'y' ) , 10 ) ;
if ( urlarg != NaN ) {
me . defaultworld . center . y = urlarg ;
}
urlarg = parseInt ( me . getParameterByName ( 'z' ) , 10 ) ;
if ( urlarg != NaN ) {
me . defaultworld . center . z = urlarg ;
}
2011-02-01 14:17:08 +01:00
} ,
2011-01-14 20:08:23 +01:00
initialize : function ( ) {
var me = this ;
2010-12-31 13:33:51 +01:00
2011-01-14 20:08:23 +01:00
var container = $ ( me . options . container ) ;
2011-02-17 20:08:50 +01:00
container . addClass ( 'dynmap' ) ;
2011-01-14 20:08:23 +01:00
var mapContainer ;
( mapContainer = $ ( '<div/>' ) )
. addClass ( 'map' )
. appendTo ( container ) ;
2011-06-27 05:05:43 +02:00
var urlzoom = parseInt ( me . getParameterByName ( 'zoom' ) , 10 ) ;
if ( urlzoom != NaN ) { me . options . defaultzoom = urlzoom ; }
2011-01-14 20:08:23 +01:00
var map = this . map = new google . maps . Map ( mapContainer . get ( 0 ) , {
2011-05-17 13:34:54 +02:00
zoom : me . options . defaultzoom || 0 ,
2011-01-14 20:08:23 +01:00
center : new google . maps . LatLng ( 0 , 1 ) ,
navigationControl : true ,
navigationControlOptions : {
style : google . maps . NavigationControlStyle . DEFAULT
} ,
scaleControl : false ,
mapTypeControl : false ,
streetViewControl : false ,
2011-06-15 20:45:59 +02:00
backgroundColor : '#000000'
2011-01-14 20:08:23 +01:00
} ) ;
2011-02-17 20:08:50 +01:00
map . zoom _changed = function ( ) {
me . maptype . updateTileSize ( me . map . zoom ) ;
2011-03-21 20:46:53 +01:00
$ ( me ) . trigger ( 'zoomchanged' ) ;
2011-02-17 20:08:50 +01:00
} ;
2011-01-12 01:45:56 +01:00
2011-01-14 20:08:23 +01:00
google . maps . event . addListener ( map , 'dragstart' , function ( mEvent ) {
2011-02-22 17:58:39 +01:00
me . followPlayer ( null ) ;
2011-01-14 20:08:23 +01:00
} ) ;
// TODO: Enable hash-links.
2011-03-21 20:46:53 +01:00
/ *
google . maps . event . addListener ( map , 'zoom_changed' , function ( ) {
2011-01-14 20:08:23 +01:00
me . updateLink ( ) ;
} ) ;
google . maps . event . addListener ( map , 'center_changed' , function ( ) {
me . updateLink ( ) ;
2011-03-21 20:46:53 +01:00
} ) ;
* /
2010-12-31 13:33:51 +01:00
2011-02-17 20:08:50 +01:00
// Sidebar
2011-06-02 20:14:38 +02:00
var panel ;
var sidebar ;
var pinbutton ;
if ( ! me . options . sidebaropened ) {
sidebar = me . sidebar = $ ( '<div/>' )
. addClass ( 'sidebar' )
. appendTo ( container ) ;
panel = $ ( '<div/>' )
. addClass ( 'panel' )
. appendTo ( sidebar ) ;
2011-02-13 01:19:47 +01:00
2011-06-02 20:14:38 +02:00
// Pin button.
pinbutton = $ ( '<div/>' )
. addClass ( 'pin' )
. click ( function ( ) {
sidebar . toggleClass ( 'pinned' ) ;
} )
. appendTo ( panel ) ;
}
else {
sidebar = me . sidebar = $ ( '<div/>' )
. addClass ( 'sidebar pinned' )
. appendTo ( container ) ;
panel = $ ( '<div/>' )
. addClass ( 'panel' )
. appendTo ( sidebar ) ;
2011-05-30 16:56:10 +02:00
}
2011-02-17 20:08:50 +01:00
// Worlds
var worldlist ;
$ ( '<fieldset/>' )
. append ( $ ( '<legend/>' ) . text ( 'Map Types' ) )
. append ( me . worldlist = worldlist = $ ( '<ul/>' ) . addClass ( 'worldlist' ) )
. appendTo ( panel ) ;
$ . each ( me . worlds , function ( index , world ) {
var maplist ;
world . element = $ ( '<li/>' )
. addClass ( 'world' )
. text ( world . title )
. append ( maplist = $ ( '<ul/>' )
. addClass ( 'maplist' )
2011-02-13 01:19:47 +01:00
)
2011-02-17 20:08:50 +01:00
. data ( 'world' , world )
2011-02-13 01:19:47 +01:00
. appendTo ( worldlist ) ;
2011-01-12 01:45:56 +01:00
2011-02-17 20:08:50 +01:00
$ . each ( world . maps , function ( index , map ) {
me . map . mapTypes . set ( map . world . name + '.' + map . name , map ) ;
map . element = $ ( '<li/>' )
. addClass ( 'map' )
. append ( $ ( '<a/>' )
. attr ( { title : map . title , href : '#' } )
. addClass ( 'maptype' )
2011-03-05 17:42:07 +01:00
. css ( { backgroundImage : 'url(' + ( map . icon || 'images/block_' + map . name + '.png' ) + ')' } )
2011-02-17 20:08:50 +01:00
. text ( map . title )
)
. click ( function ( ) {
me . selectMap ( map ) ;
2011-01-12 01:45:56 +01:00
} )
2011-02-17 20:08:50 +01:00
. data ( 'map' , map )
. appendTo ( maplist ) ;
} ) ;
2011-01-14 20:08:23 +01:00
} ) ;
2011-02-19 20:51:21 +01:00
2011-03-17 15:43:28 +01:00
// The scrollbuttons
// we need to show/hide them depending: if (me.playerlist.scrollHeight() > me.playerlist.innerHeight()) or something.
var upbtn = $ ( '<div/>' )
. addClass ( 'scrollup' )
. bind ( 'mousedown mouseup' , function ( event ) {
if ( event . type == 'mousedown' ) {
playerlist . animate ( { "scrollTop" : "-=300px" } , 3000 , 'linear' ) ;
} else {
playerlist . stop ( ) ;
}
} ) ;
var downbtn = $ ( '<div/>' )
. addClass ( 'scrolldown' )
. bind ( 'mousedown mouseup' , function ( event ) {
if ( event . type == 'mousedown' ) {
playerlist . animate ( { "scrollTop" : "+=300px" } , 3000 , 'linear' ) ;
} else {
playerlist . stop ( ) ;
}
} ) ;
2011-01-14 20:08:23 +01:00
// The Player List
2011-02-17 20:08:50 +01:00
var playerlist ;
$ ( '<fieldset/>' )
. append ( $ ( '<legend/>' ) . text ( 'Players' ) )
2011-03-17 15:43:28 +01:00
. append ( upbtn )
. append ( me . playerlist = playerlist = $ ( '<ul/>' ) . addClass ( 'playerlist' )
. bind ( 'mousewheel' , function ( event , delta ) {
this . scrollTop -= ( delta * 10 ) ;
event . preventDefault ( ) ;
} )
)
. append ( downbtn )
2011-02-17 20:08:50 +01:00
. appendTo ( panel ) ;
2011-01-14 20:08:23 +01:00
2011-03-17 21:10:35 +01:00
var updateHeight = function ( ) {
2011-03-17 15:43:28 +01:00
playerlist . height ( sidebar . innerHeight ( ) - ( playerlist . offset ( ) . top - worldlist . offset ( ) . top ) - 64 ) ; // here we need a fix to avoid the static value, but it works fine this way :P
2011-03-17 21:10:35 +01:00
var scrollable = playerlist . scrollHeight ( ) > playerlist . height ( ) ;
upbtn . toggle ( scrollable ) ;
downbtn . toggle ( scrollable ) ;
} ;
updateHeight ( ) ;
$ ( window ) . resize ( updateHeight ) ;
2011-03-17 15:43:28 +01:00
2011-02-13 07:25:28 +01:00
// The Compass
2011-02-20 01:58:53 +01:00
var compass = $ ( '<div/>' )
. addClass ( 'compass' )
2011-02-22 15:38:49 +01:00
. appendTo ( container ) ;
2011-02-13 07:25:28 +01:00
2011-01-14 20:08:23 +01:00
// TODO: Enable hash-links.
/ *
var link ;
var linkbox = me . linkbox = $ ( '<div/>' )
. addClass ( 'linkbox' )
. append ( link = $ ( '<input type="text" />' ) )
. data ( 'link' , link )
. appendTo ( container ) ; * /
2011-05-30 16:56:10 +02:00
if ( ! me . options . sidebaropened ) {
$ ( '<div/>' )
. addClass ( 'hitbar' )
. appendTo ( panel ) ;
}
2011-01-14 20:08:23 +01:00
var alertbox = me . alertbox = $ ( '<div/>' )
. addClass ( 'alertbox' )
2011-02-26 21:33:02 +01:00
. hide ( )
2011-01-14 20:08:23 +01:00
. appendTo ( container ) ;
2011-02-17 20:08:50 +01:00
me . selectMap ( me . defaultworld . defaultmap ) ;
2011-03-31 13:06:34 +02:00
var componentstoload = me . options . components . length ;
2011-03-21 20:46:53 +01:00
$ . each ( me . options . components , function ( index , configuration ) {
2011-03-31 13:06:34 +02:00
loadjs ( 'js/' + configuration . type + '.js' , function ( ) {
var componentconstructor = componentconstructors [ configuration . type ] ;
2011-04-07 15:46:50 +02:00
if ( componentconstructor ) {
me . components . push ( new componentconstructor ( me , configuration ) ) ;
} else {
// Could not load component. We'll ignore this for the moment.
}
2011-03-31 13:06:34 +02:00
componentstoload -- ;
if ( componentstoload == 0 ) {
// Actually start updating once all components are loaded.
setTimeout ( function ( ) { me . update ( ) ; } , me . options . updaterate ) ;
}
} ) ;
2011-03-21 20:46:53 +01:00
} ) ;
2011-01-14 20:08:23 +01:00
} ,
2011-02-22 14:49:03 +01:00
selectMap : function ( map , completed ) {
2011-02-18 00:07:59 +01:00
if ( ! map ) { throw "Cannot select map " + map ; }
2011-02-17 20:08:50 +01:00
var me = this ;
2011-03-21 19:07:30 +01:00
if ( me . maptype === map ) {
return ;
}
2011-06-03 07:39:21 +02:00
$ ( me ) . trigger ( 'mapchanging' ) ;
2011-04-09 08:24:52 +02:00
if ( me . maptype ) {
$ ( '.compass' ) . removeClass ( 'compass_' + me . maptype . name ) ;
}
$ ( '.compass' ) . addClass ( 'compass_' + map . name ) ;
2011-03-21 19:07:30 +01:00
var worldChanged = me . world !== map . world ;
2011-05-18 07:23:21 +02:00
var projectionChanged = me . map . getProjection ( ) !== map . projection ;
2011-02-17 20:08:50 +01:00
me . map . setMapTypeId ( 'none' ) ;
me . world = map . world ;
me . maptype = map ;
me . maptype . updateTileSize ( me . map . zoom ) ;
window . setTimeout ( function ( ) {
me . map . setMapTypeId ( map . world . name + '.' + map . name ) ;
2011-03-21 20:46:53 +01:00
if ( worldChanged ) {
$ ( me ) . trigger ( 'worldchanged' ) ;
}
2011-05-18 07:23:21 +02:00
if ( projectionChanged || worldChanged ) {
if ( map . world . center ) {
me . map . panTo ( map . projection . fromWorldToLatLng ( map . world . center . x || 0 , map . world . center . y || 64 , map . world . center . z || 0 ) ) ;
} else {
me . map . panTo ( map . projection . fromWorldToLatLng ( 0 , 64 , 0 ) ) ;
}
2011-05-14 01:16:26 +02:00
}
2011-03-21 20:46:53 +01:00
$ ( me ) . trigger ( 'mapchanged' ) ;
2011-03-21 19:07:30 +01:00
if ( completed ) {
completed ( ) ;
}
2011-02-17 20:08:50 +01:00
} , 1 ) ;
$ ( '.map' , me . worldlist ) . removeClass ( 'selected' ) ;
$ ( map . element ) . addClass ( 'selected' ) ;
2011-06-03 10:24:21 +02:00
me . updateBackground ( ) ;
2011-02-17 20:08:50 +01:00
} ,
2011-02-22 14:49:03 +01:00
selectWorld : function ( world , completed ) {
var me = this ;
2011-02-22 15:38:49 +01:00
if ( typeof ( world ) === 'String' ) { world = me . worlds [ world ] ; }
if ( me . world === world ) {
2011-02-22 14:49:03 +01:00
if ( completed ) { completed ( ) ; }
return ;
}
me . selectMap ( world . defaultmap , completed ) ;
} ,
panTo : function ( location , completed ) {
var me = this ;
me . selectWorld ( location . world , function ( ) {
var position = me . map . getProjection ( ) . fromWorldToLatLng ( location . x , location . y , location . z ) ;
me . map . panTo ( position ) ;
} ) ;
} ,
2011-01-14 20:08:23 +01:00
update : function ( ) {
var me = this ;
2011-03-21 19:07:30 +01:00
$ ( me ) . trigger ( 'worldupdating' ) ;
2011-05-26 13:54:08 +02:00
$ . getJSON ( me . formatUrl ( 'update' , { world : me . world . name , timestamp : me . lasttimestamp } ) , function ( update ) {
2011-03-29 01:16:52 +02:00
if ( ! update ) {
setTimeout ( function ( ) { me . update ( ) ; } , me . options . updaterate ) ;
return ;
}
2011-01-14 20:08:23 +01:00
me . alertbox . hide ( ) ;
2011-03-21 19:07:30 +01:00
if ( ! me . options . jsonfile ) {
2011-02-22 17:58:39 +01:00
me . lasttimestamp = update . timestamp ;
2011-03-21 19:07:30 +01:00
}
2011-05-30 16:56:10 +02:00
2011-06-02 20:14:38 +02:00
me . servertime = update . servertime ;
var oldday = me . serverday ;
if ( me . servertime > 23100 || me . servertime < 12900 )
me . serverday = true ;
else
me . serverday = false ;
2011-05-30 00:24:46 +02:00
2011-02-22 14:49:03 +01:00
var newplayers = { } ;
$ . each ( update . players , function ( index , playerUpdate ) {
var name = playerUpdate . name ;
var player = me . players [ name ] ;
if ( player ) {
me . updatePlayer ( player , playerUpdate ) ;
} else {
me . addPlayer ( playerUpdate ) ;
}
newplayers [ name ] = player ;
2011-02-06 03:00:51 +01:00
} ) ;
2011-02-22 15:38:49 +01:00
var name ;
for ( name in me . players ) {
2011-02-22 14:49:03 +01:00
var player = me . players [ name ] ;
if ( ! ( name in newplayers ) ) {
me . removePlayer ( player ) ;
}
}
2011-02-06 03:00:51 +01:00
$ . each ( update . updates , function ( index , update ) {
2011-03-07 22:07:34 +01:00
// Only handle updates that are actually new.
if ( ! me . options . jsonfile || me . lasttimestamp <= update . timestamp ) {
2011-03-21 19:07:30 +01:00
$ ( me ) . trigger ( 'worldupdate' , [ update ] ) ;
2011-03-07 22:07:34 +01:00
swtch ( update . type , {
tile : function ( ) {
2011-05-15 06:25:59 +02:00
me . onTileUpdated ( update . name , update . timestamp ) ;
2011-04-05 22:58:46 +02:00
} ,
playerjoin : function ( ) {
$ ( me ) . trigger ( 'playerjoin' , [ update . playerName ] ) ;
} ,
playerquit : function ( ) {
$ ( me ) . trigger ( 'playerquit' , [ update . playerName ] ) ;
2011-03-07 22:07:34 +01:00
}
} ) ;
}
2011-02-20 01:58:53 +01:00
/* remove older messages from chat*/
//var timestamp = event.timeStamp;
//var divs = $('div[rel]');
//divs.filter(function(i){return parseInt(divs[i].attr('rel')) > timestamp+me.options.messagettl;}).remove();
2011-02-06 03:00:51 +01:00
} ) ;
2011-05-30 16:56:10 +02:00
2011-06-02 20:14:38 +02:00
if ( me . serverday != oldday ) {
2011-06-03 10:24:21 +02:00
me . updateBackground ( ) ;
2011-06-02 20:14:38 +02:00
var mtid = me . map . mapTypeId ;
if ( me . map . mapTypes [ mtid ] . nightandday ) {
me . map . setMapTypeId ( 'none' ) ;
window . setTimeout ( function ( ) {
me . map . setMapTypeId ( mtid ) ;
2011-06-03 07:39:21 +02:00
} , 0.1 ) ;
2011-06-02 20:14:38 +02:00
}
}
2011-03-21 19:07:30 +01:00
$ ( me ) . trigger ( 'worldupdated' , [ update ] ) ;
2011-03-10 07:11:43 +01:00
me . lasttimestamp = update . timestamp ;
2011-03-21 19:07:30 +01:00
2011-02-01 15:16:54 +01:00
setTimeout ( function ( ) { me . update ( ) ; } , me . options . updaterate ) ;
2011-02-28 19:23:25 +01:00
} , function ( status , statusText , request ) {
2011-01-14 20:08:23 +01:00
me . alertbox
2011-02-28 19:23:25 +01:00
. text ( 'Could not update map: ' + ( statusText || 'Could not connect to server' ) )
2011-01-14 20:08:23 +01:00
. show ( ) ;
2011-03-21 19:07:30 +01:00
$ ( me ) . trigger ( 'worldupdatefailed' ) ;
2011-02-01 15:16:54 +01:00
setTimeout ( function ( ) { me . update ( ) ; } , me . options . updaterate ) ;
2011-01-14 20:08:23 +01:00
}
2011-02-06 03:00:51 +01:00
) ;
2011-01-14 20:08:23 +01:00
} ,
2011-02-17 20:08:50 +01:00
getTileUrl : function ( tileName , always ) {
var me = this ;
var tile = me . registeredTiles [ tileName ] ;
if ( tile ) {
return me . options . tileUrl + me . world . name + '/' + tileName + '?' + tile . lastseen ;
} else {
2011-06-02 20:14:38 +02:00
return me . options . tileUrl + me . world . name + '/' + tileName + '?' + me . inittime ; /* Browser cache fix on reload */
2011-02-17 20:08:50 +01:00
}
} ,
registerTile : function ( mapType , tileName , tile ) {
this . registeredTiles [ tileName ] = {
tileElement : tile ,
mapType : mapType ,
lastseen : '0'
} ;
} ,
unregisterTile : function ( mapType , tileName ) {
delete this . registeredTiles [ tileName ] ;
} ,
2011-05-15 06:25:59 +02:00
onTileUpdated : function ( tileName , timestamp ) {
2011-01-14 20:08:23 +01:00
var me = this ;
var tile = this . registeredTiles [ tileName ] ;
if ( tile ) {
2011-05-15 06:25:59 +02:00
tile . lastseen = timestamp ;
2011-01-14 20:08:23 +01:00
tile . mapType . onTileUpdated ( tile . tileElement , tileName ) ;
}
} ,
2011-02-22 14:49:03 +01:00
addPlayer : function ( update ) {
2011-01-14 20:08:23 +01:00
var me = this ;
2011-02-22 14:49:03 +01:00
var player = me . players [ update . name ] = {
name : update . name ,
2011-05-18 16:38:50 +02:00
location : new Location ( me . worlds [ update . world ] , parseFloat ( update . x ) , parseFloat ( update . y ) , parseFloat ( update . z ) ) ,
2011-05-21 07:59:08 +02:00
health : update . health ,
2011-05-22 16:09:50 +02:00
armor : update . armor ,
account : update . account
2011-02-22 14:49:03 +01:00
} ;
2011-03-21 19:07:30 +01:00
$ ( me ) . trigger ( 'playeradded' , [ player ] ) ;
2011-02-22 14:49:03 +01:00
// Create the player-menu-item.
var playerIconContainer ;
var menuitem = player . menuitem = $ ( '<li/>' )
. addClass ( 'player' )
. append ( playerIconContainer = $ ( '<span/>' )
. addClass ( 'playerIcon' )
2011-03-01 00:01:35 +01:00
. append ( $ ( '<img/>' ) . attr ( { src : 'images/player_face.png' } ) )
2011-02-22 14:49:03 +01:00
. attr ( { title : 'Follow ' + player . name } )
. click ( function ( ) {
2011-02-22 15:38:49 +01:00
var follow = player !== me . followingPlayer ;
me . followPlayer ( follow ? player : null ) ;
2011-02-22 14:49:03 +01:00
} )
)
. append ( $ ( '<a/>' )
. attr ( {
href : '#' ,
title : 'Center on ' + player . name
} )
. text ( player . name )
)
2011-03-05 17:43:41 +01:00
. click ( function ( e ) {
2011-03-08 01:22:03 +01:00
if ( me . followingPlayer !== player ) {
me . followPlayer ( null ) ;
}
2011-03-05 17:43:41 +01:00
me . panTo ( player . location ) ;
} )
2011-02-22 14:49:03 +01:00
. appendTo ( me . playerlist ) ;
if ( me . options . showplayerfacesinmenu ) {
2011-05-21 07:59:08 +02:00
getMinecraftHead ( player . account , 16 , function ( head ) {
2011-02-22 14:49:03 +01:00
$ ( 'img' , playerIconContainer ) . remove ( ) ;
$ ( head ) . appendTo ( playerIconContainer ) ;
} ) ;
2011-01-14 20:08:23 +01:00
}
2011-02-22 14:49:03 +01:00
} ,
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 ) ) ;
2011-05-18 16:38:50 +02:00
player . health = update . health ;
2011-05-22 16:09:50 +02:00
player . armor = update . armor ;
2011-01-14 20:08:23 +01:00
2011-03-21 19:07:30 +01:00
$ ( me ) . trigger ( 'playerupdated' , [ player ] ) ;
2011-02-22 14:49:03 +01:00
// Update menuitem.
2011-02-22 15:38:49 +01:00
player . menuitem . toggleClass ( 'otherworld' , me . world !== location . world ) ;
2011-02-22 14:49:03 +01:00
2011-02-22 15:38:49 +01:00
if ( player === me . followingPlayer ) {
2011-02-22 14:49:03 +01:00
// Follow the updated player.
me . panTo ( player . location ) ;
2011-01-14 20:08:23 +01:00
}
} ,
2011-02-22 14:49:03 +01:00
removePlayer : function ( player ) {
var me = this ;
delete me . players [ player . name ] ;
2011-03-21 19:07:30 +01:00
$ ( me ) . trigger ( 'playerremoved' , [ player ] ) ;
2011-02-22 14:49:03 +01:00
// Remove menu item.
player . menuitem . remove ( ) ;
} ,
followPlayer : function ( player ) {
2011-01-14 20:08:23 +01:00
var me = this ;
2011-02-17 20:08:50 +01:00
$ ( '.following' , me . playerlist ) . removeClass ( 'following' ) ;
2011-01-14 20:08:23 +01:00
2011-02-22 14:49:03 +01:00
if ( player ) {
$ ( player . menuitem ) . addClass ( 'following' ) ;
me . panTo ( player . location ) ;
2011-01-14 20:08:23 +01:00
}
2011-02-22 14:49:03 +01:00
this . followingPlayer = player ;
2011-06-03 10:24:21 +02:00
} ,
updateBackground : function ( ) {
var me = this ;
var col = "#000000" ;
if ( me . serverday ) {
if ( me . maptype . backgroundday )
col = me . maptype . backgroundday ;
else if ( me . maptype . background )
col = me . maptype . background ;
}
else {
if ( me . maptype . backgroundnight )
col = me . maptype . backgroundnight ;
else if ( me . maptype . background )
col = me . maptype . background ;
}
$ ( '.map' ) . css ( 'background' , col ) ;
2011-06-27 05:05:43 +02:00
} ,
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 , " " ) ) ;
}
2011-01-14 20:08:23 +01:00
// TODO: Enable hash-links.
/ * u p d a t e L i n k : f u n c t i o n ( ) {
var me = this ;
var url = location . href . match ( /^[^#]+/ ) ;
var a = url
+ "#lat=" + me . map . getCenter ( ) . lat ( ) . toFixed ( 6 )
+ "&lng=" + me . map . getCenter ( ) . lng ( ) . toFixed ( 6 )
+ "&zoom=" + me . map . getZoom ( ) ;
me . linkbox . data ( 'link' ) . val ( a ) ;
} * /
2011-02-22 17:58:39 +01:00
} ;