Tuesday, December 14, 2010

Configuring the Dynamic Map Plugin for hMod

The dynamic map plugin for hMod is awesome. If you haven't seen it, check it out on my server here:

mine.elmakers.com

The forum post is here, originally describing the plugin. It supports dynamic regeneration of map tiles (based on add/remove block notification), and live updating of player locations, and (of course) has a Google Maps client interface.

The newest version (as of this posting) also shows warp locations, home locations, and the spawn point. It even shows player face icons. (Awesome!)

It's definitely worth setting up on any Minecraft server, if you have enough control of the server to do so. It is a bit trickier to get going than your standard plugin, which is why I'm offering this tutorial. I'm hoping it helps!

Server Setup

Much of the server-side setup I have Shagnasticator's post on page 2 to thank for.

My server setup is CentOS, but this guide shouldn't be too different for other flavors of Linux.

First, get the plugin. Currently, in fescen9's signature, the link to the most recent is here:

http://www.fescen9.com/Minecraft/Plugins/DynamicMap.rar

The source code is in an SVN repository here: https://port70.net/svn/dynmap/trunk.  You only need the source if you want to modify the plugin.

Once you have downloaded the file, unrar it.You should see a map.jar, this is the actual plugin.

Setting Up the Plugin


Install map.jar like any other plugin- put it in the plugins folder, add it to "plugins" in server.properties, and then reload both the server config and the map plugin (or restart the server).

Configuration options go right in server.properties, and should be there after the plugin is loaded. The main thing you'll need to modify is "map-tilepath" (possibly- I left mine alone). Make note of "map-serverport", which should be 8123, and check out the other options.

Setting Up the Tiles Folder


Setting up the tiles folder is one of the trickiest parts. I don't claim to have done this the best or most secure way, so the standard disclaimers apply. Please feel free to add a comment if you've got a better setup and I'll be happy to modify this tutorial! And, please don't grief my server using the information I'm providing to try to help people...

So, I went in my web root- this is the folder where Apache serves up your web files. By default, this is /var/www/html. If you want your map to be in the root of your webserver, this is the folder you'll use.

Go into this folder and "mkdir tiles" to create the tiles folder. Make sure it is owned by the same user that the web server runs under (check the owner of "html", it may be root). And, here is the nasty part- make it world-writeable (777). There is probably a better way to do this, setting up a group shared by web and minecraft users, but I haven't gotten here yet, myself.

Now you have a "tiles" folder that the web service can access and that the minecraft user can write to.

Go back to your minecraft server folder, and create a symlink to the tiles folder: "ln -s /var/www/html/tiles tiles". This will let the plugin write there without having to fully path out the tiles folder.

There are obviously other ways to set up tiles so that the webserver can access it, but for me this was the easiest and least prone to errors.

Setting up the Webserver


The webserver is responsible for serving up 3 things to make the map work:

  • The map tiles, dynamically created by the plugin
  • The map index.html, javascript, images, and other static resource
  • An XHR interface for providing live information about the map (player locations, updated tiles, etc).
So far, the first part should be working. Load up your server, walk around a bit, break some blocks. Then go check your "tiles" folder- you should see some png's in there. If not, check server.log for access violation or other errors. If you can't find anything wrong, we may be stuck.

If you've got png's, then great! Let's get the map working. 

This part is pretty easy: first, we need to edit two lines in map.js (inside of the "web" folder from the RAR you downloaded), right at the very top:

tileUrl: Point this to the URL of your tile folder
updateUrl: Points to your update URL, which we'll set up later

If you're following this guide and are using the root of your webserver for your map, then you can just change the example domain name to your domain. Otherwise, change these URLs appropriately, and save the file.

If you don't have a domain, then you'll want to use the public IP address of your webserver.

Then, simply copy the files in the "web" folder to your "/var/www/html" folder on the webserver. You should now be able to navigate to your server and see the map load, and it should even show the tiles that you've created. Success! (Hopefully).

The only problem is you'll get the "error getting update data" message, and player locations/warps/etc won't be shown.

Setting up the Update URL

Now things get a little tricky, and I really have to rely on the groundwork laid out by ShagNasticator. 

