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
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)
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
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
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)
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
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()