コード例 #1
0
ファイル: adapter.py プロジェクト: dzkdev/mcedit2
    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()
コード例 #2
0
"""
    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)
コード例 #3
0
ファイル: revisionhistory_test.py プロジェクト: wcpe/mcedit2
def history(tmpdir):
    filename = "AnvilWorld"
    tmpname = copy_temp_file(tmpdir, filename)
    return RevisionHistory(tmpname.strpath)
コード例 #4
0
"""
    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)
コード例 #5
0
def history():
    filename = "AnvilWorld"
    tmpname = TempFile(filename)
    return RevisionHistory(tmpname)
コード例 #6
0
ファイル: time_storagechain.py プロジェクト: wcpe/mcedit2
"""
    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)
コード例 #7
0
ファイル: adapter.py プロジェクト: Fiskmans/mcedit2
    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)"