This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
mcedit/filters/surfacerepair.py
2012-10-25 00:09:56 -10:00

61 lines
2.0 KiB
Python

from numpy import zeros, array
import itertools
#naturally occuring materials
from pymclevel.level import extractHeights
blocktypes = [1, 2, 3, 7, 12, 13, 14, 15, 16, 56, 73, 74, 87, 88, 89]
blockmask = zeros((256,), dtype='bool')
#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[blocktypes] = True
displayName = "Chunk Surface Repair"
inputs = (
("Repairs the backwards surfaces made by old versions of Minecraft.", "label"),
)
def perform(level, box, options):
#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
data = chunk.Data
# 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 in range(heightmap.shape[0]):
for z in range(x + 1, heightmap.shape[1]):
h = heightmap[x, z]
h2 = heightmap[z, x]
b2 = blocks[z, x, h2]
if blocks[x, z, h] == 1:
h += 2 # rock surface - top 4 layers become 2 air and 2 rock
if blocks[z, x, h2] == 1:
h2 += 2 # rock surface - top 4 layers become 2 air and 2 rock
# topsoil is 4 layers deep
def swap(s1, s2):
a2 = array(s2)
s2[:] = s1[:]
s1[:] = a2[:]
swap(blocks[x, z, h - 3:h + 1], blocks[z, x, h2 - 3:h2 + 1])
swap(data[x, z, h - 3:h + 1], data[z, x, h2 - 3:h2 + 1])
# remember to do this to make sure the chunk is saved
chunk.chunkChanged()