def __init__(self, filename=None, create=False, readonly=False, resume=None): """ Load a Minecraft for PC level (Anvil format) from the given filename. It can point to either a level.dat or a folder containing one. If create is True, it will also create the world using a randomly selected seed. If you try to create an existing world, IOError will be raised. Uses a RevisionHistory to manage undo history. Upon creation, the world is read-only until createRevision() is called. Call createRevision() to create a new revision, or selectRevision() to revert to an earlier revision. Older revisions are read-only, so createRevision() must be called again to make further changes. Call writeAllChanges() to write all changes into the original world. :type filename: str or unicode :type create: bool :type readonly: bool :rtype: AnvilWorldAdapter """ self.lockTime = 0 self.EntityRef = PCEntityRef self.TileEntityRef = PCTileEntityRef assert not (create and readonly) if os.path.basename(filename) in ("level.dat", "level.dat_old"): filename = os.path.dirname(filename) if not os.path.exists(filename): if not create: raise IOError('File not found') os.mkdir(filename) else: if create: if not os.path.isdir(filename) or os.path.exists(os.path.join(filename, "level.dat")): raise IOError('File exists!') if not os.path.isdir(filename): raise IOError('File is not a Minecraft Anvil world') if readonly: self.revisionHistory = AnvilWorldFolder(filename) self.selectedRevision = self.revisionHistory else: self.revisionHistory = RevisionHistory(filename, resume) self.selectedRevision = self.revisionHistory.getHead() self.filename = filename self.readonly = readonly if not readonly: self.acquireSessionLock() if create: self._createMetadataTag() self.selectedRevision.writeFile("level.dat", self.metadata.metadataTag.save()) else: self.loadMetadata()
""" time_storagechain """ import logging from timeit import timeit from mceditlib import nbt from mceditlib.revisionhistory import RevisionHistory from mceditlib.test.templevel import TempFile log = logging.getLogger(__name__) chain = RevisionHistory(TempFile("test_files/AnvilWorld")) chunkPositions = list(chain.getHead().chunkPositions("")) from random import choice def readChunk(rev, cx, cz): return nbt.load(buf=rev.readChunkBytes(cx, cz, "")) def writeChunk(rev, cx, cz, tag): rev.writeChunkBytes(cx, cz, "", tag.save(compressed=False)) def addRevisions(): for i in range(1000): rev = chain.createRevision() cx, cz = choice(chunkPositions) tag = readChunk(rev, cx, cz) tag["Level"]["touched"] = nbt.TAG_Byte(1) writeChunk(rev, cx, cz, tag)
def history(tmpdir): filename = "AnvilWorld" tmpname = copy_temp_file(tmpdir, filename) return RevisionHistory(tmpname.strpath)
""" time_storagechain """ import logging from timeit import timeit from mceditlib import nbt from mceditlib.revisionhistory import RevisionHistory from mceditlib.test.templevel import TempFile log = logging.getLogger(__name__) chain = RevisionHistory(TempFile("AnvilWorld")) chunkPositions = list(chain.getHead().chunkPositions("")) from random import choice def readChunk(rev, cx, cz): return nbt.load(buf=rev.readChunkBytes(cx, cz, "")) def writeChunk(rev, cx, cz, tag): rev.writeChunkBytes(cx, cz, "", tag.save(compressed=False)) def addRevisions(): for i in range(1000): rev = chain.createRevision() cx, cz = choice(chunkPositions) tag = readChunk(rev, cx, cz)
def history(): filename = "AnvilWorld" tmpname = TempFile(filename) return RevisionHistory(tmpname)
""" time_storagechain """ import logging from timeit import timeit from benchmarks import bench_temp_file from mceditlib import nbt from mceditlib.revisionhistory import RevisionHistory log = logging.getLogger(__name__) chain = RevisionHistory(bench_temp_file("AnvilWorld")) chunkPositions = list(chain.getHead().chunkPositions("")) from random import choice def readChunk(rev, cx, cz): return nbt.load(buf=rev.readChunkBytes(cx, cz, "")) def writeChunk(rev, cx, cz, tag): rev.writeChunkBytes(cx, cz, "", tag.save(compressed=False)) def addRevisions(): for i in range(1000): rev = chain.createRevision() cx, cz = choice(chunkPositions)
def __init__(self, filename=None, create=False, readonly=False, resume=None): """ Load a Minecraft for PC level (Anvil format) from the given filename. It can point to either a level.dat or a folder containing one. If create is True, it will also create the world using a randomly selected seed. If you try to create an existing world, IOError will be raised. Uses a RevisionHistory to manage undo history. Upon creation, the world is read-only until createRevision() is called. Call createRevision() to create a new revision, or selectRevision() to revert to an earlier revision. Older revisions are read-only, so createRevision() must be called again to make further changes. Call writeAllChanges() to write all changes into the original world. :type filename: str or unicode :type create: bool :type readonly: bool :rtype: AnvilWorldAdapter """ self.lockTime = 0 assert not (create and readonly) if os.path.basename(filename) in ("level.dat", "level.dat_old"): filename = os.path.dirname(filename) if not os.path.exists(filename): if not create: raise IOError('File not found') os.mkdir(filename) else: if create: if not os.path.isdir(filename) or os.path.exists(os.path.join(filename, "level.dat")): raise IOError('File exists!') if not os.path.isdir(filename): raise IOError('File is not a Minecraft Anvil world') if readonly: self.revisionHistory = AnvilWorldFolder(filename) self.selectedRevision = self.revisionHistory else: self.revisionHistory = RevisionHistory(filename, resume) self.selectedRevision = self.revisionHistory.getHead() self.filename = filename self.readonly = readonly if not readonly: self.acquireSessionLock() if create: self._createMetadataTag() self.selectedRevision.writeFile("level.dat", self.metadata.metadataTag.save()) else: try: metadataTag = nbt.load(buf=self.selectedRevision.readFile("level.dat")) self.metadata = AnvilWorldMetadata(metadataTag) self.loadFMLMapping() except (EnvironmentError, zlib.error) as e: log.info("Error loading level.dat, trying level.dat_old ({0})".format(e)) try: metadataTag = nbt.load(buf=self.selectedRevision.readFile("level.dat_old")) self.metadata = AnvilWorldMetadata(metadataTag) log.info("level.dat restored from backup.") self.saveChanges() except Exception as e: traceback.print_exc() log.info("%r while loading level.dat_old. Initializing with defaults.", e) self._createMetadataTag() assert self.metadata.version == VERSION_ANVIL, "Pre-Anvil world formats are not supported (for now)"