Player per world support @ client.

This commit is contained in:
FrozenCow 2011-02-22 14:49:03 +01:00
parent 5408db1044
commit 5504761670
3 changed files with 137 additions and 111 deletions

View file

@ -1,4 +1,4 @@
function CustomMarker(latlng, map, oncreated, args) { function CustomMarker(latlng, map, oncreated) {
google.maps.OverlayView.call(this); google.maps.OverlayView.call(this);
this.latlng_ = latlng; this.latlng_ = latlng;
@ -8,7 +8,6 @@ function CustomMarker(latlng, map, oncreated, args) {
this.setMap(map); this.setMap(map);
this.oncreated = oncreated; this.oncreated = oncreated;
this.oncreatedargs = args;
} }
CustomMarker.prototype = new google.maps.OverlayView(); CustomMarker.prototype = new google.maps.OverlayView();
@ -29,7 +28,7 @@ CustomMarker.prototype.draw = function() {
google.maps.event.trigger(me, "click"); google.maps.event.trigger(me, "click");
}); });
this.oncreated(div, this.oncreatedargs); this.oncreated(div);
// Then add the overlay to the DOM // Then add the overlay to the DOM
var panes = this.getPanes(); var panes = this.getPanes();

View file

@ -377,6 +377,10 @@ body {
border: 3px solid transparent; border: 3px solid transparent;
} }
.dynmap .playerlist .player.otherworld {
opacity: 0.5;
}
.dynmap .playerlist .player:hover { .dynmap .playerlist .player:hover {
background: rgba(64,64,64,0.6); background: rgba(64,64,64,0.6);
} }

View file

