Ejemplo n.º 1
0
    def extractUndoChunks(self, level, chunks, chunkCount=None):
        if not isinstance(level, pymclevel.MCInfdevOldLevel):
            chunks = numpy.array(list(chunks))
            mincx, mincz = numpy.min(chunks, 0)
            maxcx, maxcz = numpy.max(chunks, 0)
            box = BoundingBox((mincx << 4, 0, mincz << 4), (maxcx << 4, level.Height, maxcz << 4))

            return self.extractUndoSchematic(level, box)

        undoLevel = pymclevel.MCInfdevOldLevel(mkundotemp(), create=True)
        if not chunkCount:
            try:
                chunkCount = len(chunks)
            except TypeError:
                chunkCount = -1

        def _extractUndo():
            yield 0, 0, "Recording undo..."
            for i, (cx, cz) in enumerate(chunks):
                undoLevel.copyChunkFrom(level, cx, cz)
                yield i, chunkCount, _("Copying chunk %s...") % ((cx, cz),)
            undoLevel.saveInPlace()

        if chunkCount > 25 or chunkCount < 1:
            if "Canceled" == showProgress("Recording undo...", _extractUndo(), cancel=True):
                if albow.ask("Continue with undo disabled?", ["Continue", "Cancel"]) == "Cancel":
                    raise Cancel
                else:
                    return None
        else:
            exhaust(_extractUndo())

        return undoLevel
Ejemplo n.º 2
0
    def buildWidgets(self):
        for w in self.subwidgets:
            w.set_parent(None)

        helpColumn = []

        self.root.movementLabel = label = albow.Label(_("{0}/{1}/{2}/{3}/{4}/{5} to move").format(
            _(config.keys.forward.get()),
            _(config.keys.left.get()),
            _(config.keys.back.get()),
            _(config.keys.right.get()),
            _(config.keys.up.get()),
            _(config.keys.down.get()),
        ), doNotTranslate=True)
        label.anchor = 'whrt'
        label.align = 'r'
        helpColumn.append(label)

        def addHelp(text, dnt=False):
            label = albow.Label(text, doNotTranslate=dnt)
            label.anchor = 'whrt'
            label.align = "r"
            helpColumn.append(label)
            return label

        self.root.slowDownLabel = addHelp(_("{0} to slow down").format(_(config.keys.brake.get())), dnt=True)
        self.camCont = addHelp("Right-click to toggle camera control")
        self.toolDist = addHelp("Mousewheel to control tool distance")
        self.root.detailsLabel = addHelp(_("Hold {0} for details").format(_(config.keys.showBlockInfo.get())), dnt=True)

        self.helpColumn = helpColumn = albow.Column(helpColumn, align="r")
        helpColumn.topright = self.topright
        helpColumn.anchor = "whrt"
        # helpColumn.is_gl_container = True
        self.add(helpColumn)

        keysColumn = [albow.Label("")]
        buttonsColumn = [panels.ControlPanel.getHeader()]

        shortnames = []
        for world in self.mcedit.recentWorlds():
            shortname = os.path.basename(world)
            try:
                if pymclevel.MCInfdevOldLevel.isLevel(world):
                    lev = pymclevel.MCInfdevOldLevel(world, readonly=True)
                    shortname = lev.LevelName
                    if lev.LevelName != lev.displayName:
                        shortname = u"{0} ({1})".format(lev.LevelName, lev.displayName)
            except Exception, e:
                logging.warning(
                    'Couldn\'t get name from recent world: {0!r}'.format(e))

            if shortname == "level.dat":
                shortname = os.path.basename(os.path.dirname(world))

            if len(shortname) > 40:
                shortname = shortname[:37] + "..."
            shortnames.append(shortname)
Ejemplo n.º 3
0
def createWorld(name):
    worlddir = os.path.join( os.getcwd(), "renders", name )
    if ( os.path.exists( worlddir ) ):
        print "World exists, deleting..."
        rm_rf(worlddir)
    os.mkdir( worlddir )

    world = mcl.MCInfdevOldLevel( worlddir, create = True);

    world.generateLights();
    world.setPlayerPosition( (0, 67, 0) ) # add 3 to make sure his head isn't in the ground.
    world.setPlayerSpawnPosition( (0, 64, 0) )
    world.saveInPlace()
    return world
