0

Scan the FS to find RegionSets

Rewrite Tracking Issue: #568
This commit is contained in:
Andrew Chin
2011-12-19 21:25:24 -05:00
parent d332554ec2
commit ad2399165a

View File

@@ -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
were 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/