diff --git a/MapListener.java b/MapListener.java
index 7ecf94c5..6e82e334 100644
--- a/MapListener.java
+++ b/MapListener.java
@@ -35,6 +35,12 @@ public class MapListener extends PluginListener {
return false;
}
+ @Override
+ public void onLogin(Player player)
+ {
+ mgr.getPlayerImage(player);
+ }
+
@Override
public boolean onCommand(Player player, String[] split)
{
diff --git a/MapManager.java b/MapManager.java
index 7a1acbb6..672f6384 100644
--- a/MapManager.java
+++ b/MapManager.java
@@ -1,8 +1,11 @@
import java.awt.Color;
import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.Insets;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
+import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@@ -11,6 +14,8 @@ import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
+import java.net.MalformedURLException;
+import java.net.URL;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
@@ -832,4 +837,45 @@ public class MapManager extends Thread {
}
}
}
+
+ protected void getPlayerImage(Player player)
+ {
+ String urlString = "http://www.minecraft.net/skin/" + player.getName() + ".png";
+ String filename = tilepath + player.getName() + ".png";
+
+ if (downloadPlayerImage(urlString, filename) == false) {
+ downloadPlayerImage("http://www.minecraft.net/img/char.png", filename);
+ }
+ }
+
+ private Boolean downloadPlayerImage(String urlString, String filename)
+ {
+ BufferedImage img = null;
+ Boolean success = false;
+ File out = null;
+
+ try
+ {
+ img = ImageIO.read(new URL(urlString));
+ out = new File(filename);
+
+ BufferedImage imgCropped = img.getSubimage(8, 8, 8, 8);
+ BufferedImage imgResized = new BufferedImage(24, 24, BufferedImage.TYPE_INT_ARGB);
+
+ Graphics2D g = imgResized.createGraphics();
+ g.drawImage(imgCropped, 0, 0, 24, 24, null);
+ g.dispose();
+
+ ImageIO.write(imgResized, "png", out);
+ success = true;
+ }
+ catch(IOException e) {
+ log.log(Level.INFO, "Failed to fetch player image " + filename, e);
+ }
+ catch(NullPointerException e) {
+ log.log(Level.INFO, "Failed to fetch player image " + filename, e);
+ }
+
+ return success;
+ }
}
diff --git a/dist/DynamicMap.rar b/dist/DynamicMap.rar
index 6c4f35d7..2884b78f 100644
Binary files a/dist/DynamicMap.rar and b/dist/DynamicMap.rar differ
diff --git a/map.java b/map.java
index ca34b426..f8d6cdce 100644
--- a/map.java
+++ b/map.java
@@ -42,6 +42,7 @@ public class map extends Plugin {
etc.getLoader().addListener(PluginLoader.Hook.COMMAND, listener, this, PluginListener.Priority.MEDIUM);
etc.getLoader().addListener(PluginLoader.Hook.BLOCK_CREATED, listener, this, PluginListener.Priority.MEDIUM);
etc.getLoader().addListener(PluginLoader.Hook.BLOCK_DESTROYED, listener, this, PluginListener.Priority.MEDIUM);
+ etc.getLoader().addListener(PluginLoader.Hook.LOGIN, listener, this, PluginListener.Priority.MEDIUM);
etc.getInstance().addCommand("/map_wait", " [wait] - set wait between tile renders (ms)");
etc.getInstance().addCommand("/map_stat", " - query number of tiles in render queue");
diff --git a/web/map.js b/web/map.js
index 20d4a718..a5f81a0e 100644
--- a/web/map.js
+++ b/web/map.js
@@ -1,9 +1,9 @@
var setup = {
tileUrl: 'http://www.yourdomain.com/minecraft/tiles/',
updateUrl: 'http://www.yourdomain.com/minecraft/up/', // Or if using ASP.NET: http://www.yourdomain.com/minecraft/up/default.aspx?lasttimestamp=
- updateRate: 2000 //Seconds the map should poll for updates. (Seconds) * 1000. The default is 2000 (every 2 seconds).
+ updateRate: 2000 //Seconds the map should poll for updates. (Seconds) * 1000. The default is 2000 (every 2 seconds).
};
-
+
/* THERE SHOULD BE NO NEED FOR MANUAL CONFIGURATION BEYOND THIS POINT */
/**
@@ -388,8 +388,6 @@ MarkerWithLabel.prototype.setMap = function (theMap) {
this.label.setMap(theMap);
};
-
-
/* generic function for making an XMLHttpRequest
* url: request URL
* func: callback function for success
@@ -451,7 +449,7 @@ function makeRequest(url, func, type, fail, post, contenttype)
tileWidth: 128,
tileHeight: 128,
updateRate: setup.updateRate,
- zoomSize: [ 128, 128, 256 ]
+ zoomSize: [ 128, 128, 256, 512 ]
};
function MCMapProjection() {
@@ -525,7 +523,7 @@ function makeRequest(url, func, type, fail, post, contenttype)
mcMapType.prototype.tileSize = new google.maps.Size(config.tileWidth, config.tileHeight);
mcMapType.prototype.minZoom = 0;
- mcMapType.prototype.maxZoom = 2;
+ mcMapType.prototype.maxZoom = 3;
mcMapType.prototype.getTile = function(coord, zoom, doc) {
var img = doc.createElement('IMG');
@@ -558,7 +556,7 @@ function makeRequest(url, func, type, fail, post, contenttype)
var plistbtn;
var lstopen = true;
var oldplayerlst = '[Connecting]';
-
+
function mapUpdate()
{
makeRequest(config.updateUrl + lasttimestamp, function(res) {
@@ -568,11 +566,9 @@ function makeRequest(url, func, type, fail, post, contenttype)
var showSigns = document.getElementById('showSigns').checked;
var showHomes = document.getElementById('showHomes').checked;
var showSpawn = document.getElementById('showSpawn').checked;
-
- lasttimestamp = rows[0];
+ lasttimestamp = rows[0];
delete rows[0];
-
- var playerlst = ''
+ var playerlst = ''
var numwarps = 0;
var numsigns = 0;
var numhomes = 0;
@@ -587,18 +583,18 @@ function makeRequest(url, func, type, fail, post, contenttype)
// Hack to keep duplicate markers from conflicting with eachother
if (p[1] != 'player' && p.length == 5) {
p[0] = p[0] + '' + p[1] + '';
- }
-
+ }
loggedin[p[0]] = 1;
- if (p[1] == 'player') {
- if(playerlst != '') playerlst += '
';
- playerlst += ' ' + p[0] + '';
- }
-
if(p.length == 5) {
var image = p[1] + '.png';
+ if (p[1] == 'player') {
+ if(playerlst != '') playerlst += '
';
+ playerlst += '' + p[0] + '';
+ image = setup.tileUrl + p[0] + '.png';
+ }
+
if (p[1] == 'warp') numwarps++;
if (p[1] == 'sign') numsigns++;
if (p[1] == 'home') numhomes++;
@@ -651,7 +647,6 @@ function makeRequest(url, func, type, fail, post, contenttype)
} else if(p.length == 2) {
lastSeen['t_' + p[0]] = lasttimestamp;
lastSeen['zt_' + p[1]] = lasttimestamp;
-
imgSubst('t_' + p[0]);
imgSubst('zt_' + p[1]);
}
@@ -661,24 +656,20 @@ function makeRequest(url, func, type, fail, post, contenttype)
oldplayerlst = playerlst;
lst.innerHTML = playerlst;
}
-
+
for(var m in markers) {
if(!(m in loggedin)) {
markers[m].setMap(null);
delete markers[m];
}
}
-
+ setTimeout(mapUpdate, config.updateRate);
document.getElementById('warpsDiv').style.display = (numwarps == 0)?'none':'';
document.getElementById('signsDiv').style.display = (numsigns == 0)?'none':'';
document.getElementById('homesDiv').style.display = (numhomes == 0)?'none':'';
document.getElementById('spawnsDiv').style.display = (numspawns == 0)?'none':'';
-
document.getElementById('plist').style.display = (numplayers == 0)?'none':'';
-
document.getElementById('controls').style.display = ((numwarps + numsigns + numhomes + numspawns) == 0)?'none':'';
-
- setTimeout(mapUpdate, config.updateRate);
}, 'text', function() { alert('failed to get update data'); } );
}
@@ -690,7 +681,7 @@ function makeRequest(url, func, type, fail, post, contenttype)
center: new google.maps.LatLng(0, 1),
navigationControl: true,
navigationControlOptions: {
- style: google.maps.NavigationControlStyle.SMALL
+ style: google.maps.NavigationControlStyle.DEFAULT
},
scaleControl: false,
mapTypeControl: false,
@@ -708,6 +699,12 @@ function makeRequest(url, func, type, fail, post, contenttype)
google.maps.event.addListener(map, 'dragstart', function(mEvent) {
plfollow('');
});
+ google.maps.event.addListener(map, 'zoom_changed', function() {
+ makeLink();
+ });
+ google.maps.event.addListener(map, 'center_changed', function() {
+ makeLink();
+ });
map.dragstart = plfollow('');
map.mapTypes.set('mcmap', mapType);
@@ -732,7 +729,7 @@ function makeRequest(url, func, type, fail, post, contenttype)
function plclick(name) {
if(name in markers) {
if(name != followPlayer) plfollow('');
- map.setCenter(markers[name].getPosition());
+ map.panTo(markers[name].getPosition());
}
}
@@ -759,10 +756,18 @@ function makeRequest(url, func, type, fail, post, contenttype)
followPlayer = name;
if(name in markers) {
- map.setCenter(markers[name].getPosition());
+ map.panTo(markers[name].getPosition());
}
}
+ function makeLink() {
+ var a=location.href.substring(0,location.href.lastIndexOf("/")+1)
+ + "?lat=" + map.getCenter().lat().toFixed(6)
+ + "&lng=" + map.getCenter().lng().toFixed(6)
+ + "&zoom=" + map.getZoom();
+ document.getElementById("link").innerHTML = a;
+ }
+
//remove item (string or number) from an array
function removeItem(originalArray, itemToRemove) {
var j = 0;
@@ -774,4 +779,4 @@ function makeRequest(url, func, type, fail, post, contenttype)
}
// assert('hi');
return originalArray;
- }
+ }
\ No newline at end of file
diff --git a/web/style.css b/web/style.css
index 818f3afe..ae63a021 100644
--- a/web/style.css
+++ b/web/style.css
@@ -18,6 +18,7 @@ body { height: 100%; margin: 0px; padding: 0px ; background-color: #000; }
}
#plistbtn {
float:right;
+ cursor:pointer;
}
#link {
position: absolute;
@@ -32,8 +33,8 @@ body { height: 100%; margin: 0px; padding: 0px ; background-color: #000; }
}
#controls {
position: absolute;
- top: 4px;
- left: 30px;
+ top: 12px;
+ left: 45px;
border: 1px solid #808080;
background: #000;
opacity: 0.6;
@@ -56,4 +57,15 @@ a, a:visited {
white-space: nowrap;
color: white;
display:none;
-}
\ No newline at end of file
+}
+.gmnoprint{
+ margin-top:-75px;
+ margin-left:-20px
+}
+.plisthead{
+ margin-left:3px;
+ margin-right:3px;
+ display:inline-block;
+ height:14px;width:14px;
+ background-color:#000;
+}