def main(): particles = [] ids = {} names = {} types = load_minecraft_json("protocol.json", "1.16")["types"]["particleData"][1]['fields'] print(types) for particle in load_minecraft_json("particles.json", "1.16"): variant = camel_case(particle['name']) id = str(particle['id']) if id in types.keys(): data = types[id] print(data[1]) particles.append(generate_particle_data(variant, data[1])) else: particles.append(variant) ids[variant] = id names[variant] = particle['name'] output_data = generate_enum("Particle", particles) output_data += generate_enum_property("Particle", "id", "u32", ids, True) output_data += generate_enum_property("Particle", "name", "&str", names, True, "&'static str") output("crates/core/src/particle.rs", output_data)
regexes = {} for name, regex in simplified_block['regexes'].items(): regexes[name] = compile(regex) variants = [] mapping = {} for name in regexes: variants.append(camel_case(name)) for block in blocks: name = block['name'] block_variant = camel_case(name) # Detect which SimplifiedBlockKind matches this block. found = False for simplified, regex in regexes.items(): if regex.match(name) is not None: mapping[block_variant] = "SimplifiedBlockKind::" + camel_case(simplified) found = True break if not found: # Default to block variant variants.append(block_variant) mapping[block_variant] = "SimplifiedBlockKind::" + block_variant output_data = "use crate::BlockKind;" + generate_enum("SimplifiedBlockKind", variants) output_data += generate_enum_property("BlockKind", "simplified_kind", "SimplifiedBlockKind", mapping) output("blocks/src/simplified_block.rs", output_data)
internal_ids = {} names = {} display_names = {} bboxes = {} for entity in load_minecraft_json("entities.json"): variant = camel_case(entity['name']) entities.append(variant) ids[variant] = entity['id'] internal_ids[variant] = entity['internalId'] names[variant] = entity['name'] display_names[variant] = entity['displayName'] width = entity['width'] height = entity['height'] bboxes[ variant] = f"vek::Aabb {{ min: vek::Vec3::zero(), max: vek::Vec3::new({width} as f64, {height} as f64, {width} as f64), }}" output_data = generate_enum("EntityKind", entities) output_data += generate_enum_property("EntityKind", "id", "u32", ids, True) output_data += generate_enum_property("EntityKind", "internal_id", "u32", internal_ids, True) output_data += generate_enum_property("EntityKind", "name", "&str", names, True, "&'static str") output_data += generate_enum_property("EntityKind", "display_name", "&str", display_names, True, "&'static str") output_data += generate_enum_property("EntityKind", "bounding_box", "vek::Aabb<f64>", bboxes) output("core/src/entity.rs", output_data)
from common import load_minecraft_json, output, generate_enum, generate_enum_property, camel_case particles = [] ids = {} names = {} for particle in load_minecraft_json("particles.json", "1.16"): variant = camel_case(particle['name']) particles.append(variant) ids[variant] = particle['id'] names[variant] = particle['name'] output_data = generate_enum("Particle", particles) output_data += generate_enum_property("Particle", "id", "u32", ids, True) output_data += generate_enum_property("Particle", "name", "&str", names, True, "&'static str") output("crates/core/src/particle.rs", output_data)
names = {} display_names = {} stack_sizes = {} durabilities = {} for item in load_minecraft_json("items.json", "1.16.2"): variant = camel_case(item['name']) items.append(variant) ids[variant] = item['id'] names[variant] = item['name'] display_names[variant] = item['displayName'] stack_sizes[variant] = item['stackSize'] durability = item.get('durability') if durability is None: durabilities[variant] = "None" else: durabilities[variant] = f"Some({durability})" output_data = generate_enum("Item", items) output_data += generate_enum_property("Item", "id", "u32", ids, True) output_data += generate_enum_property("Item", "name", "&str", names, True, "&'static str") output_data += generate_enum_property("Item", "display_name", "&str", display_names, False, "&'static str") output_data += generate_enum_property("Item", "stack_size", "u32", stack_sizes) output_data += generate_enum_property("Item", "durability", "Option<u32>", durabilities) output("crates/items/src/item.rs", output_data)
variant = camel_case(item['name']) items.append(variant) ids[variant] = item['id'] names[variant] = item['name'] display_names[variant] = item['displayName'] stack_sizes[variant] = item['stackSize'] durability = item.get('durability') if durability is None: durabilities[variant] = "None" else: durabilities[variant] = f"Some({durability})" output_data = "use serde::{Serialize, Deserialize};" output_data += generate_enum("Item", items, derives=["Serialize", "Deserialize"], prelude="#[serde(try_from = \"String\", into = \"&'static str\")]") output_data += generate_enum_property("Item", "id", "u32", ids, True) output_data += generate_enum_property("Item", "name", "&str", names, True, "&'static str") output_data += generate_enum_property("Item", "display_name", "&str", display_names, False, "&'static str") output_data += generate_enum_property("Item", "stack_size", "u32", stack_sizes) output_data += generate_enum_property("Item", "durability", "Option<u32>", durabilities) output_data += f""" use std::convert::TryFrom; impl TryFrom<String> for Item {{ type Error = &'static str; fn try_from(value: String) -> Result<Self, Self::Error> {{ if let Some(item) = Item::from_name(value.as_str()) {{ Ok(item)
data = common.load_minecraft_json("biomes.json") variants = [] ids = {} names = {} display_names = {} rainfalls = {} temperatures = {} for biome in data: variant = common.camel_case(biome['name']) variants.append(variant) ids[variant] = biome['id'] names[variant] = biome['name'] display_names[variant] = biome['displayName'] rainfalls[variant] = biome['rainfall'] temperatures[variant] = biome['temperature'] output = common.generate_enum("Biome", variants) output += common.generate_enum_property("Biome", "id", "u32", ids, True) output += common.generate_enum_property("Biome", "name", "&str", names, True, "&'static str") output += common.generate_enum_property("Biome", "display_name", "&str", display_names, True, "&'static str") output += common.generate_enum_property("Biome", "rainfall", "f32", rainfalls) output += common.generate_enum_property("Biome", "temperature", "f32", temperatures) common.output("src/biome.rs", output)
import common as common data = common.load_minecraft_json("particles.json", "1.16") particles = [] ids = {} names = {} for particle in data: variant = common.camel_case(particle['name']) particles.append(variant) ids[variant] = particle['id'] names[variant] = particle['name'] output = common.generate_enum("Particle", particles) output += common.generate_enum_property("Particle", "id", "u32", ids, True) output += common.generate_enum_property("Particle", "name", "&str", names, True, "&'static str") common.output("src/particle.rs", output)
# Harvest tools ht = "" for tool_id in block.get('harvestTools', {}): kind = item_kinds_by_id[int(tool_id)] ht += f"libcraft_items::Item::{kind}," if len(ht) == 0: harvest_tools[variant] = 'None' else: harvest_tools[variant] = f""" const TOOLS: &[libcraft_items::Item] = &[{ht}]; Some(TOOLS) """ output_data = "#[derive(num_derive::FromPrimitive, num_derive::ToPrimitive, serde::Serialize, serde::Deserialize)]" + \ generate_enum("BlockKind", blocks) output_data += generate_enum_property("BlockKind", "id", "u32", ids, True) output_data += generate_enum_property("BlockKind", "name", "&str", names, True, "&'static str") output_data += generate_enum_property("BlockKind", "display_name", "&str", display_names, True, "&'static str") output_data += generate_enum_property("BlockKind", "hardness", "f32", hardnesses) output_data += generate_enum_property("BlockKind", "diggable", "bool", diggables) output_data += generate_enum_property("BlockKind", "transparent", "bool", transparents) output_data += generate_enum_property("BlockKind", "light_emission", "u8", light_emissions) output_data += generate_enum_property("BlockKind", "light_filter", "u8", light_filters)
windows.append(variant) names[variant] = name inventories[variant] = window['inventories'] ao = collections.OrderedDict() slot_counter = 0 for inventory_and_area, number_of_slots in window['slots'].items(): parts = inventory_and_area.split(":") inventory = parts[0] area_in_inventory = parts[1] ao[(inventory, area_in_inventory)] = (slot_counter, number_of_slots) slot_counter += number_of_slots area_offsets[variant] = ao output = common.generate_enum("Area", areas) window = "#[derive(Debug, Clone)] pub enum Window {" index_to_slot = "#[allow(unused_comparisons)] pub fn index_to_slot(&self, index: usize) -> Option<(&crate::Inventory, Area, usize)> { match self {" slot_to_index = "pub fn slot_to_index(&self, inventory: &crate::Inventory, area: Area, slot: usize) -> Option<usize> { match self {" for variant in windows: window += f"{variant} {{" for inventory in inventories[variant]: window += f"{inventory}: crate::Inventory," window += "}," match_pattern = f"Window::{variant} {{" for inventory in inventories[variant]: match_pattern += f"{inventory}," match_pattern += "}"
# Harvest tools ht = "" for tool_id in block.get('harvestTools', {}): kind = item_kinds_by_id[int(tool_id)] ht += f"crate::Item::{kind}," if len(ht) == 0: harvest_tools[variant] = 'None' else: harvest_tools[variant] = f""" const TOOLS: &[crate::Item] = &[{ht}]; Some(TOOLS) """ output = "#[derive(num_derive::FromPrimitive, num_derive::ToPrimitive)]" + common.generate_enum( "BlockKind", blocks) output += common.generate_enum_property("BlockKind", "id", "u32", ids, True) output += common.generate_enum_property("BlockKind", "name", "&str", names, True, "&'static str") output += common.generate_enum_property("BlockKind", "display_name", "&str", display_names, True, "&'static str") output += common.generate_enum_property("BlockKind", "hardness", "f32", hardnesses) output += common.generate_enum_property("BlockKind", "diggable", "bool", diggables) output += common.generate_enum_property("BlockKind", "transparent", "bool", transparents) output += common.generate_enum_property("BlockKind", "light_emission", "u8", light_emissions) output += common.generate_enum_property("BlockKind", "light_filter", "u8", light_filters)
"""Generation of the Biome enum. Uses minecraft-data/biomes.json.""" from common import load_minecraft_json, camel_case, generate_enum, generate_enum_property, output variants = [] ids = {} names = {} display_names = {} rainfalls = {} temperatures = {} for biome in load_minecraft_json("biomes.json"): variant = camel_case(biome['name']) variants.append(variant) ids[variant] = biome['id'] names[variant] = biome['name'] display_names[variant] = biome['displayName'] rainfalls[variant] = biome['rainfall'] temperatures[variant] = biome['temperature'] output_data = generate_enum("Biome", variants) output_data += generate_enum_property("Biome", "id", "u32", ids, True) output_data += generate_enum_property("Biome", "name", "&str", names, True, "&'static str") output_data += generate_enum_property("Biome", "display_name", "&str", display_names, True, "&'static str") output_data += generate_enum_property("Biome", "rainfall", "f32", rainfalls) output_data += generate_enum_property("Biome", "temperature", "f32", temperatures) output("crates/core/src/biome.rs", output_data)
display_names = {} stack_sizes = {} durabilities = {} for item in data: variant = common.camel_case(item['name']) items.append(variant) ids[variant] = item['id'] names[variant] = item['name'] display_names[variant] = item['displayName'] stack_sizes[variant] = item['stackSize'] durability = item.get('durability') if durability is None: durabilities[variant] = "None" else: durabilities[variant] = f"Some({durability})" output = common.generate_enum("Item", items) output += common.generate_enum_property("Item", "id", "u32", ids, True) output += common.generate_enum_property("Item", "name", "&str", names, True, "&'static str") output += common.generate_enum_property("Item", "display_name", "&str", display_names, True, "&'static str") output += common.generate_enum_property("Item", "stack_size", "u32", stack_sizes) output += common.generate_enum_property("Item", "durability", "Option<u32>", durabilities) common.output("src/item.rs", output)
variants = [] mapping = {} for name in regexes: variants.append(common.camel_case(name)) for block in blocks: name = block['name'] block_variant = common.camel_case(name) # Detect which SimplifiedBlockKind matches this block. found = False for simplified, regex in regexes.items(): if regex.match(name) is not None: mapping[ block_variant] = "SimplifiedBlockKind::" + common.camel_case( simplified) found = True break if not found: # Default to block variant variants.append(block_variant) mapping[block_variant] = "SimplifiedBlockKind::" + block_variant output = "use crate::BlockKind;" + common.generate_enum( "SimplifiedBlockKind", variants) output += common.generate_enum_property("BlockKind", "simplified_kind", "SimplifiedBlockKind", mapping) common.output("src/simplified_block.rs", output)
# Harvest tools ht = "" for tool_id in block.get('harvestTools', {}): kind = item_kinds_by_id[int(tool_id)] ht += f"libcraft_items::Item::{kind}," if len(ht) == 0: harvest_tools[variant] = 'None' else: harvest_tools[variant] = f""" const TOOLS: &[libcraft_items::Item] = &[{ht}]; Some(TOOLS) """ output_data = "#[derive(num_derive::FromPrimitive, num_derive::ToPrimitive)]" + generate_enum( "BlockKind", blocks) output_data += generate_enum_property("BlockKind", "id", "u32", ids, True) output_data += generate_enum_property("BlockKind", "name", "&str", names, True, "&'static str") output_data += generate_enum_property("BlockKind", "display_name", "&str", display_names, True, "&'static str") output_data += generate_enum_property("BlockKind", "hardness", "f32", hardnesses) output_data += generate_enum_property("BlockKind", "diggable", "bool", diggables) output_data += generate_enum_property("BlockKind", "transparent", "bool", transparents) output_data += generate_enum_property("BlockKind", "light_emission", "u8", light_emissions) output_data += generate_enum_property("BlockKind", "light_filter", "u8", light_filters)
items = [] ids = {} names = {} display_names = {} stack_sizes = {} durabilities = {} for item in load_minecraft_json("items.json", "1.16.2"): variant = camel_case(item['name']) items.append(variant) ids[variant] = item['id'] names[variant] = item['name'] display_names[variant] = item['displayName'] stack_sizes[variant] = item['stackSize'] durability = item.get('durability') if durability is None: durabilities[variant] = "None" else: durabilities[variant] = f"Some({durability})" output_data = "#[derive(serde::Serialize, serde::Deserialize)]" + generate_enum("Item", items) output_data += generate_enum_property("Item", "id", "u32", ids, True) output_data += generate_enum_property("Item", "name", "&str", names, True, "&'static str") output_data += generate_enum_property("Item", "display_name", "&str", display_names, False, "&'static str") output_data += generate_enum_property("Item", "stack_size", "u32", stack_sizes) output_data += generate_enum_property("Item", "durability", "Option<u32>", durabilities) output("crates/items/src/item.rs", output_data)
internal_ids = {} names = {} display_names = {} bboxes = {} for entity in data: variant = common.camel_case(entity['name']) entities.append(variant) ids[variant] = entity['id'] internal_ids[variant] = entity['internalId'] names[variant] = entity['name'] display_names[variant] = entity['displayName'] width = entity['width'] height = entity['height'] bboxes[ variant] = f"vek::Aabb {{ min: vek::Vec3::zero(), max: vek::Vec3::new({width} as f64, {height} as f64, {width} as f64), }}" output = common.generate_enum("EntityKind", entities) output += common.generate_enum_property("EntityKind", "id", "u32", ids, True) output += common.generate_enum_property("EntityKind", "internal_id", "u32", internal_ids, True) output += common.generate_enum_property("EntityKind", "name", "&str", names, True, "&'static str") output += common.generate_enum_property("EntityKind", "display_name", "&str", display_names, True, "&'static str") output += common.generate_enum_property("EntityKind", "bounding_box", "vek::Aabb<f64>", bboxes) common.output("src/entity.rs", output)