Beispiel #1
0
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)
Beispiel #3
0
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)
Beispiel #4
0
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)

Beispiel #5
0
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)
Beispiel #6
0
    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)
Beispiel #7
0
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)
Beispiel #8
0
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)
Beispiel #9
0
    # 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)
Beispiel #10
0
    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 += "}"
Beispiel #11
0
    # 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)
Beispiel #12
0
"""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)
Beispiel #13
0
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)
Beispiel #14
0
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)
Beispiel #15
0
    # 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)
Beispiel #16
0
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)
Beispiel #17
0
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)