护身符获得顶部 non-air 方块

Amulet get top non-air block

这是地图的二维视图:

以及实际的 3d 地图:

我很难到达顶部 non-air 块,这对渲染 2d 地图至关重要。

我想到了一个糟糕的解决方案:

import amulet

level = amulet.load_level("TestWorld")
chunks = level.all_chunk_coords("minecraft:overworld")

for chunk_coords in chunks:
    chunk = level.get_chunk(*chunk_coords, "minecraft:overworld")
    renders = [[None for _ in range(16)] for __ in range(16)]
    for x in range(16):
        for z in range(16):
            for y in range(324, -65, -1):
                block_id = chunk.blocks[x, y, z]
                universal_block = chunk.block_palette[block_id]
                universal_block_entity = chunk.block_entities.get((x, y, z), None)

                (
                    block,
                    block_entity,
                    block_extra
                ) = level.translation_manager.get_version("bedrock", (1, 18, 12)).block.from_universal(
                    universal_block,
                    universal_block_entity
                )

                if repr(block) != "Block(minecraft:air)":
                    renders[x][z] = block
                    break
    print(renders)

level.save()
level.close()

如果情况真的很糟糕,它将扫描每个块大约 100k 个块。

是否有任何解决方案可以像获取列表中的最后一项一样获取顶部块?

解决方案:

import amulet
import numpy as np

level = amulet.load_level("TestWorld")
chunks = level.all_chunk_coords("minecraft:overworld")

for chunk_coords in chunks:
    chunk = level.get_chunk(*chunk_coords, "minecraft:overworld")

    game_version = ("bedrock", (1, 18, 12))

    print(np.load("out.npy"))

    render = {(x, z): None for x in range(16) for z in range(16)}

    for y in range(324, -64, -1):
        slice_ = np.asarray(chunk.blocks[:, y, :] == 0)
        slice_ = np.invert(np.array([x[0] for x in slice_]))
        if slice_.any():
            x, z = np.where(slice_)
            for x_k, z_k in zip(x, z):
                if render[(x_k, z_k)] is None:
                    universal_block = chunk.block_palette[chunk.blocks[x_k, y, z_k]]
                    render[(x_k, z_k)] = level.translation_manager.get_version("bedrock", (1, 16, 210)).block\
                        .from_universal(universal_block)[0]

            if all(render.values()):
                break

    print(render)

level.save()
level.close()

输出:

