# This will leave the top X layers of the selected area.
# The area underneath will be set to Air or what the user chooses.
# copied from topsoil.py - all credit to codewarrior0 (assuming he is the author)
from numpy import zeros
import itertools
from pymclevel import alphaMaterials
from pymclevel.level import extractHeights
am = alphaMaterials
#naturally occuring materials
blocks = [
am.Grass,
am.Dirt,
am.Stone,
am.Bedrock,
am.Sand,
am.Gravel,
am.GoldOre,
am.IronOre,
am.CoalOre,
am.LapisLazuliOre,
am.DiamondOre,
am.RedstoneOre,
am.RedstoneOreGlowing,
am.Netherrack,
am.SoulSand,
am.Clay,
am.Glowstone
]
blocktypes = [b.ID for b in blocks]
def naturalBlockmask():
blockmask = zeros((256,), dtype='bool')
blockmask[blocktypes] = True
return blockmask
inputs = (
("Layers to keep", (1, 1, 128)),
("Fill under with:", alphaMaterials.Air),
)
def perform(level, box, options):
depth = options["Layers to keep"]
blocktype = options["Fill under with:"]
#compute a truth table that we can index to find out whether a block
# is naturally occuring and should be considered in a heightmap
blockmask = naturalBlockmask()
#iterate through the slices of each chunk in the selection box
for chunk, slices, point in level.getChunkSlices(box):
# slicing the block array is straightforward. blocks will contain only
# the area of interest in this chunk.
blocks = chunk.Blocks[slices]
data = chunk.Data[slices]
# use indexing to look up whether or not each block in blocks is
# naturally-occuring. these blocks will "count" for column height.
maskedBlocks = blockmask[blocks]
heightmap = extractHeights(maskedBlocks)
for x, z in itertools.product(*map(xrange, heightmap.shape)):
h = heightmap[x, z]
# Take 'lowest point' through 'naturally occuring'
# then subtract users 'depth' input and set it all as air
blocks[x, z, 0:(h - depth)] = blocktype.ID
data[x, z, 0:(h - depth)] = blocktype.blockData
#remember to do this to make sure the chunk is saved
chunk.chunkChanged()