Esempio n. 1
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'])

    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
Esempio n. 2
0
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)
Esempio n. 3
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'])

    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
Esempio n. 4
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'])

    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
Esempio n. 5
0
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
Esempio n. 6
0
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
Esempio n. 7
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
Esempio n. 8
0
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))
Esempio n. 9
0
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))
Esempio n. 10
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'])

    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)
Esempio n. 11
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'])

    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