diff --git a/docs/blocks/block-list.md b/docs/blocks/block-list.md new file mode 100644 index 0000000..394647f --- /dev/null +++ b/docs/blocks/block-list.md @@ -0,0 +1,1866 @@ +--- +title: Blocks +--- + +# Blocks in Minecraft Legends +## Block List +Here is a list of all of the blocks that are used in Minecraft Legends. They are used in world generation or in structures. + +| Name | +| :---------------------------------------------------------: | +| badger:block_alabaster | +| badger:block_alabaster_alive | +| badger:block_alabaster_carved | +| badger:block_alabaster_carved_mossy | +| badger:block_alabaster_carved_mossy_dead | +| badger:block_alabaster_carved_redstone | +| badger:block_alabaster_carved_top | +| badger:block_alabaster_carved_top_var01 | +| badger:block_alabaster_carved_var01 | +| badger:block_alabaster_carved_var01_alive | +| badger:block_alabaster_carved_var01_dead | +| badger:block_alabaster_carved_var02 | +| badger:block_alabaster_dead | +| badger:block_alabaster_frosted | +| badger:block_alabaster_frosted_var01 | +| badger:block_alabaster_moss_top | +| badger:block_alabaster_moss_top_alive | +| badger:block_alabaster_moss_top_corrupt_dead | +| badger:block_alabaster_moss_top_side | +| badger:block_alabaster_moss_top_side_alive | +| badger:block_alabaster_moss_top_side_corrupt_dead | +| badger:block_alabaster_moss_top_side_dead | +| badger:block_alabaster_mossy | +| badger:block_alabaster_mossy_alive | +| badger:block_alabaster_mossy_corrupt_dead | +| badger:block_alabaster_mossy_dead | +| badger:block_alabaster_stone | +| badger:block_alabaster_stone_alive | +| badger:block_alabaster_stone_brick | +| badger:block_alabaster_stone_column | +| badger:block_alabaster_stone_column_bottom | +| badger:block_alabaster_stone_column_top | +| badger:block_alabaster_stone_dead | +| badger:block_alabaster_stone_moss_top | +| badger:block_alabaster_stone_moss_top_alive | +| badger:block_alabaster_stone_moss_top_dead | +| badger:block_alabaster_teamcolor | +| badger:block_alabaster_var01 | +| badger:block_alabaster_var02 | +| badger:block_alpha | +| badger:block_alpine_rock_01 | +| badger:block_alpine_rock_02 | +| badger:block_alpine_rock_03 | +| badger:block_alpine_rock_04 | +| badger:block_alpine_rock_05 | +| badger:block_alpine_rock_06 | +| badger:block_alpine_rock_snowy_01 | +| badger:block_alpine_rock_snowy_02 | +| badger:block_alpine_rock_transition | +| badger:block_alpine_rock_transition_med | +| badger:block_alpine_rock_transition_top | +| badger:block_aquastone | +| badger:block_barrier_boss | +| badger:block_barrier_door | +| badger:block_barrier_path | +| badger:block_barrier_soft | +| badger:block_barrier_soft_denether | +| badger:block_barrier_solid | +| badger:block_barrier_waterfall | +| badger:block_bedrock | +| badger:block_blackrock_a | +| badger:block_blackrock_b | +| badger:block_blackrock_b_var01 | +| badger:block_blackrock_b_var02 | +| badger:block_blackrock_b_var03 | +| badger:block_blackrock_c | +| badger:block_bone | +| badger:block_bone_bottom | +| badger:block_bone_dark | +| badger:block_bone_frosted | +| badger:block_bone_leather | +| badger:block_bone_leather_var01 | +| badger:block_bone_marrow | +| badger:block_bone_netherack_bottom | +| badger:block_bone_netherrack | +| badger:block_bone_top | +| badger:block_bone_var01 | +| badger:block_bone_var02 | +| badger:block_bone_var03 | +| badger:block_bonetwr_base_01 | +| badger:block_bonetwr_base_02 | +| badger:block_bonetwr_base_03 | +| badger:block_bonetwr_mid | +| badger:block_bonetwr_top | +| badger:block_bookshelf | +| badger:block_boulder | +| badger:block_boulder_frostland | +| badger:block_boulder_frostland_01 | +| badger:block_boulder_frostland_bottom_01 | +| badger:block_boulder_frostland_bottom_02 | +| badger:block_boulder_frostland_mid | +| badger:block_boulder_lake_01 | +| badger:block_boulder_lake_02 | +| badger:block_boulder_lake_03 | +| badger:block_boulder_lake_04 | +| badger:block_boulder_lake_mid_01 | +| badger:block_boulder_lake_moss_01 | +| badger:block_boulder_mid | +| badger:block_boulder_mid_var01 | +| badger:block_boulder_mid_var02 | +| badger:block_boulder_top_var01 | +| badger:block_boulder_top_var02 | +| badger:block_boulder_top_var03 | +| badger:block_brick_bone | +| badger:block_brick_copper | +| badger:block_brick_gold_corrupted | +| badger:block_brick_gold_corrupted_rust_var04 | +| badger:block_brick_iron_wrought | +| badger:block_brick_iron_wrought_rust_var01 | +| badger:block_brick_netherrack | +| badger:block_brick_netherrite | +| badger:block_brick_netherrite_var01 | +| badger:block_brick_planks_spruce | +| badger:block_brick_redstone | +| badger:block_brick_rock_sulphur_var01 | +| badger:block_brick_sand | +| badger:block_brick_shaggy_moss_01 | +| badger:block_brick_slag | +| badger:block_brick_stone | +| badger:block_brick_stonebrick | +| badger:block_brick_tarrock | +| badger:block_brick_tree_cedar_trunk_01 | +| badger:block_brick_tree_mang_fallen_01 | +| badger:block_brick_tree_mang_trunk | +| badger:block_brick_tree_mang_trunk_dead | +| badger:block_brick_tree_mang_trunk_dead_03 | +| badger:block_brick_tree_mang_trunk_dead_05 | +| badger:block_brick_tree_mang_vine_moss | +| badger:block_brick_tree_mang_vine_moss_v01 | +| badger:block_brick_tree_poison_vine_moss | +| badger:block_brick_tree_willow_trunk | +| badger:block_brick_tree_willow_trunk_02 | +| badger:block_bubblerack_light | +| badger:block_bubblerack_light_corner | +| badger:block_bubblerack_side | +| badger:block_bubblerack_transition | +| badger:block_bubblerack_transition_corner | +| badger:block_buff_jumpshroom | +| badger:block_buff_jumpshroom_top_01 | +| badger:block_buff_jumpshroom_top_02 | +| badger:block_buff_jumpshroom_top_03 | +| badger:block_buff_jumpshroom_top_04 | +| badger:block_bufftrigger_health | +| badger:block_burning_edge | +| badger:block_burning_edge_var01 | +| badger:block_burning_edge_var02 | +| badger:block_burning_edge_var03 | +| badger:block_burning_edge_var04 | +| badger:block_burning_edge_var05 | +| badger:block_burning_edge_var06 | +| badger:block_burning_edge_var07 | +| badger:block_burning_edge_var08 | +| badger:block_burning_edge_vfx | +| badger:block_carpet_algae_01 | +| badger:block_carpet_algae_02 | +| badger:block_carpet_algae_03 | +| badger:block_carpet_blue_culture01 | +| badger:block_carpet_burning_edge_var01 | +| badger:block_carpet_frostice_blend_01 | +| badger:block_carpet_plant_coralfan_01 | +| badger:block_carpet_plant_coralfan_02 | +| badger:block_carpet_plant_coralfan_03 | +| badger:block_carpet_plant_coralfan_04 | +| badger:block_carpet_plant_coralfan_05 | +| badger:block_carpet_plant_coralfan_06 | +| badger:block_carpet_plant_giantlily | +| badger:block_carpet_plant_giantlily_var01 | +| badger:block_carpet_riverbed_blend_01 | +| badger:block_carpet_sand_d2 | +| badger:block_carpet_sand_d3 | +| badger:block_carpet_slag | +| badger:block_carpet_tree_mangrove_01 | +| badger:block_carpet_yellow_culture01 | +| badger:block_chunk_alabaster | +| badger:block_chunk_bone | +| badger:block_chunk_boulder_lake_01 | +| badger:block_chunk_boulder_mid_var01 | +| badger:block_chunk_dark_oak | +| badger:block_chunk_gold_corrupted | +| badger:block_chunk_iron_wrought | +| badger:block_chunk_log_spruce | +| badger:block_chunk_mushroom_light | +| badger:block_chunk_netherite_var01 | +| badger:block_chunk_netherrack | +| badger:block_chunk_ore_coal | +| badger:block_chunk_ore_diamond | +| badger:block_chunk_ore_iron | +| badger:block_chunk_ore_redstone | +| badger:block_chunk_redstone | +| badger:block_chunk_stonebrick | +| badger:block_chunk_tarrock | +| badger:block_chunk_tree_cedar_trunk_01 | +| badger:block_chunk_tree_mang_trunk_dead | +| badger:block_chunk_tree_mang_trunk_dead_03 | +| badger:block_chunk_tree_mang_trunk_dead_05 | +| badger:block_chunk_tree_mang_vine | +| badger:block_chunk_tree_mang_vine_moss | +| badger:block_chunk_tree_poison_vine_01 | +| badger:block_cliffdirt_01 | +| badger:block_cliffdirt_02 | +| badger:block_cliffdirt_03 | +| badger:block_cliffdirt_04 | +| badger:block_coal | +| badger:block_coal_burning_base | +| badger:block_coal_burning_top | +| badger:block_coal_light | +| badger:block_coal_light_to_dark | +| badger:block_cobblestone | +| badger:block_cobblestone_cracked | +| badger:block_cobblestone_mossy | +| badger:block_column_alabaster | +| badger:block_column_alabaster_stone | +| badger:block_column_bone | +| badger:block_column_bone_bottom | +| badger:block_column_bone_moss | +| badger:block_column_bone_netherrack | +| badger:block_column_bone_netherrack_bottom | +| badger:block_column_bone_var02 | +| badger:block_column_capital_culture01_var01 | +| badger:block_column_culture01_var01 | +| badger:block_column_culture01_var02 | +| badger:block_column_firework_blue | +| badger:block_column_firework_blue_wrapped | +| badger:block_column_firework_red | +| badger:block_column_firework_red_wrapped | +| badger:block_column_gold_corrupted | +| badger:block_column_iron_wrought | +| badger:block_column_iron_wrought_hot | +| badger:block_column_iron_wrought_hot_bottom | +| badger:block_column_iron_wrought_moss | +| badger:block_column_iron_wrought_rust | +| badger:block_column_log_dark_oak | +| badger:block_column_log_spruce | +| badger:block_column_nether_wart_warped | +| badger:block_column_netherrack | +| badger:block_column_netherrack_moss | +| badger:block_column_netherrack_var01 | +| badger:block_column_netherrite_var01 | +| badger:block_column_prismarine_carved_bottom_light | +| badger:block_column_prismarine_carved_bottom_light_alive | +| badger:block_column_prismarine_carved_bottom_light_dead | +| badger:block_column_prismarine_carved_bottom_light_disabled | +| badger:block_column_prismarine_carved_middle | +| badger:block_column_prismarine_carved_middle_alive | +| badger:block_column_prismarine_carved_middle_dead | +| badger:block_column_prismarine_carved_middle_disabled | +| badger:block_column_prismarine_carved_top | +| badger:block_column_prismarine_carved_top_disabled | +| badger:block_column_stonebrick | +| badger:block_column_stonebrick_carved_var01 | +| badger:block_column_stonebrick_carved_var01_cracked | +| badger:block_column_stonebrick_cracked | +| badger:block_column_stucco | +| badger:block_column_tree_horsetail_stripped | +| badger:block_column_tree_mushroom_trunk_base_01 | +| badger:block_column_tree_mushroom_trunk_mid | +| badger:block_column_tree_mushroom_trunk_top | +| badger:block_copper | +| badger:block_copper_var01 | +| badger:block_coralstone_a | +| badger:block_crystalarch_02 | +| badger:block_crystalarch_03 | +| badger:block_crystalarch_04 | +| badger:block_crystalarch_05 | +| badger:block_crystalarch_06 | +| badger:block_crystalobelisk_base_01_light | +| badger:block_culture01_base | +| badger:block_culture01_middle | +| badger:block_culture01_middle_var01 | +| badger:block_culture01_top | +| badger:block_dark_oak_carved | +| badger:block_dead_mushroom_cap_01 | +| badger:block_dead_mushroom_cap_02 | +| badger:block_dead_mushroom_trunk_base_01 | +| badger:block_dead_mushroom_trunk_base_02 | +| badger:block_dead_mushroom_trunk_base_03 | +| badger:block_dead_mushroom_trunk_base_05 | +| badger:block_deco_allegiance_banners | +| badger:block_deco_allegiance_banners_disabled | +| badger:block_deco_allegiance_cage | +| badger:block_deco_allegiance_cage_disabled | +| badger:block_deco_anti_siege | +| badger:block_deco_banner_attack | +| badger:block_deco_banner_attack_cloth | +| badger:block_deco_banner_attack_small | +| badger:block_deco_banner_crowsnest | +| badger:block_deco_banner_defend_small | +| badger:block_deco_banner_defense | +| badger:block_deco_banner_defense_cloth | +| badger:block_deco_banner_obstacle | +| badger:block_deco_banner_obstacle_cloth | +| badger:block_deco_banner_obstacle_small | +| badger:block_deco_banner_pvp_hq | +| badger:block_deco_banner_village_allegiance | +| badger:block_deco_barrel | +| badger:block_deco_bramble | +| badger:block_deco_bramble_var01 | +| badger:block_deco_bramble_var02 | +| badger:block_deco_brazier_mount_player | +| badger:block_deco_brazier_piglin | +| badger:block_deco_brazier_piglin_large | +| badger:block_deco_brazier_piglin_netherite | +| badger:block_deco_brazier_piglin_sheet | +| badger:block_deco_brazier_player | +| badger:block_deco_brazier_player_var01 | +| badger:block_deco_chain | +| badger:block_deco_chain_beacon | +| badger:block_deco_chain_middle | +| badger:block_deco_chair_back_end_culture01 | +| badger:block_deco_chair_back_middle_culture01 | +| badger:block_deco_chair_base_end_culture01 | +| badger:block_deco_chair_base_middle_culture01 | +| badger:block_deco_chair_corner_culture01 | +| badger:block_deco_chair_oak | +| badger:block_deco_chair_stone | +| badger:block_deco_container_culture01_var01 | +| badger:block_deco_container_culture01_var02 | +| badger:block_deco_container_culture01_var03 | +| badger:block_deco_culture01_pillar_base | +| badger:block_deco_culture01_pillar_base_deactivated | +| badger:block_deco_culture01_support | +| badger:block_deco_culture01_support_deactivated | +| badger:block_deco_dark_beacon | +| badger:block_deco_drygrass_scatter_01 | +| badger:block_deco_drygrass_scatter_01b | +| badger:block_deco_drygrass_scatter_01c | +| badger:block_deco_drygrass_scatter_01d | +| badger:block_deco_drygrass_scatter_01e | +| badger:block_deco_drygrass_scatter_02 | +| badger:block_deco_drygrass_scatter_02b | +| badger:block_deco_drygrass_scatter_02c | +| badger:block_deco_drygrass_scatter_02d | +| badger:block_deco_drygrass_scatter_02e | +| badger:block_deco_drygrass_scatter_02f | +| badger:block_deco_drygrass_scatter_02g | +| badger:block_deco_drygrass_scatter_03 | +| badger:block_deco_drygrass_scatter_03b | +| badger:block_deco_drygrass_scatter_03c | +| badger:block_deco_drygrass_scatter_03d | +| badger:block_deco_drygrass_scatter_03e | +| badger:block_deco_drygrass_scatter_04 | +| badger:block_deco_drygrass_scatter_04b | +| badger:block_deco_drygrass_scatter_04c | +| badger:block_deco_drygrass_scatter_04d | +| badger:block_deco_drygrass_scatter_04e | +| badger:block_deco_drygrass_scatter_05 | +| badger:block_deco_drygrass_scatter_05b | +| badger:block_deco_drygrass_scatter_05c | +| badger:block_deco_drygrass_scatter_05d | +| badger:block_deco_drygrass_scatter_05e | +| badger:block_deco_drygrass_scatter_06 | +| badger:block_deco_drygrass_scatter_06b | +| badger:block_deco_drygrass_scatter_06c | +| badger:block_deco_engine_piglin_large | +| badger:block_deco_engine_piglin_small | +| badger:block_deco_engine_piglin_small_blade | +| badger:block_deco_engine_piglin_small_pipe | +| badger:block_deco_engine_piglin_small_slab | +| badger:block_deco_feathers | +| badger:block_deco_feathers_var01 | +| badger:block_deco_firelily_01 | +| badger:block_deco_flower_begonia_01 | +| badger:block_deco_flower_begonia_02 | +| badger:block_deco_flower_begonia_03 | +| badger:block_deco_flower_begonia_04 | +| badger:block_deco_flower_begonia_05 | +| badger:block_deco_flower_meadow_01 | +| badger:block_deco_flower_meadow_02 | +| badger:block_deco_flower_meadow_03 | +| badger:block_deco_flower_mountain_01 | +| badger:block_deco_flower_mountain_02 | +| badger:block_deco_flower_mountain_03 | +| badger:block_deco_flowerscatter_01 | +| badger:block_deco_flowerscatter_02 | +| badger:block_deco_flowerscatter_03 | +| badger:block_deco_flowerscatter_alive_02 | +| badger:block_deco_fol_drygrass_01 | +| badger:block_deco_fol_drygrass_02 | +| badger:block_deco_fol_drygrass_03 | +| badger:block_deco_fol_drygrass_04 | +| badger:block_deco_fol_drygrass_05 | +| badger:block_deco_fol_frondclump_01 | +| badger:block_deco_fol_frondclump_02 | +| badger:block_deco_fol_frondclump_03 | +| badger:block_deco_fol_frondclump_04 | +| badger:block_deco_fol_frondclump_05 | +| badger:block_deco_fol_frondclump_06 | +| badger:block_deco_fol_grass_clump_dark_01 | +| badger:block_deco_fol_grass_clump_dark_02 | +| badger:block_deco_fol_grass_clump_frost_01 | +| badger:block_deco_fol_grass_clump_frost_02 | +| badger:block_deco_fol_grass_clump_snow_01 | +| badger:block_deco_fol_horsetail_grass_01 | +| badger:block_deco_fol_horsetail_grass_02 | +| badger:block_deco_fol_horsetail_grass_03 | +| badger:block_deco_fol_moss_01 | +| badger:block_deco_fol_moss_02 | +| badger:block_deco_fol_moss_03 | +| badger:block_deco_fol_wofgrass_01 | +| badger:block_deco_fol_wofgrass_02 | +| badger:block_deco_fol_wofgrass_03 | +| badger:block_deco_fol_wofgrass_04 | +| badger:block_deco_fol_wofgrass_05 | +| badger:block_deco_fountain_arch | +| badger:block_deco_fountain_arch_deactivated | +| badger:block_deco_fountain_cage | +| badger:block_deco_fountain_cage_deactivated | +| badger:block_deco_fountain_trim | +| badger:block_deco_fountain_trim_deactivated | +| badger:block_deco_frostgrass_a | +| badger:block_deco_frostgrass_b | +| badger:block_deco_frostgrass_c | +| badger:block_deco_geyser_01 | +| badger:block_deco_glowplant_01 | +| badger:block_deco_glowplant_02 | +| badger:block_deco_glowplant_03 | +| badger:block_deco_glowplant_04 | +| badger:block_deco_grass_clump_02 | +| badger:block_deco_grass_clump_03 | +| badger:block_deco_grass_clump_04 | +| badger:block_deco_grass_clump_05 | +| badger:block_deco_grass_clump_dry_01 | +| badger:block_deco_grass_clump_dry_02 | +| badger:block_deco_grass_wide_bladed_01 | +| badger:block_deco_grass_wide_bladed_02 | +| badger:block_deco_grass_wide_bladed_03 | +| badger:block_deco_grass_wide_bladed_04 | +| badger:block_deco_grassrush_01 | +| badger:block_deco_grassrush_01b | +| badger:block_deco_green_plant_01 | +| badger:block_deco_green_plant_02 | +| badger:block_deco_hazard_thornvine_01 | +| badger:block_deco_hazard_thornvine_01b | +| badger:block_deco_hazard_thornvine_02 | +| badger:block_deco_hazard_thornvine_02b | +| badger:block_deco_hazard_thornvine_03 | +| badger:block_deco_hazard_thornvine_03b | +| badger:block_deco_hazard_thornvine_04 | +| badger:block_deco_hazard_thornvine_04b | +| badger:block_deco_head_attack_small | +| badger:block_deco_house_pillow | +| badger:block_deco_house_pillow_var02 | +| badger:block_deco_house_pillow_var03 | +| badger:block_deco_icegrass_01 | +| badger:block_deco_icegrass_02 | +| badger:block_deco_icegrass_03 | +| badger:block_deco_iron_anti_siege | +| badger:block_deco_kaboomery_crate_oak | +| badger:block_deco_lake_boulder_03 | +| badger:block_deco_lake_boulder_04 | +| badger:block_deco_lakeshore_var01 | +| badger:block_deco_lakeshore_var02 | +| badger:block_deco_lakeshore_var03 | +| badger:block_deco_lakeshore_var04 | +| badger:block_deco_lantern_piglin_mushroom | +| badger:block_deco_lantern_piglin_mushroom_sml | +| badger:block_deco_leather_piglin | +| badger:block_deco_megafern_01 | +| badger:block_deco_megafern_02 | +| badger:block_deco_mini_mushroom_01 | +| badger:block_deco_mini_mushroom_02 | +| badger:block_deco_moss | +| badger:block_deco_moss_var01 | +| badger:block_deco_moss_var02 | +| badger:block_deco_moss_var03 | +| badger:block_deco_moss_vine_var02 | +| badger:block_deco_mounted_horn_attack | +| badger:block_deco_mounted_horn_defense | +| badger:block_deco_mounted_horn_obstacle | +| badger:block_deco_mounted_horn_single | +| badger:block_deco_mysterious_rock_01 | +| badger:block_deco_mysterious_rock_02 | +| badger:block_deco_mysterious_rock_03 | +| badger:block_deco_mysterious_rock_04 | +| badger:block_deco_nether_brick_pipe_01 | +| badger:block_deco_nether_grass | +| badger:block_deco_nether_grass_dried | +| badger:block_deco_nether_grass_dried_small | +| badger:block_deco_nether_grass_rust | +| badger:block_deco_nether_grass_rust_small | +| badger:block_deco_nether_grass_rust_tall | +| badger:block_deco_nether_grass_small | +| badger:block_deco_nether_grass_tall | +| badger:block_deco_nether_grass_tall_dried | +| badger:block_deco_nether_grass_warped | +| badger:block_deco_nether_grass_warped_small | +| badger:block_deco_nether_grass_warped_tall | +| badger:block_deco_netherrite_gold_pipe | +| badger:block_deco_netherwart_dried_large | +| badger:block_deco_netherwart_dried_small | +| badger:block_deco_netherwart_large | +| badger:block_deco_netherwart_rust_large | +| badger:block_deco_netherwart_rust_small | +| badger:block_deco_netherwart_small | +| badger:block_deco_netherwart_warped_large | +| badger:block_deco_netherwart_warped_small | +| badger:block_deco_netherwart_warped_small_var01 | +| badger:block_deco_netherwart_warped_small_var02 | +| badger:block_deco_netherwart_warped_torch | +| badger:block_deco_nose_piglin | +| badger:block_deco_obelisk_health_buff_01 | +| badger:block_deco_obelisk_health_buff_02 | +| badger:block_deco_obelisk_health_buff_03 | +| badger:block_deco_obelisk_health_buff_04 | +| badger:block_deco_obelisk_health_buff_05 | +| badger:block_deco_obelisk_health_buff_06 | +| badger:block_deco_obelisk_health_buff_07 | +| badger:block_deco_obelisk_health_buff_08 | +| badger:block_deco_obelisk_health_buff_09 | +| badger:block_deco_obeliskgrass_01 | +| badger:block_deco_obeliskgrass_02 | +| badger:block_deco_orange_flower_01 | +| badger:block_deco_orange_flower_02 | +| badger:block_deco_phoenix_feathers | +| badger:block_deco_phoenix_feathers_var01 | +| badger:block_deco_piglin_banner_disruptor | +| badger:block_deco_piglin_banner_disruptor_attack | +| badger:block_deco_piglin_banner_disruptor_obstacle | +| badger:block_deco_piglin_banner_melee | +| badger:block_deco_piglin_banner_melee_attack | +| badger:block_deco_piglin_banner_melee_obstacle | +| badger:block_deco_piglin_banner_ranged | +| badger:block_deco_piglin_banner_ranged_attack | +| badger:block_deco_piglin_banner_ranged_obstacle | +| badger:block_deco_piglin_engine_middle | +| badger:block_deco_piglin_head_attack | +| badger:block_deco_piglin_head_attack_small | +| badger:block_deco_piglin_head_attack_small_hor | +| badger:block_deco_piglin_pyre | +| badger:block_deco_pipe_head | +| badger:block_deco_pipe_head_large | +| badger:block_deco_pipe_head_slab | +| badger:block_deco_pipe_netherwart | +| badger:block_deco_pipe_netherwart_mushrooms | +| badger:block_deco_pipe_vent | +| badger:block_deco_pipe_vent_no_fx | +| badger:block_deco_plant_brokenlands_drygrass_01 | +| badger:block_deco_plant_brokenlands_drygrass_02 | +| badger:block_deco_plant_brokenlands_drygrass_03 | +| badger:block_deco_plant_brokenlands_drygrass_04 | +| badger:block_deco_plant_brokenlands_drygrass_05 | +| badger:block_deco_plant_bullrush_01 | +| badger:block_deco_plant_bullrush_02 | +| badger:block_deco_plant_bullrush_03 | +| badger:block_deco_plant_bullrush_04 | +| badger:block_deco_plant_bullrush_05 | +| badger:block_deco_plant_bullrush_06 | +| badger:block_deco_plant_coralfanbit_01 | +| badger:block_deco_plant_coralfanbit_02 | +| badger:block_deco_plant_coralfanbit_03 | +| badger:block_deco_plant_coralfanbit_04 | +| badger:block_deco_plant_coralfanbit_05 | +| badger:block_deco_plant_coralfanbit_06 | +| badger:block_deco_plant_coralflower_01 | +| badger:block_deco_plant_coralflower_02 | +| badger:block_deco_plant_coralflower_03 | +| badger:block_deco_plant_corpse_flower_medium | +| badger:block_deco_plant_corpse_petal | +| badger:block_deco_plant_corpse_petal_large | +| badger:block_deco_plant_daisy_01 | +| badger:block_deco_plant_daisy_02 | +| badger:block_deco_plant_daisy_02_structure | +| badger:block_deco_plant_daisy_03 | +| badger:block_deco_plant_daisy_03_structure | +| badger:block_deco_plant_daisy_alive_01 | +| badger:block_deco_plant_daisy_alive_02_structure | +| badger:block_deco_plant_daisy_alive_03_structure | +| badger:block_deco_plant_driedstalks_01 | +| badger:block_deco_plant_driedstalks_02 | +| badger:block_deco_plant_dry_moss_01 | +| badger:block_deco_plant_drygrass_festuca_glauca_01 | +| badger:block_deco_plant_drygrass_festuca_glauca_02 | +| badger:block_deco_plant_drygrass_festuca_glauca_03 | +| badger:block_deco_plant_drygrass_festuca_glauca_04 | +| badger:block_deco_plant_drylands_buds_01 | +| badger:block_deco_plant_drylands_buds_02 | +| badger:block_deco_plant_drylands_buds_03 | +| badger:block_deco_plant_drylands_goldenrod_01 | +| badger:block_deco_plant_drylands_goldenrod_02 | +| badger:block_deco_plant_drylands_goldenrod_03 | +| badger:block_deco_plant_drylands_stalks_01 | +| badger:block_deco_plant_drylands_stalks_02 | +| badger:block_deco_plant_drylands_stalks_03 | +| badger:block_deco_plant_drylands_stalks_04 | +| badger:block_deco_plant_fategrass_01 | +| badger:block_deco_plant_fategrass_02 | +| badger:block_deco_plant_fategrass_03 | +| badger:block_deco_plant_fategrass_04 | +| badger:block_deco_plant_fategrass_05 | +| badger:block_deco_plant_fategrass_alive_01 | +| badger:block_deco_plant_fategrass_alive_03 | +| badger:block_deco_plant_foxglove_01 | +| badger:block_deco_plant_foxglove_02 | +| badger:block_deco_plant_foxglove_03 | +| badger:block_deco_plant_foxglove_04 | +| badger:block_deco_plant_foxglove_alive_03 | +| badger:block_deco_plant_foxglove_alive_04 | +| badger:block_deco_plant_grass_redhorn_01 | +| badger:block_deco_plant_grass_redhorn_02 | +| badger:block_deco_plant_grass_redhorn_03 | +| badger:block_deco_plant_grassrush_02 | +| badger:block_deco_plant_grassrush_03 | +| badger:block_deco_plant_greenblade_01 | +| badger:block_deco_plant_greenblade_02 | +| badger:block_deco_plant_greenblade_03 | +| badger:block_deco_plant_greenblade_flower_01 | +| badger:block_deco_plant_greenblade_flower_02 | +| badger:block_deco_plant_greenblade_flower_03 | +| badger:block_deco_plant_junglelily_01 | +| badger:block_deco_plant_junglelily_01_beetle | +| badger:block_deco_plant_junglelily_01_structure | +| badger:block_deco_plant_junglelily_02 | +| badger:block_deco_plant_junglelily_03 | +| badger:block_deco_plant_jungleplant_01 | +| badger:block_deco_plant_jungleplant_02 | +| badger:block_deco_plant_jungleplant_03 | +| badger:block_deco_plant_jungleplant_04 | +| badger:block_deco_plant_junglevine_01 | +| badger:block_deco_plant_junglevine_02 | +| badger:block_deco_plant_junglevine_03 | +| badger:block_deco_plant_junglevine_03_slab | +| badger:block_deco_plant_junglevine_04 | +| badger:block_deco_plant_mushroom_stalk_01 | +| badger:block_deco_plant_mushroom_stalk_02 | +| badger:block_deco_plant_mushroom_stalk_03 | +| badger:block_deco_plant_periwinkle_01 | +| badger:block_deco_plant_periwinkle_02 | +| badger:block_deco_plant_periwinkle_03 | +| badger:block_deco_plant_periwinkle_alive_01 | +| badger:block_deco_plant_red_mushroom | +| badger:block_deco_plant_red_mushroom_var01 | +| badger:block_deco_plant_red_mushroom_var02 | +| badger:block_deco_plant_whiteberry_01 | +| badger:block_deco_plant_whiteberry_02 | +| badger:block_deco_plant_whiteberry_03 | +| badger:block_deco_plant_wildflower_01 | +| badger:block_deco_plant_wildflower_02 | +| badger:block_deco_plant_wildflower_03 | +| badger:block_deco_plant_wildflower_alive_01 | +| badger:block_deco_plant_wildflower_alive_03 | +| badger:block_deco_plant_yellowstalks_01 | +| badger:block_deco_plant_yellowstalks_02 | +| badger:block_deco_plant_yellowstalks_03 | +| badger:block_deco_plant_yellowstalks_04 | +| badger:block_deco_plant_yellowstalks_05 | +| badger:block_deco_plant_yellowstalks_06 | +| badger:block_deco_player_lantern_chunk | +| badger:block_deco_player_lantern_chunk_stone | +| badger:block_deco_poison_grassrush_01 | +| badger:block_deco_post_netherrite_offset_left | +| badger:block_deco_post_netherrite_offset_right | +| badger:block_deco_post_netherrite_z_center_1 | +| badger:block_deco_post_netherrite_z_center_2 | +| badger:block_deco_post_netherrite_z_left | +| badger:block_deco_post_netherrite_z_right | +| badger:block_deco_redstone_button | +| badger:block_deco_saw | +| badger:block_deco_sconce_torch | +| badger:block_deco_sconce_torch_alabaster | +| badger:block_deco_sconce_torch_log_dark_oak | +| badger:block_deco_shaggy_leaves_01 | +| badger:block_deco_shaggy_leaves_02 | +| badger:block_deco_shaggy_leaves_03 | +| badger:block_deco_shaggy_leaves_04 | +| badger:block_deco_sheet_column_bone | +| badger:block_deco_sheet_column_gold | +| badger:block_deco_sheet_post_bone | +| badger:block_deco_sheet_spike_gold | +| badger:block_deco_sheet_spike_netherite | +| badger:block_deco_shotgun_tower | +| badger:block_deco_slab_geyser_01 | +| badger:block_deco_slab_geyser_corner_01 | +| badger:block_deco_snowgrass_01 | +| badger:block_deco_snowgrass_02 | +| badger:block_deco_snowgrass_03 | +| badger:block_deco_snowgrass_04 | +| badger:block_deco_snowgrass_05 | +| badger:block_deco_snowman | +| badger:block_deco_snowman_var01 | +| badger:block_deco_snowstalk_01 | +| badger:block_deco_snowstalk_02 | +| badger:block_deco_snowstalk_03 | +| badger:block_deco_snowy_grass_01 | +| badger:block_deco_snowy_grass_02 | +| badger:block_deco_snowy_grass_03 | +| badger:block_deco_snowy_grass_04 | +| badger:block_deco_snowy_moss_01 | +| badger:block_deco_spawner | +| badger:block_deco_spear_head | +| badger:block_deco_spear_head_small | +| badger:block_deco_spear_large | +| badger:block_deco_spear_medium | +| badger:block_deco_spear_small | +| badger:block_deco_speed_buff_01 | +| badger:block_deco_speed_buff_02 | +| badger:block_deco_speed_buff_03 | +| badger:block_deco_speed_buff_04 | +| badger:block_deco_speed_buff_05 | +| badger:block_deco_speed_buff_06 | +| badger:block_deco_spike | +| badger:block_deco_statue_head_piglin | +| badger:block_deco_supernether_connection | +| badger:block_deco_table_cake_culture01 | +| badger:block_deco_table_corner_culture01 | +| badger:block_deco_table_cupcake_culture01 | +| badger:block_deco_table_cupcakes_culture01 | +| badger:block_deco_table_middle_culture01 | +| badger:block_deco_table_vase_culture01 | +| badger:block_deco_tarstripe | +| badger:block_deco_terraced_grass_01 | +| badger:block_deco_terraced_grass_02 | +| badger:block_deco_terraced_grass_03 | +| badger:block_deco_torch | +| badger:block_deco_tower_eye | +| badger:block_deco_tower_eye_var01 | +| badger:block_deco_tree_cedar_branch_01 | +| badger:block_deco_tree_horsetail_flower | +| badger:block_deco_tree_horsetail_leaf | +| badger:block_deco_tree_horsetail_spikes | +| badger:block_deco_tree_horsetail_top | +| badger:block_deco_tree_horsetail_top_leaf | +| badger:block_deco_tree_lantern | +| badger:block_deco_tree_pineapple_top_01 | +| badger:block_deco_tree_pineapple_top_02 | +| badger:block_deco_tree_pineapple_top_03 | +| badger:block_deco_tree_pineapple_top_04 | +| badger:block_deco_tree_poison_trunk_top_01 | +| badger:block_deco_tropical_plant_01 | +| badger:block_deco_tropical_plant_02 | +| badger:block_deco_tropical_plant_03 | +| badger:block_deco_twig_grass_01 | +| badger:block_deco_twig_grass_02 | +| badger:block_deco_twig_grass_03 | +| badger:block_deco_twig_grass_04 | +| badger:block_deco_village_allegiance_cage | +| badger:block_deco_village_cloth_bend | +| badger:block_deco_village_cloth_bend_disabled | +| badger:block_deco_village_cloth_bottom | +| badger:block_deco_village_cloth_bottom_disabled | +| badger:block_deco_village_cloth_bottom_var01 | +| badger:block_deco_village_cloth_bottom_var01_disabled | +| badger:block_deco_village_cloth_flat | +| badger:block_deco_village_cloth_flat_back | +| badger:block_deco_village_cloth_flat_back_disabled | +| badger:block_deco_village_cloth_flat_disabled | +| badger:block_deco_village_cloth_side | +| badger:block_deco_village_cloth_side_disabled | +| badger:block_deco_village_cloth_side_var01 | +| badger:block_deco_village_cloth_side_var01_disabled | +| badger:block_deco_village_container | +| badger:block_deco_village_container_var01 | +| badger:block_deco_village_container_var02 | +| badger:block_deco_village_container_var03 | +| badger:block_deco_village_foliage | +| badger:block_deco_village_foliage_var01 | +| badger:block_deco_village_foliage_var02 | +| badger:block_deco_village_foliage_var03 | +| badger:block_deco_village_foliage_var04 | +| badger:block_deco_village_foliage_var05 | +| badger:block_deco_village_foliage_var06 | +| badger:block_deco_vindicator_banner | +| badger:block_deco_vindicator_chimney | +| badger:block_deco_vine_dead | +| badger:block_deco_vine_ivy | +| badger:block_deco_vine_ivy_alive | +| badger:block_deco_vine_ivy_alive_var01 | +| badger:block_deco_vine_ivy_dead | +| badger:block_deco_vine_ivy_dead_half | +| badger:block_deco_vine_ivy_dead_var01 | +| badger:block_deco_vine_ivy_half | +| badger:block_deco_vine_ivy_slab | +| badger:block_deco_vine_ivy_slab_dead | +| badger:block_deco_vine_ivy_slab_dead_var01 | +| badger:block_deco_vine_ivy_slab_var01 | +| badger:block_deco_vine_ivy_var01 | +| badger:block_deco_vine_ivy_var02 | +| badger:block_deco_vine_nether | +| badger:block_deco_vine_obstacle | +| badger:block_deco_vine_twisted | +| badger:block_deco_willow_leaves_01 | +| badger:block_deco_willow_leaves_02 | +| badger:block_deco_willow_leaves_03 | +| badger:block_deco_window_bolts_defend | +| badger:block_deco_window_bolts_defend_var01 | +| badger:block_deco_window_defend | +| badger:block_deco_window_netherite_bottom | +| badger:block_deco_window_netherite_corner | +| badger:block_deco_window_netherite_middle | +| badger:block_deco_window_netherite_middle_hor | +| badger:block_deco_window_netherite_top | +| badger:block_deco_window_netherite_var01_bottom | +| badger:block_deco_window_netherite_var01_middle | +| badger:block_deco_window_netherite_var02_bottom | +| badger:block_deco_window_netherite_var02_middle | +| badger:block_deco_window_netherite_var02_top | +| badger:block_deco_wof_cubelantern_01 | +| badger:block_deco_wof_cubelantern_light_01 | +| badger:block_deco_wof_floordecal_01 | +| badger:block_deco_wof_lightbeam | +| badger:block_deco_xp_ally | +| badger:block_deco_xp_bank | +| badger:block_deco_xp_banner | +| badger:block_deco_xp_flame | +| badger:block_deco_xp_lute | +| badger:block_deco_xp_ore | +| badger:block_deco_xp_tower_bank | +| badger:block_deco_zombie_mushroom | +| badger:block_deco_zombie_mushroom_small | +| badger:block_deco_zombie_stick | +| badger:block_deco_zombie_stick_var01 | +| badger:block_desertrock_a | +| badger:block_desertrock_a_var02 | +| badger:block_desertrock_b | +| badger:block_desertrock_b_dark | +| badger:block_desertrock_b_dark_var01 | +| badger:block_desertrock_b_rough | +| badger:block_desertrock_b_var01 | +| badger:block_dirt | +| badger:block_dirt_poison_01 | +| badger:block_dirt_poison_02 | +| badger:block_dirt_rock_var01 | +| badger:block_dirt_rock_var02 | +| badger:block_dirt_rock_var03 | +| badger:block_dirt_snowy | +| badger:block_edge_netherrite_01 | +| badger:block_edge_netherrite_02 | +| badger:block_fence_iron | +| badger:block_fence_spruce | +| badger:block_ferntrunk | +| badger:block_firework_blue | +| badger:block_firework_blue_wrapped | +| badger:block_firework_red | +| badger:block_firework_red_wrapped | +| badger:block_frost | +| badger:block_frost_dark | +| badger:block_frost_light | +| badger:block_frostground | +| badger:block_frostground_02 | +| badger:block_frostground_03 | +| badger:block_frostground_04 | +| badger:block_frostground_05 | +| badger:block_frostground_06 | +| badger:block_frostice_blend_01 | +| badger:block_frostice_blend_02 | +| badger:block_frostice_blend_03 | +| badger:block_frostice_mid | +| badger:block_frostice_top | +| badger:block_frostsnow | +| badger:block_frostsnow_no_vfx | +| badger:block_frostsnow_no_vfx_light | +| badger:block_furnace | +| badger:block_fx_allegiance_flame | +| badger:block_fx_buff_heal | +| badger:block_fx_buff_jump | +| badger:block_fx_buff_speed | +| badger:block_fx_creeper_poison | +| badger:block_fx_creeper_steam | +| badger:block_fx_frog_home_bugs | +| badger:block_fx_hotbubble_01 | +| badger:block_fx_jungle_fireflies_large | +| badger:block_fx_jungle_fireflies_medium | +| badger:block_fx_mountain_wind_gust | +| badger:block_fx_piglin_regen | +| badger:block_fx_piglin_regen_pipe | +| badger:block_fx_purple_tiger_home | +| badger:block_fx_skeleton_home_snow | +| badger:block_fx_slow_tar | +| badger:block_fx_spawner_creeper | +| badger:block_fx_spawner_golem_carrier | +| badger:block_fx_spawner_golem_cavalry | +| badger:block_fx_spawner_golem_fallen_warrior | +| badger:block_fx_spawner_golem_shield | +| badger:block_fx_spawner_golem_sniper | +| badger:block_fx_spawner_golem_stone | +| badger:block_fx_spawner_golem_support | +| badger:block_fx_spawner_golem_wood | +| badger:block_fx_spawner_skeleton | +| badger:block_fx_spawner_zombie | +| badger:block_fx_tower_anti_siege | +| badger:block_fx_wof_ripple | +| badger:block_fx_zombie_grotto_gas | +| badger:block_fx_zoner_outpost_tower | +| badger:block_glacier_01 | +| badger:block_glacier_02 | +| badger:block_gold_carved | +| badger:block_gold_carved_var02 | +| badger:block_gold_carved_var03 | +| badger:block_gold_carved_var04 | +| badger:block_gold_carved_var05 | +| badger:block_gold_carved_var06 | +| badger:block_gold_carved_var07 | +| badger:block_gold_corrupted | +| badger:block_gold_corrupted_rust_var01 | +| badger:block_gold_corrupted_rust_var02 | +| badger:block_gold_corrupted_rust_var03 | +| badger:block_gold_corrupted_rust_var04 | +| badger:block_gold_corrupted_shadow | +| badger:block_gold_corrupted_smooth_rust_var01 | +| badger:block_gold_corrupted_smooth_rust_var02 | +| badger:block_gold_corrupted_smooth_rust_var03 | +| badger:block_gold_corrupted_smooth_rust_var04 | +| badger:block_gold_corrupted_var01 | +| badger:block_gold_moss | +| badger:block_gold_moss_dead | +| badger:block_gold_var02 | +| badger:block_gravel | +| badger:block_hotrock_mid_var01 | +| badger:block_hotrock_var01 | +| badger:block_hotrock_var02 | +| badger:block_hotrock_var03 | +| badger:block_hotrock_var04 | +| badger:block_iceshore | +| badger:block_iron | +| badger:block_iron_bars | +| badger:block_iron_smooth | +| badger:block_iron_smooth_rust_var01 | +| badger:block_iron_smooth_rust_var02 | +| badger:block_iron_wrought | +| badger:block_iron_wrought_hot | +| badger:block_iron_wrought_hot_bottom | +| badger:block_iron_wrought_rust | +| badger:block_iron_wrought_rust_var01 | +| badger:block_jungle_terrace_dirt | +| badger:block_jungle_terrace_top | +| badger:block_lava | +| badger:block_lava_still_vfx | +| badger:block_limestone_mid | +| badger:block_limestone_mid_var02 | +| badger:block_limestone_top | +| badger:block_log_dark_oak | +| badger:block_log_dark_oak_teamcolor | +| badger:block_log_dark_oak_var01 | +| badger:block_log_spruce | +| badger:block_log_spruce_reinforced_bolt | +| badger:block_log_spruce_reinforced_hoop | +| badger:block_log_spruce_reinforced_hoop_var02 | +| badger:block_magma | +| badger:block_magma_netherrack | +| badger:block_metal_hot | +| badger:block_mob_creeper | +| badger:block_mob_golem_cavalry | +| badger:block_mob_golem_cavalry_var01 | +| badger:block_mob_golem_stone | +| badger:block_mob_golem_stone_var01 | +| badger:block_mob_golem_support | +| badger:block_mob_golem_wood | +| badger:block_mob_skeleton | +| badger:block_mob_skeleton_var01 | +| badger:block_mob_zombie | +| badger:block_mud | +| badger:block_mud_door | +| badger:block_mud_door_corner | +| badger:block_mud_door_corner_var01 | +| badger:block_mud_grass | +| badger:block_mud_grass_bottom | +| badger:block_mud_hole | +| badger:block_mud_hole_var01 | +| badger:block_mud_hole_var02 | +| badger:block_mud_path | +| badger:block_mud_var01 | +| badger:block_mud_var02 | +| badger:block_mud_var03 | +| badger:block_mud_var04 | +| badger:block_mud_var05 | +| badger:block_mud_var06 | +| badger:block_mushroom | +| badger:block_mushroom_cap_red | +| badger:block_mushroom_light | +| badger:block_mushroom_obstacle | +| badger:block_mushroom_obstacle_bottom | +| badger:block_mushroom_obstacle_bottom_var01 | +| badger:block_mushroom_obstacle_var01 | +| badger:block_mushroom_obstacle_var02 | +| badger:block_mushroom_obstacle_var03 | +| badger:block_music_box | +| badger:block_nether_brick | +| badger:block_nether_brick_lava | +| badger:block_nether_brick_purple | +| badger:block_nether_brick_purple_moss | +| badger:block_nether_brick_purple_pipe | +| badger:block_nether_brick_var01 | +| badger:block_nether_brick_var01_lava | +| badger:block_nether_brick_var01_purple | +| badger:block_nether_wart | +| badger:block_nether_wart_leaves | +| badger:block_nether_wart_warped | +| badger:block_nether_wart_warped_var01 | +| badger:block_nether_wart_warped_var02 | +| badger:block_netherite_pipe | +| badger:block_netherite_pipe_lava_top | +| badger:block_netherite_riveted_sheet | +| badger:block_netherite_riveted_sheet_rust | +| badger:block_netherite_sheet | +| badger:block_netherite_soot | +| badger:block_netherite_soot_corner | +| badger:block_netheritebrick | +| badger:block_netheritebrick_cracked | +| badger:block_netheritebrick_cracked_moss | +| badger:block_netheritebrick_cracked_moss_var01 | +| badger:block_netheritebrick_cracked_pipe | +| badger:block_netheritebrick_cracked_pipe_moss | +| badger:block_netheritebrick_cracked_pipe_var01 | +| badger:block_netheritebrick_cracked_pipe_var02 | +| badger:block_netheritebrick_small | +| badger:block_netheritebrick_small_gilded | +| badger:block_netheritebrick_small_moss | +| badger:block_netherrack | +| badger:block_netherrack_burning_edge_var04 | +| badger:block_netherrack_burning_edge_var05 | +| badger:block_netherrack_dried | +| badger:block_netherrack_dried_platform_bottom | +| badger:block_netherrack_dried_platform_transition | +| badger:block_netherrack_dried_platform_var01 | +| badger:block_netherrack_dried_platform_var02 | +| badger:block_netherrack_dried_var01 | +| badger:block_netherrack_leading | +| badger:block_netherrack_leading_var01 | +| badger:block_netherrack_meat | +| badger:block_netherrack_moss | +| badger:block_netherrack_moss_var01 | +| badger:block_netherrack_moss_vine | +| badger:block_netherrack_moss_vine_var01 | +| badger:block_netherrack_moss_vine_var02 | +| badger:block_netherrack_netherwart | +| badger:block_netherrack_netherwart_var01 | +| badger:block_netherrack_pipe | +| badger:block_netherrack_pipe_lava_top | +| badger:block_netherrack_rust_dried | +| badger:block_netherrack_rust_dried_var01 | +| badger:block_netherrack_var01 | +| badger:block_netherrack_var02 | +| badger:block_netherrack_var03 | +| badger:block_netherrack_var04 | +| badger:block_netherrite | +| badger:block_netherrite_cracked_pipe_moss | +| badger:block_netherrite_moss | +| badger:block_netherrite_var01 | +| badger:block_netherrite_var01_moss | +| badger:block_netherrite_var01_moss_var01 | +| badger:block_netherrite_var02 | +| badger:block_netherrite_var02_moss | +| badger:block_netherrite_var03 | +| badger:block_netherrite_var04 | +| badger:block_netherwart_poison | +| badger:block_nylium | +| badger:block_nylium_grass | +| badger:block_nylium_grass_var01 | +| badger:block_nylium_var01 | +| badger:block_nylium_var02 | +| badger:block_nylium_warped | +| badger:block_nylium_warped_grass | +| badger:block_nylium_warped_var01 | +| badger:block_nylium_warped_var02 | +| badger:block_oasistree_leaf | +| badger:block_oasistree_leaf_02 | +| badger:block_oasisvine_leaf | +| badger:block_oasisvine_top | +| badger:block_oasisvine_top_02 | +| badger:block_oasisvine_trunktop | +| badger:block_oasisvine_vine_01 | +| badger:block_oasisvine_vine_01b | +| badger:block_oasisvine_vine_02 | +| badger:block_oasisvine_vine_03 | +| badger:block_oasisvine_vine_end | +| badger:block_obelisk_base_01 | +| badger:block_obelisk_blend_01 | +| badger:block_obelisk_blend_02 | +| badger:block_obelisk_blend_03 | +| badger:block_obelisk_lip | +| badger:block_obelisk_lip_nobuild | +| badger:block_obelisk_mid_01 | +| badger:block_obelisk_mid_01_nobuild | +| badger:block_obelisk_top | +| badger:block_obelisk_top_nobuild | +| badger:block_obsidian | +| badger:block_ore_coal | +| badger:block_ore_diamond | +| badger:block_ore_diamond_sediment | +| badger:block_ore_gold | +| badger:block_ore_gold_soot | +| badger:block_ore_iron | +| badger:block_ore_iron_sediment | +| badger:block_ore_redstone | +| badger:block_ore_redstone_sediment | +| badger:block_palm_trunk | +| badger:block_palm_trunk_mid | +| badger:block_palm_trunk_top | +| badger:block_path_attack_path | +| badger:block_path_attack_path_var01 | +| badger:block_path_mud_04 | +| badger:block_path_mud_path | +| badger:block_path_netherrack_dried | +| badger:block_path_netherrack_dried_var01 | +| badger:block_path_slag | +| badger:block_path_stone | +| badger:block_path_stone_dark | +| badger:block_path_village | +| badger:block_path_village_edge | +| badger:block_pebbles_01 | +| badger:block_pebbles_02 | +| badger:block_pebbles_03 | +| badger:block_pigsty_mud | +| badger:block_pigsty_mud_01 | +| badger:block_pigsty_mud_02 | +| badger:block_pigsty_mud_03 | +| badger:block_pigsty_mud_moss_01 | +| badger:block_pigsty_mud_moss_02 | +| badger:block_pillar_blackrock_a | +| badger:block_pillar_bone_leather_var01 | +| badger:block_pillar_bone_top | +| badger:block_pillar_bone_var01 | +| badger:block_pillar_coal | +| badger:block_pillar_frostice | +| badger:block_pillar_log_spruce | +| badger:block_pillar_mushroom_stalk | +| badger:block_pillar_nether_wart_warped | +| badger:block_pillar_netherrack | +| badger:block_pillar_palm_trunk | +| badger:block_pillar_palm_trunk_mid | +| badger:block_pillar_palm_trunk_top | +| badger:block_pillar_plant_coraltube_a_mid | +| badger:block_pillar_plant_coraltube_a_top | +| badger:block_pillar_plant_coraltube_b_top | +| badger:block_pillar_redsand_a_top | +| badger:block_pillar_shaggy_trunk_01 | +| badger:block_pillar_shaggy_trunk_02 | +| badger:block_pillar_shaggy_trunk_03 | +| badger:block_pillar_snow | +| badger:block_pillar_snow_skeleton | +| badger:block_pillar_snowy_willow_trunk_01 | +| badger:block_pillar_stalagmite_bottom | +| badger:block_pillar_stalagmite_middle | +| badger:block_pillar_stalagmite_top | +| badger:block_pillar_stucco | +| badger:block_pillar_tree_bonsai_trunk | +| badger:block_pillar_tree_cedar_trunk_01 | +| badger:block_pillar_tree_coal_burned_vfx | +| badger:block_pillar_tree_dead_fir_trunk_01 | +| badger:block_pillar_tree_dead_fir_trunk_02 | +| badger:block_pillar_tree_dead_fir_trunk_03 | +| badger:block_pillar_tree_dead_mang_trunk_01 | +| badger:block_pillar_tree_dead_mang_trunk_02 | +| badger:block_pillar_tree_dead_mang_trunk_03 | +| badger:block_pillar_tree_fir_burned_01 | +| badger:block_pillar_tree_fir_burned_02 | +| badger:block_pillar_tree_fir_burned_03 | +| badger:block_pillar_tree_fir_burned_vfx | +| badger:block_pillar_tree_horsetail_bamboo | +| badger:block_pillar_tree_horsetail_stripped | +| badger:block_pillar_tree_pine_cone | +| badger:block_pillar_tree_redbark_snowy_01 | +| badger:block_pillar_tree_redbark_trunk_01 | +| badger:block_pillar_tree_redbark_trunk_02 | +| badger:block_pillar_tree_redbark_trunk_03 | +| badger:block_pillar_tree_willow_trunk | +| badger:block_pillar_tree_willow_trunk_bare | +| badger:block_pillar_tree_willow_trunk_bare_02 | +| badger:block_pillar_trunk_dead_mushroom_01 | +| badger:block_plane_vine_ivy_corrupt_dead | +| badger:block_planks_dark_oak | +| badger:block_planks_dark_oak_fine | +| badger:block_planks_spruce | +| badger:block_planks_spruce_fine | +| badger:block_planks_spruce_fine_mossy | +| badger:block_plant_coralstump_a_mid | +| badger:block_plant_coralstump_a_top | +| badger:block_plant_coralstump_b_top | +| badger:block_plant_coralstump_c | +| badger:block_plant_coralstump_dark | +| badger:block_plant_coralstump_dark_top | +| badger:block_plant_glowplant_btm | +| badger:block_plant_glowplant_mid | +| badger:block_plant_glowplant_top | +| badger:block_plant_moss_01 | +| badger:block_plant_wildflower_pylon | +| badger:block_poison | +| badger:block_post_bone | +| badger:block_post_bone_netherrack_bottom | +| badger:block_post_coal | +| badger:block_post_coal_light | +| badger:block_post_iron_wrought | +| badger:block_post_nether_wart_warped | +| badger:block_post_netherrite | +| badger:block_post_planks_dark_oak | +| badger:block_post_tree_mang_trunk | +| badger:block_prismarine | +| badger:block_prismarine_alive | +| badger:block_prismarine_brick | +| badger:block_prismarine_brick_moss | +| badger:block_prismarine_brick_moss_alive | +| badger:block_prismarine_brick_moss_dead | +| badger:block_prismarine_carved | +| badger:block_prismarine_carved_alive | +| badger:block_prismarine_carved_bottom_light | +| badger:block_prismarine_carved_bottom_light_alive | +| badger:block_prismarine_carved_bottom_light_dead | +| badger:block_prismarine_carved_dead | +| badger:block_prismarine_carved_middle | +| badger:block_prismarine_carved_middle_alive | +| badger:block_prismarine_carved_middle_dead | +| badger:block_prismarine_carved_moss | +| badger:block_prismarine_carved_top | +| badger:block_prismarine_dead | +| badger:block_prismarine_moss | +| badger:block_prismarine_moss_alive | +| badger:block_prismarine_moss_dead | +| badger:block_prismarine_moss_disabled | +| badger:block_prismarine_raw | +| badger:block_prismarine_raw_alive | +| badger:block_prismarine_raw_dead | +| badger:block_prismarine_raw_disabled | +| badger:block_prismarine_wof_dark | +| badger:block_prismarine_wof_light | +| badger:block_prismarine_wof_medium | +| badger:block_prismarine_wof_pattern | +| badger:block_prismarine_wof_stone | +| badger:block_prismarine_wof_stone_carved_var01 | +| badger:block_prismarine_wof_stone_carved_var02 | +| badger:block_prismarine_wof_stone_carved_var03 | +| badger:block_prismarine_wof_stone_carved_var04 | +| badger:block_prismarine_wof_stone_carved_var05 | +| badger:block_prismarine_wof_stone_carved_var06 | +| badger:block_prismarine_wof_stone_carved_var07 | +| badger:block_prismarine_wof_stone_carved_var08 | +| badger:block_prismarine_wof_stone_carved_var09 | +| badger:block_prismarine_wof_stone_carved_var10 | +| badger:block_prismarine_wof_stone_carved_var11 | +| badger:block_prismarine_wof_stone_cracked | +| badger:block_prismarine_wof_stone_var01 | +| badger:block_prismarine_wof_stone_var01_dark | +| badger:block_prismarine_wof_stone_var01_light | +| badger:block_prismarine_wof_stone_var02 | +| badger:block_redsand_a | +| badger:block_redsand_a_top | +| badger:block_redsand_a_top_var03 | +| badger:block_redsand_b | +| badger:block_redsand_c | +| badger:block_redsand_d | +| badger:block_redsand_grass | +| badger:block_riverbed_a | +| badger:block_riverbed_a2 | +| badger:block_riverbed_b | +| badger:block_riverbed_b2 | +| badger:block_riverbed_blend_01 | +| badger:block_riverbed_blend_02 | +| badger:block_riverbed_blend_03 | +| badger:block_riverbed_stone_01 | +| badger:block_riverbed_stone_02 | +| badger:block_riverbed_stone_03 | +| badger:block_rivershore | +| badger:block_rivershore_02 | +| badger:block_rivershore_03 | +| badger:block_rivershore_04 | +| badger:block_rivershore_05 | +| badger:block_rock_sulphur | +| badger:block_rock_sulphur_scorch | +| badger:block_rock_sulphur_stain | +| badger:block_rock_sulphur_var01 | +| badger:block_rock_sulphur_vein | +| badger:block_rock_sulphur_vein_var01 | +| badger:block_rock_sulphur_vein_var02 | +| badger:block_rock_sulphur_vein_var03 | +| badger:block_sand | +| badger:block_sand_d1 | +| badger:block_sand_d2 | +| badger:block_sand_d3 | +| badger:block_sand_no_fx | +| badger:block_sand_red | +| badger:block_sand_soot | +| badger:block_sand_soot_var01 | +| badger:block_sand_soot_var02 | +| badger:block_sand_soot_var03 | +| badger:block_shaggy_top_03 | +| badger:block_shaggy_top_04 | +| badger:block_shaggy_top_05 | +| badger:block_shaggy_top_06 | +| badger:block_shaggy_top_07 | +| badger:block_sheet_alabaster_stone | +| badger:block_sheet_boulder | +| badger:block_sheet_burning_edge_var01 | +| badger:block_sheet_fernbark_mid | +| badger:block_sheet_fernbark_top | +| badger:block_sheet_gold_corrupted_riveted | +| badger:block_sheet_gold_corrupted_rust_var01 | +| badger:block_sheet_icecanopy | +| badger:block_sheet_iron | +| badger:block_sheet_iron_wrought | +| badger:block_sheet_leafpile_01 | +| badger:block_sheet_leafpile_02 | +| badger:block_sheet_leafpile_03 | +| badger:block_sheet_limestone_var01 | +| badger:block_sheet_limestone_var02 | +| badger:block_sheet_nether_brick_lava | +| badger:block_sheet_nether_wart_warped | +| badger:block_sheet_nether_wart_warped_var01 | +| badger:block_sheet_nether_wart_warped_var02 | +| badger:block_sheet_netherite_riveted | +| badger:block_sheet_netherrack | +| badger:block_sheet_netherrack_dried | +| badger:block_sheet_netherrack_dried_var01 | +| badger:block_sheet_netherrack_var01 | +| badger:block_sheet_netherrack_var02 | +| badger:block_sheet_netherrack_var03 | +| badger:block_sheet_netherrite | +| badger:block_sheet_planks_spruce | +| badger:block_sheet_rock_sulphur_vein | +| badger:block_sheet_rock_sulphur_vein_var01 | +| badger:block_sheet_rock_sulphur_vein_var02 | +| badger:block_sheet_rock_sulphur_vein_var03 | +| badger:block_sheet_slag | +| badger:block_sheet_snow | +| badger:block_sheet_templestone_moss_01 | +| badger:block_sheet_xp_glow | +| badger:block_shrub | +| badger:block_shrub_brighter | +| badger:block_shrub_flower | +| badger:block_shrub_mid | +| badger:block_shrub_snowy_01 | +| badger:block_shrub_snowy_02 | +| badger:block_slab_alabaster | +| badger:block_slab_alabaster_carved_mossy | +| badger:block_slab_alabaster_carved_redstone | +| badger:block_slab_alabaster_frosted | +| badger:block_slab_alabaster_frosted_var01 | +| badger:block_slab_alabaster_moss_top | +| badger:block_slab_alabaster_mossy | +| badger:block_slab_alabaster_stone | +| badger:block_slab_bone_bottom | +| badger:block_slab_bone_netherrack_bottom | +| badger:block_slab_bone_top | +| badger:block_slab_bone_var01 | +| badger:block_slab_bone_var02 | +| badger:block_slab_bone_var03 | +| badger:block_slab_boulder | +| badger:block_slab_boulder_frostland | +| badger:block_slab_boulder_lake_01 | +| badger:block_slab_boulder_lake_02 | +| badger:block_slab_boulder_lake_03 | +| badger:block_slab_boulder_mid | +| badger:block_slab_boulder_top_var01 | +| badger:block_slab_burning_edge_var01 | +| badger:block_slab_cake | +| badger:block_slab_coal | +| badger:block_slab_coal_light | +| badger:block_slab_cobblestone | +| badger:block_slab_copper | +| badger:block_slab_coralstone_a | +| badger:block_slab_dead_mushroom_cap_01 | +| badger:block_slab_dead_mushroom_cap_02 | +| badger:block_slab_desertrock_b | +| badger:block_slab_desertrock_b_rough | +| badger:block_slab_desertrock_b_var02 | +| badger:block_slab_frostice | +| badger:block_slab_frostice_blend_01 | +| badger:block_slab_gold_carved | +| badger:block_slab_gold_corrupted | +| badger:block_slab_gold_corrupted_rust_var01 | +| badger:block_slab_gold_corrupted_rust_var02 | +| badger:block_slab_gold_corrupted_var01 | +| badger:block_slab_gold_moss | +| badger:block_slab_gold_moss_dead | +| badger:block_slab_gold_moss_dead_var01 | +| badger:block_slab_gold_moss_var01 | +| badger:block_slab_gold_var02 | +| badger:block_slab_icecanopy | +| badger:block_slab_iron | +| badger:block_slab_iron_wrought | +| badger:block_slab_iron_wrought_rust | +| badger:block_slab_iron_wrought_rust_var01 | +| badger:block_slab_lava_coils | +| badger:block_slab_lava_coils_med | +| badger:block_slab_lava_coils_top | +| badger:block_slab_leafpile_01 | +| badger:block_slab_leafpile_02 | +| badger:block_slab_leafpile_03 | +| badger:block_slab_lichen_brown_var01 | +| badger:block_slab_lichen_brown_var02 | +| badger:block_slab_lichen_green_var01 | +| badger:block_slab_lichen_green_var02 | +| badger:block_slab_lichen_green_var03 | +| badger:block_slab_lichen_green_var04 | +| badger:block_slab_limestone_var01 | +| badger:block_slab_limestone_var02 | +| badger:block_slab_log_dark_oak | +| badger:block_slab_log_dark_oak_hoop | +| badger:block_slab_mud | +| badger:block_slab_mud_var01 | +| badger:block_slab_mud_var02 | +| badger:block_slab_mud_var06 | +| badger:block_slab_mushroom | +| badger:block_slab_mushroom_obstacle | +| badger:block_slab_mushroom_obstacle_bottom | +| badger:block_slab_mushroom_obstacle_var01 | +| badger:block_slab_mushroom_obstacle_var03 | +| badger:block_slab_nether_brick | +| badger:block_slab_nether_brick_purple | +| badger:block_slab_nether_brick_var01 | +| badger:block_slab_nether_wart | +| badger:block_slab_nether_wart_leaves | +| badger:block_slab_netherite_riveted | +| badger:block_slab_netherite_soot | +| badger:block_slab_netherrack | +| badger:block_slab_netherrack_dried | +| badger:block_slab_netherrack_dried_var01 | +| badger:block_slab_netherrack_moss_var01 | +| badger:block_slab_netherrack_netherwart_var01 | +| badger:block_slab_netherrack_var01 | +| badger:block_slab_netherrack_var02 | +| badger:block_slab_netherrack_var03 | +| badger:block_slab_netherrite | +| badger:block_slab_netherrite_var01 | +| badger:block_slab_netherrite_var02 | +| badger:block_slab_netherrite_var03 | +| badger:block_slab_netherrite_var04 | +| badger:block_slab_nylium | +| badger:block_slab_nylium_var01 | +| badger:block_slab_nylium_var02 | +| badger:block_slab_oasisvine_02 | +| badger:block_slab_ore_diamond_sediment | +| badger:block_slab_ore_iron_sediment | +| badger:block_slab_ore_redstone_sediment | +| badger:block_slab_pigsty_mud_01 | +| badger:block_slab_pigsty_mud_02 | +| badger:block_slab_pigsty_mud_03 | +| badger:block_slab_planks_dark_oak | +| badger:block_slab_planks_dark_oak_fine | +| badger:block_slab_planks_spruce | +| badger:block_slab_planks_spruce_trim | +| badger:block_slab_planks_spruce_trim_mossy | +| badger:block_slab_planks_spruce_trim_var01 | +| badger:block_slab_planks_spruce_trim_var02 | +| badger:block_slab_plant_coralstump_c | +| badger:block_slab_plant_coralstump_c_w | +| badger:block_slab_plant_coralstump_cc_q2 | +| badger:block_slab_plant_treecoral_01 | +| badger:block_slab_plant_treecoral_02 | +| badger:block_slab_prismarine_brick | +| badger:block_slab_prismarine_brick_moss | +| badger:block_slab_prismarine_moss | +| badger:block_slab_prismarine_moss_alive | +| badger:block_slab_prismarine_moss_dead | +| badger:block_slab_prismarine_moss_disabled | +| badger:block_slab_prismarine_raw | +| badger:block_slab_prismarine_raw_alive | +| badger:block_slab_prismarine_raw_dead | +| badger:block_slab_prismarine_wof_stone_var01_light | +| badger:block_slab_redsand_a_top | +| badger:block_slab_redstone | +| badger:block_slab_riverbed_blend_01 | +| badger:block_slab_rock_sulphur | +| badger:block_slab_rock_sulphur_stain | +| badger:block_slab_rock_sulphur_var01 | +| badger:block_slab_rock_sulphur_vein | +| badger:block_slab_rock_sulphur_vein_var01 | +| badger:block_slab_rock_sulphur_vein_var02 | +| badger:block_slab_rock_sulphur_vein_var03 | +| badger:block_slab_sand | +| badger:block_slab_sand_d1 | +| badger:block_slab_sand_d2 | +| badger:block_slab_sand_d3 | +| badger:block_slab_shaggy_top_03 | +| badger:block_slab_shaggy_top_04 | +| badger:block_slab_shaggy_top_05 | +| badger:block_slab_shaggy_top_06 | +| badger:block_slab_shaggy_top_07 | +| badger:block_slab_shrub | +| badger:block_slab_shrub_flower | +| badger:block_slab_shrub_snowy_01 | +| badger:block_slab_slag | +| badger:block_slab_snow_01 | +| badger:block_slab_stone | +| badger:block_slab_stonebrick | +| badger:block_slab_stonebrick_carved | +| badger:block_slab_stonebrick_carved_var01 | +| badger:block_slab_stonebrick_cracked | +| badger:block_slab_stucco | +| badger:block_slab_stucco_mossy | +| badger:block_slab_stucco_mossy_dead | +| badger:block_slab_stucco_trim_culture01 | +| badger:block_slab_stucco_village_trim | +| badger:block_slab_stucco_village_trim_var01 | +| badger:block_slab_stucco_village_trim_var02 | +| badger:block_slab_tarrock | +| badger:block_slab_tree_baobab_leaves_top | +| badger:block_slab_tree_baobab_trunk_01 | +| badger:block_slab_tree_baobab_trunk_02 | +| badger:block_slab_tree_baobab_trunk_03 | +| badger:block_slab_tree_birch_fall_01 | +| badger:block_slab_tree_birch_fall_02 | +| badger:block_slab_tree_birch_fall_03 | +| badger:block_slab_tree_birch_fall_04 | +| badger:block_slab_tree_birch_frost_side | +| badger:block_slab_tree_birch_frost_side_blend | +| badger:block_slab_tree_birch_leaves | +| badger:block_slab_tree_birch_leaves_side | +| badger:block_slab_tree_birch_snow_01_side | +| badger:block_slab_tree_birch_snow_02_side | +| badger:block_slab_tree_birch_snow_side_blend | +| badger:block_slab_tree_cedar_leaves | +| badger:block_slab_tree_cedar_leaves_q2 | +| badger:block_slab_tree_fir_01 | +| badger:block_slab_tree_fir_02 | +| badger:block_slab_tree_fir_03 | +| badger:block_slab_tree_fir_snowy_01 | +| badger:block_slab_tree_fir_snowy_02 | +| badger:block_slab_tree_fir_snowy_03 | +| badger:block_slab_tree_mang_trunk_moss2 | +| badger:block_slab_tree_mang_trunk_v01 | +| badger:block_slab_tree_mang_turquoise | +| badger:block_slab_tree_mangrove_01 | +| badger:block_slab_tree_mushroom_cap_01 | +| badger:block_slab_tree_mushroom_cap_02 | +| badger:block_slab_tree_oak_dead_leaves_mid | +| badger:block_slab_tree_oak_dead_purple_leaves_mid | +| badger:block_slab_tree_oak_dead_purple_leaves_mid_novfx | +| badger:block_slab_tree_oak_dead_yellow_leaves_mid | +| badger:block_slab_tree_oak_leaves_snow | +| badger:block_slab_tree_silverbark_leaf_var02 | +| badger:block_slab_tree_willow_leaves | +| badger:block_slab_wof_prismarine_01 | +| badger:block_slab_wof_prismarine_02 | +| badger:block_slag | +| badger:block_slag_var01 | +| badger:block_slag_var02 | +| badger:block_snow | +| badger:block_snow_01 | +| badger:block_snow_terrain | +| badger:block_snow_tree_01 | +| badger:block_snowman_bottom | +| badger:block_stair_alabaster | +| badger:block_stair_alabaster_alive | +| badger:block_stair_alabaster_dead | +| badger:block_stair_alabaster_mossy | +| badger:block_stair_alabaster_mossy_alive | +| badger:block_stair_alabaster_mossy_corrupt_dead | +| badger:block_stair_alabaster_mossy_dead | +| badger:block_stair_alabaster_stone | +| badger:block_stair_bone_top | +| badger:block_stair_bone_var01 | +| badger:block_stair_cobblestone | +| badger:block_stair_copper | +| badger:block_stair_gold_corrupted | +| badger:block_stair_gold_corrupted_rust_var01 | +| badger:block_stair_iron_wrought | +| badger:block_stair_iron_wrought_rust | +| badger:block_stair_iron_wrought_rust_var01 | +| badger:block_stair_nether_brick_purple | +| badger:block_stair_nether_brick_purple_moss | +| badger:block_stair_nether_wart_warped | +| badger:block_stair_netherite_soot | +| badger:block_stair_netherrack | +| badger:block_stair_netherrite | +| badger:block_stair_netherrite_var01 | +| badger:block_stair_netherrite_var02 | +| badger:block_stair_netherrite_var03 | +| badger:block_stair_netherrite_var04 | +| badger:block_stair_planks_dark_oak | +| badger:block_stair_planks_spruce | +| badger:block_stair_planks_spruce_fine | +| badger:block_stair_planks_spruce_fine_mossy | +| badger:block_stair_prismarine_raw | +| badger:block_stair_prismarine_raw_alive | +| badger:block_stair_prismarine_raw_dead | +| badger:block_stair_stonebrick | +| badger:block_stone | +| badger:block_stone_bird_poo | +| badger:block_stone_bird_poo_var01 | +| badger:block_stone_bird_poo_var02 | +| badger:block_stone_cracked | +| badger:block_stone_dark | +| badger:block_stone_frosted | +| badger:block_stone_frosted_var01 | +| badger:block_stonebrick | +| badger:block_stonebrick_carved | +| badger:block_stonebrick_carved_mossy | +| badger:block_stonebrick_carved_var01 | +| badger:block_stonebrick_carved_var01_cracked | +| badger:block_stonebrick_carved_var02 | +| badger:block_stonebrick_cracked | +| badger:block_stonebrick_mossy | +| badger:block_stonebrick_mossy_top | +| badger:block_stonebrick_mossy_top_zombie | +| badger:block_stucco | +| badger:block_stucco_mossy | +| badger:block_stucco_mossy_dead | +| badger:block_stucco_stairs | +| badger:block_stucco_village_trim | +| badger:block_stucco_village_trim_var01 | +| badger:block_stucco_village_trim_var02 | +| badger:block_tar_02 | +| badger:block_tar_03 | +| badger:block_tarrock | +| badger:block_termite_base | +| badger:block_termite_mid_var01 | +| badger:block_termite_mid_var02 | +| badger:block_termite_mid_var03 | +| badger:block_termite_top | +| badger:block_tnt | +| badger:block_tree_baobab_leaves_top | +| badger:block_tree_baobab_trunk_01 | +| badger:block_tree_baobab_trunk_02 | +| badger:block_tree_baobab_trunk_03 | +| badger:block_tree_baobab_trunk_04 | +| badger:block_tree_baobab_trunk_05 | +| badger:block_tree_baobab_trunk_06 | +| badger:block_tree_baobab_trunk_07 | +| badger:block_tree_baobab_trunk_08 | +| badger:block_tree_baobab_trunk_09 | +| badger:block_tree_baobab_trunk_10 | +| badger:block_tree_birch_fall_01 | +| badger:block_tree_birch_fall_01_mid | +| badger:block_tree_birch_fall_02 | +| badger:block_tree_birch_fall_02_mid | +| badger:block_tree_birch_fall_03 | +| badger:block_tree_birch_fall_03_mid | +| badger:block_tree_birch_fall_04 | +| badger:block_tree_birch_fall_04_mid | +| badger:block_tree_birch_leaves | +| badger:block_tree_birch_leaves_mid | +| badger:block_tree_birch_snow_01_mid | +| badger:block_tree_birch_snow_01_side | +| badger:block_tree_birch_snow_02_side | +| badger:block_tree_birch_trunk | +| badger:block_tree_cedar_leaves | +| badger:block_tree_cedar_leaves_mid | +| badger:block_tree_cypress_leaves_mid | +| badger:block_tree_cypress_leaves_top | +| badger:block_tree_cypress_trunk | +| badger:block_tree_cypress_trunk_bare | +| badger:block_tree_cypress_trunk_blend | +| badger:block_tree_dead_cedar_trunk_01 | +| badger:block_tree_dead_cedar_trunk_02 | +| badger:block_tree_dead_fir_trunk_01 | +| badger:block_tree_dead_fir_trunk_02 | +| badger:block_tree_dead_fir_trunk_03 | +| badger:block_tree_dead_fir_trunk_04 | +| badger:block_tree_dead_fir_trunk_05 | +| badger:block_tree_dead_mang_trunk_blend | +| badger:block_tree_dead_mang_trunk_moss_01 | +| badger:block_tree_fir_01 | +| badger:block_tree_fir_02 | +| badger:block_tree_fir_03 | +| badger:block_tree_fir_burned_01 | +| badger:block_tree_fir_burned_02 | +| badger:block_tree_fir_burned_04 | +| badger:block_tree_fir_burned_05 | +| badger:block_tree_fir_burned_06 | +| badger:block_tree_fir_leaves | +| badger:block_tree_fir_snowy_01 | +| badger:block_tree_fir_snowy_02 | +| badger:block_tree_fir_snowy_03 | +| badger:block_tree_frondtree_leaf_01 | +| badger:block_tree_frondtree_leaf_mid | +| badger:block_tree_horsetail_bamboo | +| badger:block_tree_horsetail_stripped | +| badger:block_tree_icecypress_bottom | +| badger:block_tree_icecypress_lower_mid | +| badger:block_tree_icecypress_snow_01 | +| badger:block_tree_icecypress_top | +| badger:block_tree_icecypress_upper_mid | +| badger:block_tree_mang_cinamon_trunk | +| badger:block_tree_mang_fallen_01 | +| badger:block_tree_mang_fallen_moss_01 | +| badger:block_tree_mang_fallen_moss_02 | +| badger:block_tree_mang_moss_snow_01 | +| badger:block_tree_mang_moss_snow_02 | +| badger:block_tree_mang_trunk | +| badger:block_tree_mang_trunk_02 | +| badger:block_tree_mang_trunk_blend | +| badger:block_tree_mang_trunk_dead | +| badger:block_tree_mang_trunk_dead_02 | +| badger:block_tree_mang_trunk_dead_03 | +| badger:block_tree_mang_trunk_dead_04 | +| badger:block_tree_mang_trunk_dead_05 | +| badger:block_tree_mang_trunk_green | +| badger:block_tree_mang_trunk_moss | +| badger:block_tree_mang_trunk_moss2 | +| badger:block_tree_mang_trunk_snowbase_01 | +| badger:block_tree_mang_trunk_snowbase_02 | +| badger:block_tree_mang_trunk_wof_01 | +| badger:block_tree_mang_trunk_wof_02 | +| badger:block_tree_mang_trunk_wof_03 | +| badger:block_tree_mang_trunk_wof_04 | +| badger:block_tree_mang_turquoise | +| badger:block_tree_mang_turquoise_mid | +| badger:block_tree_mangrove_01 | +| badger:block_tree_mangrove_02 | +| badger:block_tree_mangrove_03 | +| badger:block_tree_mangrove_04 | +| badger:block_tree_mushroom_cap_01 | +| badger:block_tree_mushroom_cap_02 | +| badger:block_tree_mushroom_cap_mossy | +| badger:block_tree_mushroom_snowy_cap_01 | +| badger:block_tree_mushroom_trunk_base_01 | +| badger:block_tree_mushroom_trunk_base_02 | +| badger:block_tree_mushroom_trunk_mid | +| badger:block_tree_mushroom_trunk_top | +| badger:block_tree_oak_dead_leaves | +| badger:block_tree_oak_dead_leaves_mid | +| badger:block_tree_oak_dead_leaves_novfx | +| badger:block_tree_oak_dead_purple_leaves | +| badger:block_tree_oak_dead_purple_leaves_mid | +| badger:block_tree_oak_dead_yellow_leaves | +| badger:block_tree_oak_leaves | +| badger:block_tree_oak_leaves_frost_mid | +| badger:block_tree_oak_leaves_frost_top | +| badger:block_tree_oak_leaves_mid | +| badger:block_tree_oak_leaves_snow_mid | +| badger:block_tree_oak_leaves_snow_top | +| badger:block_tree_pineapple | +| badger:block_tree_poison_trunk_01 | +| badger:block_tree_poison_trunk_02 | +| badger:block_tree_poison_trunk_03 | +| badger:block_tree_poison_trunk_04 | +| badger:block_tree_redbark_snowy_01 | +| badger:block_tree_redbark_trunk_01 | +| badger:block_tree_redbark_trunk_02 | +| badger:block_tree_redbark_trunk_03 | +| badger:block_tree_reservoir_trunk | +| badger:block_tree_reservoir_trunk_var01 | +| badger:block_tree_reservoir_trunk_var02 | +| badger:block_tree_reservoir_trunk_var03 | +| badger:block_tree_reservoir_trunk_var04 | +| badger:block_tree_shaggy_trunk_01 | +| badger:block_tree_shaggy_trunk_02 | +| badger:block_tree_shaggy_trunk_moss_01 | +| badger:block_tree_silverbark_leaf_base_var01 | +| badger:block_tree_silverbark_leaf_base_var02 | +| badger:block_tree_silverbark_leaf_base_var03 | +| badger:block_tree_silverbark_leaf_mid_var01 | +| badger:block_tree_silverbark_leaf_mid_var02 | +| badger:block_tree_silverbark_leaf_mid_var03 | +| badger:block_tree_silverbark_leaf_var01 | +| badger:block_tree_silverbark_leaf_var02 | +| badger:block_tree_silverbark_leaf_var03 | +| badger:block_tree_silverbark_trunk_var01 | +| badger:block_tree_willow_leaves | +| badger:block_tree_willow_leaves_blend_01 | +| badger:block_tree_willow_trunk | +| badger:block_tree_willow_trunk_bare | +| badger:block_tree_willow_trunk_bare_02 | +| badger:block_tree_willow_trunk_blend | +| badger:block_tree_willow_trunk_blend_02 | +| badger:block_tree_wof_leaves_01 | +| badger:block_tree_wof_leaves_02 | +| badger:block_upright_alabaster | +| badger:block_upright_alabaster_frosted | +| badger:block_upright_alabaster_stone | +| badger:block_upright_bone | +| badger:block_upright_dead_mushroom_trunk_01 | +| badger:block_upright_dead_mushroom_trunk_02 | +| badger:block_upright_dead_mushroom_trunk_03 | +| badger:block_upright_dead_mushroom_trunk_04 | +| badger:block_upright_frostice | +| badger:block_upright_frostice_top | +| badger:block_upright_gold | +| badger:block_upright_gold_corrupted | +| badger:block_upright_gold_corrupted_rust_var01 | +| badger:block_upright_gold_var02 | +| badger:block_upright_iron | +| badger:block_upright_iron_wrought | +| badger:block_upright_lava_coils | +| badger:block_upright_lava_coils_med | +| badger:block_upright_lava_coils_top | +| badger:block_upright_mushroom_light | +| badger:block_upright_mushroom_light_attack_transition | +| badger:block_upright_mushroom_light_obstacle_transition | +| badger:block_upright_mushroom_obstacle | +| badger:block_upright_mushroom_obstacle_bottom | +| badger:block_upright_mushroom_obstacle_bottom_var01 | +| badger:block_upright_mushroom_obstacle_var01 | +| badger:block_upright_nether_wart | +| badger:block_upright_nether_wart_leaves | +| badger:block_upright_netherite_var01 | +| badger:block_upright_netherrack | +| badger:block_upright_netherrack_moss_var01 | +| badger:block_upright_planks_dark_oak_fine | +| badger:block_upright_prismarine_moss | +| badger:block_upright_prismarine_moss_alive | +| badger:block_upright_prismarine_moss_dead | +| badger:block_upright_prismarine_moss_disabled | +| badger:block_upright_prismarine_raw | +| badger:block_upright_prismarine_raw_alive | +| badger:block_upright_prismarine_raw_dead | +| badger:block_upright_rock_sulphur | +| badger:block_upright_rock_sulphur_var01 | +| badger:block_upright_rock_sulphur_vein | +| badger:block_upright_rock_sulphur_vein_var01 | +| badger:block_upright_rock_sulphur_vein_var02 | +| badger:block_upright_sand | +| badger:block_upright_slag | +| badger:block_upright_snow | +| badger:block_upright_stonebrick | +| badger:block_upright_stonebrick_carved_var01 | +| badger:block_upright_tarrock | +| badger:block_upright_termite_base | +| badger:block_upright_termite_mid_var01 | +| badger:block_upright_termite_mid_var02 | +| badger:block_upright_termite_mid_var03 | +| badger:block_upright_termite_top | +| badger:block_upright_tree_bonsai_trunk | +| badger:block_upright_tree_dead_mang_trunk_bare | +| badger:block_upright_tree_mang_snowbase_01 | +| badger:block_upright_tree_mang_snowtop_01 | +| badger:block_upright_tree_mang_trunk | +| badger:block_upright_tree_mang_trunk_blend | +| badger:block_upright_tree_mang_trunk_dead | +| badger:block_upright_tree_mang_trunk_dead_03 | +| badger:block_upright_tree_mang_trunk_green | +| badger:block_upright_tree_mang_trunk_moss | +| badger:block_upright_tree_mang_vine | +| badger:block_upright_tree_mang_vine_moss | +| badger:block_upright_tree_mang_vine_v01 | +| badger:block_upright_tree_mushroom_glow_01 | +| badger:block_upright_tree_mushroom_trunk | +| badger:block_upright_tree_shaggy_trunk_moss | +| badger:block_upright_wof_prismarine_01 | +| badger:block_upright_wof_prismarine_02 | +| badger:block_villager_solid_air | +| badger:block_wall_stonebrick | +| badger:block_water | +| badger:block_well_of_fate_path | +| badger:block_well_of_fate_path_sheet | +| badger:block_well_of_fate_path_var01 | +| badger:block_well_of_fate_path_var02 | +| badger:block_well_of_fate_path_var03 | +| badger:block_whiterock_var01 | +| badger:block_whiterock_var02 | +| badger:block_whiterock_var03 | +| badger:block_wof_crystal_01 | +| badger:block_wof_crystal_04 | +| badger:block_wof_crystal_05 | +| badger:block_wof_crystal_blend_01 | +| badger:block_wof_crystal_blend_01_nobuild | +| badger:block_wof_crystal_blend_02 | +| badger:block_wof_crystal_blend_02_nobuild | +| badger:block_wof_crystal_blend_03 | +| badger:block_wof_crystal_blend_04 | +| badger:block_wof_crystal_blend_05 | +| badger:block_wof_crystalfall_01 | +| badger:block_wof_ground_energy_large | +| badger:block_wof_ground_energy_medium | +| badger:block_wof_ground_energy_small | +| badger:block_wof_prismarine_base_01 | +| badger:block_workbench | +| minecraft:air | +| minecraft:bedrock | +| minecraft:dirt | +| minecraft:flowing_lava | +| minecraft:flowing_water | +| minecraft:grass | +| minecraft:lava | +| minecraft:stone | +| minecraft:structure_block | +| minecraft:structure_void | +| minecraft:water | diff --git a/docs/bsharp/bsharp-reference-sheet.md b/docs/bsharp/bsharp-reference-sheet.md new file mode 100644 index 0000000..859ac75 --- /dev/null +++ b/docs/bsharp/bsharp-reference-sheet.md @@ -0,0 +1,248 @@ +--- +title: BSharp Reference Sheet +--- + +# B# Reference Sheet +## Core B# + +### Listeners + +Listeners are how we listen to specific game events, and direct those events to snippets when fired. + +```jsx +LISTENFOR_EntitySpawned({ + snippet: "es_snippet_to_execute", + ownerVillageId: OWNER_VILLAGE_OPT_OUT, + includeTags: ["mob"], + payloadString: "hello" +}) +``` + +- `snippet` : required for all listeners, this defines the snippet to execute. +- `ownerVillageId` : required for all listeners, this defines the village that owns this listener. See section Villages below. +- `includeTags` : a listener rule for this type of listener. Each listener accepts a different set of rules (sometimes required) that determine if the event should trigger the snippet. +- `payloadString` : a payload to forward to the snippet when it executes. See section Payloads below. + +### Snippets + +Snippets are your “functions” or logic to execute when a listener triggers. + +```jsx +SNIPPET_EntitySpawned("es_snippet_to_execute", (entity, payload) => { + // do stuff here! +}) +``` + +- `"es_snippet_to_execute"` : First parameter is the snippet name. Listeners with the same `snippet` value will trigger this snippet. + - It is possible to have multiple listeners point to a single snippet, but not the other way around (when a snippet is defined its name must be unique). +- `(entity, ...)` : Each snippet will be provided a set number of arguments to operate on. See the documentation for more details on each snippet type. +- `(..., payload)` : The last argument for any snippet is always the payload. + +### Bootstraps + +Are a special classification of snippets that execute when the game starts in some way. They are special as they do not require a listener to be executed. Generally the snippet name is used as a listener rule instead. + +There are 4 bootstrap snippets, taken from the documentation itself: + +```jsx +/** + * Logic to perform when the server begins. + * No listener required. All bootstrap snippets will fire at the beginning of a new game. + */ +declare function SNIPPET_Bootstrap(snippetName: string, callback: BootstrapCallback): void +declare type BootstrapCallback = () => void + +/** + * Logic to perform when the server begins. + * No listener required. All bootstrap snippets will fire at the beginning of a new game. + * This snippet runs at the start of EVERY game, even after save-load. + */ +declare function SNIPPET_GameLoadBootstrap(snippetName: string, callback: GameLoadBootstrapCallback): void +declare type GameLoadBootstrapCallback = (isSaveLoaded: boolean) => void + +/** + * Similiar to Bootstrap. The name of the snippet should match the rule that is being reacted to. + * Passes along the value of the rule as a parameter. + * No listener required. All rule initialized snippets will fire at the beginning of a new game. + */ +declare function SNIPPET_RuleInitialized(snippetName: string, callback: RuleInitializedCallback): void +declare type RuleInitializedCallback = (ruleValue: VariantData) => void + +/** + * Similiar to Bootstrap. The name of the snippet should match the game mode this is being reacted to. + * No listener required. All rule initialized snippets will fire at the beginning of a new game. + */ +declare function SNIPPET_InheritsFromGameMode(snippetName: string, callback: RuleInitializedCallback): void +declare type RuleInitializedCallback = () => void +``` + +In general, this is when you would use this specific bootstrap: + +- `SNIPPET_Bootstrap` when you need shared “core” functionality between all game modes. **In general this shouldn’t be used**. +- `SNIPPET_InheritsFromGameMode` when you need behaviour specific to a game mode. **This should be your default go to.** +- `SNIPPET_RuleInitialized` when you want to enable modular behaviour defined by game-rules, the idea being it is functional across multiple game modes. +- `SNIPPET_GameLoadBootstrap` used in special circumstances when you need to do something on game reload (from a save file). The intended use for this is for DLC islands, when we need to add content after a world has already been generated. + +### Callbacks + +Another class of special snippets that don’t use a listener. Instead some B# functions (OUTPUTS) when executed can specify a callback as the last parameter, which will execute the associated snippet when relevant. + +There are 2 callbacks, taken from the documentation itself: + +```jsx +/** + * Logic to execute when an entity has arrived or failed to reach its destination. + * ex. **OUTPUT_MoveEntity(..., "mc_retreat_after_reaching_destination")** + * + * @param snippetName The snippet name. + * @param callback The callback to call. + */ +declare function SNIPPET_MoveCallback(snippetName: string, callback: MoveCallbackCallback): void +declare type MoveCallbackCallback = (moverEntityGroup: number, successfullyArrived: boolean, payload: SnippetPayload) => void + +/** + * Use `SpawnedBuildableCallback(snippetName)` instead! + * ex. **OUTPUT_SpawnBuildableAt(..., "sbc_spawn_guarding_mobs")** + * + * @param snippetName The snippet name. + * @param callback The callback to call. + */ +declare function SNIPPET_SpawnedBuildableCallback(snippetName: string, callback: SpawnedBuildableCallbackCallback): void +declare type SpawnedBuildableCallbackCallback = (completedStructure: number, payload: SnippetPayload) => void +``` + +### Payloads + +Payloads are supported for all listeners and snippets. It allows you to past contextual information at the time of registering the listener, to when the snippet is executed. + +- Listeners can pass **one of each** payload type via `payloadString`, `payloadInt`, `payloadFloat`, `payloadEntities` +- Snippets can receive the payload **as the last argument of the snippet** via `payload.string`, `payload.int`, `payload.float`, `payload.entities` + - You can also use `payload.ownerVillageId` which will be defined if the listener defined `ownerVillageId`. (This is the preferred way of getting the village in a snippet when possible) + +### Villages & Suspension + +A core concept in Minecraft Legends (not just B#) are villages. You can think of villages as a “Location” - an area in the game world which can house entities such as buildings, mobs, or even invisible things (like music emitters, trigger volumes, etc.). + +Suspension is the act of saving out an entity and having it enter a state of stasis due to our massive open world which makes keeping everything loaded infeasible. Special care has been made sure to ensure B# only ever works with fully loaded active entities (so all the information on the entity will be on as you expect). + +Villages are crucial to B# as they can guarantee what entities are queryable and useable at the time of your snippet execution. **When a listener that belongs to a village executes it is guaranteed that all entities belonging to the same village will also be loaded**. + +- For example: querying the number of structures in a village when a village owned listener executes is safe. + +**Note when a village is suspended, your listener will also be suspended.** + +- For example: listening for a global variable is generally not safe in a village owned listener as the village may be unloaded. + +The mechanism that drives this group un/suspension is called Atomic Village Suspension which you may hear BSharpies refer to. + +### Entity Groups, Entities, and Entity + +An Entity Group (EG) is how we represent an entity or entities in B#. It is a special data type, don't ask about it. + +Note some functions require an entity group of one and only one (referred to as "**entity**" in the documentation). + +Conversely, some functions require a group of entities (referred to as “**entities**” in the documentation) which includes a group of 0 entities or more. + +### Queries + +Queries are how we read game state - without mutating it - such as getting the count in an entity group. + +All queries are prefixed with `QUERY_` + +### Outputs + +Outputs are how we “output” changes to game state such as spawning a new entity. + +All outputs are prefixed with `OUTPUT_` + +### Filters + +Filters are how we filter down an entity group into something of the same size or smaller. For example returning all the entities within range of another entity. + +All filters are prefixed with `FILTER_` + +### Operations + +Operations are how combine entity groups into another group. For example doing the union of two groups (combine with no duplicates). If you consider an EG as a set of entities, there is an operation function for each mathematical set operation. + +All operations are prefixed with `OPER_` + +### Global Variables + +B# is largely stateless, we listen to events and respond to them "right away". However, if you do need to store some information you can use our global variable storage via commands such as `OUTPUT_SetGlobalVariable(key, intergerValue)` allowing you to store integer values to retrieve at a later time. + +Please **DO NOT** store variables like this `var thing = 123` at the global scope. Values like this still be lost to the void when the player exits and reloads. + +# **Advanced topics** + +These topics dive a little deeper into the nuance of our game, how we author scripts, as well as functions specific to game-modes like campaign. + +### Configuration objects / files + +Located at the top of scripts generally, are configuration objects which only contain “data” (and no logic). This presents an easy way to tune the functionality of a script as all the tunable values are grouped in one location. + +**Notes** + +You may notice special config objects existing in separate files entirely by themselves, with *another* script utilizing the config elsewhere. For example imagine `const gameConfig = {}` moved to a `a_moba_config.js` file. This is generally done for two reasons + +- It allows our teams to completely override the config (including removing it) for separate game-modes, useful for DLC (note there are other approaches to this too). +- Separates massive config files to shorten scripts, this is especially useful if multiple configs exists (eg. `a_config_horde_attack.js`, `a_config_horde_defend.js`) which makes tracking changes much easier. + +### Naming Conventions + +When a constant or function at the global scope is prefixed with `_` it means this **constant/function is only used within this file.** For example `_SpawnAttackingUnits = () => { // return stuff }` .This provides an easy way to know if changing a function’s behaviour could affect other scripts. + +To be clear this is purely used for semantics - all scripts are loaded at the global level meaning you *can* reference other file’s constants (but you shouldn’t!). If you get a ‘x declared already’ error this is most likely why! + +When `_` is used in a function though, it means the **function argument is not used**. For example `SNIPPET_EntitySpawned(..., (_spawnedEntity))` - if you don’t actually need to operate on the spawned entity in anyway. + +### File Naming Conventions & Load Order + +The file *path* (that includes the folder name!) determines the load order, sorted alphabetically. This is why we have some files named prefixed with `aaa_` to guarantee it loads first - this is used exclusively for files with helper functions, constants, and config files. + +### Helper functions + +Helper functions (local to a file or global to all) are ways to execute common functionality repeatedly. If you notice yourself duplicating scripts or doing something very similar make a helper function or reach out to fellow scripters for assistance! + +In B# land we define functions like so: + +```jsx +// or MyLocalFunction if you wanted it to be global! +const _myLocalFunction = (argument1, argument2) => { + // do stuff! +} + +``` + +If you have used Javascript before then you may be more familiar with this syntax: +```function _myLocalFunction(argument1, argument2) => { }``` +We don’t do this because you can redefine and *stomp* an existing function - which leads to really hard to catch bugs! + +### Special “Libraries” + +B# has some special libraries fully* defined in script, utilizing all of Core B# to do neat things. + +For example + +- `DECK_` : Used to drawn and set B# decks (this is a special case and is not *fully* scripted) +- [DEPRECATED] `RALLYMAN_` : Used to group and dispatch units. +- `aaaa_ai_helpers.js` : Supersedes above, and unfortunately doesn’t have a prefix. Used to interface with base AI. + +### Entity Destruction Listeners + +Due to the massive open world nature of Minecraft Legends, we’ve had to introduce several destruction listeners each with their own nuance. Here’s an overview of all 3. + +| | Guaranteed to fire | Provides destroyed entity | Valid entities | Intended usecase | +| --------------------------- | ------------------ | ------------------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | +| NonPopCappedEntityDestroyed | Yes | Yes | Non pop cap entities (entities that can only be destroyed while unsuspended). Eg. Structures and bosses. | When you want to do critical work based off an entity that was destroyed. (eg. progression beats) | +| PopCappedEntityDestroyed | No | Yes | Any entity. | When you want to do non-critical work based off an entity that was destroyed. (eg. play effects) | +| EntitiesAmountDestroyed | Yes | No | Any entity. | When you care about amount of entities destroyed OR need to guarantee your snippet triggers. | + +### Random Number Generation + +Avoid the standard library's `Math.random()` as it is not deterministic between instances of the game. Stick to `QUERY_RandomNumber` and `QUERY_RandomNumberGroup`. + +The `Number` returned by `QUERY_RandomNumber` and `QUERY_RandomNumberGroup` is an integer and can immediately be used as an array index. + +Consider using `QUERY_RandomNumberGroup` for consistent randomness that you do not want to be affected by other areas of the game (eg: the player affecting the state of the game world). + diff --git a/docs/bsharp/index.md b/docs/bsharp/index.md new file mode 100644 index 0000000..ca7420b --- /dev/null +++ b/docs/bsharp/index.md @@ -0,0 +1,3 @@ +--- +title: BSharp +--- diff --git a/docs/custom-game-settings/custom-game-settings.md b/docs/custom-game-settings/custom-game-settings.md new file mode 100644 index 0000000..e0724a7 --- /dev/null +++ b/docs/custom-game-settings/custom-game-settings.md @@ -0,0 +1,257 @@ +--- +title: Custom Game Settings +nav_order: 1 +--- + +# Minecraft Legends - Custom Game Settings + +![](images/custom_game_settings/image01.png) + +**Figure 1:** Screenshot of custom settings screen + +## What are custom game settings? + +Campaign and PVP have separate 'custom' game modes that feature a wide variety of settings to adjust various gameplay systems. These can range from player unit and enemy behaviors, starting and max resources, available structures, etc. + +The data for custom settings lives in `resource_packs/badger_base/gamelayer/launcher/custom_game_settings.json` + +## How to add a custom game setting? + +Adding a custom game setting is done through a combination of adding Custom Settings Data as well as data that reads the value of the setting to apply its effects in game. Both of these aspects are explained in greater detail [below](https://github.com/Mojang/minecraft-legends-docs/blob/main/CustomGameSettings.md#using-custom-settings). + +The vast majority of custom game settings that already exist are configured this way and can serve as examples for additional options. Note however that options such as 'world_world_seed' and 'world_world_size' have specific functionality in the game's engine which is not accessible. + +### Custom Settings Data + +The settings data is laid out with a category name for the main object, which will contain several sub categories and each sub category will have a list of settings. + +The main categories are the names of the Tabs in the custom settings screen and the sub categories are the names of the headers above each section of settings per tab. + +``` +{ + "mainCategory": { + "subCategory": [ + { // ======== Example ======== + "id": "world_world_seed", + "value_type": "string", + "value": "", + "backend_type": "customgame", + "ui_type": "textfield", + "game_mode_type": "allmodes", + "is_editable": false, + "save_last_used_value": false, + "enable_requirements": [], + "options": [ + ] + }, + ] + } +} +``` + +--- + +#### Property: Category ("mainCategory" from example) & Sub Category ("subCategory" from example) + +(**required**) + +Add the setting to an existing category/subcategory. May choose to create a new category or subcategory, this will create a new tab or sub header respectively. + +![](images/custom_game_settings/tabs.png) + +--- + +#### Property: "id" + +(**required**) + +This will be the identifier for the setting, and how it will be referenced when connecting the value to the gameplay system. + +--- + +#### Property: "backend_type" + +(**required**) + +_possible values_: "customgame" (always) + +--- + +#### Property: "value_type" + +(**required**) + +_possible values_: "int", "float" or "string" + +--- + +#### Property: "ui_type" + +(**required**) + +_possible values_: + +| Type | Visual | "uiType" | "valueType" | "options" | +| ----------- | ----------------------------------------------- | ----------------------- | -------------- | --------------------------------- | +| Switch | ![](images/custom_game_settings/switch.png) | "switch" | "int" | | +| Slider | ![](images/custom_game_settings/slider.png) | "slider" | "int", "float" | [{"min": #}, {"max": #}] | +| Button | ![](images/custom_game_settings/button.png) | "button" or "rowbutton" | n/a | | +| Dropdown | ![](images/custom_game_settings/dropdown.png) | "dropdown" | "int" | {"label": string} | +| Textfield | ![](images/custom_game_settings/textfield.png) | "textfield" | "string" | | +| Radio Group | ![](images/custom_game_settings/radiogroup.png) | "radiogroup" | "string" | [{"label": option name}, {} ....] | +| Toggles | ![](images/custom_game_settings/toggles.png) | "toggles" | "int" | | + +--- + +#### Property: "is_editable" + +(**optional**) + +Dictates if the setting can be edited when loading a saved custom game. +_possible values_: true or false + +--- + +#### Property: "save_last_used_value" + +(**optional**) + +_possible values_: true or false +Defaults to _true_ + +--- + +#### Property: "enable_requirements" + +(**optional**) + +What conditions are required for the setting to be enabled (meaning visible) + +_possible values_: + +| Requirement | Description | +| ----------------------- | -------------------------- | +| "platform_ps" | If Playstation platform | +| "platform_not_gamecore" | If not PC or Xbox platform | +| "platform_pc" | If PC platform | +| "platform_nx" | If Switch platform | +| "platform_not_ps" | If not PS platform | +| "platform_not_nx" | If not Switch platform | +| "platform_not_steam" | If not Steam platform | + +--- + +#### Property: "game_mode_type" + +(**optional**) + +Dictates which game mode the setting will appear in + +_possible values_: "allmodes", "campaign" or "pvp" + +--- + +#### Property: slider_convert_to_percent + +(**optional**) + +For slider settings only. Setting this to _true_ will convert the value to a percent visually in the menu. It will not affect the actual value used by the gameplay system. + +_possible values_: true or false +Defaults to _false_ + +--- + +#### Property: "slider_step_incremenet" + +(**optional**) + +For slider settings only. Numeric value to be used as the slider value increment. (Sliders default to 1) + +_possible values_: any whole number (preferably a number that will divide the full range of the slider evenly) + +![](images/custom_game_settings/sliderSteps.png) + +--- + +### Using Custom Settings + +After the data for a custom game setting has been added, it should appear in the front end when starting a new custom game, or loading a previously saved one in the case of custom campaigns. When the game is started (from the lobby) each setting and their values will be stored on the server and saved alongside other game data. + +The values for each custom game setting can then be used with entity archetype data and/or in B# scripts that exist on the server. + +#### Entity Archetypes + +Entities are constructed with a series of components that describe their behaviour. Since custom game settings are server-bound, this section only applies to server entity descriptions. For more general information about how entities are constructed, as well as a list of all the available components and their properties, check out the documentation for [Entities](https://github.com/Mojang/minecraft-legends-docs/blob/main/Entities.md#server-entity-documentation). + +In particular, there is a family of components with similar names: badger:difficulty_modifier_... + +These components are the mechanism in which an entity's properties can be altered based on what difficulty is chosen by the player. Consider this example: + +``` + "badger:difficulty_modifier_damage": { + "difficulties": { + "Peaceful": { + "post_multiply": 0.5 + }, + "Easy": { + "post_multiply": 1.0 + }, + "Normal": { + "post_multiply": 1.5 + }, + "Hard": { + "post_multiply": 2.0 + } + } + } +``` + +Since `badger:difficulty_modifier_damage` changes the damage of an entity's target actions, attaching this component to an entity would mean that the damage they deal through their target actions would increase as players choose harder difficulties. _See [the documentation](https://github.com/Mojang/minecraft-legends-docs/blob/main/Entities.md#badgerdifficulty_modifier_damage) for these components for a complete description of these properties._ + +Custom game modes have their own 'Custom' difficulty as they don't rely on traditional difficulty options for modifications such as this, however the same machanism is used to modify entities. Rather than defining a static value for a traditional difficulty, a separate section `"custom_game_settings"` can be used instead or in tandem: + +``` + "badger:difficulty_modifier_damage": { + "difficulties": { ... }, + "custom_game_settings": [ + { + "setting_name": "unit_damage", + "numeric_modifier_type": "post_multiply", + "scaling_factor": 1.0 + } + ] + } +``` + +Comparing this to the previous example, if an entity in a custom game had this component in it's description, their target actions' damage would instead be modified by _multiplying_ their base damage (which is the damage in the specific target action) by the value set for the `unit_damage` custom game setting. + +A description of each property is as follows: + +| Property | Values | Description | +| --------------------- | ---------------------------------------------- | -------------------------------------------------------------------------------------------------- | +| setting_name | any valid custom setting id | The id of the custom game setting whose value you want to use for modifying the entity's property. | +| numeric_modifier_type | pre_add, post_add, pre_multiply, post_multiply | Descriptor for how the value of the custom game setting should be applied to the base value. | +| scaling_factor | any float between (0.0, 1.0] | Scales the value of the custom game setting before it is applied to the entity's base value. | + +This applies to all the components in the _badger:difficulty*modifier*..._ family. Check out the [Entities](https://github.com/Mojang/minecraft-legends-docs/blob/main/Entities.md#server-entity-documentation) documentation to see all of these components that are available. + +A special mention here for the `"badger:template"` component as well. This component can be used for specific entity descriptions to inherit the components from the descriptions of other entities. This can be really useful for custom game settings since we can define a single difficulty modifier elsewhere and apply it to any number of different entities. Just define the difficulty modifier on a generic entity and then include its identifier in the template component for your specific entity and it will be modified the same as if you added it directly. **Note that if an entity inherits from another and they both define the same component, the resulting component will have a combination of both copmonents' properties, using the property of the inheriting entity's components when they're defined for both.** + +#### B# Scripts + +_This section only covers specifically how custom game settings are used within B# scripts. For a better idea how B# is used generally, check out the [B# Reference Sheet](https://github.com/Mojang/minecraft-legends-docs/blob/main/BSharpReferenceSheet.md#b-reference-sheet)_ + +When the game is started from the lobby and the values of each setting have been receieved, each value is provided to scripts through a special bootstrap snippet **SNIPPET_GameSettingInitialized** wherever the custom game setting's id matches the first argument of the snippet. + +``` +SNIPPET_GameSettingInitialized("custom_game_setting_id", (value) => { + const settingValue = value.value + + // Do stuff with the setting's value +}) +``` + +These snippets trigger before any other bootstrap snippets so that their effects can be applied before they are used anywhere else. This can be helpful in cases where things like data structures need to be altered based on the provided value(s). + +These snippets also trigger every time a game mode is launched, either from a new game or one that was previously saved. This is because B# script files are always parsed at this time, so previous changes in scripts that are not saved need to be re-applied each time a saved game is loaded to keep the behaviour consistent. diff --git a/docs/custom-game-settings/index.md b/docs/custom-game-settings/index.md new file mode 100644 index 0000000..0de32bd --- /dev/null +++ b/docs/custom-game-settings/index.md @@ -0,0 +1,3 @@ +--- +title: Custom Game Settings +--- diff --git a/docs/entities/EventTriggers.md b/docs/entities/EventTriggers.md new file mode 100644 index 0000000..1f31a93 --- /dev/null +++ b/docs/entities/EventTriggers.md @@ -0,0 +1,227 @@ +--- +title: Event Triggers +--- + +# Minecraft Legends Event Triggers +Event Triggers give entities life by allowing them to react to changes in gameplay state. Things like animations, audio, particles are driven through event triggers. + +## Animation +Set the animation state on the entity which has the `badger:presentation_event` component. + +Example:  +``` +"range_ability_a": { + "animation": "range_ability_a" +} +``` + +## Audio +Play a sound effect at the position of the entity which has the `badger:presentation_event` component. + +We can specify music to play by setting `is_music` to `true`. Music can also have a type (`"combat","cinematic","exploration","proximity"`). The reason for the type is that we can set audio parameters on music as well. Each type can have it's own set of parameters, but be careful and make sure to reset your music parameters per type when you want to use it. + +Example:   + +``` +"on_construction_start": { + "audio": "BAE_STRUC_Generic_BuildSequence" +} +``` + +For music: +``` +"on_piglin_combat_start": { +    "audio": { +        "event": "BAE_MUS_Piglin_Combat", +        "is_music": true, +        "music_type": "combat" +    } +}, +``` + +## External Audio +Lists of Audio Presentation Events can be defined in separate files and then used in any entity by adding the `external_audio_events` type. + +External Presentation Event lists are defined in files by using the `badger:external_audio_presentation_events` component. + +Here is an example of the `on_hero_lured` presentation event being defined in a new JSON file inside the `badger:mob_skeleton` list (NOTE: The list name does not need to match the entity it will be used on): + +``` +{ + "badger:external_audio_presentation_events" : { + "badger:mob_skeleton": { + "on_hero_lured":{ + "audio": "BAE_test_oneshot_3d" + } + } + }, + "format_version" : "1.0.0" +} +``` + +External lists can then be referenced in an entity's `badger:presentation_events` component by using the `external_audio_events` type and specifying an `external_event_list` to be imported. + +Here is an example of the `badger:mob_skeleton` list being imported into the `badger:mob_skeleton` entity's presentation events: + +``` + "badger:presentation_event": { + "external_audio_events": { + "external_event_list": "badger:mob_skeleton" + }, + "intense_hit": { + "audio": "BAE_mob_skeleton_dx_rps_notifies_intense_hit" + } + } +``` + +## Entity +Spawn a new entity on the client or server. The new entity's position and team is copied from the entity which has the `badger:presentation_event` component. + +You can also spawn multiple entities with an array: `"entity": ["badger:mob_zombie", "badger:piglin_runt", "badger:mob_wolf"]` + +Example: +``` +"on_world_hit": { + "entity": "badger:pres_entity_test" +} +``` + +## Particles +Play a particle effect on the entity which has the `badger:presentation_event` component. + +Example: +``` +"on_initialized": { + "particles": { + "effect": "fx_trail", + "locator": "loc_fx_tip", + "enabled": true, + "bind_to_actor": true + } + +"on_world_hit": { + "particles": "fx_impact" +``` + +If you want to call more then one effect on a presentation event use this syntax: + +``` +"on_construction_end": { + "particles": [ + { + "effect": "badger:fx_creeper_death", + "enabled": true + }, + { + "effect": "badger:fx_block_butterflies", + "enabled": true + } + ] +} +``` + +## Script +Calls a script on the entity which has the  `badger:presentation_event` component. + +Example: +``` +"event_scripts": { + "melee_attack_a": "variable.attack_used = 1;", + "melee_attack_b": "variable.attack_used = 2;" +} +``` + +``` +"badger:presentation_event": { + "on_melee_attack_a": { + "script": "melee_attack_a" +} +``` + +## Outline +Set the outline color on the entity which has the `badger:presentation_event` component. + +Example: + +``` +"on_lured": { + "outline": { + "color": 4, // an index into the outline colors array defined in PostFX.dragonfx (0 = None, 1 = Teammate, 2 = Enemy, 3 = Directed, 4 = Lured) + "duration": 2.0 // the seconds to display the outline for before it disappears (don't define this field, or set it to -1.0 to make it last forever) + } +} +``` + +## List of Triggers +This is a list of all of the current triggers in the game. + +| Name | Description | +| ----------------------------------- | --------------------------------------------------------------------------------------------------------- | +| `disabled_by_health` | The health of this entity has dropped enough to be disabled. | +| `on_advanced_direct_targeted` | Continuously applied when the entity is being targeted for attack using the Advanced Direct. | +| `on_aim_rotate_start` | Aiming has started rotating (redstone launcher). | +| `on_aim_rotate_stop` | Aiming has stopped rotating (redstone launcher). | +| `on_aim_selected` | Aiming has found a target (redstone launcher). | +| `on_aim_start` | Aiming has started (redstone launcher). | +| `on_aim_stop` | Aiming has stopped (redstone launcher). | +| `on_allay_deployed` | When an allay spawns from the player and begins flying to its target. | +| `on_allay_despawned` | When the allay reaches the player and disappears. | +| `on_allay_returning` | When an allay finishes its task and begins moving back to the player. | +| `on_allay_working` | When an allay reaches its target and begins working (gathering, deconstructing, or building). | +| `on_battle_view_exit` | Exiting banner view. | +| `on_battle_view_start` | Entering banner view. | +| `on_beat_1_received` | Music beat 1. Used for syncing events to the beat of the music. | +| `on_beat_2_received` | Music beat 2. Used for syncing events to the beat of the music. | +| `on_beat_3_received` | Music beat 3. Used for syncing events to the beat of the music. | +| `on_beat_4_received` | Music beat 4. Used for syncing events to the beat of the music. | +| `on_block_build` | Used when a block is placed in the world by an allay. | +| `on_block_gather` | Used when a block is gathered by an allay. | +| `on_block_layer_converted` | When a block has been converted. | +| `on_block_swap_start` | When a building's blocks start being converted by a block swap modifier (ie. the mason). | +| `on_block_swap_stop` | When a building's blocks finish being converted by a block swap modifier (ie. the mason). | +| `on_buff_utilize_start` | When an entity starts getting buffed (like the carpenter hut). | +| `on_buff_utilize_stop` | When an entity stops getting buffed. | +| `on_build_preview_exit` | When building placement preview stops. | +| `on_build_preview_start` | When building placement preview starts. | +| `on_building_deconstructed` | When deconstructing an existing structure. | +| `on_building_destroyed` | When a structure is destroyed (not despawned). | +| `on_building_failed` | When attempting to place a structure without meeting its requirements. | +| `on_building_placed` | When a structure is placed. | +| `on_building_start` | When a structure begins to construct. | +| `on_building_stop` | When a structure finishes constructing. | +| `on_damage_applied_to_structure_0` | When building enters first damage state. | +| `on_damage_applied_to_structure_1` | When building enters second damaged state. | +| `on_damage_applied_to_structure_2` | When building enters third damaged state. | +| `on_death` | When an entity dies, not necessarily destroyed at this time. | +| `on_destroyed` | When an entity is destroyed. | +| `on_disband` | When an entity hits the popcap limit and is marked for death. | +| `on_entity_hit` | When a projectile collides with another entity. | +| `on_gate_close` | When a gate closes. | +| `on_gate_open` | When a gate opens. | +| `on_healing_applied_to_structure_0` | When building leaves first damage state. | +| `on_healing_applied_to_structure_1` | When building leaves second damaged state. | +| `on_healing_applied_to_structure_2` | When building leaves third damaged state. | +| `on_initialized` | When any entity is spawned, this trigger is fired. | +| `on_interact_interrupt` | When damage is taken during a long interact, such as opening zombie cages, and the action is interrupted. | +| `on_item_collected_arrived` | When a collectable item on the ground reaches the player. | +| `on_item_collected` | When a collectable item starts being collected. | +| `on_liquid_deep_enter` | Entering deep (ocean) liquid. | +| `on_liquid_deep_exit` | Exiting deep (ocean) liquid. | +| `on_liquid_shallow_enter` | Entering shallow (river) liquid. | +| `on_liquid_shallow_exit` | Exiting shallow (river) liquid. | +| `on_mount_swap` | When the player swaps a mount. | +| `on_mounted` | When the player rides a mount. | +| `on_recall_complete` | Recalling mobs has completed. | +| `on_recall_interrupt` | Recalling mobs was interrupted. | +| `on_recall_start` | Recalling mobs starts. | +| `on_recall_stop` | Recalling mobs stops. | +| `on_spawn_batch` | Called when spawning a batch of mobs from a spawner. | +| `on_spawn_cap_reached` | Called when your spawn cap has been reached. | +| `on_stamina_full` | Triggers once when a mount depletes some of its stamina, and then refills it. | +| `on_stretch_foundation_placed` | When a stretch preview is initially placed. | +| `on_throwable_landed` | When a throwable has hit the ground. Entities being knocked back are in a throwable state. | +| `on_throwable_launched` | When a throwable starts its trajectory. Entities being knocked back are in a throwable state. | +| `on_unmounted` | When the player leaves a mount. | +| `on_world_hit` | When a projectile collides with the world | +| `reticle_alternate_effect_start` | The state where the reticle turns red when selecting a target with advanced direct or redstone launcher. | +| `reticle_alternate_effect_stop` | The state where the reticle turns red when selecting a target with advanced direct or redstone launcher. | diff --git a/docs/modeling-animating/BlockBench.md b/docs/modeling-animating/BlockBench.md new file mode 100644 index 0000000..0f4ded9 --- /dev/null +++ b/docs/modeling-animating/BlockBench.md @@ -0,0 +1,119 @@ +--- +title: Blockbench +--- + +# Blockbench To Minecraft Legends +This article will walk you through how to add custom models and textures to Minecraft Legends using the popular free software Blockbench. Adding custom art content is essential to make your experience stand out and look different from the base game. For more information on using blockbench please visit the following link: + +https://www.blockbench.net/quickstart + +and then go to Minecraft: Bedrock Edition > Entity/model for some quick start information and a few tutorials. + +``` +Important! +Be sure to only use the Bedrock Entity Project type when creating projects as the exporter only supports cube geometry. +``` + +In this Article you will learn the following: + +* How to install Blockbench +* How to install the plugin +* How to export models, animations and textures + + +# Minecraft Legends Exporter Overview + +Minecraft Legends Exporter is a plugin for Blockbench to help with exporting models into a format that Minecraft Legends can use. This Article will cover how to install the plugin and how to export models, textures, animations as well as tips & best practices. + +# Download Blockbench + +To use this plugin, you need [Blockbench](https://www.blockbench.net/downloads) + +# Installing the plugin + +1. Download the [Minecraft: Legends plugin](https://github.com/Mojang/legends-blockbench-plugin/releases) +2. Unzip the downloaded release. +3. Open Blockbench and using the menu bar select **File** > **Plugins** + +![](images/blockbench_doc/image01.png) + +4. Select the load plugin icon (the icon between “Plugins” and the cloud icon). This will open a file dialog. From the file dialog, navigate to where you unzipped the downloaded plugin, select the `legends-blockbench-plugin +/minecraftLegendsExporter.js` file, and then select Open. + +![](images/blockbench_doc/image02.png) +![](images/blockbench_doc/image03.png) + +5. There will be a popup that displays the following prompt: ”Do you want to allow this plugin to make changes to your PC? Only load plugins from authors you trust.” Select Ok and the plugin will be loaded. + +![](images/blockbench_doc/image04.png) + +The exporter plugin is now loaded and ready to go. In the next section we’ll take a look at exporting a model. For more information on how to use Blockbench and create a model file please refer to the top of the article for a link to some tutorial information. For some guidelines regarding creating models specifically for Minecraft Legends please go to the best practices section. + +``` +Important! +Again, be sure to only use the Bedrock Entity Project type when creating projects as the exporter only supports cube geometry. +``` + +# Exporting a model + +When you have created your model and are ready to export, navigate to **File** > **Export** > **Minecraft Legends Exporter** + +![](images/blockbench_doc/image05.png) + +It will open a dialog box called **Export Options**: + +![](images/blockbench_doc/image06.png) + +You have three controls within the Export Options dialog: +* **Model export Scale**: This is the scale to which the model will be exported. By default, the scale is set to 1 and the model will be exported to the normal Minecraft legends scale. +* **Alpha Test**: This check box determines if the material will interpret the alpha channel of the texture as transparency. If not checked, all texels will be opaque. +* **Export Animations**: If this is checked when you press confirm it will open a secondary dialog where you can select which animations to export. + +![](images/blockbench_doc/image07.png) + +When you have set your Export Options it will open a folder selection menu where you can select where the files will be exported. You have now successfully exported the following files: +* model +* texture +* material +* animations (if export animations were selected) + +To be able to spawn the model in the game you need to create an entire Minecraft legends entity. The following files are required for a Minecraft legends entity: + +**Behavior pack files**: +* Entity.json + +**Resource Pack Files**: +* Entity.json +* Animation_controllers.json +* Render_controllers.json + +Creation of the behavior and resource pack files, however, is outside of the scope of this article. + +# Best Practices + +Here are a couple of suggestions when creating the model to avoid any unforeseen errors: + +**Project type**: Only Use the Bedrock Entity Project type in Blockbench as the exporter only supports the block shape. + +![](images/blockbench_doc/image08.png) +![](images/blockbench_doc/image09.png) + +**Naming conventions**: +Make sure to only use +* letters +* numbers +* ```.``` (period) +* ```-``` (dash) +* ```_``` (underline) + +When creating identifiers and names for files, textures and animations. Otherwise, issues could arise when exporting models or when trying to import them into your project. + +![](images/blockbench_doc/image10.png) + +**Root Bone**: +It is recommended that every model starts with a root bone that is the parent of everything and that the bone’s Pivot Point and Rotation is left at 0, 0 ,0. Then create the model and animations inside of this root bone + +![](images/blockbench_doc/image11.png) + +**Single Texture**: +Try to use a single texture for the entire model, so that your material gets exported. If you want to use multiple textures, you will need to edit the material file to contain multiple textures. diff --git a/docs/modeling-animating/index.md b/docs/modeling-animating/index.md new file mode 100644 index 0000000..e2fb00e --- /dev/null +++ b/docs/modeling-animating/index.md @@ -0,0 +1,5 @@ +--- +title: Modeling and Animating +--- + + diff --git a/docs/world-generation/village-generation.md b/docs/world-generation/village-generation.md new file mode 100644 index 0000000..11b0086 --- /dev/null +++ b/docs/world-generation/village-generation.md @@ -0,0 +1,1531 @@ +--- +title: Village Generation +--- + + +# Minecraft Legends Village Generation +## Village Planning +### Order of Operations + +Village planning is done in the following sequence of steps. + +![](images/village_generation/image01.png) + +These steps often correspond to different kinds of cards. When a village deck is processed, the village generator will handle particular kinds of cards during different steps. For instance, all the District and Zone cards are handled during the Districts & Zones phase. This is true regardless of where those cards exist in the deck. + +Cards of the same type will be handled in the order that they’re pulled off the deck. For example, the first buildable card in the deck will be the first buildable card that’s handled. This is important to keep in mind while assembling village generation decks. Buildables will often be competing for space in a village so it’s a good practice to request larger buildables first to ensure they have a good chance of placing. + +To increase readability of B# scripts, it is best practice to organize B# scripts so that village generation decks are assembled in this order even though the village generator will automatically enforce an order regardless. + +## Village Features +### Districts +All villages are composed of one or more districts. Each district is a collection of zones, but when a new district is placed, it will just exist as a position with a district name until zones are added to it. When a village is first created, a main district will be automatically created at the village’s starting position. Every zone that gets added to the village, will belong to a particular district. + +#### District Cards +To create a new district, add a card from the district_cards library to the deck. Multiply that card with some placement preference cards to influence where the new district should go relative to the main district. +After creating a new district, to add zones, buildables, walls, moats, etc to the district, multiply the card for the new request with the district card. If no district card is multiplied, the main district will be used as the default. + +Card Library Name + +**district_cards** + +Settings + +**district** + +The unique name that identifies the district. When zones are added to a district, the district name will be added to their zone tag set. Every zone that belongs to the district will have the district name as part of their tag set. + +Example + +![](images/village_generation/image02.png) +![](images/village_generation/image03.png) + +### Zones +The zones that belong to the village districts organize the area inside the village and they provide the space to place village features like buildables. To add zones to a village district, there are two types of cards available, zones_cards and layer_of_zones_cards. + +#### Zone Cards +These cards will add one or more zones to a village. The first zone added will use any placement preferences multiplied with the zone card to find the best zone (the zone with the highest score). If the number of zones requested is greater than one, we’ll continue trying to add zones that are adjacent to the first zone added until we’ve either run out of connected zones that aren’t already part of the village, or we’ve added the requested number of zones. + +Card Library Name + +**zones_cards** + +Settings + +**number_of_zones** + +The number of zones that should be added to the village. + +Example + +![](images/village_generation/image04.png) + +![](images/village_generation/image05.png) + +Note + +* Zones are always added to a district. If no explicit district is specified, the main district is used by default. +* Placement preferences can be used to specify where zones should be added to the village. +* If **number_of_zones** is greater than 1, after the first zone is added, the zones neighboring that zones will be added until the amount requested has been added. +* Only zones that aren’t already part of the existing village will be considered. +* **zone_tag_cards** can be combined with **zones_cards** to reserve zones for particular features like paths, structures, etc. + + +#### Layer of Zones Cards +When this card is handled, it will add all the zones that border the existing village district that this card is being applied to. If no district card is specified, the default main district will be used. + +Card Library Name + +**layer_of_zones_cards** + +Settings + +None + +Example + +![](images/village_generation/image06.png) + +![](images/village_generation/image07.png) + +Note + +* Layers of zones are always added to a district. If no explicit district is specified, the main district is used by default. +* The outer layer of zones around all the district zones that aren’t part of the village yet will be added to the district. +* **zone_tag_cards** can be combined with **layer_of_zones_cards** to reserve zones for particular features like paths, structures, etc. +* If your layers of zones get weird zones that stick out from them, look into the **minimum_loz_connection_width** setting. +(Found in the village_zone component. ie. in piglin_obstacle_large.json under **badger:village_zone**) +Layers of zones by default try to avoid having tight pinch points in the ring it creates, and tries to add zones to pad out thin sections. It can cause issues specifically with hex based zones. + +![](images/village_generation/image08.png) + +![](images/village_generation/image09.png) + +_In this example, four raised zones are added to the north, south, east, and west using directional placement preference cards._ + +#### Zone Tag Cards +When zones are added to a village district, they can be given one or more tags so that they can be identified later with a card from the zone_filter_cards library. Multiply a card from the zones_cards library or the layer_of_zones_cards library with a card from the zone_tag_cards library to add that tag to the zone tag set. + +Library Card Name + +**zone_tag_cards** + +Settings + +**zone_tag** + +The name of the tag that should be added to the tag set of the zone(s) that it’s applied to. + +#### Zone Filter Cards +When a village feature needs to be placed in zones that have been given a specific zone tag (see zone_tag_cards), a card from the zone_filter_cards library with a zone_filter that matches the zone tag should be multiplied with the village feature card. For example, if a group of zones have been multiplied with a zone tag card with a zone_tag of “tower town”, multiplying a card from the buildable_cards library with a zone_filter_cards card that has a zone_filter of “tower town” (and exclude set to false) will limit the zones that the buildable can place in to the “tower town” zones. + +Card Library Name + +**zone_filter_cards** + + +Settings + +**zone_filter** + +The zone tag name to filter zones by. + + +**exclude** + +Specifies where the zone_filter zone tag name should be used to exclude or include zones. This can be true or false. + +#### Zone Height Change Cards + +When multiplied with cards from the zones_cards and layer_of_zones_cards libraries, the zones added to the village will raise or lower the height of the terrain inside the zone depending on the settings specified on the zone height change card. + +Card Library Name +**zone_height_change_cards** + +Settings + +**zone_height_change** + +The distance in blocks that the terrain inside this zone will be raised or lowered. This value can be positive or negative. + +**biome** + +The name of the biome that this zone should be changed to. This is optional. + +**zone_height_control** + +This specifies how the zone_height_change should be applied. The options are: + +* “height_control_centered” - Relative to the original zone height of the first zone that was added to the village. +* “height_control_averaged” - Relative to the village average zone height of all the zones in the entire village map. This includes zones that haven’t been added to the village. +* “height_control_lowest” - Relative to the lowest zone in the group of zones being added with this particular request. +* “height_control_none” - Relative to the original zone height of the zone being raised or lowered. + +#### Moats and Pools +Moat cards can be used to either create a moat that encircles a village district or a bunch of individual lava pools. + +#### Moat Cards +Card Library Name + +**moat_cards** + +Settings + +**biome** + +The name of the biome that will exist inside of the moat zones that get added when this card is played. The particular types of blocks that will exist inside of these moat zones will be determined by the biome. + +**width_in_blocks** + +How wide the moat should be in blocks. The moat will claim as many zones as it needs to meet the requested block width and then the edges of the moat will be displaced inward to reduce the width of the moat if the zone additions resulted in a width that's larger than the requested width. + +There are a number of other village generation settings that affect the zone sizes (grid shape, zone jitter) and the moat edges (edge noise) so this new setting will need to be tuned with those others in mind. + + +**filling_depth** + +[not used] The **biome** now determines what blocks go where inside the moat zone. + + +**distance_in_zones** + +The distance in zones from the district that the moat will be placed around. + +Example + +![](images/village_generation/image10.png) + +Note +* If distance_in_zones is 0, a moat will not be placed. Instead, all the zones that have been tagged (using zone_tag_cards) with a **“lava_option”** tag will be turned into a pool. +* If distance_in_zones is greater than 0, an external moat will be placed around the district specified. If no district has been explicitly specified using one of the **district_cards**, the main district will be used by default. +* Use **zone_height_change_cards** to control the height of the moat zones. + + +### Walls +Wall cards can be used to place walls along the edges of village zones. + +#### Wall Cards +To place walls, first multiply all the zone cards that you want to place walls around with a zone tag card. Then multiply a wall card with a zone tag filter card with the same zone_tag_filter tag. + +(Optional) If you want wall fragments / gaps in the wall, you can multiply the wall card with a placement preference card(s) and a threshold card. This will score the zones that the wall would be placed around and if a zone score is less than the threshold, that zone won’t get a wall. + +The best way to create a gate or entrance in a set of walls is to request a path that connects the zones inside the walls (using the same zone tag) to some zones that are outside of the walls. The wall that the path crosses will be replaced with a gate. + + +Note +* When terrain weathering is applied, walls can slip off the side of weathered edges. To avoid this, there is a wall_offset setting in the badger:village_wall component. This offset will move walls away from the edge. If it’s tuned greater than the maximum terrain weathering amount, that should ensure walls don’t slip. + +![](images/village_generation/image11.png) + +Card Library Name +**wall_cards** + +Settings + +**wall_buildable** + +The name of the buildable to place for the wall. + +**path_entrance** + +The name of a buildable. If a path crosses this wall, the wall segment that’s crossed will be removed and replaced with this entrance buildable. Usually this is a gate buildable. + +**embedded_buildables** + +A list of buildable names. When the wall is placed, each one of them will be placed at random locations along the wall if there’s room. It’s not recommended to use these for entrances. It’s better to use path cards so that gates will be placed in locations that can connect with the path. + +### Paths +Path cards are used to place paths that connect village zones. To connect a buildable to a path, see the build_from_district_path and connect_to_path placement preference cards. + +#### Path Cards +path_cards need to be set up in a particular way before they’re added to the deck so that they’re handled correctly later when the deck is processed. For this reason, there is a special B# helper method to request a path that will connect two village zones, CreatePathRequestOnBottomOf. + +![](images/village_generation/image12.png) + +The first parameter takes a tag identifier for the path card that will be used. In this case “defend_district_path”. The second and third parameters take arrays of rule cards that will be used to identify the best start and end zone for the path. The final parameter takes the deck which this new path request will be put on the bottom of. + +The rule cards function in the same way as when they’re multiplied with zone, district, or buildable request cards. Zones will first be filtered and any placement preferences will be used to score the remaining zones so that we can find the best / highest scoring zone. This is done for the path start and path end. + +There is also another special B# helper function if you want a path that connects a village zone to the closest path to that zone, CreatePathFromZoneRequestOnBottomOf. + +![](images/village_generation/image13.png) + +The first parameter takes a tag identifier for the path card that will be used. In this case “defend_district_path”. The second parameter takes an array of rule cards that will be used to identify the best zone for the path to start in. Since the path will connect to the closest existing path, there’s no need for the additional array of rule cards that the CreatePathRequestOnBottomOf method takes. The final parameter takes the deck which this new path request will be put on the bottom of. + +Note +* Bridges will be placed when the path connects two zones with a body of water or when the path connects two zones that have a large enough height change. +* Gates will be placed when the path crosses a wall. +* Bridges failing to place can cause paths to fail too. Adding a **force_building_placement_cards** card on either set of path rules passed into the CreatePathRequestOnBottomOf call will place the path without bridges if it would fail otherwise. This is currently used by defend bases to ensure gates appear even if bridges won’t. + +Card Library Name + +**path_cards** + +Settings + +**is_district_path** + +If this is set to true, the path created with this request will use the path settings defined in the village_district_path component on the village entity. Otherwise the settings in the village_building_path will be used. An assert will be triggered if the component needed doesn't exist. + +Example + +![](images/village_generation/image14.png) + +![](images/village_generation/image15.png) + +![](images/village_generation/image16.png) + +### Terrain Weathering +Without terrain weathering, zone height changes will result in a lot of straight and perfectly smooth cliffs. Village weathering cards help rough them up a bit. The effect is a combination of a sawtooth wave layered with gradients and a lot of noise. + +#### Terrain Weathering Cards +Adding this card to a village generation deck will apply terrain weathering to all the edges of zones that have been raised or lowered with height change or moat cards. The terrain weathering card doesn’t have any settings. See the badger:village_weathering component for the terrain weathering settings. + +Card Library Name + +**terrain_weathering_cards** + +Settings + +None + +Example + +![](images/village_generation/image17.png) + +![](images/village_generation/image18.png) + +### Buildables +Buildables (aka structures or buildings) are requested using buildable cards. + +#### Buildable Cards +Cards from the buildable_cards library are often multiplied with district, placement preference, and zone filter cards to control where they get placed in the village. + +Note +* It’s best practice to add the largest, most important buildable cards to the deck first. Buildables will be placed in the order that the cards are pulled from the deck. If smaller non-critical structures are placed first, they might space out and take up the room needed to place the larger structures. +* Buildable cards are the only kind of village feature card that can be handled after a village is done in generating for the first time. For example, when piglin bases respond to player attacks in campaign or when they rebuild in PvP. + +Card Library Name + +**buildable_cards** + +Settings + +**buildable** + + +## Placement Preference Cards +In general, placement preference cards should be multiplied with other cards like district, path, wall, zone, and buildable cards to change how those cards get handled. + +Card Library Name + +**placement_preference_cards** + +### Circle Sine Wave +This placement preference will use the angle between the zone positions and the district start position to sample from a sine wave. The result from that sine wave is shifted so that the placement preference will by default add a score between 0 and 1 to the zone being scored. + +Name + +**circle_sine_wave** + +Settings + +**amplitude** + +By default, the circle_sine_wave placement preference will add a score between 0 and 1. This score will be multiplied with the amplitude. As a result, the amplitude can be used to increase or decrease the effect that this placement preference has on the final score. + +**frequency** + +The frequency determines the number of times the sine wave oscillates between 0 and 1 over the 0 to 360 degree range. + +Example + +![](images/village_generation/image19.png) + +![](images/village_generation/image20.png) + +When combined with a wall request card and a threshold card, circle_sine_wave can be used to create fragmented walls. The yellow lines are how I like to visualize the sine wave as it affects the scores of the zones. + +### Close to Buildable +Zones will be scored higher if they're close to the buildable specified. + +Name + +**close_to_buildable** + +Settings + +**buildable** + +The tag for the buildable to place close to. This should match one of the tags in the “tags” list in the badger:tags component for that buildable entity. + +Example + +![](images/village_generation/image26.png) + +![](images/village_generation/image22.png) + +In this example, the towers are requested close to the buildable with the “pigGate” tag. + +### Close to District Center +This placement preference will score zones higher if they’re closer to the barycenter of all the district zones. The closest zone(s) will be given a score of 1, the farthest zone(s) a score of 0, and all the other district zones will be given a score in between 0 and 1 depending on how far they are from the center. + +Note +* The district center will update each time a new zone is added to the district. That means the center will be continuously changing until all the zones have been added. Using the close_to_district_center before all the zones have been added may have some surprising results. + +Name + +**close_to_district_center** + +Settings + +None + +Example + +![](images/village_generation/image23.png) + +![](images/village_generation/image24.png) + +This example base has a main district in the center, a separate district on the left that's lower than the main district, and a separate district on the right that’s higher than the main district. All the zones in the district on the left were added with the close_to_district_start placement preference. All the zones in the district on the right were added with the close_to_district_center placement preference. Likewise, the tower in the district on the left was requested with the close_to_district_start placement preference and the tower in the district on the right was requested with the close_to_district_center placement preference. + + +### +Close to District Start + +The close_to_district_start placement preference will score zones higher if they’re closer to the zone that was added first to the district. The zone that was added first will contain the starting position and will be given a score of 1. The farthest zone(s) from the starting position will be given a score of 0 and all the zones in between will be given a score between 0 and 1 depending on how far they are from the start. + +Name + +**close_to_district_start** + +Settings + +None + +Example + +![](images/village_generation/image25.png) + +### Close to Influence +This placement preference will score zones higher if they’re close to a particular unit that has the “badger:village_influence” component. This can be used to place buildables near attacking enemy mobs or friendly mobs during gameplay. + +Name + +**close_to_influence** + +Settings + +**alliance_rule_filter** + +Indicates what units should influence this placement preference. Possible values include “enemy”, “friendly”, and “any_team”. + +Close to Village Start + +The placement preference is the same as the close_to_district_start placement preference. It exists because it was added before it was possible to have multiple districts in a village. + +Name + +**close_to_village_start** + +Settings + +None + + +### Close to Walls +Score zones higher based on the number of walls bordering them. + +Note +* The close_to_buildable placement preference can be used for the same purpose if a wall tag is specified for the “buildable” setting. This close_to_wall placement preference will only score zones higher if the zones actually have walls bordering them whereas the close_to_buildable placement preference will also score nearby zones higher even if they don’t have walls actually bordering them. + +Name + +**close_to_walls** + +Settings + +None + +### Close to Water +Zones will be scored higher if they're close to a zone containing water. + +Name + +**close_to_water** + +Settings + +None + +Example + +![](images/village_generation/image26.png) + +![](images/village_generation/image27.png) + +In this example, the nether spreaders were requested outside the village and close to water. + + +### Connect to Path +This placement preference card can be multiplied with a buildable request card. Buildable request cards that have the “connect_to_path” placement preference will try to generate a path from the position of the buildable to the nearest path. + + +Note +* Since the buildable is placed and then the path is created, it’s common for the path to not be able to find or connect to an existing path because of the buildables placement. For instance, if the buildable is placed such that it’s facing another buildable, it’s likely the path won’t have enough space to place. +* The “build_from_district_path” placement preference is generally a better method for connecting buildables to paths. + +Name + +**connect_to_path** + +Settings +None + +Example + +![](images/village_generation/image28.png) + +### Clear Resources In Zone +This placement preference can be multiplied with a zone request card. Zone request cards with this placement preference will remove all the world features that overlap the zone(s) that get added to the village when the zone request card is handled. + +Note +* It’s not necessary to use this card to clear world features for buildables. World features will be removed if they overlap buildables regardless. + +Name + +**clear_resources_in_zone** + +Settings + +None + +### Disable Spacing +There is a default spacing behavior that tries to distribute structures so that they don’t bunch up too much when they have a lot of room to place in. That spacing behavior is turned off for a particular buildable request if the “disable_spacing” placement preference is multiplied with that buildable request. + +Name + +**disable_spacing** + +Settings + +None + +### Distance From District Start +This placement preference will score zones higher if the distance between the zone site and the district start is close to a specified distance. This placement preference can be multiplied with district, buildable, and path requests. + +Note +* This preference will be most reliable in low jitter bases. This is especially true if you are using smaller distances and tight tolerances with this preference. + + +Name + +**distance_from_district_start** + + +Settings + +**distance_from_district_start** + +The distance (range or single value) in blocks from the district starting position that the placement should ideally be placed. + +**distance_to_zero_score** + +The distance from the **distance_from_district_start** until the score added to zones by this placement preference is reduced to 0. For the example card below, with placement preference will add 1 to the zones that are between 80-90 blocks from the district start. At 70-80 and 90-100 blocks the score added will be a value between 0 and 1 depending on how far it is from 80 and 90 blocks away. + +Example + +![](images/village_generation/image29.png) + +![](images/village_generation/image30.png) + +Sorry, you’ll likely need to zoom in 200% to see this one. In this example the placement preference is being used to place a district a specific distance from the village start/center. (This was used to make the screenshot below.) + +![](images/village_generation/image31.png) + +### Elevation Range +This placement preference will score zones higher if the normalized height at the zone site is close to the specified target height. + +Note +* If you aren't using a score threshold, zones that fall outside the range can still be used once good zones are exhausted, so be careful. + +Name + +**elevation_range** + +Settings + +**elevation_target** + +This can be a value between 0 and 1. If a zone has a normalized height of 1, that zone is the highest zone in the village. + +**elevation_max** + +This can be a value between 0 and 1. It’s the upper limit for zone heights. If a zone has a normalized height that’s higher, this placement preference won’t add any score. + +**elevation_min** +This can be a value between 0 and 1. It’s the lower limit for zone heights. If a zone has a normalized height that’s lower, this placement preference won’t add any score. + +Example + +![](images/village_generation/image32.png) + +![](images/village_generation/image33.png) + +### Facing Buildable +This placement preference can be multiplied with buildable request cards. Buildable request cards with this placement preference will try to place with an orientation that faces the nearest specified buildable if one exists. + +Note +* Buildables can only face cardinal directions due to their blocky nature. If the buildable to face is north west of the buildable being placed, the placed buildable should face north or west. +* Without an orientation placement preference, buildables will choose their facing direction randomly. + +Name + +**facing_buildable** + +Settings + +**buildable** + +The tag for the buildable to face towards. For example, if we wanted to create a facing_buildable card that makes buildables face the nearest fountain, we would set this setting to “fountain” because the fountain buildable has the “fountain” tag in its badger:tags component “tags” list. + +Example + +![](images/village_generation/image34.png) + +All these buildings have a facing_buildable placement preference with fountain specified as the building to face. + +### Facing Influence +This placement preference can be multiplied with buildable request cards. Buildable request cards with this placement preference will try to place with an orientation that faces the nearest source of influence that passes the specified alliance rule filter. Sources of influence will have the “badger:village_influence” component. This can be used to place buildables that face towards attacking enemy mobs or friendly mobs during gameplay. + +Name + +**facing_influence** + +Settings + +**alliance_rule_filter** + +Indicates what units should influence this placement preference. Possible values include “enemy”, “friendly”, and “any_team”. + +### Facing Water +This placement preference can be multiplied with buildable request cards. Buildable request cards with this placement preference will try to place with an orientation that faces the nearest body of water if one exists. + +Note +* Buildables can only face cardinal directions due to their blocky nature. If the body of water to face is north west of the buildable being placed, the placed buildable should face north or west. +* Without an orientation placement preference, buildables will choose their facing direction randomly. + +Name + +**facing_water** + +Settings + +None + +Example + +![](images/village_generation/image35.png) + +All these buildings have the facing_water placement preference. + +### Facing Cardinal Direction +This placement preference card can be multiplied with a buildable request card. Buildable request cards that have the “facing_cardinal_direction” placement preference will be rotated to face the specified cardinal direction. + +Name + +**facing_cardinal_direction** + +Settings + +**cardinal_direction** + +The cardinal direction that the buildable should face. The options are north, south, east, or west. + +Example + +![](images/village_generation/image36.png) + +![](images/village_generation/image37.png) + +### Far From Buildable +The far_from_buildable placement preference is the inverse of the close_to_buildable placement preference. + +Name + +**far_from_buildable** + +Settings + +**buildable** + +The tag for the buildable to place close to. This should match one of the tags in the “tags” list in the badger:tags component for that buildable entity. + +Example + +![](images/village_generation/image38.png) + +The barracks in this example were requested far from buildables with the tag “pigTower”. + +### Far From District Center +The far_from_district_center placement preference is the inverse of the close_to_district_center placement preference. + +Name + +**far_from_district_center** + +Settings + +None + +Example + +![](images/village_generation/image39.png) + +### Far From District Start +The far_from_district_start placement preference is the inverse of the close_to_district_start placement preference. + +Name + +**far_from_district_start** + +Settings + +None + +Example + +![](images/village_generation/image40.png) + +### Far From Influence +The far_from_influence placement preference is the inverse of the close_to_influence placement preference. + +Name + +**far_from_influence** + +Settings + +**alliance_rule_filter** + +Indicates what units should influence this placement preference. Possible values include “enemy”, “friendly”, and “any_team”. + +### Far From Water +The far_from_water placement preference is the inverse of the close_to_water placement preference. + +Name + +**far_from_water** + +Settings + +None + +### Far From Village Start +The placement preference is the same as the “far_from_district_start” placement preference. It exists because it was added before it was possible to have multiple districts in a village. + +Name + +**far_from_village_start** + +Settings + +None + +### Noise +The noise placement preference will sample a 2D noise map at village zone positions and add the result to the zone scores. + +Name + +**noise** + +Settings + +**amplitude** + +By default, the noise placement preference will add a score between 0 and 1. This score will be multiplied with the amplitude. As a result, the amplitude can be used to increase or decrease the effect that this placement preference has on the final score. + +**scale** + +A lower value will result in a noise map with more gradual changes. A higher value will have the opposite effect. + +Example + +![](images/village_generation/image41.png) + +![](images/village_generation/image42.png) + +When combined with a wall request card and a threshold card, noise can be used to create fragmented walls. + +### Build From District Path +This placement preference card can be multiplied with a buildable request card. Buildable request cards that have the “build_from_district_path” placement preference will place buildables that are connected to a specified district path. This guarantees that the placed buildable is connected to a path and not facing the side of another buildable. + +Note +* In village.json, there is a setting for the maximum distance allowed from the starting path zone. This is to keep the buildable from running too far away, but tags and filters will usually kick in first. + +![](images/village_generation/image43.png) + +* In the village definition json (eg villager_village_001.json) the district paths need to "prevent buildable placement". If this is turned off, paths will start cutting through buildables and removing the bottom layers of blocks. + +![](images/village_generation/image44.png) + +* The card is just a placement preference, and is multiplied like usual. The main things to watch out for are that you have a valid district path to connect to, and that your tag filters/tags all agree on that. + +Name + +**build_from_district_path** + +Settings + +None + +Example + +![](images/village_generation/image45.png) + +![](images/village_generation/image46.png) + +![](images/village_generation/image47.png) + +### Across Path + +This placement preference card can be multiplied with a buildable request card. Buildable request cards that have the “across_path” placement preference will place buildables on the path. + + +Note +* This placement preference lets buildables place on top of paths. Usually our collision checks prevent that. +* Make sure you have a path requested. + +Name + +**across_path** + +Settings + +None + +Example + +![](images/village_generation/image48.png) + +![](images/village_generation/image49.png) + +The arches use the across_path placement preference. + +### Along Path +This placement preference card can be multiplied with a buildable request card. Buildable request cards that have the “along_path” placement preference will place buildables next to a path. + +Note +* This placement preference lets buildables place closer to paths than our collision checks would usually allow. +* Make sure you have a path requested. + +Name + +**along_path** + +Settings + +**offset_from_path** + +The distance from the path in blocks that the buildable should place. + +Example + +![](images/village_generation/image48.png) + +![](images/village_generation/image49.png) + +The benches use the along_path placement preference. + +### Ignore Zone Filter For Overlapping Zones +This placement preference can be multiplied with buildable request cards. By default, when we’re checking if a buildable request with a zone filter card can be placed in a zone, if that buildable overlaps a neighboring zone that doesn’t pass the filter, the buildable won’t be placed in that location. + +Note +* If the structures are failing to place, but the village looks like it has a lot of open space where they intuitively should be placed, this placement preference might help. +* The placed buildable center will still be inside a zone that passes the filter. It’s just the overlapping zones that might not pass the filter. + +Name + +**ignore_zone_filter_for_overlapping_zones_card** + +Settings + +None + +### In Direction Of Influence +This placement preference can be multiplied with buildable request cards. Buildable request cards with this placement preference will try to place in the direction of a source of influence that passes the specified alliance rule filter. Sources of influence will have the “badger:village_influence” component. This is similar to the wedge_brush placement preference except the direction is going to be towards the source of influence. This can be used to place buildables in the direction of an enemy attack. + +Name + +**in_direction_of_influence** + +Settings + +**alliance_rule_filter** + +Indicates what units should influence this placement preference. Possible values include “enemy”, “friendly”, and “any_team”. + +**wedge_angle** + +The angle between the two sides of the wedge. This determines how wide the wedge area is. See the wedge_brush placement preference for an example. + +### Random +The random placement preference will sample a random value between 0 and 1 and add the result to the zone scores. + +Name + +**random** + +Settings + +None + +### Rectangle Brush +Zones contained inside the rectangle brush will be scored higher the closer the zone is to the middle of the rectangle. The score added is between 0 and 1. + +Note +* The rectangle has an infinite length. Use this placement preference with the distance_from_district_start to limit the distance. +* Multiply this placement preference with a district card to specify the starting position of the rectangle. +* Don’t make the width smaller than the village zone_spacing or it might be possible for no zone sites to exist inside the area. + +Name + +**rectangle_brush** + +Settings + +**direction_angle** + +The direction that the rectangular area will extend towards. + +**rectangle_width** + +The width of the rectangular area. + +Example + +![](images/village_generation/image52.png) + +![](images/village_generation/image53.png) + +### Score Threshold +Zones with a score less than the threshold specified on this placement preference will not be considered for the buildable, district, path, or wall being requested. If no zone exists that passes the threshold, the request will be canceled. + +Note +* Only use this placement preference if it’s ok for the request to fail. + +Name + +**score_threshold** + +Settings + +**threshold** + +Only zones that have a score that is higher than this threshold value will be considered. + +Example + +![](images/village_generation/image54.png) + +### Wedge Brush +Zones contained inside the wedge brush will be scored higher if the direction aligns with the requested direction. The score added is between 0 and 1. + +Note +* The wedge has an infinite length. Use this placement preference with the distance_from_district_start to limit the distance. +* Multiply this placement preference with a district card to specify the starting position of the wedge. +* Don’t make the wedge_angle so small that the distance between the wedge sides might be smaller than the village zone_spacing or it might be possible for no zone sites to exist inside the area. + +Name + +**wedge_brush** + +Settings + +**direction_angle** + +The direction that the triangular area will extend towards. + +**wedge_angle** + +The angle between the two sides of the wedge. This determines how wide the wedge area is. + +Example + +![](images/village_generation/image55.png) + +![](images/village_generation/image56.png) + +### Facing Invasion Target +This placement preference card can be multiplied with a buildable request card. Buildable request cards that have the “facing_invasion_target” placement preference will be rotated to face the village being invaded. + +Note +* This placement preference can only be used in villages that are participating in an invasion. (they need the InvasionAttack_OwnedComponent) + +Name + +**facing_invasion_target** + +Settings + +None + +## Other Cards +### Force Building Placement Cards +Building request cards that have been multiplied with a force building placement card will ignore these constraints: + +* Buildables can’t place in water +* Buildables with a zone filter card cannot place such that they overlap zones that don’t pass the filter (see **ignore_zone_filter_for_overlapping_zones_card**) +* Buildables can’t overlap paths if the path has **prevent_buildable_placement** set to true + +When creating a path request with the CreatePathRequestOnBottomOf helper, if a force building placement card is added to either set of path rules, gates will still be placed along the path where the path crosses walls even if bridges fail to place. By default, if bridges fail to place, that will cause the entire path to fail which results in no gates. + +Card Library Name + +**force_building_placement_cards** + +Settings + +None + +Example + +![](images/village_generation/image57.png) + +### +Heart Cards + +Multiplying a buildable card with a heart card will make that structure a village heart. If all the village hearts get destroyed, that will destroy the village. + +Library Card Name + +**heart_cards** + +Settings + +None + +### Appearance Override Cards +Multiplying a buildable card with an appearance override card will override the visuals of the buildable. Multiplying a path card with an appearance override card will override the visuals of any bridge buildables placed by the path. + +Library Card Name +**appearance_override_cards** + +Settings +**horde** + +The horde visuals that should be applied. + +Example + +![](images/village_generation/image58.png) + +The bridge belongs to the DBB horde, but the appearance is overridden with the Obstacle horde visuals. + +### Hanging Decoration Cards +[not used] Could be used to decorate the sides of zones that have been raised or lowered. + +Library Card Name + +**hanging_decoration_cards** + +Settings + +**hanging_decoration** + +[not used] The name of the block type to place on the side of the raised zone. + +Example + +![](images/village_generation/image59.png) + +Note that we don’t have flowing liquid anymore so these lava falls won’t work anymore. + +### Tag Cards +Multiplying a tag card with a buildable card will add the specified tag to the buildable when it’s placed in the world. This tag card can also be multiplied with wall cards to add the tag to the wall and gate buildables when they’re placed. + +Card Library Name + +**tag_cards** + +Settings + +**tag** + +The name of the tag to add to the buildable tag set when the buildable is placed. + +### Entity Clearing Cards +The entity clearing card will remove entities that have the right tags. Only entities inside the village bounding rectangle will be considered. + +Card Library Name + +**entity_clearing_cards** + +Settings + +**entity_include_tag_set** + +Entities with these tags will be removed. + +**entity_exclude_tag_set** + +Entities with these tags won’t be removed. + +![](images/village_generation/image60.png) + +![](images/village_generation/image61.png) + +## Village Components +Village components contain settings that often affect all the village features and placement preferences for a particular type of village. + + +### Village Zone +Settings that will determine the amount of zones in the village map and the size and shape of each zone. + +Component Name + +**Badger:village_zone** + +Settings + +**zone_jitter_min** + +The maximum amount that a village zone will be offset in meters. + +**zone_jitter_max** + +The maximum amount that a village zone will be offset in meters. + +**is_zone_jitter_bell_curve_enabled** + +The generation of jitter values between the min and max will have a probability distribution that approximates a normal distribution. + +**zone_spacing** + +The default distance between village zones before jitter is applied. + +**expansion_distance** + +The maximum distance that villages can expand from the central starting position. + +**water_search_resolution** + +The distance between each check for water while scanning the expansion area for bodies of water. + +**is_hexagonal_grid_enabled** + +If false, the village map will be grid with square zones. If true, the village map will be a hexagonal grid with hexagon zones. + +**minimum_loz_connection_width** + +The minimum edge width between zones in a layer request before padding is added. + +### Village Wall +Settings for how walls get placed when the wall cards are handled. + +Component Name + +**Badger:village_wall** + +Settings + +**wall_offset** + +How far in meters to move the walls inward and away from the zone edges that they place along by default. + +Village Height Change + +Influences the terrain changes that are applied when the village height change cards are handled. + +Component Name + +badger:village_height_change + +Settings + +**clamp_size** + +The number of blocks above a height change that are not changed to air. + +### Village Bridge + +Determines how bridges are built when the village path cards are handled. + +Component Name + +**badger:village_bridge** + +Settings + +**diagonal_bridge_degree_tolerance** + +The number of degrees a bridge can deviate from right angles before being considered diagonal. + +**bridge_horizontal_distance_min** + +The smallest XZ difference allowed between the start and end of the bridge. + +**bridge_horizontal_distance_max** + +The largest XZ difference allowed between the start and end of the bridge. + +**bridge_vertical_distance_max** + +The largest Y difference allowed between the start and end of the bridge. + +**bridge_cost_per_meter** + +Used to compare the cost of the bridge to the cost of a path without a bridge (paths have a fixed cost of 1 per meter). If the cost is low, there’s a greater risk of getting bridges placed in weird places. + +**bridge_id** + +The entity identifier for the bridge that should be placed. + +### Village Hanging Decoration Placement +[not used] Settings for placing hanging decorations between village zones when the hanging decoration cards are handled. + +Component Name + +**badger:village_hanging_decoration_placement** + +Settings + +**minimum_edge_width** + +The minimum shared edge width between two zones considered for placement. + +**minimum_height_delta** + +The minimum height difference between two zone considered for placement. + +### Building Placement +Settings for placing buildables inside of village zones. + +Component Name + +**badger:village_building_placement** + +Settings + +**max_placement_attempts_with_jitter** + +The maximum number of times that a placement will try placing with jitter, per village zone. + +**is_placement_jitter_bell_curve** + +The generation of jitter values between the min and max will have a probability distribution that approximates a normal distribution. + +**placement_jitter_min** + +The minimum distance that the placement can be offset from a village zone face site. This value will be clamped if it's large enough to push the placement outside of a zone. + +**placement_jitter_max** + +The maximum distance that the placement can be offset from a village zone face site. This value will be clamped if it's large enough to push the placement outside of a zone. + +**minimum_distance_between_buildings** + +Buildings cannot be placed closer than this distance. + +### Zone Scoring +Settings that will adjust the weights and easing functions of different placement preferences. + +Component Name + +**badger:village_zone_scoring** + +Settings + +The easing function for each placement preference will be linear by default. As an example, if the far_from_district_start placement preference is used, the farthest zone from the district start position will be assigned a score of 1 and the closest zone will be assigned a score of 0. With the easing set to “linear”, the zone halfway between the two will receive a score of 0.5. If instead set the easing function to “ease_in_cubic”, the score assigned will be much lower since the easing is more gradual before quickly ramping up (see [https://easings.net/](https://easings.net/) for options and examples). + +The weight for each placement preference is 1.0 by default. Placement preferences usually each add a score between 0 and 1 to a zone being scored. The weight will be multiplied with that initial score. As an example, if the random placement preference and the close to district start placement preference is used, but we wanted the random placement preference to have less influence on the zones prioritized for placement, we could give the random_weight a lower value than the close_to_weight. + +Example + +![](images/village_generation/image62.png) + +### Weathering +This component contains all the terrain weathering settings. This component can be given to any of the village archetypes. + +Component Name + +badger:village_weathering + +Settings + +**is_overhanging_edge** + +Determines if the weathering effect will taper up or down. + +**position_noise_scale** + +Lower values will apply smoother xz jitter to weathering effects. + +**wave_max_depth** + +The maximum distance in blocks, before noise, that the weathering wave can remove blocks from an edge. + +**wave_min_depth** + +The minimum distance in blocks, before noise, that the weathering wave can remove blocks from an edge. + +**wave_frequency_scale** + +A smaller scale factor will reduce the frequency of the weathering wave for a smoother effect. + +**wave_noise_scale** + +The magnitude of noise used to break up the wave function. + +**gradient_passes** settings: + +The system supports multiple gradient passes, which determine how many blocks to remove and what height. + +**gradient_depths** + +A list of how many blocks deep into the terrain should be removed. These are expected to be in descending order. Each of these values corresponds to a value in the `gradient_weight_heights` list. + +**gradient_weight_heights** + +A list of heights for each gradient depth to be applied. These values should be in descending order for non-overhanging edges, and ascending order for overhanging edges. 1.0 means the top of the edge and 0.0 means the bottom. In the example, at a height of 0.8 and above, the terrain should be removed at a depth of 3.0. At a height of 0.6 and above, the terrain should be removed at a depth of 2.5. + +**gradient_2d_noise_scale** + +The magnitude of vertical noise applied to the gradient pass. Lower value noise will look more continuous. Higher will look more random. + +**gradient_3d_noise_scale** + +The magnitude of horizontal noise applied to the gradient pass. + +**gradient_affected_by_wave** + +Sets whether or not the particular gradient pass should be affected by the sawtooth wave. If they are affected, the gradient is applied only in spots where the sawtooth wave would remove blocks. If they are not, the gradient is applied consistently over the whole edge. Using a combination allows for some interesting weathering effects. + +Example + +![](images/village_generation/image63.png) + +### Path (Building and District) +These components contain all the village path settings. + +Component Name(s) + +**badger:village_building_path** and **badger:village_district_path** + +Settings + +**path_blocks** + +A list of block names and their relative weights to be placed for the central portion of the path. Changing the weight influences which block is randomly selected. + +**edge_block** + +A list of block names and their relative weights to be placed along the outer edges of the path. + + +**edge_decoration_blocks** + +A list of block names and their relative weights to be placed on top of the path edge blocks. + +**inner_blocks** + +path_blocks, edge_blocks, and edge_decoration_blocks can all be divided into inner and outer sections, as shown in the example for edge_decoration_blocks. This allows the inner and outer portions of the path and path edge to have different blocks with different weights. inner_blocks is a list of block names and their relative weights for the inner portion of the path or path edge. + +**outer_blocks** + +A list of block names and their relative weights for the outer portion of the path or path edge + +**path_width** + +The number of meters across the main portion of the path should be. + +**edge_width** +The number of meters across the edge on either side of the main path should be. + +**path_noise_scale_factor** +A small scale factor will produce more gradual changes in a building path's weathering. + +**path_deco_noise_scale_factor** + +A smaller scale factor will cause path edge decorations to alternate less frequently. + +**path_block_noise_scale_factor** + +A smaller scale factor will cause path blocks to alternate less frequently. + +**path_edge_block_noise_scale_factor** + +A smaller scale factor will cause path edge blocks to alternate less frequently. + +**path_noise_amplitude** +The noise amplitude affects the severity of a building path’s weathering. This affects both the edge and main path, but is capped by the path width + edge width + edge noise amplitude. + +**edge_noise_amplitude** + +How far noise can extend past the building path’s edge in meters. + +**diagonal_path_degree_tolerance** + +The number of degrees a building path can deviate from right angles before being considered diagonal. + +**prevent_buildable_placement** + +Setting this to false will allow buildables to place so that they overlap paths. + +**can_place_under_buildables** + +Setting this to false will force paths to generate around buildables instead of underneath them. + +**can_resuse_existing_paths** + +Setting this to true will encourage paths to reuse existing paths and bridges. If a path step is reused, it won’t add any additional cost to the path being planned. If this is false, it’s possible for a path to overlap another, but the cost of the path will still be added to the path being planned as normal. If this is false, paths won’t be able to reuse existing bridges. + +**height_change_needs_bridge** + +If the height change between zones is equal to or larger than this value, a bridge must be placed to connect the two zones. + +**outer_edge_threshold** + +Sets the proportion of the inner and outer path. A lower setting means a larger outer edge and a higher setting means a larger inner edge. + +Example + +![](images/village_generation/image64.png) + +## Village Service Parsed Data +The village service parsed data contains global settings that often affect all villages. + +File Location + +gamelayer/server/village/villages.json + +Map Settings + +**terrain_sampling_fill_step_distance** + +When we sample the terrain data before planning the village, I don’t think we can sample the entire area at once (it used to cause a crash at least) so we do it in pieces that have a width and height equal to this step distance. + +**block_query_step_distance** + +This distance defines the resolution that we query the terrain for water and then markup zones with water inside them. Water detection should become more precise if this is a smaller value, but it’s also more expensive. + +Building Settings + +**approximate_block_budget_per_tick** + +[not used] + +**build_from_path_max_range_in_blocks** + +When the build_from_district_path placement preference is used, zones won’t be considered if their distance to the starting path zone exceeds this max distance. + +Navigation Map Settings + +The village navigation system hasn’t been used in a long time. + +**crossable_edge_minimum_length** + +[not used] + +**path_padding_width** + +[not used] + +**path_destination_arrival_distance** + +[not used] + +Influence Map Settings + +**planning_influence_map_settings** + +These settings affect the close_to_buildable, far_from_buildable, close_to_water, far_from_water, facing_buildable, and facing_water placement preferences. + +**alliance_influence_map_settings** + +These settings affect the close_to_influence, far_from_influence, facing_influence, and in_direction_of_influence placement preferences. + +**decay** + +How much influence is lost as it spreads. + +**resolution** + +The dimensions of the grid that influence will spread through. + +**initial_influence** + +The initial amount of influence before it decays. + +Placement Preference Settings + +**buildable_tag_for_spacing** + +By default, every buildable request will be given a far_from_buildable** **placement preference with this tag to help ensure buildables space themselves out; However, if the buildable request has the disable_spacing placement preference, this tag won’t be used. + +Heart Destruction Settings + +**world_request_type** + +When a village has been destroyed (e.g. portal destroyed), this world request type is used to load the world. It will determine the priority of the world request. + +**tag_for_village_heart_destruction_opt_out** + +[not used] + +Wall Settings + +**max_number_of_gate_placement_attempts** + +If a gate collides with another structure (usually a bridge/staircase) we’ll move the gate position 1 meter in the direction of the path entering the wall and then the gate will try to place again. This is the max number of attempts before the gate will fail to place. + +**minimum_segment_length** + +When a structure is being embedded in a wall, we’ll extend the wall if the original wall isn’t long enough. We’ll skip walls that are less than this length when we’re creating the extended wall. + +**remove_wall_on_placement_failure** + +Specifies if a gap in the village walls should be left when we fail to embed a structure in the walls. + +Moat Settings + +**noise_levels** + +This controls how many levels of detail the moat noise is going to have. At each level, the frequency of noise is doubled and the amplitude is halved. This setting will affect all villages that have the new badger:village_moat component. It’s probably not worth having too many levels because the finer details are going to be lost when converting to block space. Also something to note is that because the end result is normalized to a value between 0 and 1, more levels of noise will have kind of a smoothing effect, mellowing out some of the interesting outliers when all the levels are averaged. + +### Performance Settings + +#### building_time_budget_in_ms +The village building system will handle pending placements until this budget is reached or passed. + +**planning_time_budget_in_ms** + +The village planning system will handle village generation requests until this budget is reached or passed. + +## Entity Removal Service Parsed Data +Specifies what entities should be removed inside the village bounding area and inside the world reload areas. + +File Location + +data\behavior_packs\badger\services\entity_removal.json + +Settings + +**include_any** + +Entities with these tags should be removed. + +**exclude_any** + +Entities with these tags won’t be removed. + + +Examples + +Before (floating chests) + +![](images/village_generation/image65.png) + +After (no floating chests) + +![](images/village_generation/image66.png) diff --git a/docs/world-generation/villages.md b/docs/world-generation/villages.md deleted file mode 100644 index f6f6173..0000000 --- a/docs/world-generation/villages.md +++ /dev/null @@ -1,203 +0,0 @@ ---- -hidden: true ---- - -# Things to know - -When reading this you are expected to haver read the https://legendsmodding.github.io/ModdingDocs/world-generation/world-generation-intro.html -and have everything in the https://legendsmodding.github.io/ModdingDocs/guide/game-config.html set up and working. - -# Adding piglin bases - -In this part of the wiki, we will be talking about how to make piglin bases generate automatically like in the versus game mode. -If you are looking into how to add piglin bases like in campain, That will be added to the wiki in the future and for any help ask in the `MCL` moding discord. - -## Steps - -- Adding `conquest` game mode as a `parent game mode` in the `game_mode.json` file -- Adding the `outpost_slot` to the `placement.json` file. -- Adding the biome to the `world_definition` file. - -### 1- Adding `conquest` game mode as a `parent game mode` in the `game_mode.json` file - -Open your `game_mode.json` file that could be found in `RP\gamelayer\launcher\game_mode.json`. -It should aready look something like this. - -```json -{ - "game_modes": [ - { - "behavior_pack": "...", - "default_privacy": 0, - "loading_tip_set": "campaign", - "max_players": 1, - "name": "...", - "parent": "myth", - "resource_pack": "...", - "telemetry_name": "Myth_Mod_Template", - "ui_style": "lostLegend" - } - ], - "myths_hub_host_list": [{ "name": "myth_test" }] -} -``` - -You wanna add `"parent": "conquest",` were you can see downblow - -```json -{ - "game_modes": [ - { - "behavior_pack": "...", - "default_privacy": 0, - "loading_tip_set": "campaign", - "max_players": 1, - "name": "...", - "parent": "myth", ------------>"parent": "conquest", - "resource_pack": "...", - "telemetry_name": "Myth_Mod_Template", - "ui_style": "lostLegend" - } - ], - "myths_hub_host_list": [{ "name": "myth_test" }] -} -``` - -### 2- Adding the `outpost_slot` to the `placement.json` file - -You need to add this card to your placement.json file - -```json -{ - "unique_card_id": "pvp_outpost_slot_outpost_slot", - "map_data": "badger:piglin_pvp_faction", - "village_data": "", - "placement_name": "outpost_slot", - "placement_type": "slot", - "initial_villages": { - "small": { - "count": 0 - } - }, - "jitter": 0, - "biome": { - "biome": "grasslands", - "total_pixels": 2, - "starting_pixels": 1 - }, - "tags": ["outpost_slot"], - "placement_rules": [ - { - "distance": { - "chunk_distance_from_parent": [16, 32], - "distance_to_zero_score": 1, - "tag_parent": "blue_hq", - "weight": 10 - } - }, - { - "distance": { - "chunk_distance_from_parent": [16, 32], - "distance_to_zero_score": 1, - "tag_parent": "red_hq", - "weight": 10 - } - }, - { - "distance": { - "chunk_distance_from_parent": [16, 32], - "distance_to_zero_score": 1, - "tag_parent": "slot", - "weight": 5 - } - } - ] -} -``` - -#### Information about code - -- Placement rules. - - This makes sure that the bases are spread out. - ```json - { - "distance": { - "chunk_distance_from_parent": [ - 16, - 32 - ], - "distance_to_zero_score": 1, - "tag_parent": "slot", - "weight": 5 - } - }, - ``` - - This makes sure that the base is far from the player bases and not in them or colliding with it. - ```json - { - "distance": { - "chunk_distance_from_parent": [ - 16, - 32 - ], - "distance_to_zero_score": 1, - "tag_parent": "blue_hq", - "weight": 10 - } - }, - ``` - ```json - { - "distance": { - "chunk_distance_from_parent": [ - 16, - 32 - ], - "distance_to_zero_score": 1, - "tag_parent": "red_hq", - "weight": 10 - } - }, - ``` - -### 3- Adding the biome to the `world_definition` file - -Add this in your `const WorldGenDefinition = { modify:(filterManager) => {}` function, In the `BP\game_modes\behavior_packs\pvp\scripts_bsharp20\world\world_gen_definition.js` file. - -```js -PiglinPVPData.numOutposts = 1; //the number of piglin bases you want to spawn -filterManager.AppendFilter(['outpost_slot'], PiglinPVPData.numOutposts); -``` - -# Extra - -- This is for people who wanna add extra functionality to there mods. - -## Making it so the number of piglin bases corresponds with the number of biomes - -In your `const WorldGenDefinition = { modify:(filterManager) => {}` function, In the BP\game_modes\behavior_packs\pvp\scripts_bsharp20\world\world_gen_definition.js` file.| -Replace - -```js -PiglinPVPData.numOutposts = 1; //the number of piglin bases you want to spawn -filterManager.AppendFilter(['outpost_slot'], PiglinPVPData.numOutposts); -``` - -with - -``` -const numBiomes = filterManager.GetFilterCount(["biome"]) - if (numBiomes <= 5) { - PiglinPVPData.numOutposts = 1 - } else if (numBiomes <= 9) { - PiglinPVPData.numOutposts = 2 - } else { - PiglinPVPData.numOutposts = 3 - } - filterManager.AppendFilter(["outpost_slot"], PiglinPVPData.numOutposts) -``` - -#### Information about code - -You can replace the `filterManger.GetFilterCount(["biome"])` with anything you want like maybe number of players or something else