def applyToChunkSlices(self, op, chunk, slices, brushBox, brushBoxThisChunk): brushMask = createBrushMask(op.tool.getBrushSize(), op.options['Style'], brushBox.origin, brushBoxThisChunk, op.options['Noise'], op.options['Hollow']) blocks = chunk.Blocks[slices] data = chunk.Data[slices] airFill = op.options['Fill Air'] if not airFill: airtable = numpy.zeros((materials.id_limit, 16), dtype='bool') airtable[0] = True replaceMaskAir = airtable[blocks, data] brushMask &= ~replaceMaskAir chunk.Blocks[slices][brushMask] = op.options['Block'].ID chunk.Data[slices][brushMask] = op.options['Block'].blockData
def applyToChunkSlices(self, op, chunk, slices, brushBox, brushBoxThisChunk): depth = op.options['Depth'] blocktype = op.options['Block'] blocks = chunk.Blocks[slices] data = chunk.Data[slices] brushMask = createBrushMask(op.tool.getBrushSize(), op.options['Style'], brushBox.origin, brushBoxThisChunk, op.options['Noise'], op.options['Hollow']) if op.options['Only Change Natural Earth']: try: # try to get the block mask from the topsoil filter import topsoil # @UnresolvedImport blockmask = topsoil.naturalBlockmask() blockmask[blocktype.ID] = True blocktypeMask = blockmask[blocks] except Exception as e: print(repr(e), " while using blockmask from filters.topsoil") blocktypeMask = blocks != 0 else: # topsoil any block blocktypeMask = blocks != 0 if depth < 0: blocktypeMask &= (blocks != blocktype.ID) if len(blocktypeMask) == 0: return heightmap = extractHeights(blocktypeMask) for x, z in itertools.product(*list(map(xrange, heightmap.shape))): h = heightmap[x, z] if h >= brushBoxThisChunk.height: continue if depth > 0: idx = x, z, slice(max(0, h - depth), h) else: # negative depth values mean to put a layer above the surface idx = x, z, slice(h, min(blocks.shape[2], h - depth)) mask = brushMask[idx] blocks[idx][mask] = blocktype.ID data[idx][mask] = blocktype.blockData createTileEntities(blocktype, brushBoxThisChunk, chunk)
def applyToChunkSlices(self, op, chunk, slices, brushBox, brushBoxThisChunk): brushMask = createBrushMask(op.tool.getBrushSize(), op.options['Style'], brushBox.origin, brushBoxThisChunk, op.options['Noise'], op.options['Hollow']) blocks = chunk.Blocks[slices] data = chunk.Data[slices] if op.options['Block'].wildcard: print "Wildcard replace" blocksToReplace = [] for i in range(16): blocksToReplace.append(op.editor.level.materials.blockWithID(op.options['Block'].ID, i)) else: blocksToReplace = [op.options['Block']] replaceTable = block_fill.blockReplaceTable(blocksToReplace) replaceMask = replaceTable[blocks, data] brushMask &= replaceMask chunk.Blocks[slices][brushMask] = op.options['Block To Replace With'].ID chunk.Data[slices][brushMask] = op.options['Block To Replace With'].blockData
def applyToChunkSlices(self, op, chunk, slices, brushBox, brushBoxThisChunk): depth = op.options['Depth'] blocktype = op.options['Block'] blocks = chunk.Blocks[slices] data = chunk.Data[slices] brushMask = createBrushMask(op.tool.getBrushSize(), op.options['Style'], brushBox.origin, brushBoxThisChunk, op.options['Noise'], op.options['Hollow']) if op.options['Only Change Natural Earth']: try: # try to get the block mask from the topsoil filter import topsoil # @UnresolvedImport blockmask = topsoil.naturalBlockmask() blockmask[blocktype.ID] = True blocktypeMask = blockmask[blocks] except Exception, e: print repr(e), " while using blockmask from filters.topsoil" blocktypeMask = blocks != 0
def applyToChunkSlices(self, op, chunk, slices, brushBox, brushBoxThisChunk): brushMask = createBrushMask(op.tool.getBrushSize(), op.options['Style'], brushBox.origin, brushBoxThisChunk, op.options['Noise'], op.options['Hollow']) replaceWith1 = op.options['Block 1'] chanceA = op.options['Weight 1'] replaceWith2 = op.options['Block 2'] chanceB = op.options['Weight 2'] replaceWith3 = op.options['Block 3'] chanceC = op.options['Weight 3'] replaceWith4 = op.options['Block 4'] chanceD = op.options['Weight 4'] totalChance = chanceA + chanceB + chanceC + chanceD if totalChance == 0: print "Total Chance value can't be 0." return blocks = chunk.Blocks[slices] data = chunk.Data[slices] if op.options['Block'].wildcard: print "Wildcard replace" blocksToReplace = [] for i in range(16): blocksToReplace.append(op.editor.level.materials.blockWithID(op.options['Block'].ID, i)) else: blocksToReplace = [op.options['Block']] replaceTable = block_fill.blockReplaceTable(blocksToReplace) replaceMask = replaceTable[blocks, data] brushMask &= replaceMask brushMaskOption1 = numpy.copy(brushMask) brushMaskOption2 = numpy.copy(brushMask) brushMaskOption3 = numpy.copy(brushMask) brushMaskOption4 = numpy.copy(brushMask) x = -1 for _ in brushMask: x += 1 y = -1 for _ in brushMask[x]: y += 1 z = -1 for _ in brushMask[x][y]: z += 1 if brushMask[x][y][z]: randomChance = random.randint(1, totalChance) if chanceA >= randomChance: brushMaskOption1[x][y][z] = True brushMaskOption2[x][y][z] = False brushMaskOption3[x][y][z] = False brushMaskOption4[x][y][z] = False continue if chanceA + chanceB >= randomChance: brushMaskOption1[x][y][z] = False brushMaskOption2[x][y][z] = True brushMaskOption3[x][y][z] = False brushMaskOption4[x][y][z] = False continue if chanceA + chanceB + chanceC >= randomChance: brushMaskOption1[x][y][z] = False brushMaskOption2[x][y][z] = False brushMaskOption3[x][y][z] = True brushMaskOption4[x][y][z] = False continue if chanceA + chanceB + chanceC + chanceD >= randomChance: brushMaskOption1[x][y][z] = False brushMaskOption2[x][y][z] = False brushMaskOption3[x][y][z] = False brushMaskOption4[x][y][z] = True continue blocks[brushMaskOption1] = replaceWith1.ID data[brushMaskOption1] = replaceWith1.blockData blocks[brushMaskOption2] = replaceWith2.ID data[brushMaskOption2] = replaceWith2.blockData blocks[brushMaskOption3] = replaceWith3.ID data[brushMaskOption3] = replaceWith3.blockData blocks[brushMaskOption4] = replaceWith4.ID data[brushMaskOption4] = replaceWith4.blockData
def apply(self, op, point): brushBox = op.tool.getDirtyBox(point, op.tool).expand(1) if brushBox.volume > 1048576: print "Affected area is too big for this brush mode" return erosionStrength = op.options["Strength"] erosionArea = op.level.extractSchematic(brushBox, entities=False) if erosionArea is None: return blocks = erosionArea.Blocks data = erosionArea.Data bins = numpy.bincount(blocks.ravel()) fillBlockID = bins.argmax() xcount = -1 for _ in blocks: xcount += 1 ycount = -1 for _ in blocks[xcount]: ycount += 1 zcount = -1 for _ in blocks[xcount][ycount]: zcount += 1 if blocks[xcount][ycount][zcount] == fillBlockID: fillBlockData = data[xcount][ycount][zcount] def getNeighbors(solidBlocks): neighbors = numpy.zeros(solidBlocks.shape, dtype='uint8') neighbors[1:-1, 1:-1, 1:-1] += solidBlocks[:-2, 1:-1, 1:-1] neighbors[1:-1, 1:-1, 1:-1] += solidBlocks[2:, 1:-1, 1:-1] neighbors[1:-1, 1:-1, 1:-1] += solidBlocks[1:-1, :-2, 1:-1] neighbors[1:-1, 1:-1, 1:-1] += solidBlocks[1:-1, 2:, 1:-1] neighbors[1:-1, 1:-1, 1:-1] += solidBlocks[1:-1, 1:-1, :-2] neighbors[1:-1, 1:-1, 1:-1] += solidBlocks[1:-1, 1:-1, 2:] return neighbors for i in range(erosionStrength): solidBlocks = blocks != 0 neighbors = getNeighbors(solidBlocks) brushMask = createBrushMask(op.tool.getBrushSize(), op.options['Style']) erodeBlocks = neighbors < 5 if op.options['Old (Messy)']: erodeBlocks &= (numpy.random.random(erodeBlocks.shape) > 0.3) erodeBlocks[1:-1, 1:-1, 1:-1] &= brushMask blocks[erodeBlocks] = 0 solidBlocks = blocks != 0 neighbors = getNeighbors(solidBlocks) fillBlocks = neighbors > 2 fillBlocks &= ~solidBlocks fillBlocks[1:-1, 1:-1, 1:-1] &= brushMask blocks[fillBlocks] = fillBlockID data[fillBlocks] = fillBlockData op.level.copyBlocksFrom(erosionArea, erosionArea.bounds.expand(-1), brushBox.origin + (1, 1, 1))
def applyToChunkSlices(self, op, chunk, slices, brushBox, brushBoxThisChunk): brushMask = createBrushMask(op.tool.getBrushSize(), op.options['Style'], brushBox.origin, brushBoxThisChunk, op.options['Noise'], op.options['Hollow']) blocks = chunk.Blocks[slices] data = chunk.Data[slices] airFill = op.options['Fill Air'] replaceWith1 = op.options['Block 1'] chanceA = op.options['Weight 1'] replaceWith2 = op.options['Block 2'] chanceB = op.options['Weight 2'] replaceWith3 = op.options['Block 3'] chanceC = op.options['Weight 3'] replaceWith4 = op.options['Block 4'] chanceD = op.options['Weight 4'] totalChance = chanceA + chanceB + chanceC + chanceD if totalChance == 0: print("Total Chance value can't be 0.") return if not airFill: airtable = numpy.zeros((materials.id_limit, 16), dtype='bool') airtable[0] = True replaceMaskAir = airtable[blocks, data] brushMask &= ~replaceMaskAir brushMaskOption1 = numpy.copy(brushMask) brushMaskOption2 = numpy.copy(brushMask) brushMaskOption3 = numpy.copy(brushMask) brushMaskOption4 = numpy.copy(brushMask) x = -1 for _ in brushMask: x += 1 y = -1 for _ in brushMask[x]: y += 1 z = -1 for _ in brushMask[x][y]: z += 1 if brushMask[x][y][z]: randomChance = random.randint(1, totalChance) if chanceA >= randomChance: brushMaskOption1[x][y][z] = True brushMaskOption2[x][y][z] = False brushMaskOption3[x][y][z] = False brushMaskOption4[x][y][z] = False continue if chanceA + chanceB >= randomChance: brushMaskOption1[x][y][z] = False brushMaskOption2[x][y][z] = True brushMaskOption3[x][y][z] = False brushMaskOption4[x][y][z] = False continue if chanceA + chanceB + chanceC >= randomChance: brushMaskOption1[x][y][z] = False brushMaskOption2[x][y][z] = False brushMaskOption3[x][y][z] = True brushMaskOption4[x][y][z] = False continue if chanceA + chanceB + chanceC + chanceD >= randomChance: brushMaskOption1[x][y][z] = False brushMaskOption2[x][y][z] = False brushMaskOption3[x][y][z] = False brushMaskOption4[x][y][z] = True continue blocks[brushMaskOption1] = replaceWith1.ID data[brushMaskOption1] = replaceWith1.blockData blocks[brushMaskOption2] = replaceWith2.ID data[brushMaskOption2] = replaceWith2.blockData blocks[brushMaskOption3] = replaceWith3.ID data[brushMaskOption3] = replaceWith3.blockData blocks[brushMaskOption4] = replaceWith4.ID data[brushMaskOption4] = replaceWith4.blockData UsedAlready = [] createTileEntities(replaceWith1, brushBoxThisChunk, chunk) UsedAlready.append(replaceWith1.ID) if replaceWith2.ID not in UsedAlready: createTileEntities(replaceWith2, brushBoxThisChunk, chunk) UsedAlready.append(replaceWith2.ID) if replaceWith3.ID not in UsedAlready: createTileEntities(replaceWith3, brushBoxThisChunk, chunk) UsedAlready.append(replaceWith3.ID) if replaceWith4.ID not in UsedAlready: createTileEntities(replaceWith4, brushBoxThisChunk, chunk)
def applyToChunkSlices(self, op, chunk, slices, brushBox, brushBoxThisChunk): brushMask = createBrushMask(op.tool.getBrushSize(), op.options['Style'], brushBox.origin, brushBoxThisChunk, op.options['Noise'], op.options['Hollow']) blocks = chunk.Blocks[slices] data = chunk.Data[slices] airFill = op.options['Fill Air'] replaceWith1 = op.options['Block 1'] chanceA = op.options['Weight 1'] replaceWith2 = op.options['Block 2'] chanceB = op.options['Weight 2'] replaceWith3 = op.options['Block 3'] chanceC = op.options['Weight 3'] replaceWith4 = op.options['Block 4'] chanceD = op.options['Weight 4'] totalChance = chanceA + chanceB + chanceC + chanceD if totalChance == 0: print "Total Chance value can't be 0." return if airFill == False: airtable = numpy.zeros((materials.id_limit, 16), dtype='bool') airtable[0] = True replaceMaskAir = airtable[blocks, data] brushMask &= ~replaceMaskAir brushMaskOption1 = numpy.copy(brushMask) brushMaskOption2 = numpy.copy(brushMask) brushMaskOption3 = numpy.copy(brushMask) brushMaskOption4 = numpy.copy(brushMask) x=-1 y=-1 z=-1 for array_x in brushMask: x += 1 y = -1 for array_y in brushMask[x]: y += 1 z=-1 for array_z in brushMask[x][y]: z += 1 if brushMask[x][y][z]: randomChance = random.randint(1, totalChance) if chanceA >= randomChance: brushMaskOption1[x][y][z] = True brushMaskOption2[x][y][z] = False brushMaskOption3[x][y][z] = False brushMaskOption4[x][y][z] = False continue if chanceA + chanceB >= randomChance: brushMaskOption1[x][y][z] = False brushMaskOption2[x][y][z] = True brushMaskOption3[x][y][z] = False brushMaskOption4[x][y][z] = False continue if chanceA + chanceB + chanceC >= randomChance: brushMaskOption1[x][y][z] = False brushMaskOption2[x][y][z] = False brushMaskOption3[x][y][z] = True brushMaskOption4[x][y][z] = False continue if chanceA + chanceB + chanceC + chanceD >= randomChance: brushMaskOption1[x][y][z] = False brushMaskOption2[x][y][z] = False brushMaskOption3[x][y][z] = False brushMaskOption4[x][y][z] = True continue blocks[brushMaskOption1] = replaceWith1.ID data[brushMaskOption1] = replaceWith1.blockData blocks[brushMaskOption2] = replaceWith2.ID data[brushMaskOption2] = replaceWith2.blockData blocks[brushMaskOption3] = replaceWith3.ID data[brushMaskOption3] = replaceWith3.blockData blocks[brushMaskOption4] = replaceWith4.ID data[brushMaskOption4] = replaceWith4.blockData