Skip to content

Instantly share code, notes, and snippets.

@Noxitu
Last active January 14, 2024 15:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Noxitu/3092b8d4262b8ddfa0de44cf4d41b472 to your computer and use it in GitHub Desktop.
Save Noxitu/3092b8d4262b8ddfa0de44cf4d41b472 to your computer and use it in GitHub Desktop.
Parsing decked out 2 area (finding holes and other random stuff)
import json
from pathlib import Path
import rich.progress
import numpy as np
from noxitu.minecraft.io.assets import Assets
from noxitu.minecraft.io.world import World
ROOT = Path(__file__).parent
DATA_PATH = Path(__file__).parents[3] / "Data"
COLLECT_CONTENT_IDS = False
USE_COLORS = False
# COLLECT_CONTENT_IDS = True
# USE_COLORS = True
# NEW_MODE = "calculate_inside"
# NEW_MODE = "calculate_outside"
NEW_MODE = "calculate_holes"
if USE_COLORS:
from h9_colors import BLOCK_COLORS
for key, value in list(BLOCK_COLORS.items()):
if value is None:
del BLOCK_COLORS[key]
def main():
# world_path = DATA_PATH / "Worlds/test_120"
world_path = Path(
# R"C:\Users\grzeg\AppData\Roaming\.minecraft\profiles\h9\saves\hc9"
R"C:\Users\grzeg\AppData\Roaming\.minecraft\profiles\h9\saves\h9.5"
)
world = World(world_path)
level = world.level()
version_id = level["Data"]["Version"]["Id"]
version = level["Data"]["Version"]["Name"].decode()
print(f"{version_id=}")
print(f"{version=}")
assets = Assets(DATA_PATH / f"Versions/{version}", track=rich.progress.track)
world.add_assets(version_id, assets)
z_chunk_size, y_chunk_size, x_chunk_size = 17, 9, 17
# z0, y0, x0 = 120, -3, -40
z0, y0, x0 = 112, -4, -44
x_size = 16 * x_chunk_size
y_size = 16 * y_chunk_size
z_size = 16 * z_chunk_size
SOURCES = np.array(
[
[-622, 48, 1944, 0],
[-454, 21, 1981, 280],
[-594, 13, 1943, 450],
[-641, -25, 1904, 590],
]
) - 16 * np.array([x0, y0, z0, 0])
# source_pos = np.array([-621, 47, 1967]) - 16 * np.array([x0, y0, z0])
sinks = [
[-606, 56, 1971], #
[-590, 57, 1955], #
[-597, 43, 1984], #
[-605, 53, 2026], #
[-624, 39, 2033], #
[-516, 55, 2016], #
[-515, 45, 1964], #
[-588, -1, 1926], #
[-640, -1, 1916], #
[-649, 0, 1882], #
[-591, 9, 1889], #
[-631, -28, 1888], #
[-597, -47, 1833], #
[-621, -53, 1877], #
]
sinks = [np.array(sink) - 16 * np.array([x0, y0, z0]) for sink in sinks]
data = np.zeros((y_size, z_size, x_size), dtype=int)
deltas = [(dx, dz) for dz in range(z_chunk_size) for dx in range(x_chunk_size)]
if COLLECT_CONTENT_IDS or USE_COLORS:
content = np.load(ROOT / "content.npy")
assert content.shape == data.shape
if COLLECT_CONTENT_IDS:
all_content_ids = set()
if USE_COLORS:
all_colors_mask = np.zeros((y_size, z_size, x_size), dtype=bool)
all_colors = np.zeros((y_size, z_size, x_size, 3), dtype="u1")
from h9_transparent import TRANSPARENT_BLOCKS
name_mapping = {block: 1 for block in TRANSPARENT_BLOCKS}
# name_mapping[b"minecraft:diamond_block"] = 2
# name_mapping[b"minecraft:dropper"] = 3
# name_mapping[b"minecraft:dispenser"] = 3
# name_mapping[b"minecraft:sweet_berry_bush"] = 4
for dx, dz in rich.progress.track(deltas):
chunk_x, chunk_z = x0 + dx, z0 + dz
chunk = world[chunk_z, chunk_x]
for dy in range(y_chunk_size):
chunk_y = y0 + dy
subchunk = chunk[chunk_y + 4]
# subchunk_coords = np.mgrid[0:16, 0:16, 0:16]
# subchunk_coords = np.moveaxis(subchunk_coords, 0, -1)
if "palette" not in subchunk:
continue
palette_map = np.array(
[name_mapping.get(p["Name"], 0) for p in subchunk["palette"]]
)
mapped_subchunk = palette_map[subchunk["data"]]
xs = slice(16 * dx, 16 * dx + 16)
ys = slice(16 * dy, 16 * dy + 16)
zs = slice(16 * dz, 16 * dz + 16)
data[ys, zs, xs] = mapped_subchunk
if COLLECT_CONTENT_IDS:
mask = content[ys, zs, xs]
if np.count_nonzero(mask) > 0:
content_ids = np.unique(subchunk["data"][mask])
content_ids = {subchunk["palette"][i]["Name"] for i in content_ids}
all_content_ids |= content_ids
if USE_COLORS:
colors_mask_map = np.array(
[
BLOCK_COLORS.get(p["Name"]) is not None
for p in subchunk["palette"]
]
)
colors_map = np.array(
[
BLOCK_COLORS.get(p["Name"], (0, 0, 0))
for p in subchunk["palette"]
]
)
mask = content[ys, zs, xs] & colors_mask_map[subchunk["data"]]
colors = colors_map[subchunk["data"][mask]]
all_colors_mask[ys, zs, xs][mask] = True
all_colors[ys, zs, xs][mask] = colors
if False:
mask = data == 4
print(np.count_nonzero(mask))
yzx = np.moveaxis(np.mgrid[0:y_size, 0:z_size, 0:x_size], 0, -1)
yzx = yzx[mask]
DESC = {
38: "Frozen Crypt - Camp",
43: "Frozen Crypt - Deadly Bush",
42: "Frozen Crypt - Tnt",
39: "Frozen Crypt - Dripstone tunnel",
44: "Frozen Crypt - Dead End Tunnel",
47: "Frozen Crypt - Ravine",
35: "Frozen Crypt - Library",
36: "Frozen Crypt - Library - Jump",
37: "Frozen Crypt - Library - Jump",
48: "Frozen Crypt - Lava Room",
49: "Frozen Crypt - Tomb",
33: "Caves of Carnage - Spiders Back",
34: "Caves of Carnage - Spiders Front",
28: "Caves of Carnage - Red Tomb",
22: "Caves of Carnage - Ravagers Den",
29: "Caves of Carnage - Mushrooms",
32: "Caves of Carnage - Ship",
27: "Caves of Carnage - Back of Cove",
14: "Black Mines - Ore Distribution Room",
11: "Black Mines - Front Stairs",
13: "Black Mines - TNT Shaft",
12: "Black Mines - Back Tower",
15: "Black Mines - Back Looparound",
10: "Black Mines - Front Jump Spot",
}
output = []
order = {v: i for i, v in enumerate(DESC)}
with open(R"C:\tmp\berries.txt", "wt") as fd:
for i, (y, z, x) in enumerate(yzx):
x1 = x + 16 * x0
y1 = y + 16 * y0
z1 = z + 16 * z0
if i in DESC:
output.append(
{
"idx": i,
"pos": [+int(x1), +int(y1), +int(z1)],
"description": DESC[i],
}
)
if i in DESC:
print(-x1, y1, z1, DESC.get(i, f"#{i}"), file=fd)
print(len(output))
output.sort(key=lambda item: order[item["idx"]])
print(len(output))
for item in output:
del item["idx"]
print(len(output))
print(output)
print(json.dumps(output))
exit()
if False:
with open(
R"C:\Users\grzeg\AppData\Roaming\.minecraft\profiles\h9\saves\h9.3\datapacks\noxitu_do2_refill\data\do2_refill\functions\dev\analyse.mcfunction",
"wt",
) as fd:
mask = data == 3
print(np.count_nonzero(mask))
yzx = np.moveaxis(np.mgrid[0:y_size, 0:z_size, 0:x_size], 0, -1)
yzx = yzx[mask]
yzx_append = np.array(
[
[-561, 109, 1982],
[-560, 109, 1982],
[-559, 109, 1982],
[-558, 109, 1982],
[-557, 109, 1982],
[-549, 106, 1979],
[-549, 106, 1978],
[-549, 106, 1977],
[-549, 106, 1976],
[-549, 106, 1975],
[-549, 106, 1974],
[-549, 106, 1973],
[-549, 106, 1972],
[-549, 106, 1971],
[-549, 106, 1970],
[-629, 59, 1945],
[-630, 59, 1945],
[-518, 53, 2011],
[-547, 116, 1965],
[-509, 104, 1972],
[-508, 104, 1972],
[-507, 104, 1972],
[-506, 104, 1972],
[-505, 104, 1972],
[-504, 104, 1972],
[-503, 104, 1972],
[-502, 104, 1972],
[-501, 104, 1972],
[-500, 104, 1972],
[-499, 104, 1972],
[-498, 104, 1972],
[-497, 104, 1972],
[-496, 104, 1972],
[-608, -57, 1887],
[-631, -15, 1987],
]
)[:, [1, 2, 0]]
yzx = np.concatenate([yzx, yzx_append], axis=0)
print("data modify storage tmp output set value []", file=fd)
for y, z, x in yzx:
if 1800 < z < 2100:
x1, y1, z1 = x, y, z
else:
x1 = x + 16 * x0
y1 = y + 16 * y0
z1 = z + 16 * z0
pos = f"{x1} {y1} {z1}"
# print(pos)
print(
f'data modify storage tmp tmp set value {{pos: "{pos}"}}', file=fd
)
print(
f"data modify storage tmp tmp.Items set from block {pos} Items",
file=fd,
)
print(
f"execute if data block {pos} Items[0].id "
"run data modify storage tmp tmp.name set from "
f"block {pos} Items[0].id",
file=fd,
)
print(
f"execute if data block {pos} Items[0].tag.display.Name "
"run data modify storage tmp tmp.name set from "
f"block {pos} Items[0].tag.display.Name",
file=fd,
)
print(
f"execute store result score count do2_refill "
f"run data get block {pos} Items[0].Count",
file=fd,
)
print(
"execute "
"if data storage tmp tmp.name "
"if score count do2_refill matches 2.. "
"run data modify storage tmp output append from "
"storage tmp tmp",
file=fd,
)
print(
"say /data get storage tmp output",
file=fd,
)
return
if COLLECT_CONTENT_IDS:
print(*all_content_ids, sep="\n")
print(f" => Total {len(all_content_ids)} ids.")
if USE_COLORS:
print(f"Render colorized cloud ({np.count_nonzero(all_colors_mask)})")
yzx = np.moveaxis(np.mgrid[0:y_size, 0:z_size, 0:x_size], 0, -1)
yzx = yzx[all_colors_mask]
with open(ROOT / "colorized.txt", "wt") as fd:
for y, z, x in yzx:
color = all_colors[y, z, x]
x1 = x + 16 * x0
y1 = y + 16 * y0
z1 = z + 16 * z0
print(-x1, z1, y1, *color, file=fd)
# y, z, x = data.shape
# pos = np.moveaxis(np.mgrid[0:y, 0:z, 0:x], 0, -1)
# pos = pos[data == 2]
# y, z, x = pos.T
# x1 = x + 16 * x0
# y1 = y + 16 * y0
# z1 = z + 16 * z0
# print(np.stack([x1, y1, z1], axis=-1))
# return
# np.save(ROOT / "data.npy", data)
# return
distance = np.full(data.shape, float("inf"))
previous_shape = *data.shape, 3
previous = np.full(previous_shape, -1)
VISITED_VALUE = 3
EDGE_VALUE = 4
queue = []
# Init all inside points as sources and clear all blockers
if NEW_MODE == "calculate_outside":
inside = np.load(ROOT / "inside.npy")
yzx = np.mgrid[0:y_size, 0:z_size, 0:x_size]
yzx = np.moveaxis(yzx, 0, -1)
yzx = yzx[inside]
xyz = yzx[..., [2, 0, 1]]
SOURCES = np.concatenate([xyz, np.zeros_like(xyz[..., -1:])], axis=-1)
data[...] = 1
if NEW_MODE == "calculate_holes":
inside = np.load(ROOT / "inside.npy") & (data == 1)
outside = np.load(ROOT / "outside.npy")
yzx = np.mgrid[0:y_size, 0:z_size, 0:x_size]
yzx = np.moveaxis(yzx, 0, -1)
yzx = yzx[outside & (data == 1)]
xyz = yzx[..., [2, 0, 1]]
SOURCES = np.concatenate([xyz, np.zeros_like(xyz[..., -1:])], axis=-1)
data[inside] = 12
for source_pos in SOURCES:
d0 = source_pos[-1]
source_pos = source_pos[:-1]
x, y, z = source_pos
data[y, z, x] = VISITED_VALUE
distance[y, z, x] = 0
# distance[y, z, x] = d0
queue.append(source_pos)
print("BFS")
def check(x, y, z, d, p):
if not all((0 <= x < x_size, 0 <= y < y_size, 0 <= z < z_size)):
return
if data[y, z, x] != 1:
if data[y, z, x] != VISITED_VALUE:
data[y, z, x] = EDGE_VALUE
return
data[y, z, x] = VISITED_VALUE
distance[y, z, x] = d
previous[y, z, x] = p
queue.append((x, y, z))
shape = data.shape
total_tiles = shape[0] * shape[1] * shape[2]
print(f"total_tiles = {total_tiles}")
for (x, y, z), _ in zip(queue, rich.progress.track(range(total_tiles))):
d = distance[y, z, x] + 1
p = x, y, z
check(x + 1, y, z, d, p)
check(x - 1, y, z, d, p)
check(x, y + 1, z, d, p)
check(x, y - 1, z, d, p)
check(x, y, z + 1, d, p)
check(x, y, z - 1, d, p)
if NEW_MODE is None:
print("Render paths")
with open(ROOT / "path.txt", "wt") as fd:
for i, sink_pos in enumerate(sinks):
x, y, z = sink_pos
while x != -1:
x1 = x + 16 * x0
y1 = y + 16 * y0
z1 = z + 16 * z0
print(-x1, z1, y1, i, file=fd)
x, y, z = previous[y, z, x]
print("visited", np.count_nonzero(data == VISITED_VALUE))
print("edge", np.count_nonzero(data == EDGE_VALUE))
if NEW_MODE == "calculate_inside":
if True:
inside = data == VISITED_VALUE
np.save(ROOT / "inside.npy", inside)
if True:
content = (data == VISITED_VALUE) | (data == EDGE_VALUE)
np.save(ROOT / "content.npy", content)
if NEW_MODE == "calculate_outside":
outside = distance > 5
np.save(ROOT / "outside.npy", outside)
print("huh")
if NEW_MODE == "calculate_holes":
holes = inside & (data == EDGE_VALUE)
print(np.count_nonzero(holes))
yzx = np.mgrid[0:y_size, 0:z_size, 0:x_size]
yzx = np.moveaxis(yzx, 0, -1)
yzx = yzx[holes]
xyz = yzx[..., [2, 0, 1]]
xyz = xyz[:3000]
print("Datapack holes")
datapack_path = world_path / "datapacks/bfs/data/bfs/functions"
with open(datapack_path / f"holes.mcfunction", "wt") as fd2:
print(f"kill @e[type=armor_stand,name=bfs]", file=fd2)
for x, y, z in xyz:
x1 = x + 16 * x0
y1 = y + 16 * y0
z1 = z + 16 * z0
text = f"summon minecraft:armor_stand {x1} {y1} {z1} {{CustomName: '\"bfs\"', NoGravity: 1b, Small: 1b, Glowing: 1}}"
print(text, file=fd2)
print("huh")
if NEW_MODE is None:
print("Render cloud")
with open(ROOT / "out.txt", "wt") as fd:
for x, y, z in queue:
x1 = x + 16 * x0
y1 = y + 16 * y0
z1 = z + 16 * z0
print(-x1, z1, y1, distance[y, z, x], file=fd)
print("Datapack paths")
datapack_path = world_path / "datapacks/bfs/data/bfs/functions"
for existing_path in datapack_path.glob("path*.mcfunction"):
existing_path.unlink()
with open(datapack_path / f"paths.mcfunction", "wt") as fd2:
print(f"kill @e[type=armor_stand,name=bfs]", file=fd2)
SKIP = 2
skip = SKIP
for i, sink_pos in enumerate(sinks):
# with open(datapack_path / f"path{i}.mcfunction", "wt") as fd:
x, y, z = sink_pos
# print(f"kill @e[type=armor_stand,name=bfs]", file=fd)
while x != -1:
x1 = x + 16 * x0
y1 = y + 16 * y0
z1 = z + 16 * z0
if skip == 0:
text = f"summon minecraft:armor_stand {x1} {y1} {z1} {{CustomName: '\"bfs\"', Marker: 1b, Small: 1b}}"
# print(text, file=fd)
print(text, file=fd2)
skip = SKIP
else:
skip -= 1
x, y, z = previous[y, z, x]
if False:
print("matplotlib")
import matplotlib.pyplot as plt
# ax = plt.figure().add_subplot(projection="3d")
# ax.set_box_aspect(r)
# ax.scatter(*coords[chunk == 1].T, c="#bb3333")
# ax.scatter(*coords[chunk == 2].T, c="#666666")
canvas = np.amin(distance, axis=0)
canvas[canvas > 1e10] = float("nan")
plt.figure()
plt.imshow(canvas[::-1, ::-1])
# plt.figure()
# for i, y in enumerate([8, 12, 16, 20, 24, 28]):
# canvas = np.amin(distance[y : y + 4], axis=0)
# canvas[canvas > 1e10] = float("nan")
# plt.subplot(2, 3, i + 1).imshow(canvas[::-1, ::-1])
plt.show()
if __name__ == "__main__":
main()
import json
from os import PathLike
from pathlib import Path
class Assets:
def __init__(self, path: PathLike, *, track=lambda x: x):
self._path = Path(path)
with open(path / "generated/reports/blocks.json", "rt") as fd:
self._blocks = json.load(fd)
self._states = {}
for block_id, desc in track(self._blocks.items()):
for state in desc["states"]:
self._states[state["id"]] = {
"block_id": block_id,
"desc": desc,
"state": state,
}
BLOCK_COLORS = {
b"minecraft:acacia_planks": None,
b"minecraft:acacia_slab": None,
b"minecraft:acacia_wood": None,
b"minecraft:air": None,
b"minecraft:amethyst_block": None,
b"minecraft:amethyst_cluster": None,
b"minecraft:ancient_debris": None,
b"minecraft:andesite_slab": (112, 112, 112),
b"minecraft:andesite_stairs": (112, 112, 112),
b"minecraft:andesite_wall": (112, 112, 112),
b"minecraft:andesite": (112, 112, 112),
b"minecraft:anvil": None,
b"minecraft:azalea_leaves": None,
b"minecraft:bamboo_block": None,
b"minecraft:barrel": None,
b"minecraft:basalt": None,
b"minecraft:beacon": None,
b"minecraft:bedrock": None,
b"minecraft:beehive": None,
b"minecraft:bell": None,
b"minecraft:big_dripleaf_stem": None,
b"minecraft:big_dripleaf": None,
b"minecraft:birch_planks": None,
b"minecraft:birch_trapdoor": None,
b"minecraft:black_candle": None,
b"minecraft:black_carpet": None,
b"minecraft:black_concrete_powder": None,
b"minecraft:black_concrete": None,
b"minecraft:black_stained_glass_pane": None,
b"minecraft:black_wool": None,
b"minecraft:blackstone_slab": (25, 25, 25),
b"minecraft:blackstone_stairs": (25, 25, 25),
b"minecraft:blackstone_wall": (25, 25, 25),
b"minecraft:blackstone": (25, 25, 25),
b"minecraft:blast_furnace": None,
b"minecraft:blue_ice": (160, 160, 255),
b"minecraft:blue_stained_glass_pane": None,
b"minecraft:blue_wool": None,
b"minecraft:bone_block": None,
b"minecraft:bookshelf": None,
b"minecraft:brewing_stand": None,
b"minecraft:brown_candle": None,
b"minecraft:brown_mushroom_block": None,
b"minecraft:brown_mushroom": None,
b"minecraft:bubble_column": None,
b"minecraft:calcite": None,
b"minecraft:calibrated_sculk_sensor": None,
b"minecraft:campfire": None,
b"minecraft:candle": None,
b"minecraft:carved_pumpkin": None,
b"minecraft:cauldron": None,
b"minecraft:cave_air": None,
b"minecraft:cave_vines_plant": None,
b"minecraft:cave_vines": None,
b"minecraft:chain": None,
b"minecraft:chest": None,
b"minecraft:chiseled_bookshelf": None,
b"minecraft:chiseled_deepslate": None,
b"minecraft:chiseled_polished_blackstone": None,
b"minecraft:chiseled_sandstone": None,
b"minecraft:chiseled_stone_bricks": (112, 112, 112),
b"minecraft:clay": None,
b"minecraft:coal_block": None,
b"minecraft:coal_ore": (112, 112, 112),
b"minecraft:coarse_dirt": None,
b"minecraft:cobbled_deepslate_slab": None,
b"minecraft:cobbled_deepslate_stairs": None,
b"minecraft:cobbled_deepslate_wall": None,
b"minecraft:cobbled_deepslate": None,
b"minecraft:cobblestone_slab": (112, 112, 112),
b"minecraft:cobblestone_stairs": (112, 112, 112),
b"minecraft:cobblestone_wall": (112, 112, 112),
b"minecraft:cobblestone": (112, 112, 112),
b"minecraft:cobweb": None,
b"minecraft:composter": None,
b"minecraft:copper_ore": None,
b"minecraft:cracked_deepslate_bricks": None,
b"minecraft:cracked_deepslate_tiles": None,
b"minecraft:cracked_polished_blackstone_bricks": None,
b"minecraft:cracked_stone_bricks": (112, 112, 112),
b"minecraft:crimson_button": None,
b"minecraft:crimson_fence_gate": None,
b"minecraft:crimson_nylium": None,
b"minecraft:crimson_slab": None,
b"minecraft:crimson_stem": None,
b"minecraft:crimson_trapdoor": None,
b"minecraft:crying_obsidian": None,
b"minecraft:cut_sandstone_slab": None,
b"minecraft:cut_sandstone": None,
b"minecraft:cyan_candle": None,
b"minecraft:cyan_carpet": None,
b"minecraft:cyan_stained_glass_pane": None,
b"minecraft:cyan_stained_glass": None,
b"minecraft:cyan_terracotta": None,
b"minecraft:cyan_wool": None,
b"minecraft:dark_oak_button": None,
b"minecraft:dark_oak_door": None,
b"minecraft:dark_oak_fence_gate": None,
b"minecraft:dark_oak_fence": None,
b"minecraft:dark_oak_log": None,
b"minecraft:dark_oak_planks": None,
b"minecraft:dark_oak_pressure_plate": None,
b"minecraft:dark_oak_slab": None,
b"minecraft:dark_oak_stairs": None,
b"minecraft:dark_oak_trapdoor": None,
b"minecraft:dark_oak_wall_sign": None,
b"minecraft:dark_oak_wood": None,
b"minecraft:daylight_detector": None,
b"minecraft:dead_brain_coral": None,
b"minecraft:dead_bush": None,
b"minecraft:deepslate_brick_slab": None,
b"minecraft:deepslate_brick_stairs": None,
b"minecraft:deepslate_brick_wall": None,
b"minecraft:deepslate_bricks": None,
b"minecraft:deepslate_copper_ore": None,
b"minecraft:deepslate_diamond_ore": None,
b"minecraft:deepslate_gold_ore": None,
b"minecraft:deepslate_iron_ore": None,
b"minecraft:deepslate_lapis_ore": None,
b"minecraft:deepslate_redstone_ore": None,
b"minecraft:deepslate_tile_slab": None,
b"minecraft:deepslate_tile_stairs": None,
b"minecraft:deepslate_tile_wall": None,
b"minecraft:deepslate_tiles": None,
b"minecraft:deepslate": None,
b"minecraft:diamond_block": None,
b"minecraft:diamond_ore": None,
b"minecraft:diorite_slab": None,
b"minecraft:diorite_stairs": None,
b"minecraft:diorite_wall": None,
b"minecraft:diorite": None,
b"minecraft:dirt": None,
b"minecraft:dispenser": None,
b"minecraft:dripstone_block": None,
b"minecraft:dropper": None,
b"minecraft:enchanting_table": None,
b"minecraft:end_rod": None,
b"minecraft:end_stone": None,
b"minecraft:fire": (255, 0, 0),
b"minecraft:flower_pot": None,
b"minecraft:flowering_azalea_leaves": None,
b"minecraft:flowering_azalea": None,
b"minecraft:gilded_blackstone": None,
b"minecraft:glow_lichen": None,
b"minecraft:glowstone": None,
b"minecraft:gold_block": None,
b"minecraft:gold_ore": (112, 112, 112),
b"minecraft:granite_slab": None,
b"minecraft:granite_stairs": None,
b"minecraft:granite_wall": None,
b"minecraft:granite": None,
b"minecraft:gravel": None,
b"minecraft:gray_candle": None,
b"minecraft:gray_carpet": None,
b"minecraft:gray_wall_banner": None,
b"minecraft:gray_wool": None,
b"minecraft:green_candle": None,
b"minecraft:green_carpet": None,
b"minecraft:grindstone": None,
b"minecraft:hanging_roots": None,
b"minecraft:hay_block": None,
b"minecraft:heavy_weighted_pressure_plate": None,
b"minecraft:honey_block": None,
b"minecraft:hopper": None,
b"minecraft:ice": (160, 160, 255),
b"minecraft:iron_bars": None,
b"minecraft:iron_block": None,
b"minecraft:iron_door": None,
b"minecraft:iron_ore": None,
b"minecraft:iron_trapdoor": None,
b"minecraft:jack_o_lantern": None,
b"minecraft:jungle_door": None,
b"minecraft:jungle_fence_gate": None,
b"minecraft:jungle_fence": None,
b"minecraft:jungle_planks": None,
b"minecraft:jungle_slab": None,
b"minecraft:jungle_stairs": None,
b"minecraft:jungle_trapdoor": None,
b"minecraft:jungle_wall_sign": None,
b"minecraft:kelp_plant": None,
b"minecraft:kelp": None,
b"minecraft:ladder": None,
b"minecraft:lantern": None,
b"minecraft:lapis_block": None,
b"minecraft:lapis_ore": None,
b"minecraft:large_amethyst_bud": None,
b"minecraft:lava_cauldron": None,
b"minecraft:lava": (255, 0, 0),
b"minecraft:lectern": None,
b"minecraft:lever": None,
b"minecraft:light_blue_carpet": None,
b"minecraft:light_blue_stained_glass_pane": None,
b"minecraft:light_blue_terracotta": None,
b"minecraft:light_blue_wool": None,
b"minecraft:light_gray_carpet": None,
b"minecraft:light_gray_wall_banner": None,
b"minecraft:light_weighted_pressure_plate": None,
b"minecraft:lightning_rod": None,
b"minecraft:lily_pad": None,
b"minecraft:lime_stained_glass_pane": None,
b"minecraft:loom": None,
b"minecraft:magenta_terracotta": None,
b"minecraft:magma_block": None,
b"minecraft:mangrove_button": None,
b"minecraft:mangrove_door": None,
b"minecraft:mangrove_fence_gate": None,
b"minecraft:mangrove_fence": None,
b"minecraft:mangrove_leaves": None,
b"minecraft:mangrove_log": None,
b"minecraft:mangrove_planks": None,
b"minecraft:mangrove_roots": None,
b"minecraft:mangrove_slab": None,
b"minecraft:mangrove_stairs": None,
b"minecraft:mangrove_trapdoor": None,
b"minecraft:mangrove_wall_sign": None,
b"minecraft:mangrove_wood": None,
b"minecraft:medium_amethyst_bud": None,
b"minecraft:moss_block": None,
b"minecraft:moss_carpet": None,
b"minecraft:mossy_cobblestone_slab": None,
b"minecraft:mossy_cobblestone_stairs": None,
b"minecraft:mossy_cobblestone_wall": None,
b"minecraft:mossy_cobblestone": None,
b"minecraft:mossy_stone_brick_slab": None,
b"minecraft:mossy_stone_brick_stairs": None,
b"minecraft:mossy_stone_brick_wall": None,
b"minecraft:mossy_stone_bricks": None,
b"minecraft:mud_brick_slab": None,
b"minecraft:mud_brick_stairs": None,
b"minecraft:mud_brick_wall": None,
b"minecraft:mud_bricks": None,
b"minecraft:mud": None,
b"minecraft:muddy_mangrove_roots": None,
b"minecraft:mushroom_stem": None,
b"minecraft:mycelium": None,
b"minecraft:nether_brick_fence": None,
b"minecraft:nether_brick_slab": None,
b"minecraft:nether_brick_stairs": None,
b"minecraft:nether_brick_wall": None,
b"minecraft:nether_bricks": None,
b"minecraft:nether_quartz_ore": None,
b"minecraft:nether_sprouts": None,
b"minecraft:nether_wart_block": None,
b"minecraft:netherite_block": None,
b"minecraft:netherrack": None,
b"minecraft:note_block": None,
b"minecraft:oak_door": None,
b"minecraft:oak_fence": None,
b"minecraft:oak_leaves": None,
b"minecraft:oak_log": None,
b"minecraft:oak_stairs": None,
b"minecraft:oak_trapdoor": None,
b"minecraft:oak_wall_sign": None,
b"minecraft:oak_wood": None,
b"minecraft:observer": None,
b"minecraft:obsidian": None,
b"minecraft:ochre_froglight": None,
b"minecraft:orange_carpet": None,
b"minecraft:orange_terracotta": None,
b"minecraft:oxidized_copper": (22, 126, 134),
b"minecraft:oxidized_cut_copper_slab": (22, 126, 134),
b"minecraft:packed_ice": (160, 160, 255),
b"minecraft:packed_mud": None,
b"minecraft:piston_head": None,
b"minecraft:player_head": None,
b"minecraft:player_wall_head": None,
b"minecraft:podzol": None,
b"minecraft:pointed_dripstone": None,
b"minecraft:polished_andesite_stairs": (112, 112, 112),
b"minecraft:polished_andesite": (112, 112, 112),
b"minecraft:polished_basalt": None,
b"minecraft:polished_blackstone_brick_slab": (25, 25, 25),
b"minecraft:polished_blackstone_brick_stairs": (25, 25, 25),
b"minecraft:polished_blackstone_brick_wall": (25, 25, 25),
b"minecraft:polished_blackstone_bricks": (25, 25, 25),
b"minecraft:polished_blackstone_button": None,
b"minecraft:polished_blackstone_pressure_plate": None,
b"minecraft:polished_blackstone_slab": (25, 25, 25),
b"minecraft:polished_blackstone_stairs": (25, 25, 25),
b"minecraft:polished_blackstone_wall": (25, 25, 25),
b"minecraft:polished_blackstone": (25, 25, 25),
b"minecraft:polished_deepslate_slab": None,
b"minecraft:polished_deepslate_stairs": None,
b"minecraft:polished_deepslate_wall": None,
b"minecraft:polished_deepslate": None,
b"minecraft:polished_granite_slab": None,
b"minecraft:polished_granite_stairs": None,
b"minecraft:polished_granite": None,
b"minecraft:potted_brown_mushroom": None,
b"minecraft:potted_crimson_fungus": None,
b"minecraft:potted_dead_bush": None,
b"minecraft:potted_warped_fungus": None,
b"minecraft:potted_warped_roots": None,
b"minecraft:potted_wither_rose": None,
b"minecraft:powder_snow": (255, 255, 255),
b"minecraft:pumpkin": None,
b"minecraft:purple_terracotta": None,
b"minecraft:quartz_block": None,
b"minecraft:quartz_slab": None,
b"minecraft:quartz_stairs": None,
b"minecraft:rail": None,
b"minecraft:raw_copper_block": (216, 127, 51),
b"minecraft:raw_gold_block": None,
b"minecraft:raw_iron_block": None,
b"minecraft:red_candle": None,
b"minecraft:red_carpet": None,
b"minecraft:red_concrete": None,
b"minecraft:red_mushroom_block": None,
b"minecraft:red_mushroom": None,
b"minecraft:red_nether_bricks": None,
b"minecraft:red_sand": None,
b"minecraft:red_stained_glass_pane": None,
b"minecraft:red_stained_glass": None,
b"minecraft:red_wall_banner": None,
b"minecraft:red_wool": None,
b"minecraft:redstone_block": (255, 0, 0),
b"minecraft:redstone_torch": None,
b"minecraft:redstone_wire": None,
b"minecraft:respawn_anchor": None,
b"minecraft:rooted_dirt": None,
b"minecraft:sandstone_stairs": None,
b"minecraft:sandstone": None,
b"minecraft:scaffolding": None,
b"minecraft:sculk_shrieker": None,
b"minecraft:sculk_vein": None,
b"minecraft:sculk": None,
b"minecraft:sea_lantern": None,
b"minecraft:sea_pickle": None,
b"minecraft:seagrass": None,
b"minecraft:shroomlight": None,
b"minecraft:skeleton_skull": None,
b"minecraft:small_amethyst_bud": None,
b"minecraft:smithing_table": None,
b"minecraft:smoker": None,
b"minecraft:smooth_basalt": None,
b"minecraft:smooth_quartz_slab": None,
b"minecraft:smooth_quartz_stairs": None,
b"minecraft:smooth_quartz": None,
b"minecraft:smooth_red_sandstone": None,
b"minecraft:smooth_sandstone_slab": None,
b"minecraft:smooth_sandstone_stairs": None,
b"minecraft:smooth_stone_slab": None,
b"minecraft:smooth_stone": None,
b"minecraft:snow_block": (255, 255, 255),
b"minecraft:snow": (255, 255, 255),
b"minecraft:soul_campfire": None,
b"minecraft:soul_fire": None,
b"minecraft:soul_lantern": None,
b"minecraft:soul_sand": None,
b"minecraft:soul_soil": None,
b"minecraft:soul_torch": None,
b"minecraft:soul_wall_torch": None,
b"minecraft:spore_blossom": None,
b"minecraft:spruce_fence_gate": None,
b"minecraft:spruce_fence": None,
b"minecraft:spruce_log": None,
b"minecraft:spruce_planks": None,
b"minecraft:spruce_pressure_plate": None,
b"minecraft:spruce_sign": None,
b"minecraft:spruce_slab": None,
b"minecraft:spruce_stairs": None,
b"minecraft:spruce_trapdoor": None,
b"minecraft:spruce_wall_sign": None,
b"minecraft:spruce_wood": None,
b"minecraft:sticky_piston": None,
b"minecraft:stone_brick_slab": (112, 112, 112),
b"minecraft:stone_brick_stairs": (112, 112, 112),
b"minecraft:stone_brick_wall": (112, 112, 112),
b"minecraft:stone_bricks": (112, 112, 112),
b"minecraft:stone_button": None,
b"minecraft:stone_pressure_plate": None,
b"minecraft:stone_slab": (112, 112, 112),
b"minecraft:stone_stairs": (112, 112, 112),
b"minecraft:stone": (112, 112, 112),
b"minecraft:stonecutter": (112, 112, 112),
b"minecraft:stripped_birch_log": None,
b"minecraft:stripped_dark_oak_log": None,
b"minecraft:stripped_dark_oak_wood": None,
b"minecraft:stripped_jungle_log": None,
b"minecraft:stripped_jungle_wood": None,
b"minecraft:stripped_mangrove_log": None,
b"minecraft:stripped_mangrove_wood": None,
b"minecraft:stripped_spruce_log": None,
b"minecraft:stripped_spruce_wood": None,
b"minecraft:stripped_warped_hyphae": None,
b"minecraft:stripped_warped_stem": None,
b"minecraft:sweet_berry_bush": None,
b"minecraft:tall_seagrass": None,
b"minecraft:terracotta": None,
b"minecraft:tnt": (255, 0, 0),
b"minecraft:torch": None,
b"minecraft:trapped_chest": None,
b"minecraft:tripwire_hook": None,
b"minecraft:tripwire": None,
b"minecraft:tuff": None,
b"minecraft:turtle_egg": None,
b"minecraft:twisting_vines_plant": None,
b"minecraft:twisting_vines": None,
b"minecraft:vine": None,
b"minecraft:wall_torch": None,
b"minecraft:warped_button": None,
b"minecraft:warped_fence_gate": (20, 180, 133),
b"minecraft:warped_fence": (20, 180, 133),
b"minecraft:warped_fungus": None,
b"minecraft:warped_hanging_sign": (20, 180, 133),
b"minecraft:warped_nylium": (20, 180, 133),
b"minecraft:warped_planks": (20, 180, 133),
b"minecraft:warped_pressure_plate": None,
b"minecraft:warped_roots": (20, 180, 133),
b"minecraft:warped_sign": None,
b"minecraft:warped_slab": (20, 180, 133),
b"minecraft:warped_stairs": (20, 180, 133),
b"minecraft:warped_trapdoor": (20, 180, 133),
b"minecraft:warped_wall_sign": None,
b"minecraft:warped_wart_block": (20, 180, 133),
b"minecraft:water": (64, 64, 255),
b"minecraft:waxed_cut_copper": (216, 127, 51),
b"minecraft:waxed_exposed_copper": (135, 107, 98),
b"minecraft:white_carpet": None,
b"minecraft:wither_rose": None,
b"minecraft:wither_skeleton_skull": None,
b"minecraft:wither_skeleton_wall_skull": None,
b"minecraft:yellow_candle": None,
}
TRANSPARENT_BLOCKS = [
# b"minecraft:acacia_planks",
# b"minecraft:acacia_slab",
# b"minecraft:acacia_wood",
b"minecraft:air",
# b"minecraft:amethyst_block",
b"minecraft:amethyst_cluster",
# b"minecraft:ancient_debris",
# b"minecraft:andesite_slab",
# b"minecraft:andesite_stairs",
# b"minecraft:andesite_wall",
# b"minecraft:andesite",
b"minecraft:anvil",
b"minecraft:azalea_leaves",
# b"minecraft:bamboo_block",
# b"minecraft:barrel",
# b"minecraft:basalt",
b"minecraft:beacon",
# b"minecraft:bedrock",
# b"minecraft:beehive",
b"minecraft:bell",
b"minecraft:big_dripleaf_stem",
b"minecraft:big_dripleaf",
# b"minecraft:birch_planks",
b"minecraft:birch_trapdoor",
b"minecraft:black_candle",
b"minecraft:black_carpet",
# b"minecraft:black_concrete_powder",
# b"minecraft:black_concrete",
b"minecraft:black_stained_glass_pane",
# b"minecraft:black_wool",
# b"minecraft:blackstone_slab",
# b"minecraft:blackstone_stairs",
# b"minecraft:blackstone_wall",
# b"minecraft:blackstone",
# b"minecraft:blast_furnace",
# b"minecraft:blue_ice",
b"minecraft:blue_stained_glass_pane",
# b"minecraft:blue_wool",
# b"minecraft:bone_block",
# b"minecraft:bookshelf",
b"minecraft:brewing_stand",
b"minecraft:brown_candle",
# b"minecraft:brown_mushroom_block",
b"minecraft:brown_mushroom",
b"minecraft:bubble_column",
# b"minecraft:calcite",
b"minecraft:calibrated_sculk_sensor",
b"minecraft:campfire",
b"minecraft:candle",
# b"minecraft:carved_pumpkin",
b"minecraft:cauldron",
b"minecraft:cave_air",
b"minecraft:cave_vines_plant",
b"minecraft:cave_vines",
b"minecraft:chain",
b"minecraft:chest",
# b"minecraft:chiseled_bookshelf",
# b"minecraft:chiseled_deepslate",
# b"minecraft:chiseled_polished_blackstone",
# b"minecraft:chiseled_sandstone",
# b"minecraft:chiseled_stone_bricks",
# b"minecraft:clay",
# b"minecraft:coal_block",
# b"minecraft:coal_ore",
# b"minecraft:coarse_dirt",
# b"minecraft:cobbled_deepslate_slab",
# b"minecraft:cobbled_deepslate_stairs",
# b"minecraft:cobbled_deepslate_wall",
# b"minecraft:cobbled_deepslate",
# b"minecraft:cobblestone_slab",
# b"minecraft:cobblestone_stairs",
# b"minecraft:cobblestone_wall",
# b"minecraft:cobblestone",
b"minecraft:cobweb",
# b"minecraft:composter",
# b"minecraft:copper_ore",
# b"minecraft:cracked_deepslate_bricks",
# b"minecraft:cracked_deepslate_tiles",
# b"minecraft:cracked_polished_blackstone_bricks",
# b"minecraft:cracked_stone_bricks",
b"minecraft:crimson_button",
b"minecraft:crimson_fence_gate",
# b"minecraft:crimson_nylium",
# b"minecraft:crimson_slab",
# b"minecraft:crimson_stem",
b"minecraft:crimson_trapdoor",
# b"minecraft:crying_obsidian",
# b"minecraft:cut_sandstone_slab",
# b"minecraft:cut_sandstone",
b"minecraft:cyan_candle",
b"minecraft:cyan_carpet",
b"minecraft:cyan_stained_glass_pane",
b"minecraft:cyan_stained_glass",
# b"minecraft:cyan_terracotta",
# b"minecraft:cyan_wool",
b"minecraft:dark_oak_button",
b"minecraft:dark_oak_door",
b"minecraft:dark_oak_fence_gate",
b"minecraft:dark_oak_fence",
# b"minecraft:dark_oak_log",
# b"minecraft:dark_oak_planks",
b"minecraft:dark_oak_pressure_plate",
# b"minecraft:dark_oak_slab",
# b"minecraft:dark_oak_stairs",
b"minecraft:dark_oak_trapdoor",
b"minecraft:dark_oak_wall_sign",
# b"minecraft:dark_oak_wood",
b"minecraft:daylight_detector",
b"minecraft:dead_brain_coral",
b"minecraft:dead_bush",
# b"minecraft:deepslate_brick_slab",
# b"minecraft:deepslate_brick_stairs",
# b"minecraft:deepslate_brick_wall",
# b"minecraft:deepslate_bricks",
# b"minecraft:deepslate_copper_ore",
# b"minecraft:deepslate_diamond_ore",
# b"minecraft:deepslate_gold_ore",
# b"minecraft:deepslate_iron_ore",
# b"minecraft:deepslate_lapis_ore",
# b"minecraft:deepslate_redstone_ore",
# b"minecraft:deepslate_tile_slab",
# b"minecraft:deepslate_tile_stairs",
# b"minecraft:deepslate_tile_wall",
# b"minecraft:deepslate_tiles",
# b"minecraft:deepslate",
# b"minecraft:diamond_block",
# b"minecraft:diamond_ore",
# b"minecraft:diorite_slab",
# b"minecraft:diorite_stairs",
# b"minecraft:diorite_wall",
# b"minecraft:diorite",
# b"minecraft:dirt",
# b"minecraft:dispenser",
# b"minecraft:dripstone_block",
# b"minecraft:dropper",
b"minecraft:enchanting_table",
b"minecraft:end_rod",
# b"minecraft:end_stone",
b"minecraft:fire",
b"minecraft:flower_pot",
b"minecraft:flowering_azalea_leaves",
b"minecraft:flowering_azalea",
# b"minecraft:gilded_blackstone",
b"minecraft:glow_lichen",
# b"minecraft:glowstone",
# b"minecraft:gold_block",
# b"minecraft:gold_ore",
# b"minecraft:granite_slab",
# b"minecraft:granite_stairs",
# b"minecraft:granite_wall",
# b"minecraft:granite",
# b"minecraft:gravel",
b"minecraft:gray_candle",
b"minecraft:gray_carpet",
b"minecraft:gray_wall_banner",
# b"minecraft:gray_wool",
b"minecraft:green_candle",
b"minecraft:green_carpet",
b"minecraft:grindstone",
b"minecraft:hanging_roots",
# b"minecraft:hay_block",
b"minecraft:heavy_weighted_pressure_plate",
b"minecraft:honey_block",
b"minecraft:hopper",
b"minecraft:ice",
b"minecraft:iron_bars",
# b"minecraft:iron_block",
b"minecraft:iron_door",
# b"minecraft:iron_ore",
b"minecraft:iron_trapdoor",
# b"minecraft:jack_o_lantern",
b"minecraft:jungle_door",
b"minecraft:jungle_fence_gate",
b"minecraft:jungle_fence",
# b"minecraft:jungle_planks",
# b"minecraft:jungle_slab",
# b"minecraft:jungle_stairs",
b"minecraft:jungle_trapdoor",
b"minecraft:jungle_wall_sign",
b"minecraft:kelp_plant",
b"minecraft:kelp",
b"minecraft:ladder",
b"minecraft:lantern",
# b"minecraft:lapis_block",
# b"minecraft:lapis_ore",
b"minecraft:large_amethyst_bud",
b"minecraft:lava_cauldron",
b"minecraft:lava",
b"minecraft:lectern",
b"minecraft:lever",
b"minecraft:light_blue_carpet",
b"minecraft:light_blue_stained_glass_pane",
# b"minecraft:light_blue_terracotta",
# b"minecraft:light_blue_wool",
b"minecraft:light_gray_carpet",
b"minecraft:light_gray_wall_banner",
b"minecraft:light_weighted_pressure_plate",
b"minecraft:lightning_rod",
b"minecraft:lily_pad",
b"minecraft:lime_stained_glass_pane",
# b"minecraft:loom",
# b"minecraft:magenta_terracotta",
# b"minecraft:magma_block",
b"minecraft:mangrove_button",
b"minecraft:mangrove_door",
b"minecraft:mangrove_fence_gate",
b"minecraft:mangrove_fence",
b"minecraft:mangrove_leaves",
# b"minecraft:mangrove_log",
# b"minecraft:mangrove_planks",
b"minecraft:mangrove_roots",
# b"minecraft:mangrove_slab",
# b"minecraft:mangrove_stairs",
b"minecraft:mangrove_trapdoor",
b"minecraft:mangrove_wall_sign",
# b"minecraft:mangrove_wood",
b"minecraft:medium_amethyst_bud",
# b"minecraft:moss_block",
b"minecraft:moss_carpet",
# b"minecraft:mossy_cobblestone_slab",
# b"minecraft:mossy_cobblestone_stairs",
# b"minecraft:mossy_cobblestone_wall",
# b"minecraft:mossy_cobblestone",
# b"minecraft:mossy_stone_brick_slab",
# b"minecraft:mossy_stone_brick_stairs",
# b"minecraft:mossy_stone_brick_wall",
# b"minecraft:mossy_stone_bricks",
# b"minecraft:mud_brick_slab",
# b"minecraft:mud_brick_stairs",
# b"minecraft:mud_brick_wall",
# b"minecraft:mud_bricks",
# b"minecraft:mud",
# b"minecraft:muddy_mangrove_roots",
# b"minecraft:mushroom_stem",
# b"minecraft:mycelium",
b"minecraft:nether_brick_fence",
# b"minecraft:nether_brick_slab",
# b"minecraft:nether_brick_stairs",
# b"minecraft:nether_brick_wall",
# b"minecraft:nether_bricks",
# b"minecraft:nether_quartz_ore",
b"minecraft:nether_sprouts",
# b"minecraft:nether_wart_block",
# b"minecraft:netherite_block",
# b"minecraft:netherrack",
# b"minecraft:note_block",
b"minecraft:oak_door",
b"minecraft:oak_fence",
b"minecraft:oak_leaves",
# b"minecraft:oak_log",
# b"minecraft:oak_stairs",
b"minecraft:oak_trapdoor",
b"minecraft:oak_wall_sign",
# b"minecraft:oak_wood",
# b"minecraft:observer",
# b"minecraft:obsidian",
# b"minecraft:ochre_froglight",
b"minecraft:orange_carpet",
# b"minecraft:orange_terracotta",
# b"minecraft:oxidized_copper",
# b"minecraft:oxidized_cut_copper_slab",
# b"minecraft:packed_ice",
# b"minecraft:packed_mud",
b"minecraft:piston_head",
b"minecraft:player_head",
b"minecraft:player_wall_head",
# b"minecraft:podzol",
b"minecraft:pointed_dripstone",
# b"minecraft:polished_andesite_stairs",
# b"minecraft:polished_andesite",
# b"minecraft:polished_basalt",
# b"minecraft:polished_blackstone_brick_slab",
# b"minecraft:polished_blackstone_brick_stairs",
# b"minecraft:polished_blackstone_brick_wall",
# b"minecraft:polished_blackstone_bricks",
b"minecraft:polished_blackstone_button",
b"minecraft:polished_blackstone_pressure_plate",
# b"minecraft:polished_blackstone_slab",
# b"minecraft:polished_blackstone_stairs",
# b"minecraft:polished_blackstone_wall",
# b"minecraft:polished_blackstone",
# b"minecraft:polished_deepslate_slab",
# b"minecraft:polished_deepslate_stairs",
# b"minecraft:polished_deepslate_wall",
# b"minecraft:polished_deepslate",
# b"minecraft:polished_granite_slab",
# b"minecraft:polished_granite_stairs",
# b"minecraft:polished_granite",
b"minecraft:potted_brown_mushroom",
b"minecraft:potted_crimson_fungus",
b"minecraft:potted_dead_bush",
b"minecraft:potted_warped_fungus",
b"minecraft:potted_warped_roots",
b"minecraft:potted_wither_rose",
b"minecraft:powder_snow",
# b"minecraft:pumpkin",
# b"minecraft:purple_terracotta",
# b"minecraft:quartz_block",
# b"minecraft:quartz_slab",
# b"minecraft:quartz_stairs",
b"minecraft:rail",
# b"minecraft:raw_copper_block",
# b"minecraft:raw_gold_block",
# b"minecraft:raw_iron_block",
b"minecraft:red_candle",
b"minecraft:red_carpet",
# b"minecraft:red_concrete",
# b"minecraft:red_mushroom_block",
b"minecraft:red_mushroom",
# b"minecraft:red_nether_bricks",
# b"minecraft:red_sand",
b"minecraft:red_stained_glass_pane",
# b"minecraft:red_stained_glass",
b"minecraft:red_wall_banner",
# b"minecraft:red_wool",
# b"minecraft:redstone_block",
b"minecraft:redstone_torch",
b"minecraft:redstone_wire",
# b"minecraft:respawn_anchor",
# b"minecraft:rooted_dirt",
# b"minecraft:sandstone_stairs",
# b"minecraft:sandstone",
b"minecraft:scaffolding",
b"minecraft:sculk_shrieker",
b"minecraft:sculk_vein",
# b"minecraft:sculk",
# b"minecraft:sea_lantern",
b"minecraft:sea_pickle",
b"minecraft:seagrass",
# b"minecraft:shroomlight",
b"minecraft:skeleton_skull",
b"minecraft:small_amethyst_bud",
# b"minecraft:smithing_table",
# b"minecraft:smoker",
# b"minecraft:smooth_basalt",
# b"minecraft:smooth_quartz_slab",
# b"minecraft:smooth_quartz_stairs",
# b"minecraft:smooth_quartz",
# b"minecraft:smooth_red_sandstone",
# b"minecraft:smooth_sandstone_slab",
# b"minecraft:smooth_sandstone_stairs",
# b"minecraft:smooth_stone_slab",
# b"minecraft:smooth_stone",
# b"minecraft:snow_block",
b"minecraft:snow",
b"minecraft:soul_campfire",
b"minecraft:soul_fire",
b"minecraft:soul_lantern",
# b"minecraft:soul_sand",
# b"minecraft:soul_soil",
b"minecraft:soul_torch",
b"minecraft:soul_wall_torch",
b"minecraft:spore_blossom",
b"minecraft:spruce_fence_gate",
b"minecraft:spruce_fence",
# b"minecraft:spruce_log",
# b"minecraft:spruce_planks",
b"minecraft:spruce_pressure_plate",
b"minecraft:spruce_sign",
# b"minecraft:spruce_slab",
# b"minecraft:spruce_stairs",
b"minecraft:spruce_trapdoor",
b"minecraft:spruce_wall_sign",
# b"minecraft:spruce_wood",
# b"minecraft:sticky_piston",
# b"minecraft:stone_brick_slab",
# b"minecraft:stone_brick_stairs",
# b"minecraft:stone_brick_wall",
# b"minecraft:stone_bricks",
b"minecraft:stone_button",
b"minecraft:stone_pressure_plate",
# b"minecraft:stone_slab",
# b"minecraft:stone_stairs",
# b"minecraft:stone",
b"minecraft:stonecutter",
# b"minecraft:stripped_birch_log",
# b"minecraft:stripped_dark_oak_log",
# b"minecraft:stripped_dark_oak_wood",
# b"minecraft:stripped_jungle_log",
# b"minecraft:stripped_jungle_wood",
# b"minecraft:stripped_mangrove_log",
# b"minecraft:stripped_mangrove_wood",
# b"minecraft:stripped_spruce_log",
# b"minecraft:stripped_spruce_wood",
# b"minecraft:stripped_warped_hyphae",
# b"minecraft:stripped_warped_stem",
b"minecraft:sweet_berry_bush",
b"minecraft:tall_seagrass",
# b"minecraft:terracotta",
# b"minecraft:tnt",
b"minecraft:torch",
b"minecraft:trapped_chest",
b"minecraft:tripwire_hook",
b"minecraft:tripwire",
# b"minecraft:tuff",
b"minecraft:turtle_egg",
b"minecraft:twisting_vines_plant",
b"minecraft:twisting_vines",
b"minecraft:vine",
b"minecraft:wall_torch",
b"minecraft:warped_button",
b"minecraft:warped_fence_gate",
b"minecraft:warped_fence",
b"minecraft:warped_fungus",
b"minecraft:warped_hanging_sign",
# b"minecraft:warped_nylium",
# b"minecraft:warped_planks",
b"minecraft:warped_pressure_plate",
b"minecraft:warped_roots",
b"minecraft:warped_sign",
# b"minecraft:warped_slab",
# b"minecraft:warped_stairs",
b"minecraft:warped_trapdoor",
b"minecraft:warped_wall_sign",
# b"minecraft:warped_wart_block",
b"minecraft:water",
# b"minecraft:waxed_cut_copper",
# b"minecraft:waxed_exposed_copper",
b"minecraft:white_carpet",
b"minecraft:wither_rose",
b"minecraft:wither_skeleton_skull",
b"minecraft:wither_skeleton_wall_skull",
b"minecraft:yellow_candle",
]
if True:
TRANSPARENT_BLOCKS = [
# b"minecraft:acacia_planks",
# b"minecraft:acacia_slab",
# b"minecraft:acacia_wood",
b"minecraft:air",
# b"minecraft:amethyst_block",
b"minecraft:amethyst_cluster",
# b"minecraft:ancient_debris",
# b"minecraft:andesite_slab",
# b"minecraft:andesite_stairs",
# b"minecraft:andesite_wall",
# b"minecraft:andesite",
b"minecraft:anvil",
b"minecraft:azalea_leaves",
# b"minecraft:bamboo_block",
# b"minecraft:barrel",
# b"minecraft:basalt",
b"minecraft:beacon",
# b"minecraft:bedrock",
# b"minecraft:beehive",
b"minecraft:bell",
b"minecraft:big_dripleaf_stem",
b"minecraft:big_dripleaf",
# b"minecraft:birch_planks",
b"minecraft:birch_trapdoor",
b"minecraft:black_candle",
b"minecraft:black_carpet",
# b"minecraft:black_concrete_powder",
# b"minecraft:black_concrete",
b"minecraft:black_stained_glass_pane",
# b"minecraft:black_wool",
# b"minecraft:blackstone_slab",
# b"minecraft:blackstone_stairs",
# b"minecraft:blackstone_wall",
# b"minecraft:blackstone",
# b"minecraft:blast_furnace",
# b"minecraft:blue_ice",
b"minecraft:blue_stained_glass_pane",
# b"minecraft:blue_wool",
# b"minecraft:bone_block",
# b"minecraft:bookshelf",
b"minecraft:brewing_stand",
b"minecraft:brown_candle",
# b"minecraft:brown_mushroom_block",
b"minecraft:brown_mushroom",
b"minecraft:bubble_column",
# b"minecraft:calcite",
# b"minecraft:calibrated_sculk_sensor",
# b"minecraft:campfire",
b"minecraft:candle",
# b"minecraft:carved_pumpkin",
b"minecraft:cauldron",
b"minecraft:cave_air",
b"minecraft:cave_vines_plant",
b"minecraft:cave_vines",
b"minecraft:chain",
b"minecraft:chest",
# b"minecraft:chiseled_bookshelf",
# b"minecraft:chiseled_deepslate",
# b"minecraft:chiseled_polished_blackstone",
# b"minecraft:chiseled_sandstone",
# b"minecraft:chiseled_stone_bricks",
# b"minecraft:clay",
# b"minecraft:coal_block",
# b"minecraft:coal_ore",
# b"minecraft:coarse_dirt",
# b"minecraft:cobbled_deepslate_slab",
# b"minecraft:cobbled_deepslate_stairs",
# b"minecraft:cobbled_deepslate_wall",
# b"minecraft:cobbled_deepslate",
# b"minecraft:cobblestone_slab",
# b"minecraft:cobblestone_stairs",
# b"minecraft:cobblestone_wall",
# b"minecraft:cobblestone",
b"minecraft:cobweb",
# b"minecraft:composter",
# b"minecraft:copper_ore",
# b"minecraft:cracked_deepslate_bricks",
# b"minecraft:cracked_deepslate_tiles",
# b"minecraft:cracked_polished_blackstone_bricks",
# b"minecraft:cracked_stone_bricks",
b"minecraft:crimson_button",
b"minecraft:crimson_fence_gate",
# b"minecraft:crimson_nylium",
# b"minecraft:crimson_slab",
# b"minecraft:crimson_stem",
b"minecraft:crimson_trapdoor",
# b"minecraft:crying_obsidian",
# b"minecraft:cut_sandstone_slab",
# b"minecraft:cut_sandstone",
b"minecraft:cyan_candle",
b"minecraft:cyan_carpet",
b"minecraft:cyan_stained_glass_pane",
b"minecraft:cyan_stained_glass",
# b"minecraft:cyan_terracotta",
# b"minecraft:cyan_wool",
b"minecraft:dark_oak_button",
b"minecraft:dark_oak_door",
b"minecraft:dark_oak_fence_gate",
b"minecraft:dark_oak_fence",
# b"minecraft:dark_oak_log",
# b"minecraft:dark_oak_planks",
b"minecraft:dark_oak_pressure_plate",
# b"minecraft:dark_oak_slab",
# b"minecraft:dark_oak_stairs",
b"minecraft:dark_oak_trapdoor",
b"minecraft:dark_oak_wall_sign",
# b"minecraft:dark_oak_wood",
b"minecraft:daylight_detector",
b"minecraft:dead_brain_coral",
b"minecraft:dead_bush",
# b"minecraft:deepslate_brick_slab",
# b"minecraft:deepslate_brick_stairs",
# b"minecraft:deepslate_brick_wall",
# b"minecraft:deepslate_bricks",
# b"minecraft:deepslate_copper_ore",
# b"minecraft:deepslate_diamond_ore",
# b"minecraft:deepslate_gold_ore",
# b"minecraft:deepslate_iron_ore",
# b"minecraft:deepslate_lapis_ore",
# b"minecraft:deepslate_redstone_ore",
# b"minecraft:deepslate_tile_slab",
# b"minecraft:deepslate_tile_stairs",
# b"minecraft:deepslate_tile_wall",
# b"minecraft:deepslate_tiles",
# b"minecraft:deepslate",
# b"minecraft:diamond_block",
# b"minecraft:diamond_ore",
# b"minecraft:diorite_slab",
# b"minecraft:diorite_stairs",
# b"minecraft:diorite_wall",
# b"minecraft:diorite",
# b"minecraft:dirt",
# b"minecraft:dispenser",
# b"minecraft:dripstone_block",
# b"minecraft:dropper",
b"minecraft:enchanting_table",
b"minecraft:end_rod",
# b"minecraft:end_stone",
b"minecraft:fire",
b"minecraft:flower_pot",
b"minecraft:flowering_azalea_leaves",
b"minecraft:flowering_azalea",
# b"minecraft:gilded_blackstone",
b"minecraft:glow_lichen",
# b"minecraft:glowstone",
# b"minecraft:gold_block",
# b"minecraft:gold_ore",
# b"minecraft:granite_slab",
# b"minecraft:granite_stairs",
# b"minecraft:granite_wall",
# b"minecraft:granite",
# b"minecraft:gravel",
b"minecraft:gray_candle",
b"minecraft:gray_carpet",
b"minecraft:gray_wall_banner",
# b"minecraft:gray_wool",
b"minecraft:green_candle",
b"minecraft:green_carpet",
b"minecraft:grindstone",
b"minecraft:hanging_roots",
# b"minecraft:hay_block",
b"minecraft:heavy_weighted_pressure_plate",
b"minecraft:honey_block",
b"minecraft:hopper",
b"minecraft:ice",
b"minecraft:iron_bars",
# b"minecraft:iron_block",
b"minecraft:iron_door",
# b"minecraft:iron_ore",
b"minecraft:iron_trapdoor",
# b"minecraft:jack_o_lantern",
b"minecraft:jungle_door",
b"minecraft:jungle_fence_gate",
b"minecraft:jungle_fence",
# b"minecraft:jungle_planks",
# b"minecraft:jungle_slab",
# b"minecraft:jungle_stairs",
b"minecraft:jungle_trapdoor",
b"minecraft:jungle_wall_sign",
b"minecraft:kelp_plant",
b"minecraft:kelp",
b"minecraft:ladder",
b"minecraft:lantern",
# b"minecraft:lapis_block",
# b"minecraft:lapis_ore",
b"minecraft:large_amethyst_bud",
b"minecraft:lava_cauldron",
b"minecraft:lava",
b"minecraft:lectern",
b"minecraft:lever",
b"minecraft:light_blue_carpet",
b"minecraft:light_blue_stained_glass_pane",
# b"minecraft:light_blue_terracotta",
# b"minecraft:light_blue_wool",
b"minecraft:light_gray_carpet",
b"minecraft:light_gray_wall_banner",
b"minecraft:light_weighted_pressure_plate",
b"minecraft:lightning_rod",
b"minecraft:lily_pad",
b"minecraft:lime_stained_glass_pane",
# b"minecraft:loom",
# b"minecraft:magenta_terracotta",
# b"minecraft:magma_block",
b"minecraft:mangrove_button",
b"minecraft:mangrove_door",
b"minecraft:mangrove_fence_gate",
b"minecraft:mangrove_fence",
b"minecraft:mangrove_leaves",
# b"minecraft:mangrove_log",
# b"minecraft:mangrove_planks",
b"minecraft:mangrove_roots",
# b"minecraft:mangrove_slab",
# b"minecraft:mangrove_stairs",
b"minecraft:mangrove_trapdoor",
b"minecraft:mangrove_wall_sign",
# b"minecraft:mangrove_wood",
b"minecraft:medium_amethyst_bud",
# b"minecraft:moss_block",
b"minecraft:moss_carpet",
# b"minecraft:mossy_cobblestone_slab",
# b"minecraft:mossy_cobblestone_stairs",
# b"minecraft:mossy_cobblestone_wall",
# b"minecraft:mossy_cobblestone",
# b"minecraft:mossy_stone_brick_slab",
# b"minecraft:mossy_stone_brick_stairs",
# b"minecraft:mossy_stone_brick_wall",
# b"minecraft:mossy_stone_bricks",
# b"minecraft:mud_brick_slab",
# b"minecraft:mud_brick_stairs",
# b"minecraft:mud_brick_wall",
# b"minecraft:mud_bricks",
# b"minecraft:mud",
# b"minecraft:muddy_mangrove_roots",
# b"minecraft:mushroom_stem",
# b"minecraft:mycelium",
b"minecraft:nether_brick_fence",
# b"minecraft:nether_brick_slab",
# b"minecraft:nether_brick_stairs",
# b"minecraft:nether_brick_wall",
# b"minecraft:nether_bricks",
# b"minecraft:nether_quartz_ore",
b"minecraft:nether_sprouts",
# b"minecraft:nether_wart_block",
# b"minecraft:netherite_block",
# b"minecraft:netherrack",
# b"minecraft:note_block",
b"minecraft:oak_door",
b"minecraft:oak_fence",
b"minecraft:oak_leaves",
# b"minecraft:oak_log",
# b"minecraft:oak_stairs",
b"minecraft:oak_trapdoor",
b"minecraft:oak_wall_sign",
# b"minecraft:oak_wood",
# b"minecraft:observer",
# b"minecraft:obsidian",
# b"minecraft:ochre_froglight",
b"minecraft:orange_carpet",
# b"minecraft:orange_terracotta",
# b"minecraft:oxidized_copper",
# b"minecraft:oxidized_cut_copper_slab",
# b"minecraft:packed_ice",
# b"minecraft:packed_mud",
b"minecraft:piston_head",
b"minecraft:player_head",
b"minecraft:player_wall_head",
# b"minecraft:podzol",
b"minecraft:pointed_dripstone",
# b"minecraft:polished_andesite_stairs",
# b"minecraft:polished_andesite",
# b"minecraft:polished_basalt",
# b"minecraft:polished_blackstone_brick_slab",
# b"minecraft:polished_blackstone_brick_stairs",
# b"minecraft:polished_blackstone_brick_wall",
# b"minecraft:polished_blackstone_bricks",
b"minecraft:polished_blackstone_button",
b"minecraft:polished_blackstone_pressure_plate",
# b"minecraft:polished_blackstone_slab",
# b"minecraft:polished_blackstone_stairs",
# b"minecraft:polished_blackstone_wall",
# b"minecraft:polished_blackstone",
# b"minecraft:polished_deepslate_slab",
# b"minecraft:polished_deepslate_stairs",
# b"minecraft:polished_deepslate_wall",
# b"minecraft:polished_deepslate",
# b"minecraft:polished_granite_slab",
# b"minecraft:polished_granite_stairs",
# b"minecraft:polished_granite",
b"minecraft:potted_brown_mushroom",
b"minecraft:potted_crimson_fungus",
b"minecraft:potted_dead_bush",
b"minecraft:potted_warped_fungus",
b"minecraft:potted_warped_roots",
b"minecraft:potted_wither_rose",
# b"minecraft:powder_snow", ###############
# b"minecraft:pumpkin",
# b"minecraft:purple_terracotta",
# b"minecraft:quartz_block",
# b"minecraft:quartz_slab",
# b"minecraft:quartz_stairs",
b"minecraft:rail",
# b"minecraft:raw_copper_block",
# b"minecraft:raw_gold_block",
# b"minecraft:raw_iron_block",
b"minecraft:red_candle",
b"minecraft:red_carpet",
# b"minecraft:red_concrete",
# b"minecraft:red_mushroom_block",
b"minecraft:red_mushroom",
# b"minecraft:red_nether_bricks",
# b"minecraft:red_sand",
b"minecraft:red_stained_glass_pane",
# b"minecraft:red_stained_glass",
b"minecraft:red_wall_banner",
# b"minecraft:red_wool",
# b"minecraft:redstone_block",
b"minecraft:redstone_torch",
b"minecraft:redstone_wire",
# b"minecraft:respawn_anchor",
# b"minecraft:rooted_dirt",
# b"minecraft:sandstone_stairs",
# b"minecraft:sandstone",
b"minecraft:scaffolding",
b"minecraft:sculk_shrieker",
b"minecraft:sculk_vein",
# b"minecraft:sculk",
# b"minecraft:sea_lantern",
b"minecraft:sea_pickle",
b"minecraft:seagrass",
# b"minecraft:shroomlight",
b"minecraft:skeleton_skull",
b"minecraft:small_amethyst_bud",
# b"minecraft:smithing_table",
# b"minecraft:smoker",
# b"minecraft:smooth_basalt",
# b"minecraft:smooth_quartz_slab",
# b"minecraft:smooth_quartz_stairs",
# b"minecraft:smooth_quartz",
# b"minecraft:smooth_red_sandstone",
# b"minecraft:smooth_sandstone_slab",
# b"minecraft:smooth_sandstone_stairs",
# b"minecraft:smooth_stone_slab",
# b"minecraft:smooth_stone",
# b"minecraft:snow_block",
b"minecraft:snow",
b"minecraft:soul_campfire",
b"minecraft:soul_fire",
b"minecraft:soul_lantern",
# b"minecraft:soul_sand",
# b"minecraft:soul_soil",
b"minecraft:soul_torch",
b"minecraft:soul_wall_torch",
b"minecraft:spore_blossom",
b"minecraft:spruce_fence_gate",
b"minecraft:spruce_fence",
# b"minecraft:spruce_log",
# b"minecraft:spruce_planks",
b"minecraft:spruce_pressure_plate",
b"minecraft:spruce_sign",
# b"minecraft:spruce_slab",
# b"minecraft:spruce_stairs",
b"minecraft:spruce_trapdoor",
b"minecraft:spruce_wall_sign",
# b"minecraft:spruce_wood",
# b"minecraft:sticky_piston",
# b"minecraft:stone_brick_slab",
# b"minecraft:stone_brick_stairs",
# b"minecraft:stone_brick_wall",
# b"minecraft:stone_bricks",
b"minecraft:stone_button",
b"minecraft:stone_pressure_plate",
# b"minecraft:stone_slab",
# b"minecraft:stone_stairs",
# b"minecraft:stone",
b"minecraft:stonecutter",
# b"minecraft:stripped_birch_log",
# b"minecraft:stripped_dark_oak_log",
# b"minecraft:stripped_dark_oak_wood",
# b"minecraft:stripped_jungle_log",
# b"minecraft:stripped_jungle_wood",
# b"minecraft:stripped_mangrove_log",
# b"minecraft:stripped_mangrove_wood",
# b"minecraft:stripped_spruce_log",
# b"minecraft:stripped_spruce_wood",
# b"minecraft:stripped_warped_hyphae",
# b"minecraft:stripped_warped_stem",
b"minecraft:sweet_berry_bush",
b"minecraft:tall_seagrass",
# b"minecraft:terracotta",
# b"minecraft:tnt",
b"minecraft:torch",
b"minecraft:trapped_chest",
b"minecraft:tripwire_hook",
b"minecraft:tripwire",
# b"minecraft:tuff",
b"minecraft:turtle_egg",
b"minecraft:twisting_vines_plant",
b"minecraft:twisting_vines",
b"minecraft:vine",
b"minecraft:wall_torch",
b"minecraft:warped_button",
b"minecraft:warped_fence_gate",
b"minecraft:warped_fence",
b"minecraft:warped_fungus",
b"minecraft:warped_hanging_sign",
# b"minecraft:warped_nylium",
# b"minecraft:warped_planks",
b"minecraft:warped_pressure_plate",
b"minecraft:warped_roots",
b"minecraft:warped_sign",
# b"minecraft:warped_slab",
# b"minecraft:warped_stairs",
b"minecraft:warped_trapdoor",
b"minecraft:warped_wall_sign",
# b"minecraft:warped_wart_block",
b"minecraft:water",
# b"minecraft:waxed_cut_copper",
# b"minecraft:waxed_exposed_copper",
b"minecraft:white_carpet",
b"minecraft:wither_rose",
b"minecraft:wither_skeleton_skull",
b"minecraft:wither_skeleton_wall_skull",
b"minecraft:yellow_candle",
]
if False:
# For new algo
TRANSPARENT_BLOCKS = [
b"minecraft:air",
b"minecraft:amethyst_cluster",
b"minecraft:big_dripleaf_stem",
b"minecraft:big_dripleaf",
b"minecraft:black_candle",
b"minecraft:brown_candle",
b"minecraft:bubble_column",
b"minecraft:candle",
b"minecraft:cave_air",
b"minecraft:cave_vines_plant",
b"minecraft:cave_vines",
b"minecraft:chain",
b"minecraft:cobweb",
b"minecraft:crimson_button",
b"minecraft:crimson_fence_gate",
b"minecraft:cyan_candle",
b"minecraft:dark_oak_button",
b"minecraft:dark_oak_pressure_plate",
b"minecraft:dark_oak_wall_sign",
b"minecraft:dead_bush",
b"minecraft:end_rod",
b"minecraft:fire",
b"minecraft:glow_lichen",
b"minecraft:gray_candle",
b"minecraft:gray_wall_banner",
b"minecraft:green_candle",
b"minecraft:heavy_weighted_pressure_plate",
b"minecraft:jungle_wall_sign",
b"minecraft:kelp_plant",
b"minecraft:kelp",
b"minecraft:ladder",
b"minecraft:lever",
b"minecraft:light_weighted_pressure_plate",
b"minecraft:lightning_rod",
b"minecraft:mangrove_button",
b"minecraft:mangrove_wall_sign",
b"minecraft:oak_wall_sign",
b"minecraft:player_wall_head",
b"minecraft:polished_blackstone_button",
b"minecraft:polished_blackstone_pressure_plate",
b"minecraft:rail",
b"minecraft:red_candle",
b"minecraft:red_mushroom",
b"minecraft:red_wall_banner",
b"minecraft:redstone_torch",
b"minecraft:redstone_wire",
b"minecraft:sculk_vein",
b"minecraft:sea_pickle",
b"minecraft:seagrass",
b"minecraft:skeleton_skull",
b"minecraft:small_amethyst_bud",
b"minecraft:snow",
b"minecraft:soul_fire",
b"minecraft:soul_torch",
b"minecraft:soul_wall_torch",
b"minecraft:spruce_pressure_plate",
b"minecraft:spruce_sign",
b"minecraft:spruce_wall_sign",
b"minecraft:stone_button",
b"minecraft:stone_pressure_plate",
b"minecraft:sweet_berry_bush",
b"minecraft:tall_seagrass",
b"minecraft:torch",
b"minecraft:tripwire_hook",
b"minecraft:tripwire",
b"minecraft:turtle_egg",
b"minecraft:twisting_vines_plant",
b"minecraft:twisting_vines",
b"minecraft:vine",
b"minecraft:wall_torch",
b"minecraft:warped_button",
b"minecraft:warped_fungus",
b"minecraft:warped_hanging_sign",
b"minecraft:warped_pressure_plate",
b"minecraft:warped_roots",
b"minecraft:warped_sign",
b"minecraft:warped_wall_sign",
b"minecraft:water",
b"minecraft:wither_skeleton_skull",
b"minecraft:wither_skeleton_wall_skull",
b"minecraft:yellow_candle",
]
import struct
def parse(buffer, offset=0, *, key_encoding="utf-8", return_offset=False):
def key_decode(text):
if key_encoding is not None:
text = text.decode(key_encoding)
return text
def pop_byte():
nonlocal offset
offset += 1
return struct.unpack_from(">b", buffer, offset - 1)[0]
def pop_short():
nonlocal offset
offset += 2
return struct.unpack_from(">h", buffer, offset - 2)[0]
def pop_int():
nonlocal offset
offset += 4
return struct.unpack_from(">i", buffer, offset - 4)[0]
def pop_long():
nonlocal offset
offset += 8
return struct.unpack_from(">q", buffer, offset - 8)[0]
def pop_float():
nonlocal offset
offset += 4
return struct.unpack_from(">f", buffer, offset - 4)[0]
def pop_double():
nonlocal offset
offset += 8
return struct.unpack_from(">d", buffer, offset - 8)[0]
def pop_string():
nonlocal offset
length = struct.unpack_from(">H", buffer, offset)[0]
offset += 2 + length
return buffer[offset - length : offset]
def pop_list():
item_type = tags.get(pop_byte())
length = pop_int()
return [item_type() for _ in range(length)]
def pop_compound():
ret = {}
while True:
item = pop_compound_item()
if item is None:
break
key, value = item
ret[key_decode(key)] = value
return ret
def pop_byte_array():
length = pop_int()
return [pop_byte() for _ in range(length)]
def pop_int_array():
length = pop_int()
return [pop_int() for _ in range(length)]
def pop_long_array():
length = pop_int()
return [pop_long() for _ in range(length)]
tags = {
0x01: pop_byte,
0x02: pop_short,
0x03: pop_int,
0x04: pop_long,
0x05: pop_float,
0x06: pop_double,
0x07: pop_byte_array,
0x08: pop_string,
0x09: pop_list,
0x0A: pop_compound,
0x0B: pop_int_array,
0x0C: pop_long_array,
}
def pop_compound_item():
item_type = pop_byte()
if item_type == 0x00:
return
item_name = pop_string()
item_value = tags[item_type]()
return item_name, item_value
key, value = pop_compound_item()
ret = {key_decode(key): value}
if return_offset:
return ret, offset
return ret
import struct
import uuid
from noxitu.minecraft.io.packet_core import varint32
import noxitu.minecraft.io.nbt
class Packet:
def __init__(self, buffer):
self._buffer = buffer
self.offset = 0
def boolean(self):
return self.ubyte() != 0
def ubyte(self):
self.offset += 1
return self._buffer[self.offset - 1]
def short(self):
(value,) = struct.unpack_from(">h", self._buffer, self.offset)
self.offset += 2
return value
def ushort(self):
(value,) = struct.unpack_from(">H", self._buffer, self.offset)
self.offset += 2
return value
def int(self):
(value,) = struct.unpack_from(">i", self._buffer, self.offset)
self.offset += 4
return value
def long(self):
(value,) = struct.unpack_from(">q", self._buffer, self.offset)
self.offset += 8
return value
def ulong(self):
(value,) = struct.unpack_from(">Q", self._buffer, self.offset)
self.offset += 8
return value
def varint(self):
value, skip = varint32(self._buffer, self.offset)
self.offset += skip
return value
def string(self, n):
length = self.varint()
value = self._buffer[self.offset : self.offset + length]
self.offset += length
return value
def nbt(self):
value, self.offset = noxitu.minecraft.io.nbt.parse(
self._buffer, self.offset, return_offset=True
)
return value
def uuid(self):
value = uuid.UUID(bytes=self._buffer[self.offset : self.offset + 16])
self.offset += 16
return value
def bytearray(self, length):
value = self._buffer[self.offset : self.offset + length]
self.offset += length
return value
def _sign32(value):
if value > 0x7FFF_FFFF:
return value - 0x1_0000_0000
return value
def _sign64(value):
if value > 0x7FFF_FFFF_FFFF_FFFF:
return value - 0x1_0000_0000_0000_0000
return value
def _varint(buffer, offset, max_length, sign):
ret = 0
for i in range(max_length):
if offset + i >= len(buffer):
return None, i + 1
val = buffer[offset + i]
ret += (val & 0x7F) << (7 * i)
if (val & 0x80) == 0:
return sign(ret), i + 1
# LOGGER.warning('Too long varint read.')
return sign(ret), max_length
def varint32(buffer, offset=0):
return _varint(buffer, offset, 5, _sign32)
def varint64(buffer, offset=0):
return _varint(buffer, offset, 10, _sign64)
import gzip
from os import PathLike
from pathlib import Path
import zlib
import numpy as np
import noxitu.minecraft.io.nbt
import noxitu.minecraft.io.packet
class World:
def __init__(self, path: PathLike):
self._path = Path(path)
self._assets = {}
self._where = {}
self._world = {}
self._collect_chunks()
def level(self):
with gzip.open(self._path / "level.dat", "rb") as fd:
buffer = fd.read()
nbt = noxitu.minecraft.io.nbt.parse(buffer)
return nbt[""]
def add_assets(self, version_id, assets):
self._assets[version_id] = assets
def __getitem__(self, item):
ret = self._world.get(item)
if ret is not None:
return ret
desc = self._where.get(item)
if desc is None:
return None
ret = _load_chunk(*desc, item)
self._world[item] = ret
return ret
def _collect_chunks_from_file(self, path):
global_x, global_z = np.array(path.stem.split(".")[1:]).astype(int) * 32
with open(path, "rb") as fd:
header = fd.read(4096)
if len(header) == 0:
return
if len(header) < 4096:
raise Exception("?")
header = np.frombuffer(header, dtype=">i4")
for i, (x, z) in enumerate([(x, z) for z in range(32) for x in range(32)]):
offset = 4096 * (header[i] >> 8)
size = 4096 * (header[i] & 0xFF)
if size > 0:
self._where[global_z + z, global_x + x] = (path, offset, size)
def _collect_chunks(self):
files = list(self._path.glob("region/r.*.*.mca"))
track = lambda x: x
for mca_file in track(files):
self._collect_chunks_from_file(mca_file)
def _unpack_long(value, bits):
if value < 0:
value += 2**64
mask = 2**bits - 1
for i in range(0, 64 - bits + 1, bits):
yield (value >> i) & mask
def _unpack_section(section_data, palette_size):
bits_per_block = 4
while 2**bits_per_block < palette_size:
bits_per_block += 1
result = [
val for packed in section_data for val in _unpack_long(packed, bits_per_block)
]
dtype = "u1" if bits_per_block <= 8 else "u2"
return np.array(result[: 16 * 16 * 16], dtype=dtype).reshape(16, 16, 16)
def _parse_chunk(buffer, item):
chunk_data = noxitu.minecraft.io.packet.Packet(buffer[:5])
size = chunk_data.int()
encryption = chunk_data.ubyte()
assert encryption == 2
chunk_data = zlib.decompress(buffer[5 : size + 4])
chunk_data = noxitu.minecraft.io.nbt.parse(chunk_data)[""]
# print(f"{chunk_data['DataVersion']=}")
assert chunk_data["xPos"] == item[1]
assert chunk_data["zPos"] == item[0]
chunk = []
for section in chunk_data["sections"]:
# print(*section, section["Y"])
y = section["Y"]
subchunk = {}
subchunk["y"] = y
if "block_states" not in section:
subchunk["data"] = np.zeros((16, 16, 16), dtype="u1")
subchunk["palette"] = [{"Name": b"minecraft:air"}]
continue
block_states = section["block_states"]
palette = block_states["palette"]
if "data" in block_states:
subchunk["data"] = _unpack_section(block_states["data"], len(palette))
subchunk["palette"] = palette
stone_mask = np.array(
[
(p["Name"] == b"minecraft:stone") + (p["Name"] != b"minecraft:air")
for p in palette
],
dtype="u1",
)
subchunk["stone"] = stone_mask[subchunk["data"]]
else:
subchunk["stone"] = np.zeros((16, 16, 16), dtype="u1")
chunk.append(subchunk)
return chunk
# if b"BlockStates" in section:
# palette = []
# for entry in section[b"Palette"]:
# block = BLOCKS[entry[b"Name"].decode()]
# if b"Properties" in entry:
# properties = {
# key.decode(): value.decode()
# for key, value in entry[b"Properties"].items()
# }
# n = 0
# for state in block["states"]:
# if all(
# properties.get(key) == value
# for key, value in state["properties"].items()
# ):
# palette.append(state["id"])
# n += 1
# if n != 1:
# raise Exception(f"Failed to determine unique state id")
# else:
# n = 0
# for state in block["states"]:
# if state.get("default", False):
# palette.append(state["id"])
# n += 1
# if n != 1:
# raise Exception()
# palette = np.array(palette)
# chunk[y] = unpack_section(section[b"BlockStates"], palette)
# return chunk.reshape(256, 16, 16)
def _load_chunk(path, offset, size, item):
with open(path, "rb") as fd:
fd.seek(offset)
buffer = fd.read(size)
return _parse_chunk(buffer, item)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment