#!/usr/bin/python ''' Updates overviewer.dat file sign info This script will scan through every chunk looking for signs and write out an updated overviewer.dat file. This can be useful if your overviewer.dat file is either out-of-date or non-existant. To run, simply give a path to your world directory and the path to your output directory. For example: python contrib/findSigns.py ../world.test/ output_dir/ An optional north direction may be specified as follows: python contrib/findSigns.py ../world.test/ output_dir/ lower-right Valid options are upper-left, upper-right, lower-left and lower-right. If no direction is specified, lower-left is assumed Once that is done, simply re-run the overviewer to generate markers.js: python overviewer.py ../world.test/ output_dir/ ''' import sys import re import os import cPickle sys.path.append(".") from overviewer_core import nbt from pprint import pprint if len(sys.argv) < 3: sys.exit("Usage: %s [north_direction]" % sys.argv[0]) worlddir = sys.argv[1] outputdir = sys.argv[2] directions=["upper-left","upper-right","lower-left","lower-right"] if len(sys.argv) < 4: print "No north direction specified - assuming lower-left" north_direction="lower-left" else: north_direction=sys.argv[3] if (north_direction not in directions): print north_direction, " is not a valid direction" sys.exit("Bad north-direction") if os.path.exists(worlddir): print "Scanning chunks in ", worlddir else: sys.exit("Bad WorldDir") if os.path.exists(outputdir): print "Output directory is ", outputdir else: sys.exit("Bad OutputDir") matcher = re.compile(r"^r\..*\.mcr$") POI = [] for dirpath, dirnames, filenames in os.walk(worlddir): for f in filenames: if matcher.match(f): print f full = os.path.join(dirpath, f) r = nbt.load_region(full,north_direction) chunks = r.get_chunks() for x,y in chunks: chunk = r.load_chunk(x,y).read_all() data = chunk[1]['Level']['TileEntities'] for entity in data: if entity['id'] == 'Sign': msg=' \n'.join([entity['Text1'], entity['Text2'], entity['Text3'], entity['Text4']]) #print "checking -->%s<--" % msg.strip() if msg.strip(): newPOI = dict(type="sign", x= entity['x'], y= entity['y'], z= entity['z'], msg=msg, chunk= (entity['x']/16, entity['z']/16), ) POI.append(newPOI) print "Found sign at (%d, %d, %d): %r" % (newPOI['x'], newPOI['y'], newPOI['z'], newPOI['msg']) if os.path.isfile(os.path.join(worlddir, "overviewer.dat")): print "Overviewer.dat detected in WorldDir - this is no longer the correct location\n" print "You may wish to delete the old file. A new overviewer.dat will be created\n" print "Old file: ", os.path.join(worlddir, "overviewer.dat") pickleFile = os.path.join(outputdir,"overviewer.dat") with open(pickleFile,"wb") as f: cPickle.dump(dict(POI=POI), f)