94 lines
2.9 KiB
Python
94 lines
2.9 KiB
Python
import csv
|
|
from dataclasses import dataclass
|
|
import data
|
|
|
|
@dataclass
|
|
class Decl:
|
|
name: str
|
|
block_id: int
|
|
data: int
|
|
linear_texture_index: str
|
|
custom_mesh: str
|
|
properties: set[str]
|
|
|
|
def decls():
|
|
with open("block_ids.csv", "r") as f:
|
|
reader = csv.reader(f)
|
|
rows = list(reader)
|
|
|
|
header = ('name', 'block id', 'data', 'linear texture index', 'custom mesh', 'properties')
|
|
assert tuple(rows[0][:len(header)]) == header, rows[0]
|
|
data_rows = rows[1:]
|
|
for name, block_id, data, texture_index, custom_mesh, properties, *_ in data_rows:
|
|
block_id = int(block_id)
|
|
texture_index = (int(texture_index) - 1) if texture_index.strip() != '' else 62
|
|
custom_mesh = custom_mesh if custom_mesh.strip() != '' else 'cube'
|
|
properties = set(properties.split(','))
|
|
if ',' in data:
|
|
for d in data.split(","):
|
|
yield Decl(name, block_id, int(d), texture_index, custom_mesh, properties)
|
|
else:
|
|
data = int(data) if data.strip() != '' else 0
|
|
yield Decl(name, block_id, data, texture_index, custom_mesh, properties)
|
|
|
|
def key_block_id_data(decl):
|
|
return decl.block_id, decl.data
|
|
|
|
sorted_decls = list(sorted(decls(), key=key_block_id_data))
|
|
by_id_data = {
|
|
(decl.block_id, decl.data): decl
|
|
for decl in sorted_decls
|
|
}
|
|
|
|
default_decl = Decl(
|
|
name = "_undefined",
|
|
block_id = 999,
|
|
data = 111,
|
|
linear_texture_index = 62,
|
|
custom_mesh = "cube",
|
|
properties = set(),
|
|
)
|
|
|
|
def is_neighbor_block(block_id, block_data):
|
|
if block_id == data.BlockID.AIR:
|
|
return False
|
|
decl = by_id_data.get((block_id, block_data), default_decl)
|
|
return decl.custom_mesh == 'cube'
|
|
|
|
def is_light_source(block_id, block_data):
|
|
decl = by_id_data.get((block_id, block_data), default_decl)
|
|
return 'emits_light' in decl.properties
|
|
|
|
def is_cube_block(block_id, block_data):
|
|
decl = by_id_data.get((block_id, block_data), default_decl)
|
|
return decl.custom_mesh == 'cube'
|
|
|
|
sorted_custom_mesh = list(sorted(set(decl.custom_mesh for decl in sorted_decls if decl.custom_mesh != "cube")))
|
|
custom_mesh_index = {
|
|
custom_mesh: index
|
|
for index, custom_mesh in enumerate(sorted_custom_mesh)
|
|
}
|
|
|
|
def get_custom_mesh_index(block_id, block_data):
|
|
decl = by_id_data.get((block_id, block_data), default_decl)
|
|
return custom_mesh_index[decl.custom_mesh]
|
|
|
|
def get_texture_id(block_id, block_data):
|
|
decl = by_id_data.get((block_id, block_data), default_decl)
|
|
return decl.linear_texture_index
|
|
|
|
def get_special(block_id, block_data):
|
|
decl = by_id_data.get((block_id, block_data), default_decl)
|
|
if "two_sided" in decl.properties:
|
|
return -1
|
|
if "torch_oriented" in decl.properties:
|
|
return 1
|
|
if "stair_oriented" in decl.properties:
|
|
return 2
|
|
return 0
|
|
|
|
if __name__ == "__main__":
|
|
from pprint import pprint
|
|
#print(sorted_custom_mesh)
|
|
pprint(sorted_decls)
|