@ -31,6 +31,13 @@ DynMapType.prototype = {
updateTileSize: function(zoom) {} updateTileSize: function(zoom) {}
}; };
function Location(world, x, y, z) {
this.world = world;
this.x = x;
this.y = y;
this.z = z;
}
function DynMap(options) { function DynMap(options) {
var me = this; var me = this;
me.options = options; me.options = options;
@ -42,7 +49,7 @@ function DynMap(options) {
DynMap.prototype = { DynMap.prototype = {
worlds: {}, worlds: {},
registeredTiles: new Array(), registeredTiles: new Array(),
markers: new Array(), players: {},
chatPopups: new Array(), chatPopups: new Array(),
lasttimestamp: '0', lasttimestamp: '0',
followingPlayer: '', followingPlayer: '',
@ -231,7 +238,7 @@ DynMap.prototype = {
setTimeout(function() { me.update(); }, me.options.updaterate); setTimeout(function() { me.update(); }, me.options.updaterate);
}, },
selectMap: function(map) { selectMap: function(map, completed) {
if (!map) { throw "Cannot select map " + map; } if (!map) { throw "Cannot select map " + map; }
var me = this; var me = this;
me.map.setMapTypeId('none'); me.map.setMapTypeId('none');
@ -240,10 +247,27 @@ DynMap.prototype = {
me.maptype.updateTileSize(me.map.zoom); me.maptype.updateTileSize(me.map.zoom);
window.setTimeout(function() { window.setTimeout(function() {
me.map.setMapTypeId(map.world.name + '.' + map.name); me.map.setMapTypeId(map.world.name + '.' + map.name);
if (completed) { completed(); }
}, 1); }, 1);
$('.map', me.worldlist).removeClass('selected'); $('.map', me.worldlist).removeClass('selected');
$(map.element).addClass('selected'); $(map.element).addClass('selected');
}, },
selectWorld: function(world, completed) {
var me = this;
if (typeof(world) == 'String') { world = me.worlds[world]; }
if (me.world == world) {
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);
});
},
update: function() { update: function() {
var me = this; var me = this;
@ -257,21 +281,23 @@ DynMap.prototype = {
me.clock.setTime(update.servertime); me.clock.setTime(update.servertime);
me.clockdigital.setTime(update.servertime); me.clockdigital.setTime(update.servertime);
var typeVisibleMap = {}; var newplayers = {};
var newmarkers = {}; $.each(update.players, function(index, playerUpdate) {
var name = playerUpdate.name;
$.each(update.players, function(index, player) { var player = me.players[name];
var mi = { if (player) {
id: 'player_' + player.name, me.updatePlayer(player, playerUpdate);
text: player.name, } else {
type: 'player', me.addPlayer(playerUpdate);
position: me.map.getProjection().fromWorldToLatLng(parseFloat(player.x), parseFloat(player.y), parseFloat(player.z)), }
visible: true newplayers[name] = player;
};
me.updateMarker(mi);
newmarkers[mi.id] = mi;
}); });
for(var name in me.players) {
var player = me.players[name];
if(!(name in newplayers)) {
me.removePlayer(player);
}
}
$.each(update.updates, function(index, update) { $.each(update.updates, function(index, update) {
swtch(update.type, { swtch(update.type, {
@ -296,17 +322,7 @@ DynMap.prototype = {
//var divs = $('div[rel]'); //var divs = $('div[rel]');
//divs.filter(function(i){return parseInt(divs[i].attr('rel')) > timestamp+me.options.messagettl;}).remove(); //divs.filter(function(i){return parseInt(divs[i].attr('rel')) > timestamp+me.options.messagettl;}).remove();
}); });
for(var m in me.markers) {
var marker = me.markers[m];
if(!(m in newmarkers)) {
marker.remove(null);
if (marker.playerItem) {
marker.playerItem.remove();
}
delete me.markers[m];
}
}
setTimeout(function() { me.update(); }, me.options.updaterate); setTimeout(function() { me.update(); }, me.options.updaterate);
}, function(request, statusText, ex) { }, function(request, statusText, ex) {
me.alertbox me.alertbox
@ -353,11 +369,10 @@ DynMap.prototype = {
}, },
onPlayerChat: function(playerName, message) { onPlayerChat: function(playerName, message) {
var me = this; var me = this;
var markers = me.markers;
var chatPopups = this.chatPopups; var chatPopups = this.chatPopups;
var map = me.map; var map = me.map;
var mid = "player_" + playerName; var player = me.players[playerName];
var playerMarker = markers[mid]; var playerMarker = player && player.marker;
if (me.options.showchat == 'balloons') { if (me.options.showchat == 'balloons') {
if (playerMarker) if (playerMarker)
{ {
@ -449,95 +464,103 @@ DynMap.prototype = {
tile.mapType.onTileUpdated(tile.tileElement, tileName); tile.mapType.onTileUpdated(tile.tileElement, tileName);
} }
}, },
updateMarker: function(mi) { addPlayer: function(update) {
var me = this; var me = this;
var markers = me.markers; var player = me.players[update.name] = {
var map = me.map; name: update.name,
location: new Location(me.worlds[update.world], parseFloat(update.x), parseFloat(update.y), parseFloat(update.z))
};
if(mi.id in markers) { // Create the player-marker.
var m = markers[mi.id]; markerPosition = me.map.getProjection().fromWorldToLatLng(location.x, location.y, location.z);
m.toggle(mi.visible); player.marker = new CustomMarker(markerPosition, me.map, function(div) {
m.setPosition(mi.position); var playerImage;
} else { $(div)
var contentfun = function(div,mi) { .addClass('Marker')
$(div) .addClass('playerMarker')
.addClass('Marker') .append(playerImage = $('<img/>')
.addClass(mi.type + 'Marker') .attr({ src: 'player.png' }))
.append($('<img/>').attr({src: mi.type + '.png'})) .append($('<span/>')
.append($('<span/>').text(mi.text)); .addClass('playerName')
}; .text(player.name));
if (mi.type == 'player') {
contentfun = function(div, mi) {
var playerImage;
$(div)
.addClass('Marker')
.addClass('playerMarker')
.append(playerImage = $('<img/>')
.attr({ src: 'player.png' }))
.append($('<span/>')
.addClass('playerName')
.text(mi.text))
if (me.options.showplayerfacesonmap) {
getMinecraftHead(mi.text, 32, function(head) {
$(head)
.addClass('playericon')
.prependTo(div);
playerImage.remove();
});
}
};
}
var marker = new CustomMarker(mi.position, map, contentfun, mi);
marker.markerType = mi.type;
markers[mi.id] = marker; if (me.options.showplayerfacesonmap) {
getMinecraftHead(player.name, 32, function(head) {
if (mi.type == 'player') { $(head)
marker.playerItem = $('<li/>') .addClass('playericon')
.addClass('player') .prependTo(div);
.append(marker.playerIconContainer = $('<span/>') playerImage.remove();
.addClass('playerIcon') });
.append($('<img/>').attr({ src: 'player_face.png' }))
.attr({ title: 'Follow ' + mi.text })
.click(function() {
var follow = mi.id != me.followingPlayer;
me.followPlayer(follow ? mi.id : '')
}))
.append($('<a/>')
.attr({
href: '#',
title: 'Center on ' + mi.text
})
.text(mi.text)
)
.click(function(e) { map.panTo(markers[mi.id].getPosition()); })
.appendTo(me.playerlist);
if (me.options.showplayerfacesinmenu) {
getMinecraftHead(mi.text, 16, function(head) {
$('img', marker.playerIconContainer).remove();
marker.playerItem.icon = $(head)
.appendTo(marker.playerIconContainer);
});
}
} }
} });
if(mi.id == me.followingPlayer) { // Create the player-menu-item.
map.panTo(markers[mi.id].getPosition()); var playerIconContainer;
var menuitem = player.menuitem = $('<li/>')
.addClass('player')
.append(playerIconContainer = $('<span/>')
.addClass('playerIcon')
.append($('<img/>').attr({ src: 'player_face.png' }))
.attr({ title: 'Follow ' + player.name })
.click(function() {
var follow = player != me.followingPlayer;
me.followPlayer(follow ? player : null)
})
)
.append($('<a/>')
.attr({
href: '#',
title: 'Center on ' + player.name
})
.text(player.name)
)
.click(function(e) { me.panTo(player.location); })
.appendTo(me.playerlist);
if (me.options.showplayerfacesinmenu) {
getMinecraftHead(player.name, 16, function(head) {
$('img', playerIconContainer).remove();
$(head).appendTo(playerIconContainer);
});
} }
}, },
followPlayer: function(name) { 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));
// Update the marker.
markerPosition = me.map.getProjection().fromWorldToLatLng(location.x, location.y, location.z);
player.marker.toggle(me.world == location.world);
player.marker.setPosition(markerPosition);
// Update menuitem.
player.menuitem.toggleClass('otherworld', me.world != location.world);
if (player == me.followingPlayer) {
// Follow the updated player.
me.panTo(player.location);
}
},
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) {
var me = this; var me = this;
$('.following', me.playerlist).removeClass('following'); $('.following', me.playerlist).removeClass('following');
var m = me.markers[name]; if(player) {
if(m) { $(player.menuitem).addClass('following');
$(m.playerItem).addClass('following'); me.panTo(player.location);
me.map.panTo(m.getPosition());
} }
this.followingPlayer = name; this.followingPlayer = player;
}, }
// TODO: Enable hash-links. // TODO: Enable hash-links.
/* updateLink: function() { /* updateLink: function() {
var me = this; var me = this;