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-02-06 15:09:15 +01:00
var maptypes = { } ;
2011-02-15 13:50:04 +01:00
var clocks = { } ;
2011-02-06 15:09:15 +01: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 ) {
return ( options [ value ] || defaultOption ) ( value ) ;
}
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 ;
$ . getJSON ( me . options . updateUrl + 'configuration' , function ( configuration ) {
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-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-02-22 15:38:49 +01:00
chatPopups : [ ] ,
2011-01-14 20:08:23 +01:00
lasttimestamp : '0' ,
followingPlayer : '' ,
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-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 ) ;
var map = this . map = new google . maps . Map ( mapContainer . get ( 0 ) , {
zoom : 1 ,
center : new google . maps . LatLng ( 0 , 1 ) ,
navigationControl : true ,
navigationControlOptions : {
style : google . maps . NavigationControlStyle . DEFAULT
} ,
scaleControl : false ,
mapTypeControl : false ,
streetViewControl : false ,
2011-01-23 12:00:15 +01:00
backgroundColor : 'none'
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-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.
/ * g o o g l e . m a p s . e v e n t . a d d L i s t e n e r ( m a p , ' z o o m _ c h a n g e d ' , f u n c t i o n ( ) {
me . updateLink ( ) ;
} ) ;
google . maps . event . addListener ( map , 'center_changed' , function ( ) {
me . updateLink ( ) ;
} ) ; * /
2010-12-31 13:33:51 +01:00
2011-02-17 20:08:50 +01:00
// Sidebar
2011-01-14 20:08:23 +01:00
var sidebar = me . sidebar = $ ( '<div/>' )
. addClass ( 'sidebar' )
. appendTo ( container ) ;
2011-02-17 20:08:50 +01:00
var panel = $ ( '<div/>' )
. addClass ( 'panel' )
2011-02-13 01:19:47 +01:00
. appendTo ( sidebar ) ;
2011-02-18 00:07:59 +01:00
// Pin button.
var pinbutton = $ ( '<div/>' )
. addClass ( 'pin' )
. click ( function ( ) {
sidebar . toggleClass ( 'pinned' ) ;
} )
. appendTo ( panel ) ;
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-17 20:08:50 +01:00
2011-02-19 20:51:21 +01:00
// The clock
var largeclock = $ ( '<div/>' )
. addClass ( 'largeclock' )
. appendTo ( container ) ;
var clock = me . clock = clocks [ 'timeofday' ] (
$ ( '<div/>' )
. appendTo ( largeclock )
) ;
var clockdigital = me . clockdigital = clocks [ 'digital' ] (
$ ( '<div/>' )
. appendTo ( largeclock )
) ;
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-02-18 07:08:29 +01:00
// The chat
2011-03-07 22:07:34 +01:00
if ( me . options . showchatwindow ) {
2011-02-18 07:08:29 +01:00
var chat = me . chat = $ ( '<div/>' )
. addClass ( 'chat' )
. appendTo ( container ) ;
var messagelist = me . messagelist = $ ( '<div/>' )
. addClass ( 'messagelist' )
. appendTo ( chat ) ;
2011-03-07 22:07:34 +01:00
if ( me . options . allowwebchat ) {
2011-03-07 07:07:48 +01:00
var chatinput = me . chatinput = $ ( '<input/>' )
. addClass ( 'chatinput' )
. attr ( {
id : 'chatinput' ,
type : 'text' ,
value : ''
} )
. keydown ( function ( event ) {
if ( event . keyCode == '13' ) {
event . preventDefault ( ) ;
2011-03-16 01:17:58 +01:00
if ( chatinput . val ( ) != '' )
{
sendChat ( me , chatinput . val ( ) ) ;
chatinput . val ( '' ) ;
}
2011-03-07 07:07:48 +01:00
}
} )
. appendTo ( chat ) ;
}
2011-02-18 07:08:29 +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-02-17 20:08:50 +01:00
$ ( '<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-02-01 15:16:54 +01:00
setTimeout ( function ( ) { me . update ( ) ; } , me . options . updaterate ) ;
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 ;
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-02-22 14:49:03 +01:00
if ( completed ) { completed ( ) ; }
2011-02-17 20:08:50 +01:00
} , 1 ) ;
$ ( '.map' , me . worldlist ) . removeClass ( 'selected' ) ;
$ ( map . element ) . addClass ( 'selected' ) ;
} ,
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-01-26 00:10:42 +01:00
// TODO: is there a better place for this?
this . cleanPopups ( ) ;
2011-02-17 20:08:50 +01:00
$ . getJSON ( me . options . updateUrl + "world/" + me . world . name + "/" + me . lasttimestamp , function ( update ) {
2011-01-14 20:08:23 +01:00
me . alertbox . hide ( ) ;
2011-02-06 03:00:51 +01:00
2011-02-22 17:58:39 +01:00
if ( ! me . options . jsonfile )
me . lasttimestamp = update . timestamp ;
2011-01-14 20:08:23 +01:00
2011-02-14 00:01:20 +01:00
me . clock . setTime ( update . servertime ) ;
2011-02-19 20:51:21 +01:00
me . clockdigital . setTime ( update . servertime ) ;
2010-12-31 13:33:51 +01: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 ) {
swtch ( update . type , {
tile : function ( ) {
2011-02-20 01:55:01 +01:00
me . onTileUpdated ( update . name ) ;
2011-03-07 22:07:34 +01:00
} ,
chat : function ( ) {
2011-02-20 01:55:01 +01:00
me . onPlayerChat ( update . playerName , update . message ) ;
2011-03-07 22:07:34 +01:00
} ,
webchat : function ( ) {
2011-02-22 17:58:39 +01:00
me . onPlayerChat ( '[WEB]' + update . playerName , update . message ) ;
2011-03-07 22:07:34 +01:00
}
} , function ( type ) {
console . log ( 'Unknown type ' , type , '!' ) ;
} ) ;
}
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-03-10 07:11:43 +01:00
me . lasttimestamp = update . timestamp ;
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-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 {
return me . options . tileUrl + me . world . name + '/' + tileName + '?0' ;
}
} ,
registerTile : function ( mapType , tileName , tile ) {
this . registeredTiles [ tileName ] = {
tileElement : tile ,
mapType : mapType ,
lastseen : '0'
} ;
} ,
unregisterTile : function ( mapType , tileName ) {
delete this . registeredTiles [ tileName ] ;
} ,
2011-01-26 00:10:42 +01:00
cleanPopups : function ( ) {
var POPUP _LIFE = 8000 ;
var d = new Date ( ) ;
var now = d . getTime ( ) ;
2011-02-22 15:38:49 +01:00
var popupIndex ;
2011-03-07 22:07:34 +01:00
for ( popupIndex in this . chatPopups ) {
2011-01-26 00:10:42 +01:00
var popup = this . chatPopups [ popupIndex ] ;
2011-03-07 22:07:34 +01:00
if ( now - popup . popupTime > POPUP _LIFE ) {
2011-01-26 00:10:42 +01:00
popup . infoWindow . close ( ) ;
popup . infoWindow = null ;
2011-01-26 01:05:00 +01:00
delete this . chatPopups [ popupIndex ] ;
2011-01-26 00:10:42 +01:00
}
}
} ,
2011-01-25 23:03:27 +01:00
onPlayerChat : function ( playerName , message ) {
var me = this ;
2011-01-26 00:10:42 +01:00
var chatPopups = this . chatPopups ;
2011-01-25 23:03:27 +01:00
var map = me . map ;
2011-02-22 14:49:03 +01:00
var player = me . players [ playerName ] ;
var playerMarker = player && player . marker ;
2011-03-07 22:07:34 +01:00
if ( me . options . showchatballoons ) {
if ( playerMarker ) {
2011-02-18 07:08:29 +01:00
var popup = chatPopups [ playerName ] ;
2011-02-22 15:38:49 +01:00
if ( ! popup ) {
2011-02-18 07:08:29 +01:00
popup = { lines : [ message ] } ;
2011-02-22 15:38:49 +01:00
} else {
2011-02-18 07:08:29 +01:00
popup . lines [ popup . lines . length ] = message ;
2011-02-22 15:38:49 +01:00
}
2011-02-18 07:08:29 +01:00
var MAX _LINES = 5 ;
2011-03-07 22:07:34 +01:00
if ( popup . lines . length > MAX _LINES ) {
2011-02-18 07:08:29 +01:00
popup . lines = popup . lines . slice ( 1 ) ;
}
2011-02-22 15:38:49 +01:00
var htmlMessage = '<div id="content"><b>' + playerName + "</b><br/><br/>" ;
var line ;
2011-03-07 22:07:34 +01:00
for ( line in popup . lines ) {
2011-02-18 07:08:29 +01:00
htmlMessage = htmlMessage + popup . lines [ line ] + "<br/>" ;
}
2011-02-22 15:38:49 +01:00
htmlMessage = htmlMessage + "</div>" ;
2011-02-18 07:08:29 +01:00
var now = new Date ( ) ;
popup . popupTime = now . getTime ( ) ;
if ( ! popup . infoWindow ) {
popup . infoWindow = new google . maps . InfoWindow ( {
disableAutoPan : ! ( me . options . focuschatballoons || false ) ,
content : htmlMessage
} ) ;
} else {
popup . infoWindow . setContent ( htmlMessage ) ;
}
popup . infoWindow . open ( map , playerMarker ) ;
this . chatPopups [ playerName ] = popup ;
2011-01-26 00:10:42 +01:00
}
2011-03-07 22:07:34 +01:00
}
if ( me . options . showchatwindow ) {
2011-02-18 07:08:29 +01:00
var messagelist = me . messagelist ;
var messageRow = $ ( '<div/>' )
2011-02-22 15:38:49 +01:00
. addClass ( 'messagerow' ) ;
2011-02-18 07:08:29 +01:00
var playerIconContainer = $ ( '<span/>' )
2011-02-22 15:38:49 +01:00
. addClass ( 'messageicon' ) ;
2011-02-18 07:08:29 +01:00
2011-02-22 15:38:49 +01:00
if ( me . options . showplayerfacesinmenu ) {
getMinecraftHead ( playerName , 16 , function ( head ) {
messageRow . icon = $ ( head )
. addClass ( 'playerIcon' )
. appendTo ( playerIconContainer ) ;
} ) ;
}
2011-02-18 07:08:29 +01:00
2011-02-22 15:38:49 +01:00
if ( playerName !== 'Server' ) {
2011-02-18 07:08:29 +01:00
var playerWorldContainer = $ ( '<span/>' )
. addClass ( 'messagetext' )
2011-02-22 15:38:49 +01:00
. text ( '[' + me . world + ']' ) ;
2011-02-18 07:08:29 +01:00
var playerGroupContainer = $ ( '<span/>' )
. addClass ( 'messagetext' )
2011-02-22 15:38:49 +01:00
. text ( '[Group]' ) ;
2011-01-26 01:05:00 +01:00
}
2011-02-18 07:08:29 +01:00
var playerNameContainer = $ ( '<span/>' )
. addClass ( 'messagetext' )
2011-02-22 15:38:49 +01:00
. text ( ' ' + playerName + ': ' ) ;
2011-02-18 07:08:29 +01:00
var playerMessageContainer = $ ( '<span/>' )
. addClass ( 'messagetext' )
2011-02-22 15:38:49 +01:00
. text ( message ) ;
2011-02-18 07:08:29 +01:00
messageRow . append ( playerIconContainer , playerNameContainer , playerMessageContainer ) ;
//messageRow.append(playerIconContainer,playerWorldContainer,playerGroupContainer,playerNameContainer,playerMessageContainer);
2011-03-15 23:56:22 +01:00
setTimeout ( function ( ) { messageRow . remove ( ) ; } , ( me . options . messagettl * 1000 ) ) ;
2011-02-18 07:08:29 +01:00
messagelist . append ( messageRow ) ;
me . messagelist . show ( ) ;
//var scrollHeight = jQuery(me.messagelist).attr('scrollHeight');
2011-03-17 22:10:59 +01:00
me . messagelist . scrollTop ( me . messagelist . scrollHeight ( ) ) ;
2011-01-25 23:03:27 +01:00
}
} ,
2011-01-14 20:08:23 +01:00
onTileUpdated : function ( tileName ) {
var me = this ;
var tile = this . registeredTiles [ tileName ] ;
if ( tile ) {
tile . lastseen = this . lasttimestamp ;
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 ,
location : new Location ( me . worlds [ update . world ] , parseFloat ( update . x ) , parseFloat ( update . y ) , parseFloat ( update . z ) )
} ;
2011-02-22 15:38:49 +01:00
var location = player . location ;
2011-02-22 14:49:03 +01:00
// Create the player-marker.
2011-02-22 15:38:49 +01:00
var markerPosition = me . map . getProjection ( ) . fromWorldToLatLng ( location . x , location . y , location . z ) ;
2011-02-22 14:49:03 +01:00
player . marker = new CustomMarker ( markerPosition , me . map , function ( div ) {
var playerImage ;
$ ( div )
. addClass ( 'Marker' )
. addClass ( 'playerMarker' )
. append ( playerImage = $ ( '<img/>' )
2011-03-01 00:01:35 +01:00
. attr ( { src : 'images/player.png' } ) )
2011-02-22 14:49:03 +01:00
. append ( $ ( '<span/>' )
. addClass ( 'playerName' )
. text ( player . name ) ) ;
2011-01-14 20:08:23 +01:00
2011-02-22 14:49:03 +01:00
if ( me . options . showplayerfacesonmap ) {
getMinecraftHead ( player . name , 32 , function ( head ) {
$ ( head )
. addClass ( 'playericon' )
. prependTo ( div ) ;
playerImage . remove ( ) ;
} ) ;
2011-01-14 20:08:23 +01:00
}
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 ) {
getMinecraftHead ( player . name , 16 , function ( head ) {
$ ( '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-01-14 20:08:23 +01:00
2011-02-22 14:49:03 +01:00
// Update the marker.
2011-02-22 15:38:49 +01:00
var markerPosition = me . map . getProjection ( ) . fromWorldToLatLng ( location . x , location . y , location . z ) ;
player . marker . toggle ( me . world === location . world ) ;
2011-02-22 14:49:03 +01:00
player . marker . setPosition ( markerPosition ) ;
// 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 ] ;
// Remove the marker.
player . marker . remove ( ) ;
// 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-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
} ;