From 05ca807325048ae9deae192adc0d9b7e1857e932 Mon Sep 17 00:00:00 2001 From: Codex Date: Sat, 9 May 2026 23:31:23 +0200 Subject: [PATCH] Generate property-aware block stubs --- docs/inventory/original-inventory.json | 450 +++++++++++++++++++++++++ tools/generate_port_sources.py | 92 ++++- 2 files changed, 539 insertions(+), 3 deletions(-) diff --git a/docs/inventory/original-inventory.json b/docs/inventory/original-inventory.json index 1c52034..8504184 100644 --- a/docs/inventory/original-inventory.json +++ b/docs/inventory/original-inventory.json @@ -1,4 +1,454 @@ { + "block_kinds": { + "active_robot_chute": "plain", + "advanced_alloy_block": "plain", + "after_burner": "horizontal", + "ai_mine": "plain", + "aimer_node": "plain", + "aluminum_ac_barrel": "horizontal", + "aluminum_ac_barrel_black": "horizontal", + "aluminum_ac_barrel_blue": "horizontal", + "aluminum_ac_barrel_brown": "horizontal", + "aluminum_ac_barrel_cyan": "horizontal", + "aluminum_ac_barrel_dark_gray": "horizontal", + "aluminum_ac_barrel_gray": "horizontal", + "aluminum_ac_barrel_green": "horizontal", + "aluminum_ac_barrel_light_blue": "horizontal", + "aluminum_ac_barrel_light_gray": "horizontal", + "aluminum_ac_barrel_lime": "horizontal", + "aluminum_ac_barrel_magenta": "horizontal", + "aluminum_ac_barrel_orange": "horizontal", + "aluminum_ac_barrel_pink": "horizontal", + "aluminum_ac_barrel_purple": "horizontal", + "aluminum_ac_barrel_red": "horizontal", + "aluminum_ac_barrel_white": "horizontal", + "aluminum_ac_barrel_yellow": "horizontal", + "aluminum_block": "plain", + "aluminum_plating": "plain", + "aluminum_plating_black": "plain", + "aluminum_plating_blue": "plain", + "aluminum_plating_brown": "plain", + "aluminum_plating_cyan": "plain", + "aluminum_plating_dark_gray": "plain", + "aluminum_plating_gray": "plain", + "aluminum_plating_green": "plain", + "aluminum_plating_light_blue": "plain", + "aluminum_plating_light_gray": "plain", + "aluminum_plating_lime": "plain", + "aluminum_plating_magenta": "plain", + "aluminum_plating_orange": "plain", + "aluminum_plating_pink": "plain", + "aluminum_plating_purple": "plain", + "aluminum_plating_red": "plain", + "aluminum_plating_slab": "slab", + "aluminum_plating_slab_black": "slab", + "aluminum_plating_slab_blue": "slab", + "aluminum_plating_slab_brown": "slab", + "aluminum_plating_slab_cyan": "slab", + "aluminum_plating_slab_dark_gray": "slab", + "aluminum_plating_slab_gray": "slab", + "aluminum_plating_slab_green": "slab", + "aluminum_plating_slab_light_blue": "slab", + "aluminum_plating_slab_light_gray": "slab", + "aluminum_plating_slab_lime": "slab", + "aluminum_plating_slab_magenta": "slab", + "aluminum_plating_slab_orange": "slab", + "aluminum_plating_slab_pink": "slab", + "aluminum_plating_slab_purple": "slab", + "aluminum_plating_slab_red": "slab", + "aluminum_plating_slab_white": "slab", + "aluminum_plating_slab_yellow": "slab", + "aluminum_plating_stairs": "stairs", + "aluminum_plating_stairs_black": "stairs", + "aluminum_plating_stairs_blue": "stairs", + "aluminum_plating_stairs_brown": "stairs", + "aluminum_plating_stairs_cyan": "stairs", + "aluminum_plating_stairs_dark_gray": "stairs", + "aluminum_plating_stairs_gray": "stairs", + "aluminum_plating_stairs_green": "stairs", + "aluminum_plating_stairs_light_blue": "stairs", + "aluminum_plating_stairs_light_gray": "stairs", + "aluminum_plating_stairs_lime": "stairs", + "aluminum_plating_stairs_magenta": "stairs", + "aluminum_plating_stairs_orange": "stairs", + "aluminum_plating_stairs_pink": "stairs", + "aluminum_plating_stairs_purple": "stairs", + "aluminum_plating_stairs_red": "stairs", + "aluminum_plating_stairs_white": "stairs", + "aluminum_plating_stairs_yellow": "stairs", + "aluminum_plating_trapdoor": "trapdoor", + "aluminum_plating_trapdoor_black": "trapdoor", + "aluminum_plating_trapdoor_blue": "trapdoor", + "aluminum_plating_trapdoor_brown": "trapdoor", + "aluminum_plating_trapdoor_cyan": "trapdoor", + "aluminum_plating_trapdoor_dark_gray": "trapdoor", + "aluminum_plating_trapdoor_gray": "trapdoor", + "aluminum_plating_trapdoor_green": "trapdoor", + "aluminum_plating_trapdoor_light_blue": "trapdoor", + "aluminum_plating_trapdoor_light_gray": "trapdoor", + "aluminum_plating_trapdoor_lime": "trapdoor", + "aluminum_plating_trapdoor_magenta": "trapdoor", + "aluminum_plating_trapdoor_orange": "trapdoor", + "aluminum_plating_trapdoor_pink": "trapdoor", + "aluminum_plating_trapdoor_purple": "trapdoor", + "aluminum_plating_trapdoor_red": "trapdoor", + "aluminum_plating_trapdoor_white": "trapdoor", + "aluminum_plating_trapdoor_yellow": "trapdoor", + "aluminum_plating_white": "plain", + "aluminum_plating_yellow": "plain", + "aluminum_side_panel": "horizontal", + "aluminum_side_panel_black": "horizontal", + "aluminum_side_panel_blue": "horizontal", + "aluminum_side_panel_brown": "horizontal", + "aluminum_side_panel_cyan": "horizontal", + "aluminum_side_panel_dark_gray": "horizontal", + "aluminum_side_panel_gray": "horizontal", + "aluminum_side_panel_green": "horizontal", + "aluminum_side_panel_light_blue": "horizontal", + "aluminum_side_panel_light_gray": "horizontal", + "aluminum_side_panel_lime": "horizontal", + "aluminum_side_panel_magenta": "horizontal", + "aluminum_side_panel_orange": "horizontal", + "aluminum_side_panel_pink": "horizontal", + "aluminum_side_panel_purple": "horizontal", + "aluminum_side_panel_red": "horizontal", + "aluminum_side_panel_white": "horizontal", + "aluminum_side_panel_yellow": "horizontal", + "ancient_light": "plain", + "ancient_well": "plain", + "artillery_autoloader": "horizontal", + "artillery_barrel": "horizontal", + "artillery_charge_loader": "horizontal", + "artillerybreech": "horizontal", + "asphalt": "plain", + "asphalt_slab": "slab", + "assembly_centrifuge_bottom": "horizontal", + "assembly_centrifuge_middle": "horizontal", + "assembly_centrifuge_top": "horizontal", + "assembly_circuit_fabricator": "horizontal", + "assembly_crusher": "horizontal", + "assembly_depot": "horizontal", + "assembly_furnace": "horizontal", + "assembly_machine": "horizontal", + "assembly_mechanical_fabricator": "horizontal", + "autocannon": "horizontal", + "autocannon_barrel": "horizontal", + "autocannon_drum": "horizontal", + "autoloader": "horizontal", + "battle_cannon_barrel": "horizontal", + "battle_cannon_breech": "horizontal", + "battle_cannon_mantlet": "horizontal", + "bauxite": "plain", + "bauxite_digester": "horizontal", + "beryllium_block": "plain", + "beryllium_ore": "plain", + "black_armor": "plain", + "black_armor_optic": "horizontal", + "black_armor_slab": "slab", + "black_armor_stairs": "stairs", + "black_armor_trapdoor": "trapdoor", + "blast_funnel": "plain", + "blast_furnace": "horizontal", + "blast_furnace_bricks": "plain", + "blue_armor": "plain", + "blue_armor_optic": "horizontal", + "blue_armor_slab": "slab", + "blue_armor_stairs": "stairs", + "blue_armor_trapdoor": "trapdoor", + "brass_block": "plain", + "breeder_reactor_core": "plain", + "breeder_reactor_interface": "plain", + "breeder_reactor_port": "plain", + "brown_armor": "plain", + "brown_armor_optic": "horizontal", + "brown_armor_slab": "slab", + "brown_armor_stairs": "stairs", + "brown_armor_trapdoor": "trapdoor", + "burntgrass": "plain", + "charred_block": "plain", + "chlorine_gas": "plain", + "cluster_of_bombs": "face_attached", + "compressed_air": "plain", + "concrete_wall": "plain", + "control_rod": "plain", + "conveyor": "horizontal", + "conveyor_splitter": "horizontal", + "countermeasure_dispenser": "horizontal", + "covered_flame_thrower_barrel": "horizontal", + "covered_machine_gun_barrel": "horizontal", + "cracked_concrete": "plain", + "cracked_concrete_wall": "plain", + "crude_oil": "plain", + "cyan_armor": "plain", + "cyan_armor_optic": "horizontal", + "cyan_armor_slab": "slab", + "cyan_armor_stairs": "stairs", + "cyan_armor_trapdoor": "trapdoor", + "damaged_concrete": "plain", + "damaged_concrete_wall": "plain", + "damagedfueltank": "horizontal", + "deepslate_lead_ore": "plain", + "defense_core": "plain", + "destroyed_concrete": "plain", + "destroyed_concrete_wall": "plain", + "diesel": "plain", + "drive_shaft": "horizontal", + "electric_firebox": "plain", + "empty_fuel_rods": "plain", + "empty_missile_hardpoint": "horizontal", + "energy_battery": "plain", + "energy_distribution_node": "plain", + "energy_node": "horizontal", + "engine_cyllinder": "horizontal", + "era_1": "horizontal", + "era_2": "horizontal", + "era_3": "horizontal", + "era_4": "horizontal", + "explosive_barrel": "face_attached", + "extension_shaft": "horizontal", + "fire_spear_missile_hardpoint": "horizontal", + "firebox": "plain", + "fission_bomb": "face_attached", + "flame_thrower": "horizontal", + "flame_thrower_barrel": "horizontal", + "foundry": "horizontal", + "fractured_concrete": "plain", + "fractured_concrete_wall": "plain", + "fuel_rods_1": "plain", + "fuel_rods_2": "plain", + "fuel_rods_3": "plain", + "fuel_rods_4": "plain", + "fuel_tank": "horizontal", + "fuel_tank_input": "horizontal", + "fuel_tank_module": "horizontal", + "fusion_bomb": "face_attached", + "gas_bomb": "face_attached", + "gas_dispenser": "horizontal", + "generator": "horizontal", + "giant_coil": "axis", + "glass_trapdoor": "trapdoor", + "gray_armor": "plain", + "gray_armor_optic": "horizontal", + "gray_armor_slab": "slab", + "gray_armor_stairs": "stairs", + "gray_armor_trapdoor": "trapdoor", + "green_armor": "plain", + "green_armor_optic": "horizontal", + "green_armor_slab": "slab", + "green_armor_stairs": "stairs", + "green_armor_trapdoor": "trapdoor", + "harddirt": "plain", + "heavy_machine_gun": "horizontal", + "hydrazine": "plain", + "item_incinerator": "plain", + "jet_compressor": "horizontal", + "jet_exhaust": "horizontal", + "jet_gearbox": "horizontal", + "jet_turbine": "horizontal", + "kerosene": "plain", + "land_mine": "plain", + "large_electric_motor": "horizontal", + "large_engine_smokestack": "horizontal", + "large_rocket_pod": "horizontal", + "large_rocket_pod_chamber": "horizontal", + "lead_block": "plain", + "lead_ore": "plain", + "light_autocannon": "horizontal", + "light_blue_armor": "plain", + "light_blue_armor_optic": "horizontal", + "light_blue_armor_slab": "slab", + "light_blue_armor_stairs": "stairs", + "light_blue_armor_trapdoor": "trapdoor", + "light_gray_armor": "plain", + "light_gray_armor_optic": "horizontal", + "light_gray_armor_slab": "slab", + "light_gray_armor_stairs": "stairs", + "light_gray_armor_trapdoor": "trapdoor", + "light_machine_gun": "horizontal", + "light_wood_block": "plain", + "light_wood_frame": "plain", + "light_wood_side_panel": "horizontal", + "light_wood_slab": "slab", + "light_wood_stairs": "stairs", + "light_wood_trapdoor": "trapdoor", + "lime_armor": "plain", + "lime_armor_optic": "horizontal", + "lime_armor_slab": "slab", + "lime_armor_stairs": "stairs", + "lime_armor_trapdoor": "trapdoor", + "liquid_hydrogen": "plain", + "liquid_oxygen": "plain", + "lithium_block": "plain", + "lithium_ore": "plain", + "loot_box": "plain", + "machine_gun": "horizontal", + "machine_gun_barrel": "horizontal", + "magenta_armor": "plain", + "magenta_armor_optic": "horizontal", + "magenta_armor_slab": "slab", + "magenta_armor_stairs": "stairs", + "magenta_armor_trapdoor": "trapdoor", + "manual_aimer": "horizontal", + "manual_crank": "horizontal", + "medium_diesel_engine": "horizontal", + "medium_petrol_engine": "horizontal", + "mineral_grinder": "plain", + "mini_gun_barrel": "horizontal", + "minigun": "horizontal", + "mortar": "horizontal", + "nickel_block": "plain", + "nickel_ore": "plain", + "niobium_block": "plain", + "nitrate_block": "plain", + "node_trigger": "horizontal", + "node_trigger_on": "horizontal", + "offset_era_1": "horizontal", + "offset_era_2": "horizontal", + "offset_era_3": "horizontal", + "offset_era_4": "horizontal", + "oil": "plain", + "oil_firebox": "plain", + "open_summonation": "plain", + "orange_armor": "plain", + "orange_armor_optic": "horizontal", + "orange_armor_slab": "slab", + "orange_armor_stairs": "stairs", + "orange_armor_trapdoor": "trapdoor", + "ordinance_cluster_warhead": "face_attached", + "ordinance_controller": "face_attached", + "ordinance_core": "face_attached", + "ordinance_fins": "face_attached", + "ordinance_fission_initiator_head": "face_attached", + "ordinance_heavy_warhead": "face_attached", + "ordinance_incendiary_warhead": "face_attached", + "ordinance_inline_fission_warhead": "face_attached", + "ordinance_inline_fusion_warhead_stage_1": "face_attached", + "ordinance_inline_fusion_warhead_stage_2": "face_attached", + "ordinance_inline_warhead": "face_attached", + "ordinance_ir_seeker_head": "face_attached", + "ordinance_kinetic_head": "face_attached", + "ordinance_relocator": "horizontal", + "ordinance_sarh_seeker": "face_attached", + "ordinance_thruster": "face_attached", + "overgrown_reenforced_concrete": "plain", + "passenger_seat": "horizontal", + "petrolium": "plain", + "phosphate_block": "plain", + "pink_armor": "plain", + "pink_armor_optic": "horizontal", + "pink_armor_slab": "slab", + "pink_armor_stairs": "stairs", + "pink_armor_trapdoor": "trapdoor", + "plutonium_block": "plain", + "polished_bauxite": "plain", + "polished_trinitite": "plain", + "power_reactor_interface": "plain", + "power_reactor_port": "plain", + "production_input": "horizontal", + "production_output": "horizontal", + "purple_armor": "plain", + "purple_armor_optic": "horizontal", + "purple_armor_slab": "slab", + "purple_armor_stairs": "stairs", + "purple_armor_trapdoor": "trapdoor", + "pyrochlore_block": "plain", + "pyrochlore_ore": "plain", + "rac_barrel": "horizontal", + "radar_spear_missile_hardpoint": "horizontal", + "radioactive_ash": "plain", + "radioactive_ash_full_block": "plain", + "raw_beryllium_block": "plain", + "raw_lead_block": "plain", + "raw_lithium_block": "plain", + "raw_nickel_block": "plain", + "raw_uranium_block": "plain", + "raw_zinc_block": "plain", + "razor_wire": "plain", + "reaction_chamber": "plain", + "reactor_casing": "plain", + "rebar": "plain", + "red_armor": "plain", + "red_armor_optic": "horizontal", + "red_armor_slab": "slab", + "red_armor_stairs": "stairs", + "red_armor_trapdoor": "trapdoor", + "redirector_shaft": "horizontal", + "redstone_tnt": "face_attached", + "reenforced_concrete": "plain", + "refinery": "horizontal", + "refinery_tower": "horizontal", + "reinforced_glass": "plain", + "reinforced_glass_stairs": "stairs", + "reinforced_glass_trapdoor": "trapdoor", + "robot_chute": "plain", + "rocket_pod": "horizontal", + "rocket_pod_chamber": "horizontal", + "rotary_auto_cannon": "horizontal", + "rusty_block": "plain", + "rusty_slab": "slab", + "rusty_stairs": "stairs", + "rusty_trapdoor": "trapdoor", + "sand_bags": "plain", + "scorch_dirt": "plain", + "seeker_spear_missile_hardpoint": "horizontal", + "sheet_metal": "plain", + "sheet_metal_pane": "plain", + "sheet_metal_slab": "slab", + "sheet_metal_stairs": "stairs", + "siren": "plain", + "small_bomb": "face_attached", + "small_diesel_engine": "horizontal", + "small_petrol_engine": "horizontal", + "smoke_bomb": "face_attached", + "smoke_launcher": "horizontal", + "solar_generator": "horizontal", + "steel_block": "plain", + "steel_door": "door", + "steel_optic": "horizontal", + "steel_plating": "plain", + "steel_plating_slab": "slab", + "steel_plating_stairs": "stairs", + "steel_trapdoor": "trapdoor", + "steel_truss": "axis", + "strike_spear_missile_hardpoint": "horizontal", + "structural_concrete": "plain", + "sulfur_block": "plain", + "sulfur_ore": "plain", + "sulfuric_acid": "plain", + "summonation": "plain", + "summonator": "plain", + "summonator_active": "plain", + "summonator_module": "plain", + "tar": "plain", + "thermal_furnace": "horizontal", + "thick_battle_cannon_barrel": "horizontal", + "tinted_glass_stairs": "stairs", + "tinted_glass_trapdoor": "trapdoor", + "torpedo_thruster": "face_attached", + "trinitite": "plain", + "trinitite_glass": "plain", + "trinitite_glass_stairs": "stairs", + "trinitite_glass_trapdoor": "trapdoor", + "type_1_bc_muzzle_brake": "horizontal", + "type_2_bc_muzzle_brake": "horizontal", + "uranium_depleted_block": "plain", + "uranium_enriched_block": "plain", + "uranium_neutral_block": "plain", + "uranium_ore": "plain", + "white_armor": "plain", + "white_armor_optic": "horizontal", + "white_armor_slab": "slab", + "white_armor_stairs": "stairs", + "white_armor_trapdoor": "trapdoor", + "wire_fence": "plain", + "yellow_armor": "plain", + "yellow_armor_optic": "horizontal", + "yellow_armor_slab": "slab", + "yellow_armor_stairs": "stairs", + "yellow_armor_trapdoor": "trapdoor", + "zinc_block": "plain", + "zinc_ore": "plain" + }, "blocks_from_blockstates": [ "active_robot_chute", "advanced_alloy_block", diff --git a/tools/generate_port_sources.py b/tools/generate_port_sources.py index d9594b9..230f94f 100644 --- a/tools/generate_port_sources.py +++ b/tools/generate_port_sources.py @@ -21,6 +21,7 @@ def main() -> None: with zipfile.ZipFile(jar) as archive: names = archive.namelist() block_names = sorted(stem(n) for n in names if n.startswith(f"assets/{MODID}/blockstates/") and n.endswith(".json")) + block_kinds = {name: block_kind(archive, name) for name in block_names} item_model_names = sorted(stem(n) for n in names if n.startswith(f"assets/{MODID}/models/item/") and n.endswith(".json")) standalone_items = sorted(name for name in item_model_names if name not in set(block_names)) @@ -32,6 +33,7 @@ def main() -> None: "source_sha1": "528d81630a23fb4004e3abdd99b16bd225cd1e92", "modid": MODID, "blocks_from_blockstates": block_names, + "block_kinds": block_kinds, "standalone_items_from_item_models": standalone_items, "counts": { "blockstates": len(block_names), @@ -45,13 +47,39 @@ def main() -> None: }, } write_json(INVENTORY_DIR / "original-inventory.json", inventory) - write_generated_registries(block_names, standalone_items) + write_generated_registries(block_names, block_kinds, standalone_items) def stem(path: str) -> str: return Path(path).name.removesuffix(".json") +def block_kind(archive: zipfile.ZipFile, name: str) -> str: + with archive.open(f"assets/{MODID}/blockstates/{name}.json") as handle: + data = json.loads(handle.read().decode("utf-8")) + keys: set[str] = set() + for variant in data.get("variants", {}): + if not variant: + continue + for part in variant.split(","): + keys.add(part.split("=")[0]) + if {"facing", "half", "hinge", "open"}.issubset(keys): + return "door" + if {"facing", "half", "open"}.issubset(keys): + return "trapdoor" + if {"facing", "half", "shape"}.issubset(keys): + return "stairs" + if "type" in keys: + return "slab" + if {"face", "facing"}.issubset(keys): + return "face_attached" + if "axis" in keys: + return "axis" + if "facing" in keys: + return "horizontal" + return "plain" + + def extract_resources(archive: zipfile.ZipFile) -> None: for info in archive.infolist(): if info.is_dir(): @@ -79,7 +107,7 @@ def migrate_data_path(path: str) -> str: return path -def write_generated_registries(blocks: list[str], items: list[str]) -> None: +def write_generated_registries(blocks: list[str], block_kinds: dict[str, str], items: list[str]) -> None: package_dir = GENERATED_JAVA / "net" / "mcreator" / "crustychunks" / "init" package_dir.mkdir(parents=True, exist_ok=True) used: set[str] = set() @@ -87,6 +115,7 @@ def write_generated_registries(blocks: list[str], items: list[str]) -> None: "package net.mcreator.crustychunks.init;", "", "import net.mcreator.crustychunks.CrustyChunksMod;", + "import net.minecraft.core.Direction;", "import net.minecraft.core.registries.Registries;", "import net.minecraft.network.chat.Component;", "import net.minecraft.world.item.BlockItem;", @@ -94,8 +123,21 @@ def write_generated_registries(blocks: list[str], items: list[str]) -> None: "import net.minecraft.world.item.Item;", "import net.minecraft.world.item.ItemStack;", "import net.minecraft.world.item.Items;", + "import net.minecraft.world.item.context.BlockPlaceContext;", "import net.minecraft.world.level.block.Block;", + "import net.minecraft.world.level.block.Blocks;", + "import net.minecraft.world.level.block.DoorBlock;", + "import net.minecraft.world.level.block.FaceAttachedHorizontalDirectionalBlock;", + "import net.minecraft.world.level.block.HorizontalDirectionalBlock;", + "import net.minecraft.world.level.block.RotatedPillarBlock;", + "import net.minecraft.world.level.block.SlabBlock;", + "import net.minecraft.world.level.block.StairBlock;", + "import net.minecraft.world.level.block.TrapDoorBlock;", + "import net.minecraft.world.level.block.state.BlockState;", "import net.minecraft.world.level.block.state.BlockBehaviour;", + "import net.minecraft.world.level.block.state.StateDefinition;", + "import net.minecraft.world.level.block.state.properties.AttachFace;", + "import net.minecraft.world.level.block.state.properties.BlockSetType;", "import net.neoforged.bus.api.IEventBus;", "import net.neoforged.neoforge.registries.DeferredHolder;", "import net.neoforged.neoforge.registries.DeferredRegister;", @@ -109,7 +151,8 @@ def write_generated_registries(blocks: list[str], items: list[str]) -> None: for name in blocks: ident = safe_java_identifier(name, used) - lines.append(f' public static final DeferredHolder {ident} = BLOCKS.register("{name}", () -> new Block(BlockBehaviour.Properties.of().strength(2.0F, 6.0F)));') + kind = block_kinds.get(name, "plain") + lines.append(f' public static final DeferredHolder {ident} = BLOCKS.register("{name}", () -> createBlock("{kind}"));') lines.append(f' public static final DeferredHolder {ident}_ITEM = ITEMS.register("{name}", () -> new BlockItem({ident}.get(), new Item.Properties()));') for name in items: @@ -132,6 +175,49 @@ def write_generated_registries(blocks: list[str], items: list[str]) -> None: " ITEMS.register(modBus);", " CREATIVE_TABS.register(modBus);", " }", + "", + " private static Block createBlock(String kind) {", + " BlockBehaviour.Properties properties = BlockBehaviour.Properties.of().strength(2.0F, 6.0F);", + " return switch (kind) {", + ' case "axis" -> new RotatedPillarBlock(properties);', + ' case "door" -> new DoorBlock(BlockSetType.IRON, properties);', + ' case "face_attached" -> new GeneratedFaceAttachedHorizontalBlock(properties);', + ' case "horizontal" -> new GeneratedHorizontalBlock(properties);', + ' case "slab" -> new SlabBlock(properties);', + ' case "stairs" -> new StairBlock(Blocks.STONE.defaultBlockState(), properties);', + ' case "trapdoor" -> new TrapDoorBlock(BlockSetType.IRON, properties);', + " default -> new Block(properties);", + " };", + " }", + "", + " private static final class GeneratedHorizontalBlock extends HorizontalDirectionalBlock {", + " private GeneratedHorizontalBlock(BlockBehaviour.Properties properties) {", + " super(properties);", + " registerDefaultState(stateDefinition.any().setValue(FACING, Direction.NORTH));", + " }", + "", + " @Override", + " public BlockState getStateForPlacement(BlockPlaceContext context) {", + " return defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite());", + " }", + "", + " @Override", + " protected void createBlockStateDefinition(StateDefinition.Builder builder) {", + " builder.add(FACING);", + " }", + " }", + "", + " private static final class GeneratedFaceAttachedHorizontalBlock extends FaceAttachedHorizontalDirectionalBlock {", + " private GeneratedFaceAttachedHorizontalBlock(BlockBehaviour.Properties properties) {", + " super(properties);", + " registerDefaultState(stateDefinition.any().setValue(FACING, Direction.NORTH).setValue(FACE, AttachFace.FLOOR));", + " }", + "", + " @Override", + " protected void createBlockStateDefinition(StateDefinition.Builder builder) {", + " builder.add(FACING, FACE);", + " }", + " }", "}", "", ])