{(0, 0): Block(minecraft:grass), (0, 1): Block(minecraft:grass), (0, 2): Block(minecraft:grass), (0, 3): Block(minecraft:grass), (0, 4): Block(minecraft:grass), (0, 5): Block(minecraft:grass), (0, 6): Block(
minecraft:grass), (0, 7): Block(minecraft:grass), (0, 8): Block(minecraft:grass), (0, 9): Block(minecraft:grass), (0, 10): Block(minecraft:grass), (0, 11): Block(minecraft:grass), (0, 12): Block(minecraft:gr
ass), (0, 13): Block(minecraft:grass), (0, 14): Block(minecraft:grass), (0, 15): Block(minecraft:grass), (1, 0): Block(minecraft:grass), (1, 1): Block(minecraft:grass), (1, 2): Block(minecraft:grass), (1, 3)
: Block(minecraft:grass), (1, 4): Block(minecraft:command_block[conditional_bit=0b,facing_direction=3]), (1, 5): Block(minecraft:grass), (1, 6): Block(minecraft:grass), (1, 7): Block(minecraft:grass), (1, 8)
: Block(minecraft:grass), (1, 9): Block(minecraft:grass), (1, 10): Block(minecraft:grass), (1, 11): Block(minecraft:grass), (1, 12): Block(minecraft:grass), (1, 13): Block(minecraft:grass), (1, 14): Block(mi
necraft:grass), (1, 15): Block(minecraft:grass), (2, 0): Block(minecraft:grass), (2, 1): Block(minecraft:grass), (2, 2): Block(minecraft:grass), (2, 3): Block(minecraft:grass), (2, 4): Block(minecraft:grass)
, (2, 5): Block(minecraft:grass), (2, 6): Block(minecraft:grass), (2, 7): Block(minecraft:grass), (2, 8): Block(minecraft:grass), (2, 9): Block(minecraft:grass), (2, 10): Block(minecraft:grass), (2, 11): Blo
ck(minecraft:grass), (2, 12): Block(minecraft:grass), (2, 13): Block(minecraft:grass), (2, 14): Block(minecraft:grass), (2, 15): Block(minecraft:grass), (3, 0): Block(minecraft:grass), (3, 1): Block(minecraf
t:grass), (3, 2): Block(minecraft:grass), (3, 3): Block(minecraft:grass), (3, 4): Block(minecraft:command_block[conditional_bit=0b,facing_direction=3]), (3, 5): Block(minecraft:grass), (3, 6): Block(minecraf
t:grass), (3, 7): Block(minecraft:grass), (3, 8): Block(minecraft:grass), (3, 9): Block(minecraft:grass), (3, 10): Block(minecraft:grass), (3, 11): Block(minecraft:grass), (3, 12): Block(minecraft:grass), (3
, 13): Block(minecraft:grass), (3, 14): Block(minecraft:grass), (3, 15): Block(minecraft:grass), (4, 0): Block(minecraft:grass), (4, 1): Block(minecraft:grass), (4, 2): Block(minecraft:grass), (4, 3): Block(
minecraft:grass), (4, 4): Block(minecraft:grass), (4, 5): Block(minecraft:grass), (4, 6): Block(minecraft:grass), (4, 7): Block(minecraft:grass), (4, 8): Block(minecraft:grass), (4, 9): Block(minecraft:grass
), (4, 10): Block(minecraft:grass), (4, 11): Block(minecraft:grass), (4, 12): Block(minecraft:grass), (4, 13): Block(minecraft:grass), (4, 14): Block(minecraft:grass), (4, 15): Block(minecraft:grass), (5, 0)
: Block(minecraft:grass), (5, 1): Block(minecraft:grass), (5, 2): Block(minecraft:grass), (5, 3): Block(minecraft:grass), (5, 4): Block(minecraft:chain_command_block[conditional_bit=0b,facing_direction=3]), 
(5, 5): Block(minecraft:grass), (5, 6): Block(minecraft:grass), (5, 7): Block(minecraft:grass), (5, 8): Block(minecraft:grass), (5, 9): Block(minecraft:grass), (5, 10): Block(minecraft:grass), (5, 11): Block
(minecraft:grass), (5, 12): Block(minecraft:grass), (5, 13): Block(minecraft:grass), (5, 14): Block(minecraft:grass), (5, 15): Block(minecraft:grass), (6, 0): Block(minecraft:grass), (6, 1): Block(minecraft:
grass), (6, 2): Block(minecraft:grass), (6, 3): Block(minecraft:grass), (6, 4): Block(minecraft:grass), (6, 5): Block(minecraft:grass), (6, 6): Block(minecraft:grass), (6, 7): Block(minecraft:grass), (6, 8):
 Block(minecraft:grass), (6, 9): Block(minecraft:grass), (6, 10): Block(minecraft:grass), (6, 11): Block(minecraft:grass), (6, 12): Block(minecraft:grass), (6, 13): Block(minecraft:grass), (6, 14): Block(min
ecraft:grass), (6, 15): Block(minecraft:grass), (7, 0): Block(minecraft:grass), (7, 1): Block(minecraft:grass), (7, 2): Block(minecraft:grass), (7, 3): Block(minecraft:grass), (7, 4): Block(minecraft:repeati
ng_command_block[conditional_bit=1b,facing_direction=3]), (7, 5): Block(minecraft:grass), (7, 6): Block(minecraft:grass), (7, 7): Block(minecraft:grass), (7, 8): Block(minecraft:grass), (7, 9): Block(minecra
ft:grass), (7, 10): Block(minecraft:grass), (7, 11): Block(minecraft:grass), (7, 12): Block(minecraft:grass), (7, 13): Block(minecraft:grass), (7, 14): Block(minecraft:grass), (7, 15): Block(minecraft:grass)
, (8, 0): Block(minecraft:grass), (8, 1): Block(minecraft:grass), (8, 2): Block(minecraft:grass), (8, 3): Block(minecraft:grass), (8, 4): Block(minecraft:grass), (8, 5): Block(minecraft:grass), (8, 6): Block
(minecraft:grass), (8, 7): Block(minecraft:grass), (8, 8): Block(minecraft:grass), (8, 9): Block(minecraft:grass), (8, 10): Block(minecraft:grass), (8, 11): Block(minecraft:grass), (8, 12): Block(minecraft:g
rass), (8, 13): Block(minecraft:grass), (8, 14): Block(minecraft:grass), (8, 15): Block(minecraft:grass), (9, 0): Block(minecraft:grass), (9, 1): Block(minecraft:grass), (9, 2): Block(minecraft:grass), (9, 3
): Block(minecraft:grass), (9, 4): Block(minecraft:grass), (9, 5): Block(minecraft:grass), (9, 6): Block(minecraft:grass), (9, 7): Block(minecraft:grass), (9, 8): Block(minecraft:grass), (9, 9): Block(minecr
aft:grass), (9, 10): Block(minecraft:grass), (9, 11): Block(minecraft:grass), (9, 12): Block(minecraft:grass), (9, 13): Block(minecraft:grass), (9, 14): Block(minecraft:grass), (9, 15): Block(minecraft:grass
), (10, 0): Block(minecraft:grass), (10, 1): Block(minecraft:grass), (10, 2): Block(minecraft:grass), (10, 3): Block(minecraft:grass), (10, 4): Block(minecraft:grass), (10, 5): Block(minecraft:grass), (10, 6
): Block(minecraft:grass), (10, 7): Block(minecraft:grass), (10, 8): Block(minecraft:grass), (10, 9): Block(minecraft:grass), (10, 10): Block(minecraft:grass), (10, 11): Block(minecraft:grass), (10, 12): Blo
ck(minecraft:grass), (10, 13): Block(minecraft:grass), (10, 14): Block(minecraft:grass), (10, 15): Block(minecraft:grass), (11, 0): Block(minecraft:grass), (11, 1): Block(minecraft:grass), (11, 2): Block(min
ecraft:grass), (11, 3): Block(minecraft:grass), (11, 4): Block(minecraft:command_block[conditional_bit=0b,facing_direction=3]), (11, 5): Block(minecraft:grass), (11, 6): Block(minecraft:grass), (11, 7): Bloc
k(minecraft:grass), (11, 8): Block(minecraft:grass), (11, 9): Block(minecraft:grass), (11, 10): Block(minecraft:grass), (11, 11): Block(minecraft:grass), (11, 12): Block(minecraft:grass), (11, 13): Block(min
ecraft:grass), (11, 14): Block(minecraft:grass), (11, 15): Block(minecraft:grass), (12, 0): Block(minecraft:grass), (12, 1): Block(minecraft:grass), (12, 2): Block(minecraft:grass), (12, 3): Block(minecraft:
grass), (12, 4): Block(minecraft:grass), (12, 5): Block(minecraft:grass), (12, 6): Block(minecraft:grass), (12, 7): Block(minecraft:grass), (12, 8): Block(minecraft:grass), (12, 9): Block(minecraft:grass), (
12, 10): Block(minecraft:grass), (12, 11): Block(minecraft:grass), (12, 12): Block(minecraft:grass), (12, 13): Block(minecraft:grass), (12, 14): Block(minecraft:grass), (12, 15): Block(minecraft:grass), (13,
 0): Block(minecraft:grass), (13, 1): Block(minecraft:grass), (13, 2): Block(minecraft:grass), (13, 3): Block(minecraft:grass), (13, 4): Block(minecraft:grass), (13, 5): Block(minecraft:grass), (13, 6): Bloc
k(minecraft:grass), (13, 7): Block(minecraft:grass), (13, 8): Block(minecraft:grass), (13, 9): Block(minecraft:grass), (13, 10): Block(minecraft:grass), (13, 11): Block(minecraft:grass), (13, 12): Block(mine
craft:grass), (13, 13): Block(minecraft:grass), (13, 14): Block(minecraft:grass), (13, 15): Block(minecraft:grass), (14, 0): Block(minecraft:grass), (14, 1): Block(minecraft:grass), (14, 2): Block(minecraft:
grass), (14, 3): Block(minecraft:grass), (14, 4): Block(minecraft:grass), (14, 5): Block(minecraft:grass), (14, 6): Block(minecraft:grass), (14, 7): Block(minecraft:grass), (14, 8): Block(minecraft:grass), (
15): Block(minecraft:grass), (15, 0): Block(minecraft:grass), (15, 1): Block(minecraft:grass), (15, 2): Block(minecraft:grass), (15, 3): Block(minecraft:grass), (15, 4): Block(minecraft:grass), (15, 5): Bloc
k(minecraft:grass), (15, 6): Block(minecraft:grass), (15, 7): Block(minecraft:grass), (15, 8): Block(minecraft:grass), (15, 9): Block(minecraft:grass), (15, 10): Block(minecraft:grass), (15, 11): Block(minec
raft:grass), (15, 12): Block(minecraft:grass), (15, 13): Block(minecraft:grass), (15, 14): Block(minecraft:grass), (15, 15): Block(minecraft:grass)}