Ejemplo n.º 4
0
    def extractUndoChunks(self, level, chunks, chunkCount=None):
        undoLevel = pymclevel.MCInfdevOldLevel(mkundotemp(), create=True)
        if not chunkCount:
            try:
                chunkCount = len(chunks)
            except TypeError:
                chunkCount = -1

        def _extractUndo():
            yield 0, 0, "Recording undo..."
            for i, (cx, cz) in enumerate(chunks):
                undoLevel.copyChunkFrom(level, cx, cz)
                yield i, chunkCount, "Copying chunk %s..." % ((cx, cz), )
            undoLevel.saveInPlace()

        if chunkCount > 25 or chunkCount < 1:
            showProgress("Recording undo...", _extractUndo())
        else:
            exhaust(_extractUndo())

        return undoLevel
Ejemplo n.º 5
0
    def __init__(self, mcedit, *args, **kwargs):
        kwargs['rect'] = mcedit.rect
        albow.Widget.__init__(self, *args, **kwargs)
        self.anchor = 'tlbr'
        self.mcedit = mcedit
        self.root = self.get_root()

        helpColumn = []

        label = albow.Label(
            _("{0}/{1}/{2}/{3}/{4}/{5} to move").format(
                config.keys.forward.get(),
                config.keys.left.get(),
                config.keys.back.get(),
                config.keys.right.get(),
                config.keys.up.get(),
                config.keys.down.get(),
            ))
        label.anchor = 'whrt'
        label.align = 'r'
        helpColumn.append(label)

        def addHelp(text):
            label = albow.Label(text)
            label.anchor = 'whrt'
            label.align = "r"
            helpColumn.append(label)

        addHelp(_("{0} to slow down").format(config.keys.brake.get()))
        addHelp("Right-click to toggle camera control")
        addHelp("Mousewheel to control tool distance")
        addHelp(
            _("Hold {0} for details").format(config.keys.showBlockInfo.get()))

        helpColumn = albow.Column(helpColumn, align="r")
        helpColumn.topright = self.topright
        helpColumn.anchor = "whrt"
        # helpColumn.is_gl_container = True
        self.add(helpColumn)

        keysColumn = [albow.Label("")]
        buttonsColumn = [panels.ControlPanel.getHeader()]

        shortnames = []
        for world in self.mcedit.recentWorlds():
            shortname = os.path.basename(world)
            try:
                if pymclevel.MCInfdevOldLevel.isLevel(world):
                    lev = pymclevel.MCInfdevOldLevel(world, readonly=True)
                    shortname = lev.LevelName
                    if lev.LevelName != lev.displayName:
                        shortname = u"{0} ({1})".format(
                            lev.LevelName, lev.displayName)
            except Exception, e:
                logging.warning(
                    'Couldn\'t get name from recent world: {0!r}'.format(e))

            if shortname == "level.dat":
                shortname = os.path.basename(os.path.dirname(world))

            if len(shortname) > 40:
                shortname = shortname[:37] + "..."
            shortnames.append(shortname)
