From 61ec62f9d25400ec396cc66dda07020867176a35 Mon Sep 17 00:00:00 2001 From: David Vierra Date: Thu, 28 Oct 2010 00:03:01 -1000 Subject: [PATCH] automatically recover from a damaged level.dat. if level.dat is unreadable, try to read level.dat_old and save if successful. plus stricter checks on the filename when it doesn't point to a world folder. --- mclevel.py | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/mclevel.py b/mclevel.py index c70e2d7..d965481 100644 --- a/mclevel.py +++ b/mclevel.py @@ -1811,27 +1811,36 @@ class MCInfdevOldLevel(MCLevel): if os.path.isdir(filename): self.worldDir = filename - filename = os.path.join(filename, "level.dat") + else: + if os.path.basename(filename) in ("level.dat", "level.dat_old"): + self.worldDir = os.path.dirname(filename) + else: + raise IOError, 'File is not a Minecraft Alpha world' - self.worldDir = os.path.split(filename)[0] + self.filename = os.path.join(self.worldDir, "level.dat") + + #maps (cx,cz) pairs to InfdevChunks self._presentChunks = {}; #used to limit memory usage self.loadedChunks = dequeset() self.decompressedChunks = dequeset() - if create: - self.create(filename, random_seed, last_played); - else: - root_tag = nbt.load(filename) - - self.root_tag = root_tag; - self.filename = filename; if create: + self.create(self.filename, random_seed, last_played); self.saveInPlace(); + else: + try: + self.root_tag = nbt.load(self.filename) + except Exception, e: + filename_old = os.path.join(self.worldDir, "level.dat_old") + info( "Error loading level.dat, trying level.dat_old ({0})".format( e ) ) + self.root_tag = nbt.load(filename_old) + info( "level.dat restored from backup." ) + self.saveInPlace(); self.dirhashes = [self.dirhash(n) for n in range(64)]; self.dirhash=self.dirhashlookup;