diff --git a/overviewer_core/world.py b/overviewer_core/world.py index 87fda41..5e9d39c 100644 --- a/overviewer_core/world.py +++ b/overviewer_core/world.py @@ -74,18 +74,40 @@ class World(object): mincol = maxcol = minrow = maxrow = 0 + ### TODO clean up all of this! def __init__(self, worlddir, outputdir, useBiomeData=False, regionlist=None, north_direction="auto"): self.worlddir = worlddir self.outputdir = outputdir self.useBiomeData = useBiomeData self.north_direction = north_direction + + self.regionsets = [] + + # Scan worlddir to try to identify all region sets + if not os.path.exists(os.path.join(self.worlddir, "level.dat")): + raise Exception("level.dat not found in %s" % self.worlddir) + + for root, dirs, files in os.walk(self.worlddir): + # any .mcr files in this directory? + mcrs = filter(lambda x: x.endswith(".mcr")) + if mcrs: + # construct a regionset object for this + rset = RegionSet(self, os.path.join(self.worlddir, root)) + self.regionsets.append(rset) + # TODO consider reordering self.regionsets so that the 'default' region is first + + # TODO move a lot of the following code into the RegionSet + + # figure out chunk format is in use # if not mcregion, error out early data = nbt.load(os.path.join(self.worlddir, "level.dat"))[1]['Data'] if not ('version' in data and data['version'] == 19132): logging.error("Sorry, This version of Minecraft-Overviewer only works with the new McRegion chunk format") sys.exit(1) + + # TODO move levelname into the regionsets? if 'LevelName' in data: # level.dat should have the LevelName attribute so we'll use that self.name = data['LevelName'] @@ -129,6 +151,9 @@ class World(object): logging.debug("Done scanning regions") + def get_regionsets(self): + return self.regionsets + def get_region_path(self, chunkX, chunkY): """Returns the path to the region that contains chunk (chunkX, chunkY) """ @@ -390,6 +415,37 @@ class World(object): y = -temp-1 yield (x, y, join(dirpath, f)) +class RegionSet(object): + """\ +This object is the gateway to a set of regions (or dimension) from the world +we’re reading from. There is one of these per set of regions on the hard drive, +but may be several per invocation of the Overviewer in the case of multi-world. + """ + + def __init__(self, worldobj, regiondir): + self.world = worldobj + self.regiondir = regiondir + + def get_chunk(self, x, z): + """\ +Returns a dictionary representing the top-level NBT Compound for a chunk given +its x, z coordinates. The coordinates are chunk coordinates. +""" + raise NotImplementedError("get_chunk rewrite") + + def iterate_chunks(self): + """\ +Returns an iterator over all chunk metadata in this world. Iterates over tuples +of integers (x,z,mtime) for each chunk. Other chunk data is not returned here. +""" + raise NotImplementedError("iterate_chunks rewrite") + + def chunk_exists(self, x, z) + """\ +Returns True or False depending on whether the given chunk exists. +""" + raise NotImplementedError("chunk_exists needs rewrite") + def get_save_dir(): """Returns the path to the local saves directory * On Windows, at %APPDATA%/.minecraft/saves/