Ejemplo n.º 6
0
def apply(self, op, point):

    undoLevel = pymclevel.MCInfdevOldLevel(mkundotemp(), create=True)
    dirtyChunks = set()

    def saveUndoChunk(cx, cz):
        if (cx, cz) in dirtyChunks:
            return
        dirtyChunks.add((cx, cz))
        undoLevel.copyChunkFrom(op.level, cx, cz)

    doomedBlock = op.level.blockAt(*point)
    doomedBlockData = op.level.blockDataAt(*point)
    checkData = (doomedBlock not in (8, 9, 10, 11))
    indiscriminate = op.options['Indiscriminate']

    if indiscriminate:
        checkData = False
        if doomedBlock == 2:  # grass
            doomedBlock = 3  # dirt
    if doomedBlock == op.options['Block'].ID and (
            doomedBlockData == op.options['Block'].blockData
            or checkData == False):
        return

    x, y, z = point
    saveUndoChunk(x // 16, z // 16)
    op.level.setBlockAt(x, y, z, op.options['Block'].ID)
    op.level.setBlockDataAt(x, y, z, op.options['Block'].blockData)

    def processCoords(coords):
        newcoords = collections.deque()

        for (x, y, z) in coords:
            for _dir, offsets in pymclevel.faceDirections:
                dx, dy, dz = offsets
                p = (x + dx, y + dy, z + dz)

                nx, ny, nz = p
                b = op.level.blockAt(nx, ny, nz)
                if indiscriminate:
                    if b == 2:
                        b = 3
                if b == doomedBlock:
                    if checkData:
                        if op.level.blockDataAt(nx, ny, nz) != doomedBlockData:
                            continue

                    saveUndoChunk(nx // 16, nz // 16)
                    op.level.setBlockAt(nx, ny, nz, op.options['Block'].ID)
                    op.level.setBlockDataAt(nx, ny, nz,
                                            op.options['Block'].blockData)
                    newcoords.append(p)

        return newcoords

    def spread(coords):
        while len(coords):
            start = datetime.datetime.now()

            num = len(coords)
            coords = processCoords(coords)
            d = datetime.datetime.now() - start
            progress = "Did {0} coords in {1}".format(num, d)
            log.info(progress)
            yield progress

    showProgress("Flood fill...", spread([point]), cancel=True)
    op.editor.invalidateChunks(dirtyChunks)
    op.undoLevel = undoLevel
Ejemplo n.º 7
0
    def buildWidgets(self):
        for w in self.subwidgets:
            w.set_parent(None)

        helpColumn = []

        self.root.movementLabel = label = albow.Label(
            _("{0}/{1}/{2}/{3}/{4}/{5} to move").format(
                _(config.keys.forward.get()),
                _(config.keys.left.get()),
                _(config.keys.back.get()),
                _(config.keys.right.get()),
                _(config.keys.up.get()),
                _(config.keys.down.get()),
            ),
            doNotTranslate=True)
        label.anchor = 'whrt'
        label.align = 'r'
        helpColumn.append(label)

        def addHelp(text, dnt=False):
            label = albow.Label(text, doNotTranslate=dnt)
            label.anchor = 'whrt'
            label.align = "r"
            helpColumn.append(label)
            return label

        self.root.slowDownLabel = addHelp(_("{0} to slow down").format(
            _(config.keys.brake.get())),
                                          dnt=True)
        self.camCont = addHelp("Right-click to toggle camera control")
        self.toolDist = addHelp("Mousewheel to control tool distance")
        self.root.detailsLabel = addHelp(_("Hold {0} for details").format(
            _(config.keys.showBlockInfo.get())),
                                         dnt=True)

        self.helpColumn = helpColumn = albow.Column(helpColumn, align="r")
        helpColumn.topright = self.topright
        helpColumn.anchor = "whrt"
        # helpColumn.is_gl_container = True
        self.add(helpColumn)

        keysColumn = [albow.Label("")]
        buttonsColumn = [panels.ControlPanel.getHeader()]

        shortnames = []
        for world in self.mcedit.recentWorlds():
            shortname = os.path.basename(world)
            try:
                if pymclevel.MCInfdevOldLevel.isLevel(world):
                    lev = pymclevel.MCInfdevOldLevel(world, readonly=True)
                    shortname = lev.LevelName
                    if lev.LevelName != lev.displayName:
                        shortname = u"{0} ({1})".format(
                            lev.LevelName, lev.displayName)
            except Exception as e:
                logging.warning(
                    'Couldn\'t get name from recent world: {0!r}'.format(e))

            if shortname == "level.dat":
                shortname = os.path.basename(os.path.dirname(world))

            if len(shortname) > 40:
                shortname = shortname[:37] + "..."
            shortnames.append(shortname)

        hotkeys = (
            [(config.keys.newWorld.get(), 'Create New World',
              self.createNewWorld),
             (config.keys.quickLoad.get(), 'Quick Load',
              self.mcedit.editor.askLoadWorld),
             (config.keys.open.get(), 'Open...', self.promptOpenAndLoad)] +
            [('F{0}'.format(i + 1), shortnames[i],
              self.createLoadButtonHandler(world))
             for i, world in enumerate(self.mcedit.recentWorlds())])

        self.root.commandRow = commandRow = albow.HotkeyColumn(
            hotkeys, keysColumn, buttonsColumn, translateButtons=range(3))
        commandRow.anchor = 'lrh'

        sideColumn1 = self.mcedit.makeSideColumn1()
        sideColumn1.anchor = 'wh'
        spaceLabel = albow.Label("")
        spaceLabel.anchor = 'wh'
        sideColumn2 = self.mcedit.makeSideColumn2()
        sideColumn2.anchor = 'wh'

        contentRow = albow.Row(
            (commandRow, albow.Column((sideColumn1, spaceLabel, sideColumn2))))
        contentRow.center = self.center
        contentRow.anchor = "rh"
        self.contentRow = contentRow
        self.add(contentRow)
        self.invalidate()