The problem is that the plugin serves up its update information on port 8123. Most webservers are firewalled, and wouldn't let anyone connect to that port- and I'm not even sure that the XSS blocking wouldn't catch different ports anyway.

So, you've got to set Apache up to serve that port as a "virtual" address.

For CentOS, I did not have to do this part, but Shagnasticator mentions first having to turn on some Apache modules (all of this will be in httpd.conf - /etc/httpd/conf/httpd.conf on CentOS):

LoadModule rewrite_module modules/mod_rewrite.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so

Then, on to the important stuff- basically copy+paste this into your httpd.conf, at the very bottom- that's what I did.

<VirtualHost *:80>
RewriteEngine on
RewriteRule /up/(.*) http://localhost:8123/$1 [P,L]
</VirtualHost> 

<VirtualHost 127.0.0.1>
ServerName localhost
</Virtualhost>

<Proxy http://localhost:8123/*>
Order deny,allow
Allow from all
</Proxy>

This sets up a rewrite rule that will map "/up/" to port 8123 on your local machine. This means that the XHR requests sent by the map client will get routed to the plugin, which will be able to report back its status.

Restart apache (apachectl restart), and jump on your mapserver while logged into Minecraft.

If all went well, you should see your player show up!

If not, check the minecraft server logs and check the httpd logs for any errors. And, if all else fails, come back to the forums!

9 comments:

  1. ok ok...
    so if im say using my default pc to host the server and its behind a router (without a domain) do i just put my extrenal ip into instead of an domain name? or my router ip?

    ReplyDelete
  2. littleclazii: That's right, thanks- I added a note. If you don't have a domain name set up, then just use the public IP of your server. If you are hosting from home on your local network, this will be the same public IP as your router.

    Note that, with this setup, you'll also need to configure your router to send port 80 traffic to your minecraft/web server. Presumably, you've already done this for the minecraft server port itself, so you should know what to do here.

    Also note that (such as is the case with my ISP) you may not have a static IP, and it can change- hopefully not too frequently. Just make sure to check in on it from time to time.

    ReplyDelete
  3. hii again.. i did everything that you did in yours (but changed what i had to for ubuntu 10.10) and going to my external ip. i get a 404 error :/
    i am stumped. ive tryed your take on the map.js too and still nothing :(

    ReplyDelete
  4. This comment has been removed by the author.

    ReplyDelete
  5. by doing this i get somethings
    (Proxy http://localhost:8123/*)
    Order deny,allow
    Allow from all
    (/Proxy)

    (VirtualHost*:80)
    ServerName Localhost
    DocumentRoot /var/www
    Alias tiles/ /var/www/tiles/

    RewriteEngine on
    RewriteRule /up/(.*) http://127.0.0.1:8123/$1 [P,L]
    (/VirtualHost)

    ive got it showing numbers and letters on /up/ but nothing but a black blank screen doing http://86.156.146.160/
    p.s im not using () in my httpd.conf i use <

    ReplyDelete
  6. Do you have a new link for the map.jar file. The one posted isn't working for me.

    ReplyDelete
  7. http://www.mediafire.com/?dn9eeii5lwwwi2d
    found here: http://forum.hey0.net/showthread.php?tid=1295&page=26
    works with newest hmod for met BUT! the players wont show up on the map. i cant find any error :(

    ReplyDelete
  8. This comment has been removed by the author.

    ReplyDelete
  9. [SEVERE] Exception while calling plugin function in 'class MapListener' while calling hook: 'BLOCK_CREATED'.
    java.lang.NullPointerException
    at MapListener.onBlockCreate(MapListener.java:18)
    at PluginLoader.callHook(PluginLoader.java:501)
    at kk.a(kk.java:408)
    at gt.a(SourceFile:57)
    at bs.a(SourceFile:232)
    at kk.a(kk.java:61)
    at eh.a(eh.java:71)
    at net.minecraft.server.MinecraftServer.h(SourceFile:275)
    at net.minecraft.server.MinecraftServer.run(SourceFile:216)
    at cj.run(SourceFile:490)

    ReplyDelete