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; +}