diff --git a/README.md b/README.md index 9d7889f..f4ecaf4 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ A gophertunnel protocol interface implementation to support older Minecraft Bedr | 712 | 1.21.20 | ✅ | | 686 | 1.21.2 | ✅ | | 685 | 1.21.0 | ✅ | -| 671 | 1.20.80 | 🚧 | +| 671 | 1.20.80 | ✅ | | 662 | 1.20.70 | 🚧 | | 649 | 1.20.60 | 🚧 | | 630 | 1.20.50 | 🚧 | diff --git a/main.go b/example-proxy.go similarity index 95% rename from main.go rename to example-proxy.go index 4d87d92..f623a35 100644 --- a/main.go +++ b/example-proxy.go @@ -28,11 +28,12 @@ func main() { listener, err := minecraft.ListenConfig{ StatusProvider: p, AcceptedProtocols: []minecraft.Protocol{ - legacyver.New748(false), - legacyver.New729(false), - legacyver.New712(false), - legacyver.New686(false), - legacyver.New685(false), + legacyver.New748(), + legacyver.New729(), + legacyver.New712(), + legacyver.New686(), + legacyver.New685(), + legacyver.New671(), }, }.Listen("raknet", config.Connection.LocalAddress) if err != nil { diff --git a/legacyver/data/block_states_671.nbt b/legacyver/data/block_states_671.nbt new file mode 100644 index 0000000..83c833f Binary files /dev/null and b/legacyver/data/block_states_671.nbt differ diff --git a/legacyver/data/item_runtime_ids_671.nbt b/legacyver/data/item_runtime_ids_671.nbt new file mode 100644 index 0000000..10fa3de Binary files /dev/null and b/legacyver/data/item_runtime_ids_671.nbt differ diff --git a/legacyver/data/required_item_list_671.json b/legacyver/data/required_item_list_671.json new file mode 100644 index 0000000..263c3ad --- /dev/null +++ b/legacyver/data/required_item_list_671.json @@ -0,0 +1,6274 @@ +{ + "minecraft:acacia_boat": { + "runtime_id": 386, + "component_based": false + }, + "minecraft:acacia_button": { + "runtime_id": -140, + "component_based": false + }, + "minecraft:acacia_chest_boat": { + "runtime_id": 659, + "component_based": false + }, + "minecraft:acacia_door": { + "runtime_id": 571, + "component_based": false + }, + "minecraft:acacia_double_slab": { + "runtime_id": -812, + "component_based": false + }, + "minecraft:acacia_fence": { + "runtime_id": -575, + "component_based": false + }, + "minecraft:acacia_fence_gate": { + "runtime_id": 187, + "component_based": false + }, + "minecraft:acacia_hanging_sign": { + "runtime_id": -504, + "component_based": false + }, + "minecraft:acacia_leaves": { + "runtime_id": 161, + "component_based": false + }, + "minecraft:acacia_log": { + "runtime_id": 162, + "component_based": false + }, + "minecraft:acacia_planks": { + "runtime_id": -742, + "component_based": false + }, + "minecraft:acacia_pressure_plate": { + "runtime_id": -150, + "component_based": false + }, + "minecraft:acacia_sapling": { + "runtime_id": -828, + "component_based": false + }, + "minecraft:acacia_sign": { + "runtime_id": 594, + "component_based": false + }, + "minecraft:acacia_slab": { + "runtime_id": -807, + "component_based": false + }, + "minecraft:acacia_stairs": { + "runtime_id": 163, + "component_based": false + }, + "minecraft:acacia_standing_sign": { + "runtime_id": -190, + "component_based": false + }, + "minecraft:acacia_trapdoor": { + "runtime_id": -145, + "component_based": false + }, + "minecraft:acacia_wall_sign": { + "runtime_id": -191, + "component_based": false + }, + "minecraft:acacia_wood": { + "runtime_id": -817, + "component_based": false + }, + "minecraft:activator_rail": { + "runtime_id": 126, + "component_based": false + }, + "minecraft:agent_spawn_egg": { + "runtime_id": 496, + "component_based": false + }, + "minecraft:air": { + "runtime_id": -158, + "component_based": false + }, + "minecraft:allay_spawn_egg": { + "runtime_id": 648, + "component_based": false + }, + "minecraft:allium": { + "runtime_id": -831, + "component_based": false + }, + "minecraft:allow": { + "runtime_id": 210, + "component_based": false + }, + "minecraft:amethyst_block": { + "runtime_id": -327, + "component_based": false + }, + "minecraft:amethyst_cluster": { + "runtime_id": -329, + "component_based": false + }, + "minecraft:amethyst_shard": { + "runtime_id": 641, + "component_based": false + }, + "minecraft:ancient_debris": { + "runtime_id": -271, + "component_based": false + }, + "minecraft:andesite": { + "runtime_id": -594, + "component_based": false + }, + "minecraft:andesite_stairs": { + "runtime_id": -171, + "component_based": false + }, + "minecraft:angler_pottery_sherd": { + "runtime_id": 673, + "component_based": false + }, + "minecraft:anvil": { + "runtime_id": 145, + "component_based": false + }, + "minecraft:apple": { + "runtime_id": 257, + "component_based": true + }, + "minecraft:archer_pottery_sherd": { + "runtime_id": 674, + "component_based": false + }, + "minecraft:armadillo_scute": { + "runtime_id": 719, + "component_based": false + }, + "minecraft:armadillo_spawn_egg": { + "runtime_id": 718, + "component_based": false + }, + "minecraft:armor_stand": { + "runtime_id": 567, + "component_based": false + }, + "minecraft:arms_up_pottery_sherd": { + "runtime_id": 675, + "component_based": false + }, + "minecraft:arrow": { + "runtime_id": 306, + "component_based": true + }, + "minecraft:axolotl_bucket": { + "runtime_id": 375, + "component_based": false + }, + "minecraft:axolotl_spawn_egg": { + "runtime_id": 511, + "component_based": false + }, + "minecraft:azalea": { + "runtime_id": -337, + "component_based": false + }, + "minecraft:azalea_leaves": { + "runtime_id": -324, + "component_based": false + }, + "minecraft:azalea_leaves_flowered": { + "runtime_id": -325, + "component_based": false + }, + "minecraft:azure_bluet": { + "runtime_id": -832, + "component_based": false + }, + "minecraft:baked_potato": { + "runtime_id": 284, + "component_based": false + }, + "minecraft:balloon": { + "runtime_id": 615, + "component_based": false + }, + "minecraft:bamboo": { + "runtime_id": -163, + "component_based": false + }, + "minecraft:bamboo_block": { + "runtime_id": -527, + "component_based": false + }, + "minecraft:bamboo_button": { + "runtime_id": -511, + "component_based": false + }, + "minecraft:bamboo_chest_raft": { + "runtime_id": 671, + "component_based": false + }, + "minecraft:bamboo_door": { + "runtime_id": -517, + "component_based": false + }, + "minecraft:bamboo_double_slab": { + "runtime_id": -521, + "component_based": false + }, + "minecraft:bamboo_fence": { + "runtime_id": -515, + "component_based": false + }, + "minecraft:bamboo_fence_gate": { + "runtime_id": -516, + "component_based": false + }, + "minecraft:bamboo_hanging_sign": { + "runtime_id": -522, + "component_based": false + }, + "minecraft:bamboo_mosaic": { + "runtime_id": -509, + "component_based": false + }, + "minecraft:bamboo_mosaic_double_slab": { + "runtime_id": -525, + "component_based": false + }, + "minecraft:bamboo_mosaic_slab": { + "runtime_id": -524, + "component_based": false + }, + "minecraft:bamboo_mosaic_stairs": { + "runtime_id": -523, + "component_based": false + }, + "minecraft:bamboo_planks": { + "runtime_id": -510, + "component_based": false + }, + "minecraft:bamboo_pressure_plate": { + "runtime_id": -514, + "component_based": false + }, + "minecraft:bamboo_raft": { + "runtime_id": 670, + "component_based": false + }, + "minecraft:bamboo_sapling": { + "runtime_id": -164, + "component_based": false + }, + "minecraft:bamboo_sign": { + "runtime_id": 669, + "component_based": false + }, + "minecraft:bamboo_slab": { + "runtime_id": -513, + "component_based": false + }, + "minecraft:bamboo_stairs": { + "runtime_id": -512, + "component_based": false + }, + "minecraft:bamboo_standing_sign": { + "runtime_id": -518, + "component_based": false + }, + "minecraft:bamboo_trapdoor": { + "runtime_id": -520, + "component_based": false + }, + "minecraft:bamboo_wall_sign": { + "runtime_id": -519, + "component_based": false + }, + "minecraft:banner": { + "runtime_id": 582, + "component_based": false + }, + "minecraft:banner_pattern": { + "runtime_id": 746, + "component_based": false + }, + "minecraft:barrel": { + "runtime_id": -203, + "component_based": false + }, + "minecraft:barrier": { + "runtime_id": -161, + "component_based": false + }, + "minecraft:basalt": { + "runtime_id": -234, + "component_based": false + }, + "minecraft:bat_spawn_egg": { + "runtime_id": 461, + "component_based": false + }, + "minecraft:beacon": { + "runtime_id": 138, + "component_based": false + }, + "minecraft:bed": { + "runtime_id": 425, + "component_based": false + }, + "minecraft:bedrock": { + "runtime_id": 7, + "component_based": false + }, + "minecraft:bee_nest": { + "runtime_id": -218, + "component_based": false + }, + "minecraft:bee_spawn_egg": { + "runtime_id": 503, + "component_based": false + }, + "minecraft:beef": { + "runtime_id": 276, + "component_based": false + }, + "minecraft:beehive": { + "runtime_id": -219, + "component_based": false + }, + "minecraft:beetroot": { + "runtime_id": 288, + "component_based": false + }, + "minecraft:beetroot_seeds": { + "runtime_id": 298, + "component_based": false + }, + "minecraft:beetroot_soup": { + "runtime_id": 289, + "component_based": false + }, + "minecraft:bell": { + "runtime_id": -206, + "component_based": false + }, + "minecraft:big_dripleaf": { + "runtime_id": -323, + "component_based": false + }, + "minecraft:birch_boat": { + "runtime_id": 383, + "component_based": false + }, + "minecraft:birch_button": { + "runtime_id": -141, + "component_based": false + }, + "minecraft:birch_chest_boat": { + "runtime_id": 656, + "component_based": false + }, + "minecraft:birch_door": { + "runtime_id": 569, + "component_based": false + }, + "minecraft:birch_double_slab": { + "runtime_id": -810, + "component_based": false + }, + "minecraft:birch_fence": { + "runtime_id": -576, + "component_based": false + }, + "minecraft:birch_fence_gate": { + "runtime_id": 184, + "component_based": false + }, + "minecraft:birch_hanging_sign": { + "runtime_id": -502, + "component_based": false + }, + "minecraft:birch_leaves": { + "runtime_id": -801, + "component_based": false + }, + "minecraft:birch_log": { + "runtime_id": -570, + "component_based": false + }, + "minecraft:birch_planks": { + "runtime_id": -740, + "component_based": false + }, + "minecraft:birch_pressure_plate": { + "runtime_id": -151, + "component_based": false + }, + "minecraft:birch_sapling": { + "runtime_id": -826, + "component_based": false + }, + "minecraft:birch_sign": { + "runtime_id": 592, + "component_based": false + }, + "minecraft:birch_slab": { + "runtime_id": -805, + "component_based": false + }, + "minecraft:birch_stairs": { + "runtime_id": 135, + "component_based": false + }, + "minecraft:birch_standing_sign": { + "runtime_id": -186, + "component_based": false + }, + "minecraft:birch_trapdoor": { + "runtime_id": -146, + "component_based": false + }, + "minecraft:birch_wall_sign": { + "runtime_id": -187, + "component_based": false + }, + "minecraft:birch_wood": { + "runtime_id": -815, + "component_based": false + }, + "minecraft:black_candle": { + "runtime_id": -428, + "component_based": false + }, + "minecraft:black_candle_cake": { + "runtime_id": -445, + "component_based": false + }, + "minecraft:black_carpet": { + "runtime_id": -611, + "component_based": false + }, + "minecraft:black_concrete": { + "runtime_id": -642, + "component_based": false + }, + "minecraft:black_concrete_powder": { + "runtime_id": -723, + "component_based": false + }, + "minecraft:black_dye": { + "runtime_id": 402, + "component_based": false + }, + "minecraft:black_glazed_terracotta": { + "runtime_id": 235, + "component_based": false + }, + "minecraft:black_shulker_box": { + "runtime_id": -627, + "component_based": false + }, + "minecraft:black_stained_glass": { + "runtime_id": -687, + "component_based": false + }, + "minecraft:black_stained_glass_pane": { + "runtime_id": -657, + "component_based": false + }, + "minecraft:black_terracotta": { + "runtime_id": -738, + "component_based": false + }, + "minecraft:black_wool": { + "runtime_id": -554, + "component_based": false + }, + "minecraft:blackstone": { + "runtime_id": -273, + "component_based": false + }, + "minecraft:blackstone_double_slab": { + "runtime_id": -283, + "component_based": false + }, + "minecraft:blackstone_slab": { + "runtime_id": -282, + "component_based": false + }, + "minecraft:blackstone_stairs": { + "runtime_id": -276, + "component_based": false + }, + "minecraft:blackstone_wall": { + "runtime_id": -277, + "component_based": false + }, + "minecraft:blade_pottery_sherd": { + "runtime_id": 676, + "component_based": false + }, + "minecraft:blast_furnace": { + "runtime_id": -196, + "component_based": false + }, + "minecraft:blaze_powder": { + "runtime_id": 437, + "component_based": false + }, + "minecraft:blaze_rod": { + "runtime_id": 430, + "component_based": false + }, + "minecraft:blaze_spawn_egg": { + "runtime_id": 464, + "component_based": false + }, + "minecraft:bleach": { + "runtime_id": 613, + "component_based": false + }, + "minecraft:blue_candle": { + "runtime_id": -424, + "component_based": false + }, + "minecraft:blue_candle_cake": { + "runtime_id": -441, + "component_based": false + }, + "minecraft:blue_carpet": { + "runtime_id": -607, + "component_based": false + }, + "minecraft:blue_concrete": { + "runtime_id": -638, + "component_based": false + }, + "minecraft:blue_concrete_powder": { + "runtime_id": -719, + "component_based": false + }, + "minecraft:blue_dye": { + "runtime_id": 406, + "component_based": false + }, + "minecraft:blue_glazed_terracotta": { + "runtime_id": 231, + "component_based": false + }, + "minecraft:blue_ice": { + "runtime_id": -11, + "component_based": false + }, + "minecraft:blue_orchid": { + "runtime_id": -830, + "component_based": false + }, + "minecraft:blue_shulker_box": { + "runtime_id": -623, + "component_based": false + }, + "minecraft:blue_stained_glass": { + "runtime_id": -683, + "component_based": false + }, + "minecraft:blue_stained_glass_pane": { + "runtime_id": -653, + "component_based": false + }, + "minecraft:blue_terracotta": { + "runtime_id": -734, + "component_based": false + }, + "minecraft:blue_wool": { + "runtime_id": -563, + "component_based": false + }, + "minecraft:boat": { + "runtime_id": 744, + "component_based": false + }, + "minecraft:bogged_spawn_egg": { + "runtime_id": 471, + "component_based": false + }, + "minecraft:bolt_armor_trim_smithing_template": { + "runtime_id": 715, + "component_based": false + }, + "minecraft:bone": { + "runtime_id": 422, + "component_based": false + }, + "minecraft:bone_block": { + "runtime_id": 216, + "component_based": false + }, + "minecraft:bone_meal": { + "runtime_id": 418, + "component_based": false + }, + "minecraft:book": { + "runtime_id": 394, + "component_based": false + }, + "minecraft:bookshelf": { + "runtime_id": 47, + "component_based": false + }, + "minecraft:border_block": { + "runtime_id": 212, + "component_based": false + }, + "minecraft:bordure_indented_banner_pattern": { + "runtime_id": 601, + "component_based": false + }, + "minecraft:bow": { + "runtime_id": 305, + "component_based": false + }, + "minecraft:bowl": { + "runtime_id": 327, + "component_based": false + }, + "minecraft:brain_coral": { + "runtime_id": -581, + "component_based": false + }, + "minecraft:brain_coral_fan": { + "runtime_id": -840, + "component_based": false + }, + "minecraft:bread": { + "runtime_id": 264, + "component_based": false + }, + "minecraft:breeze_rod": { + "runtime_id": 431, + "component_based": false + }, + "minecraft:breeze_spawn_egg": { + "runtime_id": 510, + "component_based": false + }, + "minecraft:brewer_pottery_sherd": { + "runtime_id": 677, + "component_based": false + }, + "minecraft:brewing_stand": { + "runtime_id": 439, + "component_based": true + }, + "minecraft:brick": { + "runtime_id": 390, + "component_based": false + }, + "minecraft:brick_block": { + "runtime_id": 45, + "component_based": false + }, + "minecraft:brick_stairs": { + "runtime_id": 108, + "component_based": false + }, + "minecraft:brown_candle": { + "runtime_id": -425, + "component_based": false + }, + "minecraft:brown_candle_cake": { + "runtime_id": -442, + "component_based": false + }, + "minecraft:brown_carpet": { + "runtime_id": -608, + "component_based": false + }, + "minecraft:brown_concrete": { + "runtime_id": -639, + "component_based": false + }, + "minecraft:brown_concrete_powder": { + "runtime_id": -720, + "component_based": false + }, + "minecraft:brown_dye": { + "runtime_id": 405, + "component_based": false + }, + "minecraft:brown_glazed_terracotta": { + "runtime_id": 232, + "component_based": false + }, + "minecraft:brown_mushroom": { + "runtime_id": 39, + "component_based": false + }, + "minecraft:brown_mushroom_block": { + "runtime_id": 99, + "component_based": false + }, + "minecraft:brown_shulker_box": { + "runtime_id": -624, + "component_based": false + }, + "minecraft:brown_stained_glass": { + "runtime_id": -684, + "component_based": false + }, + "minecraft:brown_stained_glass_pane": { + "runtime_id": -654, + "component_based": false + }, + "minecraft:brown_terracotta": { + "runtime_id": -735, + "component_based": false + }, + "minecraft:brown_wool": { + "runtime_id": -555, + "component_based": false + }, + "minecraft:brush": { + "runtime_id": 696, + "component_based": false + }, + "minecraft:bubble_column": { + "runtime_id": -160, + "component_based": false + }, + "minecraft:bubble_coral": { + "runtime_id": -582, + "component_based": false + }, + "minecraft:bubble_coral_fan": { + "runtime_id": -841, + "component_based": false + }, + "minecraft:bucket": { + "runtime_id": 366, + "component_based": false + }, + "minecraft:budding_amethyst": { + "runtime_id": -328, + "component_based": false + }, + "minecraft:burn_pottery_sherd": { + "runtime_id": 678, + "component_based": false + }, + "minecraft:cactus": { + "runtime_id": 81, + "component_based": false + }, + "minecraft:cake": { + "runtime_id": 424, + "component_based": true + }, + "minecraft:calcite": { + "runtime_id": -326, + "component_based": false + }, + "minecraft:calibrated_sculk_sensor": { + "runtime_id": -580, + "component_based": false + }, + "minecraft:camel_spawn_egg": { + "runtime_id": 672, + "component_based": false + }, + "minecraft:camera": { + "runtime_id": 610, + "component_based": false + }, + "minecraft:campfire": { + "runtime_id": 606, + "component_based": true + }, + "minecraft:candle": { + "runtime_id": -412, + "component_based": false + }, + "minecraft:candle_cake": { + "runtime_id": -429, + "component_based": false + }, + "minecraft:carpet": { + "runtime_id": 723, + "component_based": false + }, + "minecraft:carrot": { + "runtime_id": 282, + "component_based": false + }, + "minecraft:carrot_on_a_stick": { + "runtime_id": 532, + "component_based": false + }, + "minecraft:carrots": { + "runtime_id": 141, + "component_based": false + }, + "minecraft:cartography_table": { + "runtime_id": -200, + "component_based": false + }, + "minecraft:carved_pumpkin": { + "runtime_id": -155, + "component_based": false + }, + "minecraft:cat_spawn_egg": { + "runtime_id": 497, + "component_based": false + }, + "minecraft:cauldron": { + "runtime_id": 440, + "component_based": true + }, + "minecraft:cave_spider_spawn_egg": { + "runtime_id": 465, + "component_based": false + }, + "minecraft:cave_vines": { + "runtime_id": -322, + "component_based": false + }, + "minecraft:cave_vines_body_with_berries": { + "runtime_id": -375, + "component_based": false + }, + "minecraft:cave_vines_head_with_berries": { + "runtime_id": -376, + "component_based": false + }, + "minecraft:chain": { + "runtime_id": 636, + "component_based": true + }, + "minecraft:chain_command_block": { + "runtime_id": 189, + "component_based": false + }, + "minecraft:chainmail_boots": { + "runtime_id": 348, + "component_based": false + }, + "minecraft:chainmail_chestplate": { + "runtime_id": 346, + "component_based": false + }, + "minecraft:chainmail_helmet": { + "runtime_id": 345, + "component_based": false + }, + "minecraft:chainmail_leggings": { + "runtime_id": 347, + "component_based": false + }, + "minecraft:charcoal": { + "runtime_id": 308, + "component_based": true + }, + "minecraft:chemical_heat": { + "runtime_id": 192, + "component_based": false + }, + "minecraft:chemistry_table": { + "runtime_id": 238, + "component_based": false + }, + "minecraft:cherry_boat": { + "runtime_id": 666, + "component_based": false + }, + "minecraft:cherry_button": { + "runtime_id": -530, + "component_based": false + }, + "minecraft:cherry_chest_boat": { + "runtime_id": 667, + "component_based": false + }, + "minecraft:cherry_door": { + "runtime_id": -531, + "component_based": false + }, + "minecraft:cherry_double_slab": { + "runtime_id": -540, + "component_based": false + }, + "minecraft:cherry_fence": { + "runtime_id": -532, + "component_based": false + }, + "minecraft:cherry_fence_gate": { + "runtime_id": -533, + "component_based": false + }, + "minecraft:cherry_hanging_sign": { + "runtime_id": -534, + "component_based": false + }, + "minecraft:cherry_leaves": { + "runtime_id": -548, + "component_based": false + }, + "minecraft:cherry_log": { + "runtime_id": -536, + "component_based": false + }, + "minecraft:cherry_planks": { + "runtime_id": -537, + "component_based": false + }, + "minecraft:cherry_pressure_plate": { + "runtime_id": -538, + "component_based": false + }, + "minecraft:cherry_sapling": { + "runtime_id": -547, + "component_based": false + }, + "minecraft:cherry_sign": { + "runtime_id": 668, + "component_based": false + }, + "minecraft:cherry_slab": { + "runtime_id": -539, + "component_based": false + }, + "minecraft:cherry_stairs": { + "runtime_id": -541, + "component_based": false + }, + "minecraft:cherry_standing_sign": { + "runtime_id": -542, + "component_based": false + }, + "minecraft:cherry_trapdoor": { + "runtime_id": -543, + "component_based": false + }, + "minecraft:cherry_wall_sign": { + "runtime_id": -544, + "component_based": false + }, + "minecraft:cherry_wood": { + "runtime_id": -546, + "component_based": false + }, + "minecraft:chest": { + "runtime_id": 54, + "component_based": false + }, + "minecraft:chest_boat": { + "runtime_id": 662, + "component_based": false + }, + "minecraft:chest_minecart": { + "runtime_id": 396, + "component_based": false + }, + "minecraft:chicken": { + "runtime_id": 278, + "component_based": false + }, + "minecraft:chicken_spawn_egg": { + "runtime_id": 443, + "component_based": false + }, + "minecraft:chiseled_bookshelf": { + "runtime_id": -526, + "component_based": false + }, + "minecraft:chiseled_copper": { + "runtime_id": -760, + "component_based": false + }, + "minecraft:chiseled_deepslate": { + "runtime_id": -395, + "component_based": false + }, + "minecraft:chiseled_nether_bricks": { + "runtime_id": -302, + "component_based": false + }, + "minecraft:chiseled_polished_blackstone": { + "runtime_id": -279, + "component_based": false + }, + "minecraft:chiseled_tuff": { + "runtime_id": -753, + "component_based": false + }, + "minecraft:chiseled_tuff_bricks": { + "runtime_id": -759, + "component_based": false + }, + "minecraft:chorus_flower": { + "runtime_id": 200, + "component_based": false + }, + "minecraft:chorus_fruit": { + "runtime_id": 573, + "component_based": false + }, + "minecraft:chorus_plant": { + "runtime_id": 240, + "component_based": false + }, + "minecraft:clay": { + "runtime_id": 82, + "component_based": false + }, + "minecraft:clay_ball": { + "runtime_id": 391, + "component_based": false + }, + "minecraft:client_request_placeholder_block": { + "runtime_id": -465, + "component_based": false + }, + "minecraft:clock": { + "runtime_id": 400, + "component_based": false + }, + "minecraft:coal": { + "runtime_id": 307, + "component_based": true + }, + "minecraft:coal_block": { + "runtime_id": 173, + "component_based": false + }, + "minecraft:coal_ore": { + "runtime_id": 16, + "component_based": false + }, + "minecraft:coast_armor_trim_smithing_template": { + "runtime_id": 700, + "component_based": false + }, + "minecraft:cobbled_deepslate": { + "runtime_id": -379, + "component_based": false + }, + "minecraft:cobbled_deepslate_double_slab": { + "runtime_id": -396, + "component_based": false + }, + "minecraft:cobbled_deepslate_slab": { + "runtime_id": -380, + "component_based": false + }, + "minecraft:cobbled_deepslate_stairs": { + "runtime_id": -381, + "component_based": false + }, + "minecraft:cobbled_deepslate_wall": { + "runtime_id": -382, + "component_based": false + }, + "minecraft:cobblestone": { + "runtime_id": 4, + "component_based": false + }, + "minecraft:cobblestone_wall": { + "runtime_id": 139, + "component_based": false + }, + "minecraft:cocoa": { + "runtime_id": 127, + "component_based": false + }, + "minecraft:cocoa_beans": { + "runtime_id": 419, + "component_based": false + }, + "minecraft:cod": { + "runtime_id": 267, + "component_based": false + }, + "minecraft:cod_bucket": { + "runtime_id": 370, + "component_based": false + }, + "minecraft:cod_spawn_egg": { + "runtime_id": 489, + "component_based": false + }, + "minecraft:colored_torch_bp": { + "runtime_id": 204, + "component_based": false + }, + "minecraft:colored_torch_rg": { + "runtime_id": 202, + "component_based": false + }, + "minecraft:command_block": { + "runtime_id": 137, + "component_based": false + }, + "minecraft:command_block_minecart": { + "runtime_id": 578, + "component_based": false + }, + "minecraft:comparator": { + "runtime_id": 537, + "component_based": true + }, + "minecraft:compass": { + "runtime_id": 398, + "component_based": false + }, + "minecraft:composter": { + "runtime_id": -213, + "component_based": false + }, + "minecraft:compound": { + "runtime_id": 611, + "component_based": false + }, + "minecraft:concrete": { + "runtime_id": 736, + "component_based": false + }, + "minecraft:concrete_powder": { + "runtime_id": 737, + "component_based": false + }, + "minecraft:conduit": { + "runtime_id": -157, + "component_based": false + }, + "minecraft:cooked_beef": { + "runtime_id": 277, + "component_based": false + }, + "minecraft:cooked_chicken": { + "runtime_id": 279, + "component_based": false + }, + "minecraft:cooked_cod": { + "runtime_id": 271, + "component_based": false + }, + "minecraft:cooked_mutton": { + "runtime_id": 566, + "component_based": false + }, + "minecraft:cooked_porkchop": { + "runtime_id": 266, + "component_based": false + }, + "minecraft:cooked_rabbit": { + "runtime_id": 292, + "component_based": false + }, + "minecraft:cooked_salmon": { + "runtime_id": 272, + "component_based": false + }, + "minecraft:cookie": { + "runtime_id": 274, + "component_based": false + }, + "minecraft:copper_block": { + "runtime_id": -340, + "component_based": false + }, + "minecraft:copper_bulb": { + "runtime_id": -776, + "component_based": false + }, + "minecraft:copper_door": { + "runtime_id": -784, + "component_based": false + }, + "minecraft:copper_grate": { + "runtime_id": -768, + "component_based": false + }, + "minecraft:copper_ingot": { + "runtime_id": 519, + "component_based": false + }, + "minecraft:copper_ore": { + "runtime_id": -311, + "component_based": false + }, + "minecraft:copper_trapdoor": { + "runtime_id": -792, + "component_based": false + }, + "minecraft:coral": { + "runtime_id": 734, + "component_based": false + }, + "minecraft:coral_block": { + "runtime_id": -132, + "component_based": false + }, + "minecraft:coral_fan": { + "runtime_id": 726, + "component_based": false + }, + "minecraft:coral_fan_dead": { + "runtime_id": 727, + "component_based": false + }, + "minecraft:coral_fan_hang": { + "runtime_id": -135, + "component_based": false + }, + "minecraft:coral_fan_hang2": { + "runtime_id": -136, + "component_based": false + }, + "minecraft:coral_fan_hang3": { + "runtime_id": -137, + "component_based": false + }, + "minecraft:cornflower": { + "runtime_id": -838, + "component_based": false + }, + "minecraft:cow_spawn_egg": { + "runtime_id": 444, + "component_based": false + }, + "minecraft:cracked_deepslate_bricks": { + "runtime_id": -410, + "component_based": false + }, + "minecraft:cracked_deepslate_tiles": { + "runtime_id": -409, + "component_based": false + }, + "minecraft:cracked_nether_bricks": { + "runtime_id": -303, + "component_based": false + }, + "minecraft:cracked_polished_blackstone_bricks": { + "runtime_id": -280, + "component_based": false + }, + "minecraft:crafter": { + "runtime_id": -313, + "component_based": false + }, + "minecraft:crafting_table": { + "runtime_id": 58, + "component_based": false + }, + "minecraft:creeper_banner_pattern": { + "runtime_id": 597, + "component_based": false + }, + "minecraft:creeper_spawn_egg": { + "runtime_id": 449, + "component_based": false + }, + "minecraft:crimson_button": { + "runtime_id": -260, + "component_based": false + }, + "minecraft:crimson_door": { + "runtime_id": 633, + "component_based": false + }, + "minecraft:crimson_double_slab": { + "runtime_id": -266, + "component_based": false + }, + "minecraft:crimson_fence": { + "runtime_id": -256, + "component_based": false + }, + "minecraft:crimson_fence_gate": { + "runtime_id": -258, + "component_based": false + }, + "minecraft:crimson_fungus": { + "runtime_id": -228, + "component_based": false + }, + "minecraft:crimson_hanging_sign": { + "runtime_id": -506, + "component_based": false + }, + "minecraft:crimson_hyphae": { + "runtime_id": -299, + "component_based": false + }, + "minecraft:crimson_nylium": { + "runtime_id": -232, + "component_based": false + }, + "minecraft:crimson_planks": { + "runtime_id": -242, + "component_based": false + }, + "minecraft:crimson_pressure_plate": { + "runtime_id": -262, + "component_based": false + }, + "minecraft:crimson_roots": { + "runtime_id": -223, + "component_based": false + }, + "minecraft:crimson_sign": { + "runtime_id": 631, + "component_based": false + }, + "minecraft:crimson_slab": { + "runtime_id": -264, + "component_based": false + }, + "minecraft:crimson_stairs": { + "runtime_id": -254, + "component_based": false + }, + "minecraft:crimson_standing_sign": { + "runtime_id": -250, + "component_based": false + }, + "minecraft:crimson_stem": { + "runtime_id": -225, + "component_based": false + }, + "minecraft:crimson_trapdoor": { + "runtime_id": -246, + "component_based": false + }, + "minecraft:crimson_wall_sign": { + "runtime_id": -252, + "component_based": false + }, + "minecraft:crossbow": { + "runtime_id": 590, + "component_based": false + }, + "minecraft:crying_obsidian": { + "runtime_id": -289, + "component_based": false + }, + "minecraft:cut_copper": { + "runtime_id": -347, + "component_based": false + }, + "minecraft:cut_copper_slab": { + "runtime_id": -361, + "component_based": false + }, + "minecraft:cut_copper_stairs": { + "runtime_id": -354, + "component_based": false + }, + "minecraft:cyan_candle": { + "runtime_id": -422, + "component_based": false + }, + "minecraft:cyan_candle_cake": { + "runtime_id": -439, + "component_based": false + }, + "minecraft:cyan_carpet": { + "runtime_id": -605, + "component_based": false + }, + "minecraft:cyan_concrete": { + "runtime_id": -636, + "component_based": false + }, + "minecraft:cyan_concrete_powder": { + "runtime_id": -717, + "component_based": false + }, + "minecraft:cyan_dye": { + "runtime_id": 408, + "component_based": false + }, + "minecraft:cyan_glazed_terracotta": { + "runtime_id": 229, + "component_based": false + }, + "minecraft:cyan_shulker_box": { + "runtime_id": -621, + "component_based": false + }, + "minecraft:cyan_stained_glass": { + "runtime_id": -681, + "component_based": false + }, + "minecraft:cyan_stained_glass_pane": { + "runtime_id": -651, + "component_based": false + }, + "minecraft:cyan_terracotta": { + "runtime_id": -732, + "component_based": false + }, + "minecraft:cyan_wool": { + "runtime_id": -561, + "component_based": false + }, + "minecraft:danger_pottery_sherd": { + "runtime_id": 679, + "component_based": false + }, + "minecraft:dark_oak_boat": { + "runtime_id": 387, + "component_based": false + }, + "minecraft:dark_oak_button": { + "runtime_id": -142, + "component_based": false + }, + "minecraft:dark_oak_chest_boat": { + "runtime_id": 660, + "component_based": false + }, + "minecraft:dark_oak_door": { + "runtime_id": 572, + "component_based": false + }, + "minecraft:dark_oak_double_slab": { + "runtime_id": -813, + "component_based": false + }, + "minecraft:dark_oak_fence": { + "runtime_id": -577, + "component_based": false + }, + "minecraft:dark_oak_fence_gate": { + "runtime_id": 186, + "component_based": false + }, + "minecraft:dark_oak_hanging_sign": { + "runtime_id": -505, + "component_based": false + }, + "minecraft:dark_oak_leaves": { + "runtime_id": -803, + "component_based": false + }, + "minecraft:dark_oak_log": { + "runtime_id": -572, + "component_based": false + }, + "minecraft:dark_oak_planks": { + "runtime_id": -743, + "component_based": false + }, + "minecraft:dark_oak_pressure_plate": { + "runtime_id": -152, + "component_based": false + }, + "minecraft:dark_oak_sapling": { + "runtime_id": -829, + "component_based": false + }, + "minecraft:dark_oak_sign": { + "runtime_id": 595, + "component_based": false + }, + "minecraft:dark_oak_slab": { + "runtime_id": -808, + "component_based": false + }, + "minecraft:dark_oak_stairs": { + "runtime_id": 164, + "component_based": false + }, + "minecraft:dark_oak_trapdoor": { + "runtime_id": -147, + "component_based": false + }, + "minecraft:dark_oak_wood": { + "runtime_id": -818, + "component_based": false + }, + "minecraft:dark_prismarine_stairs": { + "runtime_id": -3, + "component_based": false + }, + "minecraft:darkoak_standing_sign": { + "runtime_id": -192, + "component_based": false + }, + "minecraft:darkoak_wall_sign": { + "runtime_id": -193, + "component_based": false + }, + "minecraft:daylight_detector": { + "runtime_id": 151, + "component_based": false + }, + "minecraft:daylight_detector_inverted": { + "runtime_id": 178, + "component_based": false + }, + "minecraft:dead_brain_coral": { + "runtime_id": -586, + "component_based": false + }, + "minecraft:dead_brain_coral_fan": { + "runtime_id": -844, + "component_based": false + }, + "minecraft:dead_bubble_coral": { + "runtime_id": -587, + "component_based": false + }, + "minecraft:dead_bubble_coral_fan": { + "runtime_id": -845, + "component_based": false + }, + "minecraft:dead_fire_coral": { + "runtime_id": -588, + "component_based": false + }, + "minecraft:dead_fire_coral_fan": { + "runtime_id": -846, + "component_based": false + }, + "minecraft:dead_horn_coral": { + "runtime_id": -589, + "component_based": false + }, + "minecraft:dead_horn_coral_fan": { + "runtime_id": -847, + "component_based": false + }, + "minecraft:dead_tube_coral": { + "runtime_id": -585, + "component_based": false + }, + "minecraft:dead_tube_coral_fan": { + "runtime_id": -134, + "component_based": false + }, + "minecraft:deadbush": { + "runtime_id": 32, + "component_based": false + }, + "minecraft:decorated_pot": { + "runtime_id": -551, + "component_based": false + }, + "minecraft:deepslate": { + "runtime_id": -378, + "component_based": false + }, + "minecraft:deepslate_brick_double_slab": { + "runtime_id": -399, + "component_based": false + }, + "minecraft:deepslate_brick_slab": { + "runtime_id": -392, + "component_based": false + }, + "minecraft:deepslate_brick_stairs": { + "runtime_id": -393, + "component_based": false + }, + "minecraft:deepslate_brick_wall": { + "runtime_id": -394, + "component_based": false + }, + "minecraft:deepslate_bricks": { + "runtime_id": -391, + "component_based": false + }, + "minecraft:deepslate_coal_ore": { + "runtime_id": -406, + "component_based": false + }, + "minecraft:deepslate_copper_ore": { + "runtime_id": -408, + "component_based": false + }, + "minecraft:deepslate_diamond_ore": { + "runtime_id": -405, + "component_based": false + }, + "minecraft:deepslate_emerald_ore": { + "runtime_id": -407, + "component_based": false + }, + "minecraft:deepslate_gold_ore": { + "runtime_id": -402, + "component_based": false + }, + "minecraft:deepslate_iron_ore": { + "runtime_id": -401, + "component_based": false + }, + "minecraft:deepslate_lapis_ore": { + "runtime_id": -400, + "component_based": false + }, + "minecraft:deepslate_redstone_ore": { + "runtime_id": -403, + "component_based": false + }, + "minecraft:deepslate_tile_double_slab": { + "runtime_id": -398, + "component_based": false + }, + "minecraft:deepslate_tile_slab": { + "runtime_id": -388, + "component_based": false + }, + "minecraft:deepslate_tile_stairs": { + "runtime_id": -389, + "component_based": false + }, + "minecraft:deepslate_tile_wall": { + "runtime_id": -390, + "component_based": false + }, + "minecraft:deepslate_tiles": { + "runtime_id": -387, + "component_based": false + }, + "minecraft:deny": { + "runtime_id": 211, + "component_based": false + }, + "minecraft:detector_rail": { + "runtime_id": 28, + "component_based": false + }, + "minecraft:diamond": { + "runtime_id": 309, + "component_based": false + }, + "minecraft:diamond_axe": { + "runtime_id": 324, + "component_based": false + }, + "minecraft:diamond_block": { + "runtime_id": 57, + "component_based": false + }, + "minecraft:diamond_boots": { + "runtime_id": 356, + "component_based": false + }, + "minecraft:diamond_chestplate": { + "runtime_id": 354, + "component_based": false + }, + "minecraft:diamond_helmet": { + "runtime_id": 353, + "component_based": false + }, + "minecraft:diamond_hoe": { + "runtime_id": 338, + "component_based": false + }, + "minecraft:diamond_horse_armor": { + "runtime_id": 548, + "component_based": false + }, + "minecraft:diamond_leggings": { + "runtime_id": 355, + "component_based": false + }, + "minecraft:diamond_ore": { + "runtime_id": 56, + "component_based": false + }, + "minecraft:diamond_pickaxe": { + "runtime_id": 323, + "component_based": false + }, + "minecraft:diamond_shovel": { + "runtime_id": 322, + "component_based": false + }, + "minecraft:diamond_sword": { + "runtime_id": 321, + "component_based": false + }, + "minecraft:diorite": { + "runtime_id": -592, + "component_based": false + }, + "minecraft:diorite_stairs": { + "runtime_id": -170, + "component_based": false + }, + "minecraft:dirt": { + "runtime_id": 3, + "component_based": false + }, + "minecraft:dirt_with_roots": { + "runtime_id": -318, + "component_based": false + }, + "minecraft:disc_fragment_5": { + "runtime_id": 654, + "component_based": false + }, + "minecraft:dispenser": { + "runtime_id": 23, + "component_based": false + }, + "minecraft:dolphin_spawn_egg": { + "runtime_id": 493, + "component_based": false + }, + "minecraft:donkey_spawn_egg": { + "runtime_id": 474, + "component_based": false + }, + "minecraft:double_cut_copper_slab": { + "runtime_id": -368, + "component_based": false + }, + "minecraft:double_plant": { + "runtime_id": 175, + "component_based": false + }, + "minecraft:double_stone_block_slab": { + "runtime_id": 43, + "component_based": false + }, + "minecraft:double_stone_block_slab2": { + "runtime_id": 181, + "component_based": false + }, + "minecraft:double_stone_block_slab3": { + "runtime_id": -167, + "component_based": false + }, + "minecraft:double_stone_block_slab4": { + "runtime_id": -168, + "component_based": false + }, + "minecraft:dragon_breath": { + "runtime_id": 575, + "component_based": false + }, + "minecraft:dragon_egg": { + "runtime_id": 122, + "component_based": false + }, + "minecraft:dried_kelp": { + "runtime_id": 273, + "component_based": false + }, + "minecraft:dried_kelp_block": { + "runtime_id": -139, + "component_based": false + }, + "minecraft:dripstone_block": { + "runtime_id": -317, + "component_based": false + }, + "minecraft:dropper": { + "runtime_id": 125, + "component_based": false + }, + "minecraft:drowned_spawn_egg": { + "runtime_id": 492, + "component_based": false + }, + "minecraft:dune_armor_trim_smithing_template": { + "runtime_id": 699, + "component_based": false + }, + "minecraft:dye": { + "runtime_id": 745, + "component_based": false + }, + "minecraft:echo_shard": { + "runtime_id": 664, + "component_based": false + }, + "minecraft:egg": { + "runtime_id": 397, + "component_based": false + }, + "minecraft:elder_guardian_spawn_egg": { + "runtime_id": 480, + "component_based": false + }, + "minecraft:element_0": { + "runtime_id": 36, + "component_based": false + }, + "minecraft:element_1": { + "runtime_id": -12, + "component_based": false + }, + "minecraft:element_10": { + "runtime_id": -21, + "component_based": false + }, + "minecraft:element_100": { + "runtime_id": -111, + "component_based": false + }, + "minecraft:element_101": { + "runtime_id": -112, + "component_based": false + }, + "minecraft:element_102": { + "runtime_id": -113, + "component_based": false + }, + "minecraft:element_103": { + "runtime_id": -114, + "component_based": false + }, + "minecraft:element_104": { + "runtime_id": -115, + "component_based": false + }, + "minecraft:element_105": { + "runtime_id": -116, + "component_based": false + }, + "minecraft:element_106": { + "runtime_id": -117, + "component_based": false + }, + "minecraft:element_107": { + "runtime_id": -118, + "component_based": false + }, + "minecraft:element_108": { + "runtime_id": -119, + "component_based": false + }, + "minecraft:element_109": { + "runtime_id": -120, + "component_based": false + }, + "minecraft:element_11": { + "runtime_id": -22, + "component_based": false + }, + "minecraft:element_110": { + "runtime_id": -121, + "component_based": false + }, + "minecraft:element_111": { + "runtime_id": -122, + "component_based": false + }, + "minecraft:element_112": { + "runtime_id": -123, + "component_based": false + }, + "minecraft:element_113": { + "runtime_id": -124, + "component_based": false + }, + "minecraft:element_114": { + "runtime_id": -125, + "component_based": false + }, + "minecraft:element_115": { + "runtime_id": -126, + "component_based": false + }, + "minecraft:element_116": { + "runtime_id": -127, + "component_based": false + }, + "minecraft:element_117": { + "runtime_id": -128, + "component_based": false + }, + "minecraft:element_118": { + "runtime_id": -129, + "component_based": false + }, + "minecraft:element_12": { + "runtime_id": -23, + "component_based": false + }, + "minecraft:element_13": { + "runtime_id": -24, + "component_based": false + }, + "minecraft:element_14": { + "runtime_id": -25, + "component_based": false + }, + "minecraft:element_15": { + "runtime_id": -26, + "component_based": false + }, + "minecraft:element_16": { + "runtime_id": -27, + "component_based": false + }, + "minecraft:element_17": { + "runtime_id": -28, + "component_based": false + }, + "minecraft:element_18": { + "runtime_id": -29, + "component_based": false + }, + "minecraft:element_19": { + "runtime_id": -30, + "component_based": false + }, + "minecraft:element_2": { + "runtime_id": -13, + "component_based": false + }, + "minecraft:element_20": { + "runtime_id": -31, + "component_based": false + }, + "minecraft:element_21": { + "runtime_id": -32, + "component_based": false + }, + "minecraft:element_22": { + "runtime_id": -33, + "component_based": false + }, + "minecraft:element_23": { + "runtime_id": -34, + "component_based": false + }, + "minecraft:element_24": { + "runtime_id": -35, + "component_based": false + }, + "minecraft:element_25": { + "runtime_id": -36, + "component_based": false + }, + "minecraft:element_26": { + "runtime_id": -37, + "component_based": false + }, + "minecraft:element_27": { + "runtime_id": -38, + "component_based": false + }, + "minecraft:element_28": { + "runtime_id": -39, + "component_based": false + }, + "minecraft:element_29": { + "runtime_id": -40, + "component_based": false + }, + "minecraft:element_3": { + "runtime_id": -14, + "component_based": false + }, + "minecraft:element_30": { + "runtime_id": -41, + "component_based": false + }, + "minecraft:element_31": { + "runtime_id": -42, + "component_based": false + }, + "minecraft:element_32": { + "runtime_id": -43, + "component_based": false + }, + "minecraft:element_33": { + "runtime_id": -44, + "component_based": false + }, + "minecraft:element_34": { + "runtime_id": -45, + "component_based": false + }, + "minecraft:element_35": { + "runtime_id": -46, + "component_based": false + }, + "minecraft:element_36": { + "runtime_id": -47, + "component_based": false + }, + "minecraft:element_37": { + "runtime_id": -48, + "component_based": false + }, + "minecraft:element_38": { + "runtime_id": -49, + "component_based": false + }, + "minecraft:element_39": { + "runtime_id": -50, + "component_based": false + }, + "minecraft:element_4": { + "runtime_id": -15, + "component_based": false + }, + "minecraft:element_40": { + "runtime_id": -51, + "component_based": false + }, + "minecraft:element_41": { + "runtime_id": -52, + "component_based": false + }, + "minecraft:element_42": { + "runtime_id": -53, + "component_based": false + }, + "minecraft:element_43": { + "runtime_id": -54, + "component_based": false + }, + "minecraft:element_44": { + "runtime_id": -55, + "component_based": false + }, + "minecraft:element_45": { + "runtime_id": -56, + "component_based": false + }, + "minecraft:element_46": { + "runtime_id": -57, + "component_based": false + }, + "minecraft:element_47": { + "runtime_id": -58, + "component_based": false + }, + "minecraft:element_48": { + "runtime_id": -59, + "component_based": false + }, + "minecraft:element_49": { + "runtime_id": -60, + "component_based": false + }, + "minecraft:element_5": { + "runtime_id": -16, + "component_based": false + }, + "minecraft:element_50": { + "runtime_id": -61, + "component_based": false + }, + "minecraft:element_51": { + "runtime_id": -62, + "component_based": false + }, + "minecraft:element_52": { + "runtime_id": -63, + "component_based": false + }, + "minecraft:element_53": { + "runtime_id": -64, + "component_based": false + }, + "minecraft:element_54": { + "runtime_id": -65, + "component_based": false + }, + "minecraft:element_55": { + "runtime_id": -66, + "component_based": false + }, + "minecraft:element_56": { + "runtime_id": -67, + "component_based": false + }, + "minecraft:element_57": { + "runtime_id": -68, + "component_based": false + }, + "minecraft:element_58": { + "runtime_id": -69, + "component_based": false + }, + "minecraft:element_59": { + "runtime_id": -70, + "component_based": false + }, + "minecraft:element_6": { + "runtime_id": -17, + "component_based": false + }, + "minecraft:element_60": { + "runtime_id": -71, + "component_based": false + }, + "minecraft:element_61": { + "runtime_id": -72, + "component_based": false + }, + "minecraft:element_62": { + "runtime_id": -73, + "component_based": false + }, + "minecraft:element_63": { + "runtime_id": -74, + "component_based": false + }, + "minecraft:element_64": { + "runtime_id": -75, + "component_based": false + }, + "minecraft:element_65": { + "runtime_id": -76, + "component_based": false + }, + "minecraft:element_66": { + "runtime_id": -77, + "component_based": false + }, + "minecraft:element_67": { + "runtime_id": -78, + "component_based": false + }, + "minecraft:element_68": { + "runtime_id": -79, + "component_based": false + }, + "minecraft:element_69": { + "runtime_id": -80, + "component_based": false + }, + "minecraft:element_7": { + "runtime_id": -18, + "component_based": false + }, + "minecraft:element_70": { + "runtime_id": -81, + "component_based": false + }, + "minecraft:element_71": { + "runtime_id": -82, + "component_based": false + }, + "minecraft:element_72": { + "runtime_id": -83, + "component_based": false + }, + "minecraft:element_73": { + "runtime_id": -84, + "component_based": false + }, + "minecraft:element_74": { + "runtime_id": -85, + "component_based": false + }, + "minecraft:element_75": { + "runtime_id": -86, + "component_based": false + }, + "minecraft:element_76": { + "runtime_id": -87, + "component_based": false + }, + "minecraft:element_77": { + "runtime_id": -88, + "component_based": false + }, + "minecraft:element_78": { + "runtime_id": -89, + "component_based": false + }, + "minecraft:element_79": { + "runtime_id": -90, + "component_based": false + }, + "minecraft:element_8": { + "runtime_id": -19, + "component_based": false + }, + "minecraft:element_80": { + "runtime_id": -91, + "component_based": false + }, + "minecraft:element_81": { + "runtime_id": -92, + "component_based": false + }, + "minecraft:element_82": { + "runtime_id": -93, + "component_based": false + }, + "minecraft:element_83": { + "runtime_id": -94, + "component_based": false + }, + "minecraft:element_84": { + "runtime_id": -95, + "component_based": false + }, + "minecraft:element_85": { + "runtime_id": -96, + "component_based": false + }, + "minecraft:element_86": { + "runtime_id": -97, + "component_based": false + }, + "minecraft:element_87": { + "runtime_id": -98, + "component_based": false + }, + "minecraft:element_88": { + "runtime_id": -99, + "component_based": false + }, + "minecraft:element_89": { + "runtime_id": -100, + "component_based": false + }, + "minecraft:element_9": { + "runtime_id": -20, + "component_based": false + }, + "minecraft:element_90": { + "runtime_id": -101, + "component_based": false + }, + "minecraft:element_91": { + "runtime_id": -102, + "component_based": false + }, + "minecraft:element_92": { + "runtime_id": -103, + "component_based": false + }, + "minecraft:element_93": { + "runtime_id": -104, + "component_based": false + }, + "minecraft:element_94": { + "runtime_id": -105, + "component_based": false + }, + "minecraft:element_95": { + "runtime_id": -106, + "component_based": false + }, + "minecraft:element_96": { + "runtime_id": -107, + "component_based": false + }, + "minecraft:element_97": { + "runtime_id": -108, + "component_based": false + }, + "minecraft:element_98": { + "runtime_id": -109, + "component_based": false + }, + "minecraft:element_99": { + "runtime_id": -110, + "component_based": false + }, + "minecraft:elytra": { + "runtime_id": 579, + "component_based": false + }, + "minecraft:emerald": { + "runtime_id": 527, + "component_based": false + }, + "minecraft:emerald_block": { + "runtime_id": 133, + "component_based": false + }, + "minecraft:emerald_ore": { + "runtime_id": 129, + "component_based": false + }, + "minecraft:empty_map": { + "runtime_id": 530, + "component_based": false + }, + "minecraft:enchanted_book": { + "runtime_id": 536, + "component_based": false + }, + "minecraft:enchanted_golden_apple": { + "runtime_id": 262, + "component_based": false + }, + "minecraft:enchanting_table": { + "runtime_id": 116, + "component_based": false + }, + "minecraft:end_brick_stairs": { + "runtime_id": -178, + "component_based": false + }, + "minecraft:end_bricks": { + "runtime_id": 206, + "component_based": false + }, + "minecraft:end_crystal": { + "runtime_id": 748, + "component_based": false + }, + "minecraft:end_gateway": { + "runtime_id": 209, + "component_based": false + }, + "minecraft:end_portal": { + "runtime_id": 119, + "component_based": false + }, + "minecraft:end_portal_frame": { + "runtime_id": 120, + "component_based": false + }, + "minecraft:end_rod": { + "runtime_id": 208, + "component_based": false + }, + "minecraft:end_stone": { + "runtime_id": 121, + "component_based": false + }, + "minecraft:ender_chest": { + "runtime_id": 130, + "component_based": false + }, + "minecraft:ender_dragon_spawn_egg": { + "runtime_id": 516, + "component_based": false + }, + "minecraft:ender_eye": { + "runtime_id": 441, + "component_based": false + }, + "minecraft:ender_pearl": { + "runtime_id": 429, + "component_based": false + }, + "minecraft:enderman_spawn_egg": { + "runtime_id": 450, + "component_based": false + }, + "minecraft:endermite_spawn_egg": { + "runtime_id": 468, + "component_based": false + }, + "minecraft:evoker_spawn_egg": { + "runtime_id": 484, + "component_based": false + }, + "minecraft:experience_bottle": { + "runtime_id": 523, + "component_based": false + }, + "minecraft:explorer_pottery_sherd": { + "runtime_id": 680, + "component_based": false + }, + "minecraft:exposed_chiseled_copper": { + "runtime_id": -761, + "component_based": false + }, + "minecraft:exposed_copper": { + "runtime_id": -341, + "component_based": false + }, + "minecraft:exposed_copper_bulb": { + "runtime_id": -777, + "component_based": false + }, + "minecraft:exposed_copper_door": { + "runtime_id": -785, + "component_based": false + }, + "minecraft:exposed_copper_grate": { + "runtime_id": -769, + "component_based": false + }, + "minecraft:exposed_copper_trapdoor": { + "runtime_id": -793, + "component_based": false + }, + "minecraft:exposed_cut_copper": { + "runtime_id": -348, + "component_based": false + }, + "minecraft:exposed_cut_copper_slab": { + "runtime_id": -362, + "component_based": false + }, + "minecraft:exposed_cut_copper_stairs": { + "runtime_id": -355, + "component_based": false + }, + "minecraft:exposed_double_cut_copper_slab": { + "runtime_id": -369, + "component_based": false + }, + "minecraft:eye_armor_trim_smithing_template": { + "runtime_id": 703, + "component_based": false + }, + "minecraft:farmland": { + "runtime_id": 60, + "component_based": false + }, + "minecraft:feather": { + "runtime_id": 333, + "component_based": false + }, + "minecraft:fence": { + "runtime_id": 725, + "component_based": false + }, + "minecraft:fence_gate": { + "runtime_id": 107, + "component_based": false + }, + "minecraft:fermented_spider_eye": { + "runtime_id": 436, + "component_based": false + }, + "minecraft:field_masoned_banner_pattern": { + "runtime_id": 600, + "component_based": false + }, + "minecraft:filled_map": { + "runtime_id": 427, + "component_based": false + }, + "minecraft:fire": { + "runtime_id": 51, + "component_based": false + }, + "minecraft:fire_charge": { + "runtime_id": 524, + "component_based": false + }, + "minecraft:fire_coral": { + "runtime_id": -583, + "component_based": false + }, + "minecraft:fire_coral_fan": { + "runtime_id": -842, + "component_based": false + }, + "minecraft:firework_rocket": { + "runtime_id": 534, + "component_based": false + }, + "minecraft:firework_star": { + "runtime_id": 535, + "component_based": false + }, + "minecraft:fishing_rod": { + "runtime_id": 399, + "component_based": true + }, + "minecraft:fletching_table": { + "runtime_id": -201, + "component_based": false + }, + "minecraft:flint": { + "runtime_id": 362, + "component_based": false + }, + "minecraft:flint_and_steel": { + "runtime_id": 304, + "component_based": false + }, + "minecraft:flow_armor_trim_smithing_template": { + "runtime_id": 714, + "component_based": false + }, + "minecraft:flow_banner_pattern": { + "runtime_id": 604, + "component_based": false + }, + "minecraft:flow_pottery_sherd": { + "runtime_id": 681, + "component_based": false + }, + "minecraft:flower_banner_pattern": { + "runtime_id": 596, + "component_based": false + }, + "minecraft:flower_pot": { + "runtime_id": 529, + "component_based": true + }, + "minecraft:flowering_azalea": { + "runtime_id": -338, + "component_based": false + }, + "minecraft:flowing_lava": { + "runtime_id": 10, + "component_based": false + }, + "minecraft:flowing_water": { + "runtime_id": 8, + "component_based": false + }, + "minecraft:fox_spawn_egg": { + "runtime_id": 499, + "component_based": false + }, + "minecraft:frame": { + "runtime_id": 528, + "component_based": true + }, + "minecraft:friend_pottery_sherd": { + "runtime_id": 682, + "component_based": false + }, + "minecraft:frog_spawn": { + "runtime_id": -468, + "component_based": false + }, + "minecraft:frog_spawn_egg": { + "runtime_id": 645, + "component_based": false + }, + "minecraft:frosted_ice": { + "runtime_id": 207, + "component_based": false + }, + "minecraft:furnace": { + "runtime_id": 61, + "component_based": false + }, + "minecraft:ghast_spawn_egg": { + "runtime_id": 462, + "component_based": false + }, + "minecraft:ghast_tear": { + "runtime_id": 432, + "component_based": false + }, + "minecraft:gilded_blackstone": { + "runtime_id": -281, + "component_based": false + }, + "minecraft:glass": { + "runtime_id": 20, + "component_based": false + }, + "minecraft:glass_bottle": { + "runtime_id": 435, + "component_based": false + }, + "minecraft:glass_pane": { + "runtime_id": 102, + "component_based": false + }, + "minecraft:glistering_melon_slice": { + "runtime_id": 442, + "component_based": false + }, + "minecraft:globe_banner_pattern": { + "runtime_id": 603, + "component_based": false + }, + "minecraft:glow_berries": { + "runtime_id": 749, + "component_based": false + }, + "minecraft:glow_frame": { + "runtime_id": 640, + "component_based": true + }, + "minecraft:glow_ink_sac": { + "runtime_id": 518, + "component_based": false + }, + "minecraft:glow_lichen": { + "runtime_id": -411, + "component_based": false + }, + "minecraft:glow_squid_spawn_egg": { + "runtime_id": 513, + "component_based": false + }, + "minecraft:glow_stick": { + "runtime_id": 618, + "component_based": false + }, + "minecraft:glowingobsidian": { + "runtime_id": 246, + "component_based": false + }, + "minecraft:glowstone": { + "runtime_id": 89, + "component_based": false + }, + "minecraft:glowstone_dust": { + "runtime_id": 401, + "component_based": false + }, + "minecraft:goat_horn": { + "runtime_id": 644, + "component_based": false + }, + "minecraft:goat_spawn_egg": { + "runtime_id": 512, + "component_based": false + }, + "minecraft:gold_block": { + "runtime_id": 41, + "component_based": false + }, + "minecraft:gold_ingot": { + "runtime_id": 311, + "component_based": false + }, + "minecraft:gold_nugget": { + "runtime_id": 433, + "component_based": false + }, + "minecraft:gold_ore": { + "runtime_id": 14, + "component_based": false + }, + "minecraft:golden_apple": { + "runtime_id": 261, + "component_based": false + }, + "minecraft:golden_axe": { + "runtime_id": 331, + "component_based": false + }, + "minecraft:golden_boots": { + "runtime_id": 360, + "component_based": false + }, + "minecraft:golden_carrot": { + "runtime_id": 286, + "component_based": false + }, + "minecraft:golden_chestplate": { + "runtime_id": 358, + "component_based": false + }, + "minecraft:golden_helmet": { + "runtime_id": 357, + "component_based": false + }, + "minecraft:golden_hoe": { + "runtime_id": 339, + "component_based": false + }, + "minecraft:golden_horse_armor": { + "runtime_id": 547, + "component_based": false + }, + "minecraft:golden_leggings": { + "runtime_id": 359, + "component_based": false + }, + "minecraft:golden_pickaxe": { + "runtime_id": 330, + "component_based": false + }, + "minecraft:golden_rail": { + "runtime_id": 27, + "component_based": false + }, + "minecraft:golden_shovel": { + "runtime_id": 329, + "component_based": false + }, + "minecraft:golden_sword": { + "runtime_id": 328, + "component_based": false + }, + "minecraft:granite": { + "runtime_id": -590, + "component_based": false + }, + "minecraft:granite_stairs": { + "runtime_id": -169, + "component_based": false + }, + "minecraft:grass_block": { + "runtime_id": 2, + "component_based": false + }, + "minecraft:grass_path": { + "runtime_id": 198, + "component_based": false + }, + "minecraft:gravel": { + "runtime_id": 13, + "component_based": false + }, + "minecraft:gray_candle": { + "runtime_id": -420, + "component_based": false + }, + "minecraft:gray_candle_cake": { + "runtime_id": -437, + "component_based": false + }, + "minecraft:gray_carpet": { + "runtime_id": -603, + "component_based": false + }, + "minecraft:gray_concrete": { + "runtime_id": -634, + "component_based": false + }, + "minecraft:gray_concrete_powder": { + "runtime_id": -715, + "component_based": false + }, + "minecraft:gray_dye": { + "runtime_id": 410, + "component_based": false + }, + "minecraft:gray_glazed_terracotta": { + "runtime_id": 227, + "component_based": false + }, + "minecraft:gray_shulker_box": { + "runtime_id": -619, + "component_based": false + }, + "minecraft:gray_stained_glass": { + "runtime_id": -679, + "component_based": false + }, + "minecraft:gray_stained_glass_pane": { + "runtime_id": -649, + "component_based": false + }, + "minecraft:gray_terracotta": { + "runtime_id": -730, + "component_based": false + }, + "minecraft:gray_wool": { + "runtime_id": -553, + "component_based": false + }, + "minecraft:green_candle": { + "runtime_id": -426, + "component_based": false + }, + "minecraft:green_candle_cake": { + "runtime_id": -443, + "component_based": false + }, + "minecraft:green_carpet": { + "runtime_id": -609, + "component_based": false + }, + "minecraft:green_concrete": { + "runtime_id": -640, + "component_based": false + }, + "minecraft:green_concrete_powder": { + "runtime_id": -721, + "component_based": false + }, + "minecraft:green_dye": { + "runtime_id": 404, + "component_based": false + }, + "minecraft:green_glazed_terracotta": { + "runtime_id": 233, + "component_based": false + }, + "minecraft:green_shulker_box": { + "runtime_id": -625, + "component_based": false + }, + "minecraft:green_stained_glass": { + "runtime_id": -685, + "component_based": false + }, + "minecraft:green_stained_glass_pane": { + "runtime_id": -655, + "component_based": false + }, + "minecraft:green_terracotta": { + "runtime_id": -736, + "component_based": false + }, + "minecraft:green_wool": { + "runtime_id": -560, + "component_based": false + }, + "minecraft:grindstone": { + "runtime_id": -195, + "component_based": false + }, + "minecraft:guardian_spawn_egg": { + "runtime_id": 469, + "component_based": false + }, + "minecraft:gunpowder": { + "runtime_id": 334, + "component_based": false + }, + "minecraft:guster_banner_pattern": { + "runtime_id": 605, + "component_based": false + }, + "minecraft:guster_pottery_sherd": { + "runtime_id": 683, + "component_based": false + }, + "minecraft:hanging_roots": { + "runtime_id": -319, + "component_based": false + }, + "minecraft:hard_black_stained_glass": { + "runtime_id": -702, + "component_based": false + }, + "minecraft:hard_black_stained_glass_pane": { + "runtime_id": -672, + "component_based": false + }, + "minecraft:hard_blue_stained_glass": { + "runtime_id": -698, + "component_based": false + }, + "minecraft:hard_blue_stained_glass_pane": { + "runtime_id": -668, + "component_based": false + }, + "minecraft:hard_brown_stained_glass": { + "runtime_id": -699, + "component_based": false + }, + "minecraft:hard_brown_stained_glass_pane": { + "runtime_id": -669, + "component_based": false + }, + "minecraft:hard_cyan_stained_glass": { + "runtime_id": -696, + "component_based": false + }, + "minecraft:hard_cyan_stained_glass_pane": { + "runtime_id": -666, + "component_based": false + }, + "minecraft:hard_glass": { + "runtime_id": 253, + "component_based": false + }, + "minecraft:hard_glass_pane": { + "runtime_id": 190, + "component_based": false + }, + "minecraft:hard_gray_stained_glass": { + "runtime_id": -694, + "component_based": false + }, + "minecraft:hard_gray_stained_glass_pane": { + "runtime_id": -664, + "component_based": false + }, + "minecraft:hard_green_stained_glass": { + "runtime_id": -700, + "component_based": false + }, + "minecraft:hard_green_stained_glass_pane": { + "runtime_id": -670, + "component_based": false + }, + "minecraft:hard_light_blue_stained_glass": { + "runtime_id": -690, + "component_based": false + }, + "minecraft:hard_light_blue_stained_glass_pane": { + "runtime_id": -660, + "component_based": false + }, + "minecraft:hard_light_gray_stained_glass": { + "runtime_id": -695, + "component_based": false + }, + "minecraft:hard_light_gray_stained_glass_pane": { + "runtime_id": -665, + "component_based": false + }, + "minecraft:hard_lime_stained_glass": { + "runtime_id": -692, + "component_based": false + }, + "minecraft:hard_lime_stained_glass_pane": { + "runtime_id": -662, + "component_based": false + }, + "minecraft:hard_magenta_stained_glass": { + "runtime_id": -689, + "component_based": false + }, + "minecraft:hard_magenta_stained_glass_pane": { + "runtime_id": -659, + "component_based": false + }, + "minecraft:hard_orange_stained_glass": { + "runtime_id": -688, + "component_based": false + }, + "minecraft:hard_orange_stained_glass_pane": { + "runtime_id": -658, + "component_based": false + }, + "minecraft:hard_pink_stained_glass": { + "runtime_id": -693, + "component_based": false + }, + "minecraft:hard_pink_stained_glass_pane": { + "runtime_id": -663, + "component_based": false + }, + "minecraft:hard_purple_stained_glass": { + "runtime_id": -697, + "component_based": false + }, + "minecraft:hard_purple_stained_glass_pane": { + "runtime_id": -667, + "component_based": false + }, + "minecraft:hard_red_stained_glass": { + "runtime_id": -701, + "component_based": false + }, + "minecraft:hard_red_stained_glass_pane": { + "runtime_id": -671, + "component_based": false + }, + "minecraft:hard_stained_glass": { + "runtime_id": 742, + "component_based": false + }, + "minecraft:hard_stained_glass_pane": { + "runtime_id": 743, + "component_based": false + }, + "minecraft:hard_white_stained_glass": { + "runtime_id": 254, + "component_based": false + }, + "minecraft:hard_white_stained_glass_pane": { + "runtime_id": 191, + "component_based": false + }, + "minecraft:hard_yellow_stained_glass": { + "runtime_id": -691, + "component_based": false + }, + "minecraft:hard_yellow_stained_glass_pane": { + "runtime_id": -661, + "component_based": false + }, + "minecraft:hardened_clay": { + "runtime_id": 172, + "component_based": false + }, + "minecraft:hay_block": { + "runtime_id": 170, + "component_based": false + }, + "minecraft:heart_of_the_sea": { + "runtime_id": 586, + "component_based": false + }, + "minecraft:heart_pottery_sherd": { + "runtime_id": 684, + "component_based": false + }, + "minecraft:heartbreak_pottery_sherd": { + "runtime_id": 685, + "component_based": false + }, + "minecraft:heavy_core": { + "runtime_id": -316, + "component_based": false + }, + "minecraft:heavy_weighted_pressure_plate": { + "runtime_id": 148, + "component_based": false + }, + "minecraft:hoglin_spawn_egg": { + "runtime_id": 505, + "component_based": false + }, + "minecraft:honey_block": { + "runtime_id": -220, + "component_based": false + }, + "minecraft:honey_bottle": { + "runtime_id": 609, + "component_based": false + }, + "minecraft:honeycomb": { + "runtime_id": 608, + "component_based": false + }, + "minecraft:honeycomb_block": { + "runtime_id": -221, + "component_based": false + }, + "minecraft:hopper": { + "runtime_id": 542, + "component_based": true + }, + "minecraft:hopper_minecart": { + "runtime_id": 541, + "component_based": false + }, + "minecraft:horn_coral": { + "runtime_id": -584, + "component_based": false + }, + "minecraft:horn_coral_fan": { + "runtime_id": -843, + "component_based": false + }, + "minecraft:horse_spawn_egg": { + "runtime_id": 466, + "component_based": false + }, + "minecraft:host_armor_trim_smithing_template": { + "runtime_id": 713, + "component_based": false + }, + "minecraft:howl_pottery_sherd": { + "runtime_id": 686, + "component_based": false + }, + "minecraft:husk_spawn_egg": { + "runtime_id": 472, + "component_based": false + }, + "minecraft:ice": { + "runtime_id": 79, + "component_based": false + }, + "minecraft:ice_bomb": { + "runtime_id": 612, + "component_based": false + }, + "minecraft:infested_deepslate": { + "runtime_id": -454, + "component_based": false + }, + "minecraft:info_update": { + "runtime_id": 248, + "component_based": false + }, + "minecraft:info_update2": { + "runtime_id": 249, + "component_based": false + }, + "minecraft:ink_sac": { + "runtime_id": 420, + "component_based": false + }, + "minecraft:invisible_bedrock": { + "runtime_id": 95, + "component_based": false + }, + "minecraft:iron_axe": { + "runtime_id": 303, + "component_based": false + }, + "minecraft:iron_bars": { + "runtime_id": 101, + "component_based": false + }, + "minecraft:iron_block": { + "runtime_id": 42, + "component_based": false + }, + "minecraft:iron_boots": { + "runtime_id": 352, + "component_based": false + }, + "minecraft:iron_chestplate": { + "runtime_id": 350, + "component_based": false + }, + "minecraft:iron_door": { + "runtime_id": 378, + "component_based": false + }, + "minecraft:iron_golem_spawn_egg": { + "runtime_id": 514, + "component_based": false + }, + "minecraft:iron_helmet": { + "runtime_id": 349, + "component_based": false + }, + "minecraft:iron_hoe": { + "runtime_id": 337, + "component_based": false + }, + "minecraft:iron_horse_armor": { + "runtime_id": 546, + "component_based": false + }, + "minecraft:iron_ingot": { + "runtime_id": 310, + "component_based": false + }, + "minecraft:iron_leggings": { + "runtime_id": 351, + "component_based": false + }, + "minecraft:iron_nugget": { + "runtime_id": 584, + "component_based": false + }, + "minecraft:iron_ore": { + "runtime_id": 15, + "component_based": false + }, + "minecraft:iron_pickaxe": { + "runtime_id": 302, + "component_based": false + }, + "minecraft:iron_shovel": { + "runtime_id": 301, + "component_based": false + }, + "minecraft:iron_sword": { + "runtime_id": 312, + "component_based": false + }, + "minecraft:iron_trapdoor": { + "runtime_id": 167, + "component_based": false + }, + "minecraft:item.acacia_door": { + "runtime_id": 196, + "component_based": false + }, + "minecraft:item.bed": { + "runtime_id": 26, + "component_based": false + }, + "minecraft:item.beetroot": { + "runtime_id": 244, + "component_based": false + }, + "minecraft:item.birch_door": { + "runtime_id": 194, + "component_based": false + }, + "minecraft:item.brewing_stand": { + "runtime_id": 117, + "component_based": false + }, + "minecraft:item.cake": { + "runtime_id": 92, + "component_based": false + }, + "minecraft:item.camera": { + "runtime_id": 242, + "component_based": false + }, + "minecraft:item.campfire": { + "runtime_id": -209, + "component_based": false + }, + "minecraft:item.cauldron": { + "runtime_id": 118, + "component_based": false + }, + "minecraft:item.chain": { + "runtime_id": -286, + "component_based": false + }, + "minecraft:item.crimson_door": { + "runtime_id": -244, + "component_based": false + }, + "minecraft:item.dark_oak_door": { + "runtime_id": 197, + "component_based": false + }, + "minecraft:item.flower_pot": { + "runtime_id": 140, + "component_based": false + }, + "minecraft:item.frame": { + "runtime_id": 199, + "component_based": false + }, + "minecraft:item.glow_frame": { + "runtime_id": -339, + "component_based": false + }, + "minecraft:item.hopper": { + "runtime_id": 154, + "component_based": false + }, + "minecraft:item.iron_door": { + "runtime_id": 71, + "component_based": false + }, + "minecraft:item.jungle_door": { + "runtime_id": 195, + "component_based": false + }, + "minecraft:item.kelp": { + "runtime_id": -138, + "component_based": false + }, + "minecraft:item.mangrove_door": { + "runtime_id": -493, + "component_based": false + }, + "minecraft:item.nether_sprouts": { + "runtime_id": -238, + "component_based": false + }, + "minecraft:item.nether_wart": { + "runtime_id": 115, + "component_based": false + }, + "minecraft:item.reeds": { + "runtime_id": 83, + "component_based": false + }, + "minecraft:item.skull": { + "runtime_id": 144, + "component_based": false + }, + "minecraft:item.soul_campfire": { + "runtime_id": -290, + "component_based": false + }, + "minecraft:item.spruce_door": { + "runtime_id": 193, + "component_based": false + }, + "minecraft:item.warped_door": { + "runtime_id": -245, + "component_based": false + }, + "minecraft:item.wheat": { + "runtime_id": 59, + "component_based": false + }, + "minecraft:item.wooden_door": { + "runtime_id": 64, + "component_based": false + }, + "minecraft:jigsaw": { + "runtime_id": -211, + "component_based": false + }, + "minecraft:jukebox": { + "runtime_id": 84, + "component_based": false + }, + "minecraft:jungle_boat": { + "runtime_id": 384, + "component_based": false + }, + "minecraft:jungle_button": { + "runtime_id": -143, + "component_based": false + }, + "minecraft:jungle_chest_boat": { + "runtime_id": 657, + "component_based": false + }, + "minecraft:jungle_door": { + "runtime_id": 570, + "component_based": false + }, + "minecraft:jungle_double_slab": { + "runtime_id": -811, + "component_based": false + }, + "minecraft:jungle_fence": { + "runtime_id": -578, + "component_based": false + }, + "minecraft:jungle_fence_gate": { + "runtime_id": 185, + "component_based": false + }, + "minecraft:jungle_hanging_sign": { + "runtime_id": -503, + "component_based": false + }, + "minecraft:jungle_leaves": { + "runtime_id": -802, + "component_based": false + }, + "minecraft:jungle_log": { + "runtime_id": -571, + "component_based": false + }, + "minecraft:jungle_planks": { + "runtime_id": -741, + "component_based": false + }, + "minecraft:jungle_pressure_plate": { + "runtime_id": -153, + "component_based": false + }, + "minecraft:jungle_sapling": { + "runtime_id": -827, + "component_based": false + }, + "minecraft:jungle_sign": { + "runtime_id": 593, + "component_based": false + }, + "minecraft:jungle_slab": { + "runtime_id": -806, + "component_based": false + }, + "minecraft:jungle_stairs": { + "runtime_id": 136, + "component_based": false + }, + "minecraft:jungle_standing_sign": { + "runtime_id": -188, + "component_based": false + }, + "minecraft:jungle_trapdoor": { + "runtime_id": -148, + "component_based": false + }, + "minecraft:jungle_wall_sign": { + "runtime_id": -189, + "component_based": false + }, + "minecraft:jungle_wood": { + "runtime_id": -816, + "component_based": false + }, + "minecraft:kelp": { + "runtime_id": 389, + "component_based": true + }, + "minecraft:ladder": { + "runtime_id": 65, + "component_based": false + }, + "minecraft:lantern": { + "runtime_id": -208, + "component_based": false + }, + "minecraft:lapis_block": { + "runtime_id": 22, + "component_based": false + }, + "minecraft:lapis_lazuli": { + "runtime_id": 421, + "component_based": false + }, + "minecraft:lapis_ore": { + "runtime_id": 21, + "component_based": false + }, + "minecraft:large_amethyst_bud": { + "runtime_id": -330, + "component_based": false + }, + "minecraft:lava": { + "runtime_id": 11, + "component_based": false + }, + "minecraft:lava_bucket": { + "runtime_id": 369, + "component_based": false + }, + "minecraft:lead": { + "runtime_id": 562, + "component_based": false + }, + "minecraft:leather": { + "runtime_id": 388, + "component_based": false + }, + "minecraft:leather_boots": { + "runtime_id": 344, + "component_based": false + }, + "minecraft:leather_chestplate": { + "runtime_id": 342, + "component_based": false + }, + "minecraft:leather_helmet": { + "runtime_id": 341, + "component_based": false + }, + "minecraft:leather_horse_armor": { + "runtime_id": 545, + "component_based": false + }, + "minecraft:leather_leggings": { + "runtime_id": 343, + "component_based": false + }, + "minecraft:leaves": { + "runtime_id": 729, + "component_based": false + }, + "minecraft:leaves2": { + "runtime_id": 730, + "component_based": false + }, + "minecraft:lectern": { + "runtime_id": -194, + "component_based": false + }, + "minecraft:lever": { + "runtime_id": 69, + "component_based": false + }, + "minecraft:light_block": { + "runtime_id": -215, + "component_based": false + }, + "minecraft:light_blue_candle": { + "runtime_id": -416, + "component_based": false + }, + "minecraft:light_blue_candle_cake": { + "runtime_id": -433, + "component_based": false + }, + "minecraft:light_blue_carpet": { + "runtime_id": -599, + "component_based": false + }, + "minecraft:light_blue_concrete": { + "runtime_id": -630, + "component_based": false + }, + "minecraft:light_blue_concrete_powder": { + "runtime_id": -711, + "component_based": false + }, + "minecraft:light_blue_dye": { + "runtime_id": 414, + "component_based": false + }, + "minecraft:light_blue_glazed_terracotta": { + "runtime_id": 223, + "component_based": false + }, + "minecraft:light_blue_shulker_box": { + "runtime_id": -615, + "component_based": false + }, + "minecraft:light_blue_stained_glass": { + "runtime_id": -675, + "component_based": false + }, + "minecraft:light_blue_stained_glass_pane": { + "runtime_id": -645, + "component_based": false + }, + "minecraft:light_blue_terracotta": { + "runtime_id": -726, + "component_based": false + }, + "minecraft:light_blue_wool": { + "runtime_id": -562, + "component_based": false + }, + "minecraft:light_gray_candle": { + "runtime_id": -421, + "component_based": false + }, + "minecraft:light_gray_candle_cake": { + "runtime_id": -438, + "component_based": false + }, + "minecraft:light_gray_carpet": { + "runtime_id": -604, + "component_based": false + }, + "minecraft:light_gray_concrete": { + "runtime_id": -635, + "component_based": false + }, + "minecraft:light_gray_concrete_powder": { + "runtime_id": -716, + "component_based": false + }, + "minecraft:light_gray_dye": { + "runtime_id": 409, + "component_based": false + }, + "minecraft:light_gray_shulker_box": { + "runtime_id": -620, + "component_based": false + }, + "minecraft:light_gray_stained_glass": { + "runtime_id": -680, + "component_based": false + }, + "minecraft:light_gray_stained_glass_pane": { + "runtime_id": -650, + "component_based": false + }, + "minecraft:light_gray_terracotta": { + "runtime_id": -731, + "component_based": false + }, + "minecraft:light_gray_wool": { + "runtime_id": -552, + "component_based": false + }, + "minecraft:light_weighted_pressure_plate": { + "runtime_id": 147, + "component_based": false + }, + "minecraft:lightning_rod": { + "runtime_id": -312, + "component_based": false + }, + "minecraft:lily_of_the_valley": { + "runtime_id": -839, + "component_based": false + }, + "minecraft:lime_candle": { + "runtime_id": -418, + "component_based": false + }, + "minecraft:lime_candle_cake": { + "runtime_id": -435, + "component_based": false + }, + "minecraft:lime_carpet": { + "runtime_id": -601, + "component_based": false + }, + "minecraft:lime_concrete": { + "runtime_id": -632, + "component_based": false + }, + "minecraft:lime_concrete_powder": { + "runtime_id": -713, + "component_based": false + }, + "minecraft:lime_dye": { + "runtime_id": 412, + "component_based": false + }, + "minecraft:lime_glazed_terracotta": { + "runtime_id": 225, + "component_based": false + }, + "minecraft:lime_shulker_box": { + "runtime_id": -617, + "component_based": false + }, + "minecraft:lime_stained_glass": { + "runtime_id": -677, + "component_based": false + }, + "minecraft:lime_stained_glass_pane": { + "runtime_id": -647, + "component_based": false + }, + "minecraft:lime_terracotta": { + "runtime_id": -728, + "component_based": false + }, + "minecraft:lime_wool": { + "runtime_id": -559, + "component_based": false + }, + "minecraft:lingering_potion": { + "runtime_id": 577, + "component_based": false + }, + "minecraft:lit_blast_furnace": { + "runtime_id": -214, + "component_based": false + }, + "minecraft:lit_deepslate_redstone_ore": { + "runtime_id": -404, + "component_based": false + }, + "minecraft:lit_furnace": { + "runtime_id": 62, + "component_based": false + }, + "minecraft:lit_pumpkin": { + "runtime_id": 91, + "component_based": false + }, + "minecraft:lit_redstone_lamp": { + "runtime_id": 124, + "component_based": false + }, + "minecraft:lit_redstone_ore": { + "runtime_id": 74, + "component_based": false + }, + "minecraft:lit_smoker": { + "runtime_id": -199, + "component_based": false + }, + "minecraft:llama_spawn_egg": { + "runtime_id": 482, + "component_based": false + }, + "minecraft:lodestone": { + "runtime_id": -222, + "component_based": false + }, + "minecraft:lodestone_compass": { + "runtime_id": 619, + "component_based": false + }, + "minecraft:log": { + "runtime_id": 724, + "component_based": false + }, + "minecraft:log2": { + "runtime_id": 735, + "component_based": false + }, + "minecraft:loom": { + "runtime_id": -204, + "component_based": false + }, + "minecraft:mace": { + "runtime_id": 325, + "component_based": false + }, + "minecraft:magenta_candle": { + "runtime_id": -415, + "component_based": false + }, + "minecraft:magenta_candle_cake": { + "runtime_id": -432, + "component_based": false + }, + "minecraft:magenta_carpet": { + "runtime_id": -598, + "component_based": false + }, + "minecraft:magenta_concrete": { + "runtime_id": -629, + "component_based": false + }, + "minecraft:magenta_concrete_powder": { + "runtime_id": -710, + "component_based": false + }, + "minecraft:magenta_dye": { + "runtime_id": 415, + "component_based": false + }, + "minecraft:magenta_glazed_terracotta": { + "runtime_id": 222, + "component_based": false + }, + "minecraft:magenta_shulker_box": { + "runtime_id": -614, + "component_based": false + }, + "minecraft:magenta_stained_glass": { + "runtime_id": -674, + "component_based": false + }, + "minecraft:magenta_stained_glass_pane": { + "runtime_id": -644, + "component_based": false + }, + "minecraft:magenta_terracotta": { + "runtime_id": -725, + "component_based": false + }, + "minecraft:magenta_wool": { + "runtime_id": -565, + "component_based": false + }, + "minecraft:magma": { + "runtime_id": 213, + "component_based": false + }, + "minecraft:magma_cream": { + "runtime_id": 438, + "component_based": false + }, + "minecraft:magma_cube_spawn_egg": { + "runtime_id": 463, + "component_based": false + }, + "minecraft:mangrove_boat": { + "runtime_id": 652, + "component_based": false + }, + "minecraft:mangrove_button": { + "runtime_id": -487, + "component_based": false + }, + "minecraft:mangrove_chest_boat": { + "runtime_id": 661, + "component_based": false + }, + "minecraft:mangrove_door": { + "runtime_id": 650, + "component_based": false + }, + "minecraft:mangrove_double_slab": { + "runtime_id": -499, + "component_based": false + }, + "minecraft:mangrove_fence": { + "runtime_id": -491, + "component_based": false + }, + "minecraft:mangrove_fence_gate": { + "runtime_id": -492, + "component_based": false + }, + "minecraft:mangrove_hanging_sign": { + "runtime_id": -508, + "component_based": false + }, + "minecraft:mangrove_leaves": { + "runtime_id": -472, + "component_based": false + }, + "minecraft:mangrove_log": { + "runtime_id": -484, + "component_based": false + }, + "minecraft:mangrove_planks": { + "runtime_id": -486, + "component_based": false + }, + "minecraft:mangrove_pressure_plate": { + "runtime_id": -490, + "component_based": false + }, + "minecraft:mangrove_propagule": { + "runtime_id": -474, + "component_based": false + }, + "minecraft:mangrove_roots": { + "runtime_id": -482, + "component_based": false + }, + "minecraft:mangrove_sign": { + "runtime_id": 651, + "component_based": false + }, + "minecraft:mangrove_slab": { + "runtime_id": -489, + "component_based": false + }, + "minecraft:mangrove_stairs": { + "runtime_id": -488, + "component_based": false + }, + "minecraft:mangrove_standing_sign": { + "runtime_id": -494, + "component_based": false + }, + "minecraft:mangrove_trapdoor": { + "runtime_id": -496, + "component_based": false + }, + "minecraft:mangrove_wall_sign": { + "runtime_id": -495, + "component_based": false + }, + "minecraft:mangrove_wood": { + "runtime_id": -497, + "component_based": false + }, + "minecraft:medicine": { + "runtime_id": 616, + "component_based": false + }, + "minecraft:medium_amethyst_bud": { + "runtime_id": -331, + "component_based": false + }, + "minecraft:melon_block": { + "runtime_id": 103, + "component_based": false + }, + "minecraft:melon_seeds": { + "runtime_id": 296, + "component_based": false + }, + "minecraft:melon_slice": { + "runtime_id": 275, + "component_based": false + }, + "minecraft:melon_stem": { + "runtime_id": 105, + "component_based": false + }, + "minecraft:milk_bucket": { + "runtime_id": 367, + "component_based": false + }, + "minecraft:minecart": { + "runtime_id": 376, + "component_based": false + }, + "minecraft:miner_pottery_sherd": { + "runtime_id": 687, + "component_based": false + }, + "minecraft:mob_spawner": { + "runtime_id": 52, + "component_based": false + }, + "minecraft:mojang_banner_pattern": { + "runtime_id": 599, + "component_based": false + }, + "minecraft:monster_egg": { + "runtime_id": 97, + "component_based": false + }, + "minecraft:mooshroom_spawn_egg": { + "runtime_id": 448, + "component_based": false + }, + "minecraft:moss_block": { + "runtime_id": -320, + "component_based": false + }, + "minecraft:moss_carpet": { + "runtime_id": -335, + "component_based": false + }, + "minecraft:mossy_cobblestone": { + "runtime_id": 48, + "component_based": false + }, + "minecraft:mossy_cobblestone_stairs": { + "runtime_id": -179, + "component_based": false + }, + "minecraft:mossy_stone_brick_stairs": { + "runtime_id": -175, + "component_based": false + }, + "minecraft:mourner_pottery_sherd": { + "runtime_id": 688, + "component_based": false + }, + "minecraft:moving_block": { + "runtime_id": 250, + "component_based": false + }, + "minecraft:mud": { + "runtime_id": -473, + "component_based": false + }, + "minecraft:mud_brick_double_slab": { + "runtime_id": -479, + "component_based": false + }, + "minecraft:mud_brick_slab": { + "runtime_id": -478, + "component_based": false + }, + "minecraft:mud_brick_stairs": { + "runtime_id": -480, + "component_based": false + }, + "minecraft:mud_brick_wall": { + "runtime_id": -481, + "component_based": false + }, + "minecraft:mud_bricks": { + "runtime_id": -475, + "component_based": false + }, + "minecraft:muddy_mangrove_roots": { + "runtime_id": -483, + "component_based": false + }, + "minecraft:mule_spawn_egg": { + "runtime_id": 475, + "component_based": false + }, + "minecraft:mushroom_stew": { + "runtime_id": 263, + "component_based": false + }, + "minecraft:music_disc_11": { + "runtime_id": 559, + "component_based": true + }, + "minecraft:music_disc_13": { + "runtime_id": 549, + "component_based": true + }, + "minecraft:music_disc_5": { + "runtime_id": 653, + "component_based": true + }, + "minecraft:music_disc_blocks": { + "runtime_id": 551, + "component_based": true + }, + "minecraft:music_disc_cat": { + "runtime_id": 550, + "component_based": true + }, + "minecraft:music_disc_chirp": { + "runtime_id": 552, + "component_based": true + }, + "minecraft:music_disc_far": { + "runtime_id": 553, + "component_based": true + }, + "minecraft:music_disc_mall": { + "runtime_id": 554, + "component_based": true + }, + "minecraft:music_disc_mellohi": { + "runtime_id": 555, + "component_based": true + }, + "minecraft:music_disc_otherside": { + "runtime_id": 643, + "component_based": true + }, + "minecraft:music_disc_pigstep": { + "runtime_id": 637, + "component_based": true + }, + "minecraft:music_disc_relic": { + "runtime_id": 716, + "component_based": true + }, + "minecraft:music_disc_stal": { + "runtime_id": 556, + "component_based": true + }, + "minecraft:music_disc_strad": { + "runtime_id": 557, + "component_based": true + }, + "minecraft:music_disc_wait": { + "runtime_id": 560, + "component_based": true + }, + "minecraft:music_disc_ward": { + "runtime_id": 558, + "component_based": true + }, + "minecraft:mutton": { + "runtime_id": 565, + "component_based": false + }, + "minecraft:mycelium": { + "runtime_id": 110, + "component_based": false + }, + "minecraft:name_tag": { + "runtime_id": 563, + "component_based": false + }, + "minecraft:nautilus_shell": { + "runtime_id": 585, + "component_based": false + }, + "minecraft:nether_brick": { + "runtime_id": 112, + "component_based": false + }, + "minecraft:nether_brick_fence": { + "runtime_id": 113, + "component_based": false + }, + "minecraft:nether_brick_stairs": { + "runtime_id": 114, + "component_based": false + }, + "minecraft:nether_gold_ore": { + "runtime_id": -288, + "component_based": false + }, + "minecraft:nether_sprouts": { + "runtime_id": 638, + "component_based": true + }, + "minecraft:nether_star": { + "runtime_id": 533, + "component_based": false + }, + "minecraft:nether_wart": { + "runtime_id": 297, + "component_based": false + }, + "minecraft:nether_wart_block": { + "runtime_id": 214, + "component_based": false + }, + "minecraft:netherbrick": { + "runtime_id": 538, + "component_based": false + }, + "minecraft:netherite_axe": { + "runtime_id": 623, + "component_based": false + }, + "minecraft:netherite_block": { + "runtime_id": -270, + "component_based": false + }, + "minecraft:netherite_boots": { + "runtime_id": 629, + "component_based": false + }, + "minecraft:netherite_chestplate": { + "runtime_id": 627, + "component_based": false + }, + "minecraft:netherite_helmet": { + "runtime_id": 626, + "component_based": false + }, + "minecraft:netherite_hoe": { + "runtime_id": 624, + "component_based": false + }, + "minecraft:netherite_ingot": { + "runtime_id": 625, + "component_based": false + }, + "minecraft:netherite_leggings": { + "runtime_id": 628, + "component_based": false + }, + "minecraft:netherite_pickaxe": { + "runtime_id": 622, + "component_based": false + }, + "minecraft:netherite_scrap": { + "runtime_id": 630, + "component_based": false + }, + "minecraft:netherite_shovel": { + "runtime_id": 621, + "component_based": false + }, + "minecraft:netherite_sword": { + "runtime_id": 620, + "component_based": false + }, + "minecraft:netherite_upgrade_smithing_template": { + "runtime_id": 697, + "component_based": false + }, + "minecraft:netherrack": { + "runtime_id": 87, + "component_based": false + }, + "minecraft:netherreactor": { + "runtime_id": 247, + "component_based": false + }, + "minecraft:normal_stone_stairs": { + "runtime_id": -180, + "component_based": false + }, + "minecraft:noteblock": { + "runtime_id": 25, + "component_based": false + }, + "minecraft:npc_spawn_egg": { + "runtime_id": 479, + "component_based": false + }, + "minecraft:oak_boat": { + "runtime_id": 382, + "component_based": false + }, + "minecraft:oak_chest_boat": { + "runtime_id": 655, + "component_based": false + }, + "minecraft:oak_double_slab": { + "runtime_id": 157, + "component_based": false + }, + "minecraft:oak_fence": { + "runtime_id": 85, + "component_based": false + }, + "minecraft:oak_hanging_sign": { + "runtime_id": -500, + "component_based": false + }, + "minecraft:oak_leaves": { + "runtime_id": 18, + "component_based": false + }, + "minecraft:oak_log": { + "runtime_id": 17, + "component_based": false + }, + "minecraft:oak_planks": { + "runtime_id": 5, + "component_based": false + }, + "minecraft:oak_sapling": { + "runtime_id": 6, + "component_based": false + }, + "minecraft:oak_sign": { + "runtime_id": 364, + "component_based": false + }, + "minecraft:oak_slab": { + "runtime_id": 158, + "component_based": false + }, + "minecraft:oak_stairs": { + "runtime_id": 53, + "component_based": false + }, + "minecraft:oak_wood": { + "runtime_id": -212, + "component_based": false + }, + "minecraft:observer": { + "runtime_id": 251, + "component_based": false + }, + "minecraft:obsidian": { + "runtime_id": 49, + "component_based": false + }, + "minecraft:ocelot_spawn_egg": { + "runtime_id": 459, + "component_based": false + }, + "minecraft:ochre_froglight": { + "runtime_id": -471, + "component_based": false + }, + "minecraft:orange_candle": { + "runtime_id": -414, + "component_based": false + }, + "minecraft:orange_candle_cake": { + "runtime_id": -431, + "component_based": false + }, + "minecraft:orange_carpet": { + "runtime_id": -597, + "component_based": false + }, + "minecraft:orange_concrete": { + "runtime_id": -628, + "component_based": false + }, + "minecraft:orange_concrete_powder": { + "runtime_id": -709, + "component_based": false + }, + "minecraft:orange_dye": { + "runtime_id": 416, + "component_based": false + }, + "minecraft:orange_glazed_terracotta": { + "runtime_id": 221, + "component_based": false + }, + "minecraft:orange_shulker_box": { + "runtime_id": -613, + "component_based": false + }, + "minecraft:orange_stained_glass": { + "runtime_id": -673, + "component_based": false + }, + "minecraft:orange_stained_glass_pane": { + "runtime_id": -643, + "component_based": false + }, + "minecraft:orange_terracotta": { + "runtime_id": -724, + "component_based": false + }, + "minecraft:orange_tulip": { + "runtime_id": -834, + "component_based": false + }, + "minecraft:orange_wool": { + "runtime_id": -557, + "component_based": false + }, + "minecraft:oxeye_daisy": { + "runtime_id": -837, + "component_based": false + }, + "minecraft:oxidized_chiseled_copper": { + "runtime_id": -763, + "component_based": false + }, + "minecraft:oxidized_copper": { + "runtime_id": -343, + "component_based": false + }, + "minecraft:oxidized_copper_bulb": { + "runtime_id": -779, + "component_based": false + }, + "minecraft:oxidized_copper_door": { + "runtime_id": -787, + "component_based": false + }, + "minecraft:oxidized_copper_grate": { + "runtime_id": -771, + "component_based": false + }, + "minecraft:oxidized_copper_trapdoor": { + "runtime_id": -795, + "component_based": false + }, + "minecraft:oxidized_cut_copper": { + "runtime_id": -350, + "component_based": false + }, + "minecraft:oxidized_cut_copper_slab": { + "runtime_id": -364, + "component_based": false + }, + "minecraft:oxidized_cut_copper_stairs": { + "runtime_id": -357, + "component_based": false + }, + "minecraft:oxidized_double_cut_copper_slab": { + "runtime_id": -371, + "component_based": false + }, + "minecraft:packed_ice": { + "runtime_id": 174, + "component_based": false + }, + "minecraft:packed_mud": { + "runtime_id": -477, + "component_based": false + }, + "minecraft:painting": { + "runtime_id": 363, + "component_based": false + }, + "minecraft:panda_spawn_egg": { + "runtime_id": 498, + "component_based": false + }, + "minecraft:paper": { + "runtime_id": 393, + "component_based": false + }, + "minecraft:parrot_spawn_egg": { + "runtime_id": 487, + "component_based": false + }, + "minecraft:pearlescent_froglight": { + "runtime_id": -469, + "component_based": false + }, + "minecraft:phantom_membrane": { + "runtime_id": 589, + "component_based": false + }, + "minecraft:phantom_spawn_egg": { + "runtime_id": 495, + "component_based": false + }, + "minecraft:pig_spawn_egg": { + "runtime_id": 445, + "component_based": false + }, + "minecraft:piglin_banner_pattern": { + "runtime_id": 602, + "component_based": false + }, + "minecraft:piglin_brute_spawn_egg": { + "runtime_id": 508, + "component_based": false + }, + "minecraft:piglin_spawn_egg": { + "runtime_id": 506, + "component_based": false + }, + "minecraft:pillager_spawn_egg": { + "runtime_id": 500, + "component_based": false + }, + "minecraft:pink_candle": { + "runtime_id": -419, + "component_based": false + }, + "minecraft:pink_candle_cake": { + "runtime_id": -436, + "component_based": false + }, + "minecraft:pink_carpet": { + "runtime_id": -602, + "component_based": false + }, + "minecraft:pink_concrete": { + "runtime_id": -633, + "component_based": false + }, + "minecraft:pink_concrete_powder": { + "runtime_id": -714, + "component_based": false + }, + "minecraft:pink_dye": { + "runtime_id": 411, + "component_based": false + }, + "minecraft:pink_glazed_terracotta": { + "runtime_id": 226, + "component_based": false + }, + "minecraft:pink_petals": { + "runtime_id": -549, + "component_based": false + }, + "minecraft:pink_shulker_box": { + "runtime_id": -618, + "component_based": false + }, + "minecraft:pink_stained_glass": { + "runtime_id": -678, + "component_based": false + }, + "minecraft:pink_stained_glass_pane": { + "runtime_id": -648, + "component_based": false + }, + "minecraft:pink_terracotta": { + "runtime_id": -729, + "component_based": false + }, + "minecraft:pink_tulip": { + "runtime_id": -836, + "component_based": false + }, + "minecraft:pink_wool": { + "runtime_id": -566, + "component_based": false + }, + "minecraft:piston": { + "runtime_id": 33, + "component_based": false + }, + "minecraft:piston_arm_collision": { + "runtime_id": 34, + "component_based": false + }, + "minecraft:pitcher_crop": { + "runtime_id": -574, + "component_based": false + }, + "minecraft:pitcher_plant": { + "runtime_id": -612, + "component_based": false + }, + "minecraft:pitcher_pod": { + "runtime_id": 300, + "component_based": false + }, + "minecraft:planks": { + "runtime_id": 733, + "component_based": false + }, + "minecraft:plenty_pottery_sherd": { + "runtime_id": 689, + "component_based": false + }, + "minecraft:podzol": { + "runtime_id": 243, + "component_based": false + }, + "minecraft:pointed_dripstone": { + "runtime_id": -308, + "component_based": false + }, + "minecraft:poisonous_potato": { + "runtime_id": 285, + "component_based": false + }, + "minecraft:polar_bear_spawn_egg": { + "runtime_id": 481, + "component_based": false + }, + "minecraft:polished_andesite": { + "runtime_id": -595, + "component_based": false + }, + "minecraft:polished_andesite_stairs": { + "runtime_id": -174, + "component_based": false + }, + "minecraft:polished_basalt": { + "runtime_id": -235, + "component_based": false + }, + "minecraft:polished_blackstone": { + "runtime_id": -291, + "component_based": false + }, + "minecraft:polished_blackstone_brick_double_slab": { + "runtime_id": -285, + "component_based": false + }, + "minecraft:polished_blackstone_brick_slab": { + "runtime_id": -284, + "component_based": false + }, + "minecraft:polished_blackstone_brick_stairs": { + "runtime_id": -275, + "component_based": false + }, + "minecraft:polished_blackstone_brick_wall": { + "runtime_id": -278, + "component_based": false + }, + "minecraft:polished_blackstone_bricks": { + "runtime_id": -274, + "component_based": false + }, + "minecraft:polished_blackstone_button": { + "runtime_id": -296, + "component_based": false + }, + "minecraft:polished_blackstone_double_slab": { + "runtime_id": -294, + "component_based": false + }, + "minecraft:polished_blackstone_pressure_plate": { + "runtime_id": -295, + "component_based": false + }, + "minecraft:polished_blackstone_slab": { + "runtime_id": -293, + "component_based": false + }, + "minecraft:polished_blackstone_stairs": { + "runtime_id": -292, + "component_based": false + }, + "minecraft:polished_blackstone_wall": { + "runtime_id": -297, + "component_based": false + }, + "minecraft:polished_deepslate": { + "runtime_id": -383, + "component_based": false + }, + "minecraft:polished_deepslate_double_slab": { + "runtime_id": -397, + "component_based": false + }, + "minecraft:polished_deepslate_slab": { + "runtime_id": -384, + "component_based": false + }, + "minecraft:polished_deepslate_stairs": { + "runtime_id": -385, + "component_based": false + }, + "minecraft:polished_deepslate_wall": { + "runtime_id": -386, + "component_based": false + }, + "minecraft:polished_diorite": { + "runtime_id": -593, + "component_based": false + }, + "minecraft:polished_diorite_stairs": { + "runtime_id": -173, + "component_based": false + }, + "minecraft:polished_granite": { + "runtime_id": -591, + "component_based": false + }, + "minecraft:polished_granite_stairs": { + "runtime_id": -172, + "component_based": false + }, + "minecraft:polished_tuff": { + "runtime_id": -748, + "component_based": false + }, + "minecraft:polished_tuff_double_slab": { + "runtime_id": -750, + "component_based": false + }, + "minecraft:polished_tuff_slab": { + "runtime_id": -749, + "component_based": false + }, + "minecraft:polished_tuff_stairs": { + "runtime_id": -751, + "component_based": false + }, + "minecraft:polished_tuff_wall": { + "runtime_id": -752, + "component_based": false + }, + "minecraft:popped_chorus_fruit": { + "runtime_id": 574, + "component_based": false + }, + "minecraft:poppy": { + "runtime_id": 38, + "component_based": false + }, + "minecraft:porkchop": { + "runtime_id": 265, + "component_based": false + }, + "minecraft:portal": { + "runtime_id": 90, + "component_based": false + }, + "minecraft:potato": { + "runtime_id": 283, + "component_based": false + }, + "minecraft:potatoes": { + "runtime_id": 142, + "component_based": false + }, + "minecraft:potion": { + "runtime_id": 434, + "component_based": false + }, + "minecraft:powder_snow": { + "runtime_id": -306, + "component_based": false + }, + "minecraft:powder_snow_bucket": { + "runtime_id": 374, + "component_based": false + }, + "minecraft:powered_comparator": { + "runtime_id": 150, + "component_based": false + }, + "minecraft:powered_repeater": { + "runtime_id": 94, + "component_based": false + }, + "minecraft:prismarine": { + "runtime_id": 168, + "component_based": false + }, + "minecraft:prismarine_bricks_stairs": { + "runtime_id": -4, + "component_based": false + }, + "minecraft:prismarine_crystals": { + "runtime_id": 564, + "component_based": false + }, + "minecraft:prismarine_shard": { + "runtime_id": 580, + "component_based": false + }, + "minecraft:prismarine_stairs": { + "runtime_id": -2, + "component_based": false + }, + "minecraft:prize_pottery_sherd": { + "runtime_id": 690, + "component_based": false + }, + "minecraft:pufferfish": { + "runtime_id": 270, + "component_based": false + }, + "minecraft:pufferfish_bucket": { + "runtime_id": 373, + "component_based": false + }, + "minecraft:pufferfish_spawn_egg": { + "runtime_id": 490, + "component_based": false + }, + "minecraft:pumpkin": { + "runtime_id": 86, + "component_based": false + }, + "minecraft:pumpkin_pie": { + "runtime_id": 287, + "component_based": false + }, + "minecraft:pumpkin_seeds": { + "runtime_id": 295, + "component_based": false + }, + "minecraft:pumpkin_stem": { + "runtime_id": 104, + "component_based": false + }, + "minecraft:purple_candle": { + "runtime_id": -423, + "component_based": false + }, + "minecraft:purple_candle_cake": { + "runtime_id": -440, + "component_based": false + }, + "minecraft:purple_carpet": { + "runtime_id": -606, + "component_based": false + }, + "minecraft:purple_concrete": { + "runtime_id": -637, + "component_based": false + }, + "minecraft:purple_concrete_powder": { + "runtime_id": -718, + "component_based": false + }, + "minecraft:purple_dye": { + "runtime_id": 407, + "component_based": false + }, + "minecraft:purple_glazed_terracotta": { + "runtime_id": 219, + "component_based": false + }, + "minecraft:purple_shulker_box": { + "runtime_id": -622, + "component_based": false + }, + "minecraft:purple_stained_glass": { + "runtime_id": -682, + "component_based": false + }, + "minecraft:purple_stained_glass_pane": { + "runtime_id": -652, + "component_based": false + }, + "minecraft:purple_terracotta": { + "runtime_id": -733, + "component_based": false + }, + "minecraft:purple_wool": { + "runtime_id": -564, + "component_based": false + }, + "minecraft:purpur_block": { + "runtime_id": 201, + "component_based": false + }, + "minecraft:purpur_stairs": { + "runtime_id": 203, + "component_based": false + }, + "minecraft:quartz": { + "runtime_id": 539, + "component_based": false + }, + "minecraft:quartz_block": { + "runtime_id": 155, + "component_based": false + }, + "minecraft:quartz_bricks": { + "runtime_id": -304, + "component_based": false + }, + "minecraft:quartz_ore": { + "runtime_id": 153, + "component_based": false + }, + "minecraft:quartz_stairs": { + "runtime_id": 156, + "component_based": false + }, + "minecraft:rabbit": { + "runtime_id": 291, + "component_based": false + }, + "minecraft:rabbit_foot": { + "runtime_id": 543, + "component_based": false + }, + "minecraft:rabbit_hide": { + "runtime_id": 544, + "component_based": false + }, + "minecraft:rabbit_spawn_egg": { + "runtime_id": 467, + "component_based": false + }, + "minecraft:rabbit_stew": { + "runtime_id": 293, + "component_based": false + }, + "minecraft:rail": { + "runtime_id": 66, + "component_based": false + }, + "minecraft:raiser_armor_trim_smithing_template": { + "runtime_id": 711, + "component_based": false + }, + "minecraft:rapid_fertilizer": { + "runtime_id": 614, + "component_based": false + }, + "minecraft:ravager_spawn_egg": { + "runtime_id": 502, + "component_based": false + }, + "minecraft:raw_copper": { + "runtime_id": 522, + "component_based": false + }, + "minecraft:raw_copper_block": { + "runtime_id": -452, + "component_based": false + }, + "minecraft:raw_gold": { + "runtime_id": 521, + "component_based": false + }, + "minecraft:raw_gold_block": { + "runtime_id": -453, + "component_based": false + }, + "minecraft:raw_iron": { + "runtime_id": 520, + "component_based": false + }, + "minecraft:raw_iron_block": { + "runtime_id": -451, + "component_based": false + }, + "minecraft:recovery_compass": { + "runtime_id": 663, + "component_based": false + }, + "minecraft:red_candle": { + "runtime_id": -427, + "component_based": false + }, + "minecraft:red_candle_cake": { + "runtime_id": -444, + "component_based": false + }, + "minecraft:red_carpet": { + "runtime_id": -610, + "component_based": false + }, + "minecraft:red_concrete": { + "runtime_id": -641, + "component_based": false + }, + "minecraft:red_concrete_powder": { + "runtime_id": -722, + "component_based": false + }, + "minecraft:red_dye": { + "runtime_id": 403, + "component_based": false + }, + "minecraft:red_flower": { + "runtime_id": 732, + "component_based": false + }, + "minecraft:red_glazed_terracotta": { + "runtime_id": 234, + "component_based": false + }, + "minecraft:red_mushroom": { + "runtime_id": 40, + "component_based": false + }, + "minecraft:red_mushroom_block": { + "runtime_id": 100, + "component_based": false + }, + "minecraft:red_nether_brick": { + "runtime_id": 215, + "component_based": false + }, + "minecraft:red_nether_brick_stairs": { + "runtime_id": -184, + "component_based": false + }, + "minecraft:red_sandstone": { + "runtime_id": 179, + "component_based": false + }, + "minecraft:red_sandstone_stairs": { + "runtime_id": 180, + "component_based": false + }, + "minecraft:red_shulker_box": { + "runtime_id": -626, + "component_based": false + }, + "minecraft:red_stained_glass": { + "runtime_id": -686, + "component_based": false + }, + "minecraft:red_stained_glass_pane": { + "runtime_id": -656, + "component_based": false + }, + "minecraft:red_terracotta": { + "runtime_id": -737, + "component_based": false + }, + "minecraft:red_tulip": { + "runtime_id": -833, + "component_based": false + }, + "minecraft:red_wool": { + "runtime_id": -556, + "component_based": false + }, + "minecraft:redstone": { + "runtime_id": 379, + "component_based": false + }, + "minecraft:redstone_block": { + "runtime_id": 152, + "component_based": false + }, + "minecraft:redstone_lamp": { + "runtime_id": 123, + "component_based": false + }, + "minecraft:redstone_ore": { + "runtime_id": 73, + "component_based": false + }, + "minecraft:redstone_torch": { + "runtime_id": 76, + "component_based": false + }, + "minecraft:redstone_wire": { + "runtime_id": 55, + "component_based": false + }, + "minecraft:reinforced_deepslate": { + "runtime_id": -466, + "component_based": false + }, + "minecraft:repeater": { + "runtime_id": 426, + "component_based": true + }, + "minecraft:repeating_command_block": { + "runtime_id": 188, + "component_based": false + }, + "minecraft:reserved6": { + "runtime_id": 255, + "component_based": false + }, + "minecraft:respawn_anchor": { + "runtime_id": -272, + "component_based": false + }, + "minecraft:rib_armor_trim_smithing_template": { + "runtime_id": 707, + "component_based": false + }, + "minecraft:rotten_flesh": { + "runtime_id": 280, + "component_based": false + }, + "minecraft:saddle": { + "runtime_id": 377, + "component_based": false + }, + "minecraft:salmon": { + "runtime_id": 268, + "component_based": false + }, + "minecraft:salmon_bucket": { + "runtime_id": 371, + "component_based": false + }, + "minecraft:salmon_spawn_egg": { + "runtime_id": 491, + "component_based": false + }, + "minecraft:sand": { + "runtime_id": 12, + "component_based": false + }, + "minecraft:sandstone": { + "runtime_id": 24, + "component_based": false + }, + "minecraft:sandstone_stairs": { + "runtime_id": 128, + "component_based": false + }, + "minecraft:sapling": { + "runtime_id": 728, + "component_based": false + }, + "minecraft:scaffolding": { + "runtime_id": -165, + "component_based": false + }, + "minecraft:scrape_pottery_sherd": { + "runtime_id": 691, + "component_based": false + }, + "minecraft:sculk": { + "runtime_id": -458, + "component_based": false + }, + "minecraft:sculk_catalyst": { + "runtime_id": -460, + "component_based": false + }, + "minecraft:sculk_sensor": { + "runtime_id": -307, + "component_based": false + }, + "minecraft:sculk_shrieker": { + "runtime_id": -461, + "component_based": false + }, + "minecraft:sculk_vein": { + "runtime_id": -459, + "component_based": false + }, + "minecraft:sea_lantern": { + "runtime_id": 169, + "component_based": false + }, + "minecraft:sea_pickle": { + "runtime_id": -156, + "component_based": false + }, + "minecraft:seagrass": { + "runtime_id": -130, + "component_based": false + }, + "minecraft:sentry_armor_trim_smithing_template": { + "runtime_id": 698, + "component_based": false + }, + "minecraft:shaper_armor_trim_smithing_template": { + "runtime_id": 712, + "component_based": false + }, + "minecraft:sheaf_pottery_sherd": { + "runtime_id": 692, + "component_based": false + }, + "minecraft:shears": { + "runtime_id": 428, + "component_based": false + }, + "minecraft:sheep_spawn_egg": { + "runtime_id": 446, + "component_based": false + }, + "minecraft:shelter_pottery_sherd": { + "runtime_id": 693, + "component_based": false + }, + "minecraft:shield": { + "runtime_id": 361, + "component_based": false + }, + "minecraft:shroomlight": { + "runtime_id": -230, + "component_based": false + }, + "minecraft:shulker_box": { + "runtime_id": 740, + "component_based": false + }, + "minecraft:shulker_shell": { + "runtime_id": 581, + "component_based": false + }, + "minecraft:shulker_spawn_egg": { + "runtime_id": 478, + "component_based": false + }, + "minecraft:silence_armor_trim_smithing_template": { + "runtime_id": 709, + "component_based": false + }, + "minecraft:silver_glazed_terracotta": { + "runtime_id": 228, + "component_based": false + }, + "minecraft:silverfish_spawn_egg": { + "runtime_id": 451, + "component_based": false + }, + "minecraft:skeleton_horse_spawn_egg": { + "runtime_id": 476, + "component_based": false + }, + "minecraft:skeleton_spawn_egg": { + "runtime_id": 452, + "component_based": false + }, + "minecraft:skull": { + "runtime_id": 531, + "component_based": false + }, + "minecraft:skull_banner_pattern": { + "runtime_id": 598, + "component_based": false + }, + "minecraft:skull_pottery_sherd": { + "runtime_id": 694, + "component_based": false + }, + "minecraft:slime": { + "runtime_id": 165, + "component_based": false + }, + "minecraft:slime_ball": { + "runtime_id": 395, + "component_based": false + }, + "minecraft:slime_spawn_egg": { + "runtime_id": 453, + "component_based": false + }, + "minecraft:small_amethyst_bud": { + "runtime_id": -332, + "component_based": false + }, + "minecraft:small_dripleaf_block": { + "runtime_id": -336, + "component_based": false + }, + "minecraft:smithing_table": { + "runtime_id": -202, + "component_based": false + }, + "minecraft:smoker": { + "runtime_id": -198, + "component_based": false + }, + "minecraft:smooth_basalt": { + "runtime_id": -377, + "component_based": false + }, + "minecraft:smooth_quartz_stairs": { + "runtime_id": -185, + "component_based": false + }, + "minecraft:smooth_red_sandstone_stairs": { + "runtime_id": -176, + "component_based": false + }, + "minecraft:smooth_sandstone_stairs": { + "runtime_id": -177, + "component_based": false + }, + "minecraft:smooth_stone": { + "runtime_id": -183, + "component_based": false + }, + "minecraft:sniffer_egg": { + "runtime_id": -596, + "component_based": false + }, + "minecraft:sniffer_spawn_egg": { + "runtime_id": 509, + "component_based": false + }, + "minecraft:snort_pottery_sherd": { + "runtime_id": 695, + "component_based": false + }, + "minecraft:snout_armor_trim_smithing_template": { + "runtime_id": 706, + "component_based": false + }, + "minecraft:snow": { + "runtime_id": 80, + "component_based": false + }, + "minecraft:snow_golem_spawn_egg": { + "runtime_id": 515, + "component_based": false + }, + "minecraft:snow_layer": { + "runtime_id": 78, + "component_based": false + }, + "minecraft:snowball": { + "runtime_id": 380, + "component_based": true + }, + "minecraft:soul_campfire": { + "runtime_id": 639, + "component_based": true + }, + "minecraft:soul_fire": { + "runtime_id": -237, + "component_based": false + }, + "minecraft:soul_lantern": { + "runtime_id": -269, + "component_based": false + }, + "minecraft:soul_sand": { + "runtime_id": 88, + "component_based": false + }, + "minecraft:soul_soil": { + "runtime_id": -236, + "component_based": false + }, + "minecraft:soul_torch": { + "runtime_id": -268, + "component_based": false + }, + "minecraft:sparkler": { + "runtime_id": 617, + "component_based": false + }, + "minecraft:spawn_egg": { + "runtime_id": 747, + "component_based": false + }, + "minecraft:spider_eye": { + "runtime_id": 281, + "component_based": false + }, + "minecraft:spider_spawn_egg": { + "runtime_id": 454, + "component_based": false + }, + "minecraft:spire_armor_trim_smithing_template": { + "runtime_id": 708, + "component_based": false + }, + "minecraft:splash_potion": { + "runtime_id": 576, + "component_based": false + }, + "minecraft:sponge": { + "runtime_id": 19, + "component_based": false + }, + "minecraft:spore_blossom": { + "runtime_id": -321, + "component_based": false + }, + "minecraft:spruce_boat": { + "runtime_id": 385, + "component_based": false + }, + "minecraft:spruce_button": { + "runtime_id": -144, + "component_based": false + }, + "minecraft:spruce_chest_boat": { + "runtime_id": 658, + "component_based": false + }, + "minecraft:spruce_door": { + "runtime_id": 568, + "component_based": false + }, + "minecraft:spruce_double_slab": { + "runtime_id": -809, + "component_based": false + }, + "minecraft:spruce_fence": { + "runtime_id": -579, + "component_based": false + }, + "minecraft:spruce_fence_gate": { + "runtime_id": 183, + "component_based": false + }, + "minecraft:spruce_hanging_sign": { + "runtime_id": -501, + "component_based": false + }, + "minecraft:spruce_leaves": { + "runtime_id": -800, + "component_based": false + }, + "minecraft:spruce_log": { + "runtime_id": -569, + "component_based": false + }, + "minecraft:spruce_planks": { + "runtime_id": -739, + "component_based": false + }, + "minecraft:spruce_pressure_plate": { + "runtime_id": -154, + "component_based": false + }, + "minecraft:spruce_sapling": { + "runtime_id": -825, + "component_based": false + }, + "minecraft:spruce_sign": { + "runtime_id": 591, + "component_based": false + }, + "minecraft:spruce_slab": { + "runtime_id": -804, + "component_based": false + }, + "minecraft:spruce_stairs": { + "runtime_id": 134, + "component_based": false + }, + "minecraft:spruce_standing_sign": { + "runtime_id": -181, + "component_based": false + }, + "minecraft:spruce_trapdoor": { + "runtime_id": -149, + "component_based": false + }, + "minecraft:spruce_wall_sign": { + "runtime_id": -182, + "component_based": false + }, + "minecraft:spruce_wood": { + "runtime_id": -814, + "component_based": false + }, + "minecraft:spyglass": { + "runtime_id": 642, + "component_based": false + }, + "minecraft:squid_spawn_egg": { + "runtime_id": 458, + "component_based": false + }, + "minecraft:stained_glass": { + "runtime_id": 738, + "component_based": false + }, + "minecraft:stained_glass_pane": { + "runtime_id": 739, + "component_based": false + }, + "minecraft:stained_hardened_clay": { + "runtime_id": 717, + "component_based": false + }, + "minecraft:standing_banner": { + "runtime_id": 176, + "component_based": false + }, + "minecraft:standing_sign": { + "runtime_id": 63, + "component_based": false + }, + "minecraft:stick": { + "runtime_id": 326, + "component_based": false + }, + "minecraft:sticky_piston": { + "runtime_id": 29, + "component_based": false + }, + "minecraft:sticky_piston_arm_collision": { + "runtime_id": -217, + "component_based": false + }, + "minecraft:stone": { + "runtime_id": 1, + "component_based": false + }, + "minecraft:stone_axe": { + "runtime_id": 320, + "component_based": false + }, + "minecraft:stone_block_slab": { + "runtime_id": 44, + "component_based": false + }, + "minecraft:stone_block_slab2": { + "runtime_id": 182, + "component_based": false + }, + "minecraft:stone_block_slab3": { + "runtime_id": -162, + "component_based": false + }, + "minecraft:stone_block_slab4": { + "runtime_id": -166, + "component_based": false + }, + "minecraft:stone_brick_stairs": { + "runtime_id": 109, + "component_based": false + }, + "minecraft:stone_button": { + "runtime_id": 77, + "component_based": false + }, + "minecraft:stone_hoe": { + "runtime_id": 336, + "component_based": false + }, + "minecraft:stone_pickaxe": { + "runtime_id": 319, + "component_based": false + }, + "minecraft:stone_pressure_plate": { + "runtime_id": 70, + "component_based": false + }, + "minecraft:stone_shovel": { + "runtime_id": 318, + "component_based": false + }, + "minecraft:stone_stairs": { + "runtime_id": 67, + "component_based": false + }, + "minecraft:stone_sword": { + "runtime_id": 317, + "component_based": false + }, + "minecraft:stonebrick": { + "runtime_id": 98, + "component_based": false + }, + "minecraft:stonecutter": { + "runtime_id": 245, + "component_based": false + }, + "minecraft:stonecutter_block": { + "runtime_id": -197, + "component_based": false + }, + "minecraft:stray_spawn_egg": { + "runtime_id": 470, + "component_based": false + }, + "minecraft:strider_spawn_egg": { + "runtime_id": 504, + "component_based": false + }, + "minecraft:string": { + "runtime_id": 332, + "component_based": true + }, + "minecraft:stripped_acacia_log": { + "runtime_id": -8, + "component_based": false + }, + "minecraft:stripped_acacia_wood": { + "runtime_id": -823, + "component_based": false + }, + "minecraft:stripped_bamboo_block": { + "runtime_id": -528, + "component_based": false + }, + "minecraft:stripped_birch_log": { + "runtime_id": -6, + "component_based": false + }, + "minecraft:stripped_birch_wood": { + "runtime_id": -821, + "component_based": false + }, + "minecraft:stripped_cherry_log": { + "runtime_id": -535, + "component_based": false + }, + "minecraft:stripped_cherry_wood": { + "runtime_id": -545, + "component_based": false + }, + "minecraft:stripped_crimson_hyphae": { + "runtime_id": -300, + "component_based": false + }, + "minecraft:stripped_crimson_stem": { + "runtime_id": -240, + "component_based": false + }, + "minecraft:stripped_dark_oak_log": { + "runtime_id": -9, + "component_based": false + }, + "minecraft:stripped_dark_oak_wood": { + "runtime_id": -824, + "component_based": false + }, + "minecraft:stripped_jungle_log": { + "runtime_id": -7, + "component_based": false + }, + "minecraft:stripped_jungle_wood": { + "runtime_id": -822, + "component_based": false + }, + "minecraft:stripped_mangrove_log": { + "runtime_id": -485, + "component_based": false + }, + "minecraft:stripped_mangrove_wood": { + "runtime_id": -498, + "component_based": false + }, + "minecraft:stripped_oak_log": { + "runtime_id": -10, + "component_based": false + }, + "minecraft:stripped_oak_wood": { + "runtime_id": -819, + "component_based": false + }, + "minecraft:stripped_spruce_log": { + "runtime_id": -5, + "component_based": false + }, + "minecraft:stripped_spruce_wood": { + "runtime_id": -820, + "component_based": false + }, + "minecraft:stripped_warped_hyphae": { + "runtime_id": -301, + "component_based": false + }, + "minecraft:stripped_warped_stem": { + "runtime_id": -241, + "component_based": false + }, + "minecraft:structure_block": { + "runtime_id": 252, + "component_based": false + }, + "minecraft:structure_void": { + "runtime_id": 217, + "component_based": false + }, + "minecraft:sugar": { + "runtime_id": 423, + "component_based": false + }, + "minecraft:sugar_cane": { + "runtime_id": 392, + "component_based": true + }, + "minecraft:suspicious_gravel": { + "runtime_id": -573, + "component_based": false + }, + "minecraft:suspicious_sand": { + "runtime_id": -529, + "component_based": false + }, + "minecraft:suspicious_stew": { + "runtime_id": 607, + "component_based": false + }, + "minecraft:sweet_berries": { + "runtime_id": 290, + "component_based": false + }, + "minecraft:sweet_berry_bush": { + "runtime_id": -207, + "component_based": false + }, + "minecraft:tadpole_bucket": { + "runtime_id": 647, + "component_based": false + }, + "minecraft:tadpole_spawn_egg": { + "runtime_id": 646, + "component_based": false + }, + "minecraft:tallgrass": { + "runtime_id": 31, + "component_based": false + }, + "minecraft:target": { + "runtime_id": -239, + "component_based": false + }, + "minecraft:tide_armor_trim_smithing_template": { + "runtime_id": 705, + "component_based": false + }, + "minecraft:tinted_glass": { + "runtime_id": -334, + "component_based": false + }, + "minecraft:tnt": { + "runtime_id": 46, + "component_based": false + }, + "minecraft:tnt_minecart": { + "runtime_id": 540, + "component_based": false + }, + "minecraft:torch": { + "runtime_id": 50, + "component_based": false + }, + "minecraft:torchflower": { + "runtime_id": -568, + "component_based": false + }, + "minecraft:torchflower_crop": { + "runtime_id": -567, + "component_based": false + }, + "minecraft:torchflower_seeds": { + "runtime_id": 299, + "component_based": false + }, + "minecraft:totem_of_undying": { + "runtime_id": 583, + "component_based": false + }, + "minecraft:trader_llama_spawn_egg": { + "runtime_id": 665, + "component_based": false + }, + "minecraft:trapdoor": { + "runtime_id": 96, + "component_based": false + }, + "minecraft:trapped_chest": { + "runtime_id": 146, + "component_based": false + }, + "minecraft:trial_key": { + "runtime_id": 258, + "component_based": true + }, + "minecraft:trial_spawner": { + "runtime_id": -315, + "component_based": false + }, + "minecraft:trident": { + "runtime_id": 561, + "component_based": false + }, + "minecraft:trip_wire": { + "runtime_id": 132, + "component_based": false + }, + "minecraft:tripwire_hook": { + "runtime_id": 131, + "component_based": false + }, + "minecraft:tropical_fish": { + "runtime_id": 269, + "component_based": false + }, + "minecraft:tropical_fish_bucket": { + "runtime_id": 372, + "component_based": false + }, + "minecraft:tropical_fish_spawn_egg": { + "runtime_id": 488, + "component_based": false + }, + "minecraft:tube_coral": { + "runtime_id": -131, + "component_based": false + }, + "minecraft:tube_coral_fan": { + "runtime_id": -133, + "component_based": false + }, + "minecraft:tuff": { + "runtime_id": -333, + "component_based": false + }, + "minecraft:tuff_brick_double_slab": { + "runtime_id": -756, + "component_based": false + }, + "minecraft:tuff_brick_slab": { + "runtime_id": -755, + "component_based": false + }, + "minecraft:tuff_brick_stairs": { + "runtime_id": -757, + "component_based": false + }, + "minecraft:tuff_brick_wall": { + "runtime_id": -758, + "component_based": false + }, + "minecraft:tuff_bricks": { + "runtime_id": -754, + "component_based": false + }, + "minecraft:tuff_double_slab": { + "runtime_id": -745, + "component_based": false + }, + "minecraft:tuff_slab": { + "runtime_id": -744, + "component_based": false + }, + "minecraft:tuff_stairs": { + "runtime_id": -746, + "component_based": false + }, + "minecraft:tuff_wall": { + "runtime_id": -747, + "component_based": false + }, + "minecraft:turtle_egg": { + "runtime_id": -159, + "component_based": false + }, + "minecraft:turtle_helmet": { + "runtime_id": 588, + "component_based": false + }, + "minecraft:turtle_scute": { + "runtime_id": 587, + "component_based": false + }, + "minecraft:turtle_spawn_egg": { + "runtime_id": 494, + "component_based": false + }, + "minecraft:twisting_vines": { + "runtime_id": -287, + "component_based": false + }, + "minecraft:underwater_torch": { + "runtime_id": 239, + "component_based": false + }, + "minecraft:undyed_shulker_box": { + "runtime_id": 205, + "component_based": false + }, + "minecraft:unknown": { + "runtime_id": -305, + "component_based": false + }, + "minecraft:unlit_redstone_torch": { + "runtime_id": 75, + "component_based": false + }, + "minecraft:unpowered_comparator": { + "runtime_id": 149, + "component_based": false + }, + "minecraft:unpowered_repeater": { + "runtime_id": 93, + "component_based": false + }, + "minecraft:vault": { + "runtime_id": -314, + "component_based": false + }, + "minecraft:verdant_froglight": { + "runtime_id": -470, + "component_based": false + }, + "minecraft:vex_armor_trim_smithing_template": { + "runtime_id": 704, + "component_based": false + }, + "minecraft:vex_spawn_egg": { + "runtime_id": 485, + "component_based": false + }, + "minecraft:villager_spawn_egg": { + "runtime_id": 457, + "component_based": false + }, + "minecraft:vindicator_spawn_egg": { + "runtime_id": 483, + "component_based": false + }, + "minecraft:vine": { + "runtime_id": 106, + "component_based": false + }, + "minecraft:wall_banner": { + "runtime_id": 177, + "component_based": false + }, + "minecraft:wall_sign": { + "runtime_id": 68, + "component_based": false + }, + "minecraft:wandering_trader_spawn_egg": { + "runtime_id": 501, + "component_based": false + }, + "minecraft:ward_armor_trim_smithing_template": { + "runtime_id": 702, + "component_based": false + }, + "minecraft:warden_spawn_egg": { + "runtime_id": 649, + "component_based": false + }, + "minecraft:warped_button": { + "runtime_id": -261, + "component_based": false + }, + "minecraft:warped_door": { + "runtime_id": 634, + "component_based": false + }, + "minecraft:warped_double_slab": { + "runtime_id": -267, + "component_based": false + }, + "minecraft:warped_fence": { + "runtime_id": -257, + "component_based": false + }, + "minecraft:warped_fence_gate": { + "runtime_id": -259, + "component_based": false + }, + "minecraft:warped_fungus": { + "runtime_id": -229, + "component_based": false + }, + "minecraft:warped_fungus_on_a_stick": { + "runtime_id": 635, + "component_based": true + }, + "minecraft:warped_hanging_sign": { + "runtime_id": -507, + "component_based": false + }, + "minecraft:warped_hyphae": { + "runtime_id": -298, + "component_based": false + }, + "minecraft:warped_nylium": { + "runtime_id": -233, + "component_based": false + }, + "minecraft:warped_planks": { + "runtime_id": -243, + "component_based": false + }, + "minecraft:warped_pressure_plate": { + "runtime_id": -263, + "component_based": false + }, + "minecraft:warped_roots": { + "runtime_id": -224, + "component_based": false + }, + "minecraft:warped_sign": { + "runtime_id": 632, + "component_based": false + }, + "minecraft:warped_slab": { + "runtime_id": -265, + "component_based": false + }, + "minecraft:warped_stairs": { + "runtime_id": -255, + "component_based": false + }, + "minecraft:warped_standing_sign": { + "runtime_id": -251, + "component_based": false + }, + "minecraft:warped_stem": { + "runtime_id": -226, + "component_based": false + }, + "minecraft:warped_trapdoor": { + "runtime_id": -247, + "component_based": false + }, + "minecraft:warped_wall_sign": { + "runtime_id": -253, + "component_based": false + }, + "minecraft:warped_wart_block": { + "runtime_id": -227, + "component_based": false + }, + "minecraft:water": { + "runtime_id": 9, + "component_based": false + }, + "minecraft:water_bucket": { + "runtime_id": 368, + "component_based": false + }, + "minecraft:waterlily": { + "runtime_id": 111, + "component_based": false + }, + "minecraft:waxed_chiseled_copper": { + "runtime_id": -764, + "component_based": false + }, + "minecraft:waxed_copper": { + "runtime_id": -344, + "component_based": false + }, + "minecraft:waxed_copper_bulb": { + "runtime_id": -780, + "component_based": false + }, + "minecraft:waxed_copper_door": { + "runtime_id": -788, + "component_based": false + }, + "minecraft:waxed_copper_grate": { + "runtime_id": -772, + "component_based": false + }, + "minecraft:waxed_copper_trapdoor": { + "runtime_id": -796, + "component_based": false + }, + "minecraft:waxed_cut_copper": { + "runtime_id": -351, + "component_based": false + }, + "minecraft:waxed_cut_copper_slab": { + "runtime_id": -365, + "component_based": false + }, + "minecraft:waxed_cut_copper_stairs": { + "runtime_id": -358, + "component_based": false + }, + "minecraft:waxed_double_cut_copper_slab": { + "runtime_id": -372, + "component_based": false + }, + "minecraft:waxed_exposed_chiseled_copper": { + "runtime_id": -765, + "component_based": false + }, + "minecraft:waxed_exposed_copper": { + "runtime_id": -345, + "component_based": false + }, + "minecraft:waxed_exposed_copper_bulb": { + "runtime_id": -781, + "component_based": false + }, + "minecraft:waxed_exposed_copper_door": { + "runtime_id": -789, + "component_based": false + }, + "minecraft:waxed_exposed_copper_grate": { + "runtime_id": -773, + "component_based": false + }, + "minecraft:waxed_exposed_copper_trapdoor": { + "runtime_id": -797, + "component_based": false + }, + "minecraft:waxed_exposed_cut_copper": { + "runtime_id": -352, + "component_based": false + }, + "minecraft:waxed_exposed_cut_copper_slab": { + "runtime_id": -366, + "component_based": false + }, + "minecraft:waxed_exposed_cut_copper_stairs": { + "runtime_id": -359, + "component_based": false + }, + "minecraft:waxed_exposed_double_cut_copper_slab": { + "runtime_id": -373, + "component_based": false + }, + "minecraft:waxed_oxidized_chiseled_copper": { + "runtime_id": -766, + "component_based": false + }, + "minecraft:waxed_oxidized_copper": { + "runtime_id": -446, + "component_based": false + }, + "minecraft:waxed_oxidized_copper_bulb": { + "runtime_id": -783, + "component_based": false + }, + "minecraft:waxed_oxidized_copper_door": { + "runtime_id": -791, + "component_based": false + }, + "minecraft:waxed_oxidized_copper_grate": { + "runtime_id": -775, + "component_based": false + }, + "minecraft:waxed_oxidized_copper_trapdoor": { + "runtime_id": -799, + "component_based": false + }, + "minecraft:waxed_oxidized_cut_copper": { + "runtime_id": -447, + "component_based": false + }, + "minecraft:waxed_oxidized_cut_copper_slab": { + "runtime_id": -449, + "component_based": false + }, + "minecraft:waxed_oxidized_cut_copper_stairs": { + "runtime_id": -448, + "component_based": false + }, + "minecraft:waxed_oxidized_double_cut_copper_slab": { + "runtime_id": -450, + "component_based": false + }, + "minecraft:waxed_weathered_chiseled_copper": { + "runtime_id": -767, + "component_based": false + }, + "minecraft:waxed_weathered_copper": { + "runtime_id": -346, + "component_based": false + }, + "minecraft:waxed_weathered_copper_bulb": { + "runtime_id": -782, + "component_based": false + }, + "minecraft:waxed_weathered_copper_door": { + "runtime_id": -790, + "component_based": false + }, + "minecraft:waxed_weathered_copper_grate": { + "runtime_id": -774, + "component_based": false + }, + "minecraft:waxed_weathered_copper_trapdoor": { + "runtime_id": -798, + "component_based": false + }, + "minecraft:waxed_weathered_cut_copper": { + "runtime_id": -353, + "component_based": false + }, + "minecraft:waxed_weathered_cut_copper_slab": { + "runtime_id": -367, + "component_based": false + }, + "minecraft:waxed_weathered_cut_copper_stairs": { + "runtime_id": -360, + "component_based": false + }, + "minecraft:waxed_weathered_double_cut_copper_slab": { + "runtime_id": -374, + "component_based": false + }, + "minecraft:wayfinder_armor_trim_smithing_template": { + "runtime_id": 710, + "component_based": false + }, + "minecraft:weathered_chiseled_copper": { + "runtime_id": -762, + "component_based": false + }, + "minecraft:weathered_copper": { + "runtime_id": -342, + "component_based": false + }, + "minecraft:weathered_copper_bulb": { + "runtime_id": -778, + "component_based": false + }, + "minecraft:weathered_copper_door": { + "runtime_id": -786, + "component_based": false + }, + "minecraft:weathered_copper_grate": { + "runtime_id": -770, + "component_based": false + }, + "minecraft:weathered_copper_trapdoor": { + "runtime_id": -794, + "component_based": false + }, + "minecraft:weathered_cut_copper": { + "runtime_id": -349, + "component_based": false + }, + "minecraft:weathered_cut_copper_slab": { + "runtime_id": -363, + "component_based": false + }, + "minecraft:weathered_cut_copper_stairs": { + "runtime_id": -356, + "component_based": false + }, + "minecraft:weathered_double_cut_copper_slab": { + "runtime_id": -370, + "component_based": false + }, + "minecraft:web": { + "runtime_id": 30, + "component_based": false + }, + "minecraft:weeping_vines": { + "runtime_id": -231, + "component_based": false + }, + "minecraft:wheat": { + "runtime_id": 340, + "component_based": false + }, + "minecraft:wheat_seeds": { + "runtime_id": 294, + "component_based": false + }, + "minecraft:white_candle": { + "runtime_id": -413, + "component_based": false + }, + "minecraft:white_candle_cake": { + "runtime_id": -430, + "component_based": false + }, + "minecraft:white_carpet": { + "runtime_id": 171, + "component_based": false + }, + "minecraft:white_concrete": { + "runtime_id": 236, + "component_based": false + }, + "minecraft:white_concrete_powder": { + "runtime_id": 237, + "component_based": false + }, + "minecraft:white_dye": { + "runtime_id": 417, + "component_based": false + }, + "minecraft:white_glazed_terracotta": { + "runtime_id": 220, + "component_based": false + }, + "minecraft:white_shulker_box": { + "runtime_id": 218, + "component_based": false + }, + "minecraft:white_stained_glass": { + "runtime_id": 241, + "component_based": false + }, + "minecraft:white_stained_glass_pane": { + "runtime_id": 160, + "component_based": false + }, + "minecraft:white_terracotta": { + "runtime_id": 159, + "component_based": false + }, + "minecraft:white_tulip": { + "runtime_id": -835, + "component_based": false + }, + "minecraft:white_wool": { + "runtime_id": 35, + "component_based": false + }, + "minecraft:wild_armor_trim_smithing_template": { + "runtime_id": 701, + "component_based": false + }, + "minecraft:wind_charge": { + "runtime_id": 259, + "component_based": true + }, + "minecraft:witch_spawn_egg": { + "runtime_id": 460, + "component_based": false + }, + "minecraft:wither_rose": { + "runtime_id": -216, + "component_based": false + }, + "minecraft:wither_skeleton_spawn_egg": { + "runtime_id": 473, + "component_based": false + }, + "minecraft:wither_spawn_egg": { + "runtime_id": 517, + "component_based": false + }, + "minecraft:wolf_armor": { + "runtime_id": 720, + "component_based": true + }, + "minecraft:wolf_spawn_egg": { + "runtime_id": 447, + "component_based": false + }, + "minecraft:wood": { + "runtime_id": 741, + "component_based": false + }, + "minecraft:wooden_axe": { + "runtime_id": 316, + "component_based": false + }, + "minecraft:wooden_button": { + "runtime_id": 143, + "component_based": false + }, + "minecraft:wooden_door": { + "runtime_id": 365, + "component_based": false + }, + "minecraft:wooden_hoe": { + "runtime_id": 335, + "component_based": false + }, + "minecraft:wooden_pickaxe": { + "runtime_id": 315, + "component_based": false + }, + "minecraft:wooden_pressure_plate": { + "runtime_id": 72, + "component_based": false + }, + "minecraft:wooden_shovel": { + "runtime_id": 314, + "component_based": false + }, + "minecraft:wooden_slab": { + "runtime_id": 731, + "component_based": false + }, + "minecraft:wooden_sword": { + "runtime_id": 313, + "component_based": false + }, + "minecraft:wool": { + "runtime_id": 722, + "component_based": false + }, + "minecraft:writable_book": { + "runtime_id": 525, + "component_based": false + }, + "minecraft:written_book": { + "runtime_id": 526, + "component_based": false + }, + "minecraft:yellow_candle": { + "runtime_id": -417, + "component_based": false + }, + "minecraft:yellow_candle_cake": { + "runtime_id": -434, + "component_based": false + }, + "minecraft:yellow_carpet": { + "runtime_id": -600, + "component_based": false + }, + "minecraft:yellow_concrete": { + "runtime_id": -631, + "component_based": false + }, + "minecraft:yellow_concrete_powder": { + "runtime_id": -712, + "component_based": false + }, + "minecraft:yellow_dye": { + "runtime_id": 413, + "component_based": false + }, + "minecraft:yellow_flower": { + "runtime_id": 37, + "component_based": false + }, + "minecraft:yellow_glazed_terracotta": { + "runtime_id": 224, + "component_based": false + }, + "minecraft:yellow_shulker_box": { + "runtime_id": -616, + "component_based": false + }, + "minecraft:yellow_stained_glass": { + "runtime_id": -676, + "component_based": false + }, + "minecraft:yellow_stained_glass_pane": { + "runtime_id": -646, + "component_based": false + }, + "minecraft:yellow_terracotta": { + "runtime_id": -727, + "component_based": false + }, + "minecraft:yellow_wool": { + "runtime_id": -558, + "component_based": false + }, + "minecraft:zoglin_spawn_egg": { + "runtime_id": 507, + "component_based": false + }, + "minecraft:zombie_horse_spawn_egg": { + "runtime_id": 477, + "component_based": false + }, + "minecraft:zombie_pigman_spawn_egg": { + "runtime_id": 456, + "component_based": false + }, + "minecraft:zombie_spawn_egg": { + "runtime_id": 455, + "component_based": false + }, + "minecraft:zombie_villager_spawn_egg": { + "runtime_id": 486, + "component_based": false + } +} diff --git a/legacyver/legacypacket/code_builder_source.go b/legacyver/legacypacket/code_builder_source.go new file mode 100644 index 0000000..1ee3f53 --- /dev/null +++ b/legacyver/legacypacket/code_builder_source.go @@ -0,0 +1,32 @@ +package legacypacket + +import ( + "github.com/akmalfairuz/legacy-version/legacyver/proto" + "github.com/sandertv/gophertunnel/minecraft/protocol" + "github.com/sandertv/gophertunnel/minecraft/protocol/packet" +) + +// CodeBuilderSource is an Education Edition packet sent by the client to the server to run an operation with a +// code builder. +type CodeBuilderSource struct { + // Operation is used to distinguish the operation performed. It is always one of the constants listed above. + Operation byte + // Category is used to distinguish the category of the operation performed. It is always one of the constants + // listed above. + Category byte + // CodeStatus is the status of the code builder. It is always one of the constants listed above. + CodeStatus byte +} + +// ID ... +func (pk *CodeBuilderSource) ID() uint32 { + return packet.IDCodeBuilderSource +} + +func (pk *CodeBuilderSource) Marshal(io protocol.IO) { + io.Uint8(&pk.Operation) + io.Uint8(&pk.Category) + if proto.IsProtoGTE(io, proto.ID685) { + io.Uint8(&pk.CodeStatus) + } +} diff --git a/legacyver/legacypacket/container_close.go b/legacyver/legacypacket/container_close.go new file mode 100644 index 0000000..479d617 --- /dev/null +++ b/legacyver/legacypacket/container_close.go @@ -0,0 +1,35 @@ +package legacypacket + +import ( + "github.com/akmalfairuz/legacy-version/legacyver/proto" + "github.com/sandertv/gophertunnel/minecraft/protocol" + "github.com/sandertv/gophertunnel/minecraft/protocol/packet" +) + +// ContainerClose is sent by the server to close a container the player currently has opened, which was opened +// using the ContainerOpen packet, or by the client to tell the server it closed a particular container, such +// as the crafting grid. +type ContainerClose struct { + // WindowID is the ID representing the window of the container that should be closed. It must be equal to + // the one sent in the ContainerOpen packet to close the designated window. + WindowID byte + // ContainerType is the type of container that the server is trying to close. This is used to validate on + // the client side whether or not the server's close request is valid. + ContainerType byte + // ServerSide determines whether or not the container was force-closed by the server. If this value is + // not set correctly, the client may ignore the packet and respond with a PacketViolationWarning. + ServerSide bool +} + +// ID ... +func (*ContainerClose) ID() uint32 { + return packet.IDContainerClose +} + +func (pk *ContainerClose) Marshal(io protocol.IO) { + io.Uint8(&pk.WindowID) + if proto.IsProtoGTE(io, proto.ID685) { + io.Uint8(&pk.ContainerType) + } + io.Bool(&pk.ServerSide) +} diff --git a/legacyver/legacypacket/crafting_data.go b/legacyver/legacypacket/crafting_data.go new file mode 100644 index 0000000..ee112b5 --- /dev/null +++ b/legacyver/legacypacket/crafting_data.go @@ -0,0 +1,42 @@ +package legacypacket + +import ( + "github.com/akmalfairuz/legacy-version/legacyver/proto" + "github.com/sandertv/gophertunnel/minecraft/protocol" + "github.com/sandertv/gophertunnel/minecraft/protocol/packet" +) + +// CraftingData is sent by the server to let the client know all crafting data that the server maintains. This +// includes shapeless crafting, crafting table recipes, furnace recipes etc. Each crafting station's recipes +// are included in it. +type CraftingData struct { + // Recipes is a list of all recipes available on the server. It includes among others shapeless, shaped + // and furnace recipes. The client will only be able to craft these recipes. + Recipes []proto.Recipe + // PotionRecipes is a list of all potion mixing recipes which may be used in the brewing stand. + PotionRecipes []protocol.PotionRecipe + // PotionContainerChangeRecipes is a list of all recipes to convert a potion from one type to another, + // such as from a drinkable potion to a splash potion, or from a splash potion to a lingering potion. + PotionContainerChangeRecipes []protocol.PotionContainerChangeRecipe + // MaterialReducers is a list of all material reducers which is used in education edition chemistry. + MaterialReducers []protocol.MaterialReducer + // ClearRecipes indicates if all recipes currently active on the client should be cleaned. Doing this + // means that the client will have no recipes active by itself: Any CraftingData packets previously sent + // will also be discarded, and only the recipes in this CraftingData packet will be used. + ClearRecipes bool +} + +// ID ... +func (*CraftingData) ID() uint32 { + return packet.IDCraftingData +} + +func (pk *CraftingData) Marshal(io protocol.IO) { + protocol.FuncSlice(io, &pk.Recipes, func(p *proto.Recipe) { + proto.IORecipe(io, p) + }) + protocol.Slice(io, &pk.PotionRecipes) + protocol.Slice(io, &pk.PotionContainerChangeRecipes) + protocol.FuncSlice(io, &pk.MaterialReducers, io.MaterialReducer) + io.Bool(&pk.ClearRecipes) +} diff --git a/legacyver/legacypacket/start_game.go b/legacyver/legacypacket/start_game.go new file mode 100644 index 0000000..5e66b54 --- /dev/null +++ b/legacyver/legacypacket/start_game.go @@ -0,0 +1,329 @@ +package legacypacket + +import ( + "github.com/akmalfairuz/legacy-version/legacyver/proto" + "github.com/go-gl/mathgl/mgl32" + "github.com/google/uuid" + "github.com/sandertv/gophertunnel/minecraft/nbt" + "github.com/sandertv/gophertunnel/minecraft/protocol" + "github.com/sandertv/gophertunnel/minecraft/protocol/packet" +) + +// StartGame is sent by the server to send information about the world the player will be spawned in. It +// contains information about the position the player spawns in, and information about the world in general +// such as its game rules. +type StartGame struct { + // EntityUniqueID is the unique ID of the player. The unique ID is a value that remains consistent across + // different sessions of the same world, but most servers simply fill the runtime ID of the entity out for + // this field. + EntityUniqueID int64 + // EntityRuntimeID is the runtime ID of the player. The runtime ID is unique for each world session, and + // entities are generally identified in packets using this runtime ID. + EntityRuntimeID uint64 + // PlayerGameMode is the game mode the player currently has. It is a value from 0-4, with 0 being + // survival mode, 1 being creative mode, 2 being adventure mode, 3 being survival spectator and 4 being + // creative spectator. + // This field may be set to 5 to make the client fall back to the game mode set in the WorldGameMode + // field. + PlayerGameMode int32 + // PlayerPosition is the spawn position of the player in the world. In servers this is often the same as + // the world's spawn position found below. + PlayerPosition mgl32.Vec3 + // Pitch is the vertical rotation of the player. Facing straight forward yields a pitch of 0. Pitch is + // measured in degrees. + Pitch float32 + // Yaw is the horizontal rotation of the player. Yaw is also measured in degrees. + Yaw float32 + // WorldSeed is the seed used to generate the world. Unlike in PC edition, the seed is a 32bit integer + // here. + WorldSeed int64 + // SpawnBiomeType specifies if the biome that the player spawns in is user defined (through behaviour + // packs) or builtin. See the constants above. + SpawnBiomeType int16 + // UserDefinedBiomeName is a readable name of the biome that the player spawned in, such as 'plains'. This + // might be a custom biome name if any custom biomes are present through behaviour packs. + UserDefinedBiomeName string + // Dimension is the ID of the dimension that the player spawns in. It is a value from 0-2, with 0 being + // the overworld, 1 being the nether and 2 being the end. + Dimension int32 + // Generator is the generator used for the world. It is a value from 0-4, with 0 being old limited worlds, + // 1 being infinite worlds, 2 being flat worlds, 3 being nether worlds and 4 being end worlds. A value of + // 0 will actually make the client stop rendering chunks you send beyond the world limit. + Generator int32 + // WorldGameMode is the game mode that a player gets when it first spawns in the world. It is shown in the + // settings and is used if the PlayerGameMode is set to 5. + WorldGameMode int32 + // Hardcore is if the world is in hardcore mode. In hardcore mode, the player cannot respawn after dying. + Hardcore bool + // Difficulty is the difficulty of the world. It is a value from 0-3, with 0 being peaceful, 1 being easy, + // 2 being normal and 3 being hard. + Difficulty int32 + // WorldSpawn is the block on which the world spawn of the world. This coordinate has no effect on the + // place that the client spawns, but it does have an effect on the direction that a compass points. + WorldSpawn protocol.BlockPos + // AchievementsDisabled defines if achievements are disabled in the world. The client crashes if this + // value is set to true while the player's or the world's game mode is creative, and it's recommended to + // simply always set this to false as a server. + AchievementsDisabled bool + // EditorWorldType is a value to dictate the type of editor mode, a special mode recently introduced adding + // "powerful tools for editing worlds, intended for experienced creators." It is one of the constants above. + EditorWorldType int32 + // CreatedInEditor is a value to dictate if the world was created as a project in the editor mode. The functionality + // of this field is currently unknown. + CreatedInEditor bool + // ExportedFromEditor is a value to dictate if the world was exported from editor mode. The functionality of this + // field is currently unknown. + ExportedFromEditor bool + // DayCycleLockTime is the time at which the day cycle was locked if the day cycle is disabled using the + // respective game rule. The client will maintain this time as long as the day cycle is disabled. + DayCycleLockTime int32 + // EducationEditionOffer is some Minecraft: Education Edition field that specifies what 'region' the world + // was from, with 0 being None, 1 being RestOfWorld, and 2 being China. + // The actual use of this field is unknown. + EducationEditionOffer int32 + // EducationFeaturesEnabled specifies if the world has education edition features enabled, such as the + // blocks or entities specific to education edition. + EducationFeaturesEnabled bool + // EducationProductID is a UUID used to identify the education edition server instance. It is generally + // unique for education edition servers. + EducationProductID string + // RainLevel is the level specifying the intensity of the rain falling. When set to 0, no rain falls at + // all. + RainLevel float32 + // LightningLevel is the level specifying the intensity of the thunder. This may actually be set + // independently from the RainLevel, meaning dark clouds can be produced without rain. + LightningLevel float32 + // ConfirmedPlatformLockedContent ... + ConfirmedPlatformLockedContent bool + // MultiPlayerGame specifies if the world is a multi-player game. This should always be set to true for + // servers. + MultiPlayerGame bool + // LANBroadcastEnabled specifies if LAN broadcast was intended to be enabled for the world. + LANBroadcastEnabled bool + // XBLBroadcastMode is the mode used to broadcast the joined game across XBOX Live. + XBLBroadcastMode int32 + // PlatformBroadcastMode is the mode used to broadcast the joined game across the platform. + PlatformBroadcastMode int32 + // CommandsEnabled specifies if commands are enabled for the player. It is recommended to always set this + // to true on the server, as setting it to false means the player cannot, under any circumstance, use a + // command. + CommandsEnabled bool + // TexturePackRequired specifies if the texture pack the world might hold is required, meaning the client + // was forced to download it before joining. + TexturePackRequired bool + // GameRules defines game rules currently active with their respective values. The value of these game + // rules may be either 'bool', 'int32' or 'float32'. Some game rules are server side only, and don't + // necessarily need to be sent to the client. + GameRules []protocol.GameRule + // Experiments holds a list of experiments that are either enabled or disabled in the world that the + // player spawns in. + Experiments []protocol.ExperimentData + // ExperimentsPreviouslyToggled specifies if any experiments were previously toggled in this world. It is + // probably used for some kind of metrics. + ExperimentsPreviouslyToggled bool + // BonusChestEnabled specifies if the world had the bonus map setting enabled when generating it. It does + // not have any effect client-side. + BonusChestEnabled bool + // StartWithMapEnabled specifies if the world has the start with map setting enabled, meaning each joining + // player obtains a map. This should always be set to false, because the client obtains a map all on its + // own accord if this is set to true. + StartWithMapEnabled bool + // PlayerPermissions is the permission level of the player. It is a value from 0-3, with 0 being visitor, + // 1 being member, 2 being operator and 3 being custom. + PlayerPermissions int32 + // ServerChunkTickRadius is the radius around the player in which chunks are ticked. Most servers set this + // value to a fixed number, as it does not necessarily affect anything client-side. + ServerChunkTickRadius int32 + // HasLockedBehaviourPack specifies if the behaviour pack of the world is locked, meaning it cannot be + // disabled from the world. This is typically set for worlds on the marketplace that have a dedicated + // behaviour pack. + HasLockedBehaviourPack bool + // HasLockedTexturePack specifies if the texture pack of the world is locked, meaning it cannot be + // disabled from the world. This is typically set for worlds on the marketplace that have a dedicated + // texture pack. + HasLockedTexturePack bool + // FromLockedWorldTemplate specifies if the world from the server was from a locked world template. For + // servers this should always be set to false. + FromLockedWorldTemplate bool + // MSAGamerTagsOnly .. + MSAGamerTagsOnly bool + // FromWorldTemplate specifies if the world from the server was from a world template. For servers this + // should always be set to false. + FromWorldTemplate bool + // WorldTemplateSettingsLocked specifies if the world was a template that locks all settings that change + // properties above in the settings GUI. It is recommended to set this to true for servers that do not + // allow things such as setting game rules through the GUI. + WorldTemplateSettingsLocked bool + // OnlySpawnV1Villagers is a hack that Mojang put in place to preserve backwards compatibility with old + // villagers. The bool is never actually read though, so it has no functionality. + OnlySpawnV1Villagers bool + // PersonaDisabled is true if persona skins are disabled for the current game session. + PersonaDisabled bool + // CustomSkinsDisabled is true if custom skins are disabled for the current game session. + CustomSkinsDisabled bool + // EmoteChatMuted specifies if players will be sent a chat message when using certain emotes. + EmoteChatMuted bool + // BaseGameVersion is the version of the game from which Vanilla features will be used. The exact function + // of this field isn't clear. + BaseGameVersion string + // LimitedWorldWidth and LimitedWorldDepth are the dimensions of the world if the world is a limited + // world. For unlimited worlds, these may simply be left as 0. + LimitedWorldWidth, LimitedWorldDepth int32 + // NewNether specifies if the server runs with the new nether introduced in the 1.16 update. + NewNether bool + // EducationSharedResourceURI is an education edition feature that transmits education resource settings to clients. + EducationSharedResourceURI protocol.EducationSharedResourceURI + // ForceExperimentalGameplay specifies if experimental gameplay should be force enabled. For servers this + // should always be set to false. + ForceExperimentalGameplay protocol.Optional[bool] + // LevelID is a base64 encoded world ID that is used to identify the world. + LevelID string + // WorldName is the name of the world that the player is joining. Note that this field shows up above the + // player list for the rest of the game session, and cannot be changed. Setting the server name to this + // field is recommended. + WorldName string + // TemplateContentIdentity is a UUID specific to the premium world template that might have been used to + // generate the world. Servers should always fill out an empty string for this. + TemplateContentIdentity string + // Trial specifies if the world was a trial world, meaning features are limited and there is a time limit + // on the world. + Trial bool + // PlayerMovementSettings ... + PlayerMovementSettings protocol.PlayerMovementSettings + // Time is the total time that has elapsed since the start of the world. + Time int64 + // EnchantmentSeed is the seed used to seed the random used to produce enchantments in the enchantment + // table. Note that the exact correct random implementation must be used to produce the correct results + // both client- and server-side. + EnchantmentSeed int32 + // Blocks is a list of all custom blocks registered on the server. + Blocks []protocol.BlockEntry + // Items is a list of all items with their legacy IDs which are available in the game. Failing to send any + // of the items that are in the game will crash mobile clients. + Items []protocol.ItemEntry + // MultiPlayerCorrelationID is a unique ID specifying the multi-player session of the player. A random + // UUID should be filled out for this field. + MultiPlayerCorrelationID string + // ServerAuthoritativeInventory specifies if the server authoritative inventory system is enabled. This + // is a new system introduced in 1.16. Backwards compatibility with the inventory transactions has to + // some extent been preserved, but will eventually be removed. + ServerAuthoritativeInventory bool + // GameVersion is the version of the game the server is running. The exact function of this field isn't clear. + GameVersion string + // PropertyData contains properties that should be applied on the player. These properties are the same as the + // ones that are sent in the SyncActorProperty packet. + PropertyData map[string]any + // ServerBlockStateChecksum is a checksum to ensure block states between the server and client match. + // This can simply be left empty, and the client will avoid trying to verify it. + ServerBlockStateChecksum uint64 + // ClientSideGeneration is true if the client should use the features registered in the FeatureRegistry packet to + // generate terrain client-side to save on bandwidth. + ClientSideGeneration bool + // WorldTemplateID is a UUID that identifies the template that was used to generate the world. Servers that do not + // use a world based off of a template can set this to an empty UUID. + WorldTemplateID uuid.UUID + // ChatRestrictionLevel specifies the level of restriction on in-game chat. It is one of the constants above. + ChatRestrictionLevel uint8 + // DisablePlayerInteractions is true if the client should ignore other players when interacting with the world. + DisablePlayerInteractions bool + // ServerID is always empty in vanilla and its usage is currently unknown. + ServerID string + // WorldID is always empty in vanilla and its usage is currently unknown. + WorldID string + // ScenarioID is always empty in vanilla and its usage is currently unknown. + ScenarioID string + // UseBlockNetworkIDHashes is true if the client should use the hash of a block's name as its network ID rather than + // its index in the expected block palette. This is useful for servers that wish to support multiple protocol versions + // and custom blocks, but it will result in extra bytes being written for every block in a sub chunk palette. + UseBlockNetworkIDHashes bool + // ServerAuthoritativeSound is currently unknown as to what it does. + ServerAuthoritativeSound bool +} + +// ID ... +func (*StartGame) ID() uint32 { + return packet.IDStartGame +} + +func (pk *StartGame) Marshal(io protocol.IO) { + io.Varint64(&pk.EntityUniqueID) + io.Varuint64(&pk.EntityRuntimeID) + io.Varint32(&pk.PlayerGameMode) + io.Vec3(&pk.PlayerPosition) + io.Float32(&pk.Pitch) + io.Float32(&pk.Yaw) + io.Int64(&pk.WorldSeed) + io.Int16(&pk.SpawnBiomeType) + io.String(&pk.UserDefinedBiomeName) + io.Varint32(&pk.Dimension) + io.Varint32(&pk.Generator) + io.Varint32(&pk.WorldGameMode) + io.Bool(&pk.Hardcore) + io.Varint32(&pk.Difficulty) + io.UBlockPos(&pk.WorldSpawn) + io.Bool(&pk.AchievementsDisabled) + io.Varint32(&pk.EditorWorldType) + io.Bool(&pk.CreatedInEditor) + io.Bool(&pk.ExportedFromEditor) + io.Varint32(&pk.DayCycleLockTime) + io.Varint32(&pk.EducationEditionOffer) + io.Bool(&pk.EducationFeaturesEnabled) + io.String(&pk.EducationProductID) + io.Float32(&pk.RainLevel) + io.Float32(&pk.LightningLevel) + io.Bool(&pk.ConfirmedPlatformLockedContent) + io.Bool(&pk.MultiPlayerGame) + io.Bool(&pk.LANBroadcastEnabled) + io.Varint32(&pk.XBLBroadcastMode) + io.Varint32(&pk.PlatformBroadcastMode) + io.Bool(&pk.CommandsEnabled) + io.Bool(&pk.TexturePackRequired) + protocol.FuncSlice(io, &pk.GameRules, io.GameRule) + protocol.SliceUint32Length(io, &pk.Experiments) + io.Bool(&pk.ExperimentsPreviouslyToggled) + io.Bool(&pk.BonusChestEnabled) + io.Bool(&pk.StartWithMapEnabled) + io.Varint32(&pk.PlayerPermissions) + io.Int32(&pk.ServerChunkTickRadius) + io.Bool(&pk.HasLockedBehaviourPack) + io.Bool(&pk.HasLockedTexturePack) + io.Bool(&pk.FromLockedWorldTemplate) + io.Bool(&pk.MSAGamerTagsOnly) + io.Bool(&pk.FromWorldTemplate) + io.Bool(&pk.WorldTemplateSettingsLocked) + io.Bool(&pk.OnlySpawnV1Villagers) + io.Bool(&pk.PersonaDisabled) + io.Bool(&pk.CustomSkinsDisabled) + io.Bool(&pk.EmoteChatMuted) + io.String(&pk.BaseGameVersion) + io.Int32(&pk.LimitedWorldWidth) + io.Int32(&pk.LimitedWorldDepth) + io.Bool(&pk.NewNether) + protocol.Single(io, &pk.EducationSharedResourceURI) + protocol.OptionalFunc(io, &pk.ForceExperimentalGameplay, io.Bool) + io.Uint8(&pk.ChatRestrictionLevel) + io.Bool(&pk.DisablePlayerInteractions) + if proto.IsProtoGTE(io, proto.ID685) { + io.String(&pk.ServerID) + io.String(&pk.WorldID) + io.String(&pk.ScenarioID) + } + io.String(&pk.LevelID) + io.String(&pk.WorldName) + io.String(&pk.TemplateContentIdentity) + io.Bool(&pk.Trial) + protocol.PlayerMoveSettings(io, &pk.PlayerMovementSettings) + io.Int64(&pk.Time) + io.Varint32(&pk.EnchantmentSeed) + protocol.Slice(io, &pk.Blocks) + protocol.Slice(io, &pk.Items) + io.String(&pk.MultiPlayerCorrelationID) + io.Bool(&pk.ServerAuthoritativeInventory) + io.String(&pk.GameVersion) + io.NBT(&pk.PropertyData, nbt.NetworkLittleEndian) + io.Uint64(&pk.ServerBlockStateChecksum) + io.UUID(&pk.WorldTemplateID) + io.Bool(&pk.ClientSideGeneration) + io.Bool(&pk.UseBlockNetworkIDHashes) + io.Bool(&pk.ServerAuthoritativeSound) +} diff --git a/legacyver/legacypacket/text.go b/legacyver/legacypacket/text.go new file mode 100644 index 0000000..8a67027 --- /dev/null +++ b/legacyver/legacypacket/text.go @@ -0,0 +1,79 @@ +package legacypacket + +import ( + "github.com/akmalfairuz/legacy-version/legacyver/proto" + "github.com/sandertv/gophertunnel/minecraft/protocol" + "github.com/sandertv/gophertunnel/minecraft/protocol/packet" +) + +const ( + TextTypeRaw = iota + TextTypeChat + TextTypeTranslation + TextTypePopup + TextTypeJukeboxPopup + TextTypeTip + TextTypeSystem + TextTypeWhisper + TextTypeAnnouncement + TextTypeObjectWhisper + TextTypeObject + TextTypeObjectAnnouncement +) + +// Text is sent by the client to the server to send chat messages, and by the server to the client to forward +// or send messages, which may be chat, popups, tips etc. +type Text struct { + // TextType is the type of the text sent. When a client sends this to the server, it should always be + // TextTypeChat. If the server sends it, it may be one of the other text types above. + TextType byte + // NeedsTranslation specifies if any of the messages need to be translated. It seems that where % is found + // in translatable text types, these are translated regardless of this bool. Translatable text types + // include TextTypeTranslation, TextTypeTip, TextTypePopup and TextTypeJukeboxPopup. + NeedsTranslation bool + // SourceName is the name of the source of the messages. This source is displayed in text types such as + // the TextTypeChat and TextTypeWhisper, where typically the username is shown. + SourceName string + // Message is the message of the packet. This field is set for each TextType and is the main component of + // the packet. + Message string + // Parameters is a list of parameters that should be filled into the message. These parameters are only + // written if the type of the packet is TextTypeTranslation, TextTypeTip, TextTypePopup or TextTypeJukeboxPopup. + Parameters []string + // XUID is the XBOX Live user ID of the player that sent the message. It is only set for packets of + // TextTypeChat. When sent to a player, the player will only be shown the chat message if a player with + // this XUID is present in the player list and not muted, or if the XUID is empty. + XUID string + // PlatformChatID is an identifier only set for particular platforms when chatting (presumably only for + // Nintendo Switch). It is otherwise an empty string, and is used to decide which players are able to + // chat with each other. + PlatformChatID string + // FilteredMessage is a filtered version of Message with all the profanity removed. The client will use + // this over Message if this field is not empty and they have the "Filter Profanity" setting enabled. + FilteredMessage string +} + +// ID ... +func (*Text) ID() uint32 { + return packet.IDText +} + +func (pk *Text) Marshal(io protocol.IO) { + io.Uint8(&pk.TextType) + io.Bool(&pk.NeedsTranslation) + switch pk.TextType { + case TextTypeChat, TextTypeWhisper, TextTypeAnnouncement: + io.String(&pk.SourceName) + io.String(&pk.Message) + case TextTypeRaw, TextTypeTip, TextTypeSystem, TextTypeObject, TextTypeObjectWhisper, TextTypeObjectAnnouncement: + io.String(&pk.Message) + case TextTypeTranslation, TextTypePopup, TextTypeJukeboxPopup: + io.String(&pk.Message) + protocol.FuncSlice(io, &pk.Parameters, io.String) + } + io.String(&pk.XUID) + io.String(&pk.PlatformChatID) + if proto.IsProtoGTE(io, proto.ID685) { + io.String(&pk.FilteredMessage) + } +} diff --git a/legacyver/proto/id.go b/legacyver/proto/id.go index c44a0c3..920d08d 100644 --- a/legacyver/proto/id.go +++ b/legacyver/proto/id.go @@ -9,6 +9,7 @@ const ( ID712 = 712 // v1.21.20 ID686 = 686 // v1.21.2 ID685 = 685 // v1.21.0 + ID671 = 671 // v1.20.80 ) func IsProtoGTE(io protocol.IO, proto int32) bool { diff --git a/legacyver/proto/io.go b/legacyver/proto/io.go index d8a6f42..7d61176 100644 --- a/legacyver/proto/io.go +++ b/legacyver/proto/io.go @@ -112,3 +112,22 @@ func IOStackRequestAction(io protocol.IO, x *protocol.StackRequestAction) { } (*x).Marshal(io) } + +func IORecipe(io protocol.IO, recipe *Recipe) { + if IsReader(io) { + var recipeType int32 + io.Varint32(&recipeType) + if !lookupRecipe(recipeType, recipe) { + io.UnknownEnumOption(recipeType, "crafting data recipe type") + return + } + (*recipe).Unmarshal(io.(*Reader)) + } else { + var recipeType int32 + if !lookupRecipeType(*recipe, &recipeType) { + io.UnknownEnumOption(fmt.Sprintf("%T", *recipe), "crafting recipe type") + } + io.Varint32(&recipeType) + (*recipe).Marshal(io.(*Writer)) + } +} diff --git a/legacyver/proto/item_stack.go b/legacyver/proto/item_stack.go index 14212b3..fd25ba6 100644 --- a/legacyver/proto/item_stack.go +++ b/legacyver/proto/item_stack.go @@ -44,6 +44,27 @@ func (x *ItemStackRequest) FromLatest(y protocol.ItemStackRequest) ItemStackRequ for i, v := range y.Actions { if z, ok := v.(*protocol.CraftRecipeStackRequestAction); ok { x.Actions[i] = (&CraftRecipeStackRequestAction{}).FromLatest(z) + continue + } + + if z, ok := v.(*protocol.AutoCraftRecipeStackRequestAction); ok { + x.Actions[i] = (&AutoCraftRecipeStackRequestAction{}).FromLatest(z) + continue + } + + if z, ok := v.(*protocol.CraftCreativeStackRequestAction); ok { + x.Actions[i] = (&CraftCreativeStackRequestAction{}).FromLatest(z) + continue + } + + if z, ok := v.(*protocol.CraftGrindstoneRecipeStackRequestAction); ok { + x.Actions[i] = (&CraftGrindstoneRecipeStackRequestAction{}).FromLatest(z) + continue + } + + if z, ok := v.(*protocol.CraftLoomRecipeStackRequestAction); ok { + x.Actions[i] = (&CraftLoomRecipeStackRequestAction{}).FromLatest(z) + continue } } x.FilterStrings = y.FilterStrings @@ -61,6 +82,27 @@ func (x *ItemStackRequest) ToLatest() protocol.ItemStackRequest { for i, v := range x.Actions { if z, ok := v.(*CraftRecipeStackRequestAction); ok { ret.Actions[i] = z.ToLatest() + continue + } + + if z, ok := v.(*AutoCraftRecipeStackRequestAction); ok { + ret.Actions[i] = z.ToLatest() + continue + } + + if z, ok := v.(*CraftCreativeStackRequestAction); ok { + ret.Actions[i] = z.ToLatest() + continue + } + + if z, ok := v.(*CraftGrindstoneRecipeStackRequestAction); ok { + ret.Actions[i] = z.ToLatest() + continue + } + + if z, ok := v.(*CraftLoomRecipeStackRequestAction); ok { + ret.Actions[i] = z.ToLatest() + continue } } return ret @@ -101,15 +143,15 @@ func lookupStackRequestActionType(x StackRequestAction, id *uint8) bool { *id = protocol.StackRequestActionMineBlock case *CraftRecipeStackRequestAction: *id = protocol.StackRequestActionCraftRecipe - case *protocol.AutoCraftRecipeStackRequestAction: + case *AutoCraftRecipeStackRequestAction: *id = protocol.StackRequestActionCraftRecipeAuto - case *protocol.CraftCreativeStackRequestAction: + case *CraftCreativeStackRequestAction: *id = protocol.StackRequestActionCraftCreative case *protocol.CraftRecipeOptionalStackRequestAction: *id = protocol.StackRequestActionCraftRecipeOptional - case *protocol.CraftGrindstoneRecipeStackRequestAction: + case *CraftGrindstoneRecipeStackRequestAction: *id = protocol.StackRequestActionCraftGrindstone - case *protocol.CraftLoomRecipeStackRequestAction: + case *CraftLoomRecipeStackRequestAction: *id = protocol.StackRequestActionCraftLoom case *protocol.CraftNonImplementedStackRequestAction: *id = protocol.StackRequestActionCraftNonImplementedDeprecated @@ -151,15 +193,15 @@ func lookupStackRequestAction(id uint8, x *protocol.StackRequestAction) bool { case protocol.StackRequestActionCraftRecipe: *x = &CraftRecipeStackRequestAction{} case protocol.StackRequestActionCraftRecipeAuto: - *x = &protocol.AutoCraftRecipeStackRequestAction{} + *x = &AutoCraftRecipeStackRequestAction{} case protocol.StackRequestActionCraftCreative: - *x = &protocol.CraftCreativeStackRequestAction{} + *x = &CraftCreativeStackRequestAction{} case protocol.StackRequestActionCraftRecipeOptional: *x = &protocol.CraftRecipeOptionalStackRequestAction{} case protocol.StackRequestActionCraftGrindstone: - *x = &protocol.CraftGrindstoneRecipeStackRequestAction{} + *x = &CraftGrindstoneRecipeStackRequestAction{} case protocol.StackRequestActionCraftLoom: - *x = &protocol.CraftLoomRecipeStackRequestAction{} + *x = &CraftLoomRecipeStackRequestAction{} case protocol.StackRequestActionCraftNonImplementedDeprecated: *x = &protocol.CraftNonImplementedStackRequestAction{} case protocol.StackRequestActionCraftResultsDeprecated: @@ -602,11 +644,32 @@ type AutoCraftRecipeStackRequestAction struct { Ingredients []protocol.ItemDescriptorCount } +// FromLatest ... +func (a *AutoCraftRecipeStackRequestAction) FromLatest(y *protocol.AutoCraftRecipeStackRequestAction) *AutoCraftRecipeStackRequestAction { + a.RecipeNetworkID = y.RecipeNetworkID + a.NumberOfCrafts = y.NumberOfCrafts + a.TimesCrafted = y.TimesCrafted + a.Ingredients = y.Ingredients + return a +} + +// ToLatest ... +func (a *AutoCraftRecipeStackRequestAction) ToLatest() *protocol.AutoCraftRecipeStackRequestAction { + return &protocol.AutoCraftRecipeStackRequestAction{ + RecipeNetworkID: a.RecipeNetworkID, + NumberOfCrafts: a.NumberOfCrafts, + TimesCrafted: a.TimesCrafted, + Ingredients: a.Ingredients, + } +} + // Marshal ... func (a *AutoCraftRecipeStackRequestAction) Marshal(r protocol.IO) { r.Varuint32(&a.RecipeNetworkID) r.Uint8(&a.NumberOfCrafts) - r.Uint8(&a.TimesCrafted) + if IsProtoGTE(r, ID712) { + r.Uint8(&a.TimesCrafted) + } protocol.FuncSlice(r, &a.Ingredients, r.ItemDescriptorCount) } @@ -621,10 +684,27 @@ type CraftCreativeStackRequestAction struct { NumberOfCrafts byte } +// FromLatest ... +func (a *CraftCreativeStackRequestAction) FromLatest(y *protocol.CraftCreativeStackRequestAction) *CraftCreativeStackRequestAction { + a.CreativeItemNetworkID = y.CreativeItemNetworkID + a.NumberOfCrafts = y.NumberOfCrafts + return a +} + +// ToLatest ... +func (a *CraftCreativeStackRequestAction) ToLatest() *protocol.CraftCreativeStackRequestAction { + return &protocol.CraftCreativeStackRequestAction{ + CreativeItemNetworkID: a.CreativeItemNetworkID, + NumberOfCrafts: a.NumberOfCrafts, + } +} + // Marshal ... func (a *CraftCreativeStackRequestAction) Marshal(r protocol.IO) { r.Varuint32(&a.CreativeItemNetworkID) - r.Uint8(&a.NumberOfCrafts) + if IsProtoGTE(r, ID712) { + r.Uint8(&a.NumberOfCrafts) + } } // CraftRecipeOptionalStackRequestAction is sent when using an anvil. When this action is sent, the @@ -659,10 +739,29 @@ type CraftGrindstoneRecipeStackRequestAction struct { Cost int32 } +// FromLatest ... +func (c *CraftGrindstoneRecipeStackRequestAction) FromLatest(y *protocol.CraftGrindstoneRecipeStackRequestAction) *CraftGrindstoneRecipeStackRequestAction { + c.RecipeNetworkID = y.RecipeNetworkID + c.NumberOfCrafts = y.NumberOfCrafts + c.Cost = y.Cost + return c +} + +// ToLatest ... +func (c *CraftGrindstoneRecipeStackRequestAction) ToLatest() *protocol.CraftGrindstoneRecipeStackRequestAction { + return &protocol.CraftGrindstoneRecipeStackRequestAction{ + RecipeNetworkID: c.RecipeNetworkID, + NumberOfCrafts: c.NumberOfCrafts, + Cost: c.Cost, + } +} + // Marshal ... func (c *CraftGrindstoneRecipeStackRequestAction) Marshal(r protocol.IO) { r.Varuint32(&c.RecipeNetworkID) - r.Uint8(&c.NumberOfCrafts) + if IsProtoGTE(r, ID712) { + r.Uint8(&c.NumberOfCrafts) + } r.Varint32(&c.Cost) } @@ -675,10 +774,27 @@ type CraftLoomRecipeStackRequestAction struct { TimesCrafted byte } +// FromLatest ... +func (c *CraftLoomRecipeStackRequestAction) FromLatest(y *protocol.CraftLoomRecipeStackRequestAction) *CraftLoomRecipeStackRequestAction { + c.Pattern = y.Pattern + c.TimesCrafted = y.TimesCrafted + return c +} + +// ToLatest ... +func (c *CraftLoomRecipeStackRequestAction) ToLatest() *protocol.CraftLoomRecipeStackRequestAction { + return &protocol.CraftLoomRecipeStackRequestAction{ + Pattern: c.Pattern, + TimesCrafted: c.TimesCrafted, + } +} + // Marshal ... func (c *CraftLoomRecipeStackRequestAction) Marshal(r protocol.IO) { r.String(&c.Pattern) - r.Uint8(&c.TimesCrafted) + if IsProtoGTE(r, ID712) { + r.Uint8(&c.TimesCrafted) + } } // CraftNonImplementedStackRequestAction is an action sent for inventory actions that aren't yet implemented diff --git a/legacyver/proto/recipe.go b/legacyver/proto/recipe.go new file mode 100644 index 0000000..34bba08 --- /dev/null +++ b/legacyver/proto/recipe.go @@ -0,0 +1,699 @@ +package proto + +import ( + "github.com/google/uuid" + "github.com/sandertv/gophertunnel/minecraft/protocol" +) + +const ( + RecipeUnlockContextNone = iota + RecipeUnlockContextAlwaysUnlocked + RecipeUnlockContextPlayerInWater + RecipeUnlockContextPlayerHasManyItems +) + +// RecipeUnlockRequirement represents a requirement that must be met in order to unlock a recipe. This is used +// for both shaped and shapeless recipes. +type RecipeUnlockRequirement struct { + // Context is the context in which the recipe is unlocked. This is one of the constants above. + Context byte + // Ingredients are the ingredients required to unlock the recipe and only used if Context is set to none. + Ingredients []protocol.ItemDescriptorCount +} + +func (x *RecipeUnlockRequirement) FromLatest(requirement protocol.RecipeUnlockRequirement) RecipeUnlockRequirement { + x.Context = requirement.Context + x.Ingredients = requirement.Ingredients + return *x +} + +func (x *RecipeUnlockRequirement) ToLatest() protocol.RecipeUnlockRequirement { + return protocol.RecipeUnlockRequirement{ + Context: x.Context, + Ingredients: x.Ingredients, + } +} + +// Marshal ... +func (x *RecipeUnlockRequirement) Marshal(r protocol.IO) { + r.Uint8(&x.Context) + if x.Context == RecipeUnlockContextNone { + protocol.FuncSlice(r, &x.Ingredients, r.ItemDescriptorCount) + } +} + +const ( + RecipeShapeless int32 = iota + RecipeShaped + RecipeFurnace + RecipeFurnaceData + RecipeMulti + RecipeShulkerBox + RecipeShapelessChemistry + RecipeShapedChemistry + RecipeSmithingTransform + RecipeSmithingTrim +) + +// Recipe represents a recipe that may be sent in a CraftingData packet to let the client know what recipes +// are available server-side. +type Recipe interface { + // Marshal encodes the recipe data to its binary representation into buf. + Marshal(w *Writer) + // Unmarshal decodes a serialised recipe from Reader r into the recipe instance. + Unmarshal(r *Reader) +} + +func takePtr[T any](x T) *T { + return &x +} + +func RecipeToLatest(x Recipe) protocol.Recipe { + switch x := x.(type) { + case *ShapelessRecipe: + return takePtr(x.ToLatest()) + case *ShulkerBoxRecipe: + return takePtr(x.ToLatest()) + case *ShapelessChemistryRecipe: + return takePtr(x.ToLatest()) + case *ShapedRecipe: + return takePtr(x.ToLatest()) + case *ShapedChemistryRecipe: + return takePtr(x.ToLatest()) + case *FurnaceRecipe: + return takePtr(x.ToLatest()) + case *FurnaceDataRecipe: + return takePtr(x.ToLatest()) + case *MultiRecipe: + return takePtr(x.ToLatest()) + case *SmithingTransformRecipe: + return takePtr(x.ToLatest()) + case *SmithingTrimRecipe: + return takePtr(x.ToLatest()) + } + panic("RecipeToLatest: unknown recipe type") +} + +func RecipeFromLatest(x protocol.Recipe) Recipe { + switch x := x.(type) { + case *protocol.ShapelessRecipe: + return (&ShapelessRecipe{}).FromLatest(*x) + case *protocol.ShulkerBoxRecipe: + return (&ShulkerBoxRecipe{}).FromLatest(*x) + case *protocol.ShapelessChemistryRecipe: + return (&ShapelessChemistryRecipe{}).FromLatest(*x) + case *protocol.ShapedRecipe: + return (&ShapedRecipe{}).FromLatest(*x) + case *protocol.ShapedChemistryRecipe: + return (&ShapedChemistryRecipe{}).FromLatest(*x) + case *protocol.FurnaceRecipe: + return (&FurnaceRecipe{}).FromLatest(*x) + case *protocol.FurnaceDataRecipe: + return (&FurnaceDataRecipe{}).FromLatest(*x) + case *protocol.MultiRecipe: + return (&MultiRecipe{}).FromLatest(*x) + case *protocol.SmithingTransformRecipe: + return (&SmithingTransformRecipe{}).FromLatest(*x) + case *protocol.SmithingTrimRecipe: + return (&SmithingTrimRecipe{}).FromLatest(*x) + } + panic("RecipeFromLatest: unknown recipe type") +} + +// lookupRecipe looks up the Recipe for a recipe type. False is returned if not +// found. +func lookupRecipe(recipeType int32, x *Recipe) bool { + switch recipeType { + case RecipeShapeless: + *x = &ShapelessRecipe{} + case RecipeShaped: + *x = &ShapedRecipe{} + case RecipeFurnace: + *x = &FurnaceRecipe{} + case RecipeFurnaceData: + *x = &FurnaceDataRecipe{} + case RecipeMulti: + *x = &MultiRecipe{} + case RecipeShulkerBox: + *x = &ShulkerBoxRecipe{} + case RecipeShapelessChemistry: + *x = &ShapelessChemistryRecipe{} + case RecipeShapedChemistry: + *x = &ShapedChemistryRecipe{} + case RecipeSmithingTransform: + *x = &SmithingTransformRecipe{} + case RecipeSmithingTrim: + *x = &SmithingTrimRecipe{} + default: + return false + } + return true +} + +// lookupRecipeType looks up the recipe type for a Recipe. False is returned if +// none was found. +func lookupRecipeType(x Recipe, recipeType *int32) bool { + switch x.(type) { + case *ShapelessRecipe: + *recipeType = RecipeShapeless + case *ShapedRecipe: + *recipeType = RecipeShaped + case *FurnaceRecipe: + *recipeType = RecipeFurnace + case *FurnaceDataRecipe: + *recipeType = RecipeFurnaceData + case *MultiRecipe: + *recipeType = RecipeMulti + case *ShulkerBoxRecipe: + *recipeType = RecipeShulkerBox + case *ShapelessChemistryRecipe: + *recipeType = RecipeShapelessChemistry + case *ShapedChemistryRecipe: + *recipeType = RecipeShapedChemistry + case *SmithingTransformRecipe: + *recipeType = RecipeSmithingTransform + case *SmithingTrimRecipe: + *recipeType = RecipeSmithingTrim + default: + return false + } + return true +} + +// ShapelessRecipe is a recipe that has no particular shape. Its functionality is shared with the +// RecipeShulkerBox and RecipeShapelessChemistry types. +type ShapelessRecipe struct { + // RecipeID is a unique ID of the recipe. This ID must be unique amongst all other types of recipes too, + // but its functionality is not exactly known. + RecipeID string + // Input is a list of items that serve as the input of the shapeless recipe. These items are the items + // required to craft the output. + Input []protocol.ItemDescriptorCount + // Output is a list of items that are created as a result of crafting the recipe. + Output []protocol.ItemStack + // UUID is a UUID identifying the recipe. Since the CraftingEvent packet no longer exists, this can always be empty. + UUID uuid.UUID + // Block is the block name that is required to craft the output of the recipe. The block is not prefixed + // with 'minecraft:', so it will look like 'crafting_table' as an example. + // The available blocks are: + // - crafting_table + // - cartography_table + // - stonecutter + // - furnace + // - blast_furnace + // - smoker + // - campfire + Block string + // Priority ... + Priority int32 + // UnlockRequirement is a requirement that must be met in order to unlock the recipe. + UnlockRequirement RecipeUnlockRequirement + // RecipeNetworkID is a unique ID used to identify the recipe over network. Each recipe must have a unique + // network ID. Recommended is to just increment a variable for each unique recipe registered. + // This field must never be 0. + RecipeNetworkID uint32 +} + +// ShulkerBoxRecipe is a shapeless recipe made specifically for shulker box crafting, so that they don't lose +// their user data when dyeing a shulker box. +type ShulkerBoxRecipe struct { + ShapelessRecipe +} + +// ShapelessChemistryRecipe is a recipe specifically made for chemistry related features, which exist only in +// the Education Edition. They function the same as shapeless recipes do. +type ShapelessChemistryRecipe struct { + ShapelessRecipe +} + +// ShapedRecipe is a recipe that has a specific shape that must be used to craft the output of the recipe. +// Trying to craft the item in any other shape will not work. The ShapedRecipe is of the same structure as the +// ShapedChemistryRecipe. +type ShapedRecipe struct { + // RecipeID is a unique ID of the recipe. This ID must be unique amongst all other types of recipes too, + // but its functionality is not exactly known. + RecipeID string + // Width is the width of the recipe's shape. + Width int32 + // Height is the height of the recipe's shape. + Height int32 + // Input is a list of items that serve as the input of the shapeless recipe. These items are the items + // required to craft the output. The amount of input items must be exactly equal to Width * Height. + Input []protocol.ItemDescriptorCount + // Output is a list of items that are created as a result of crafting the recipe. + Output []protocol.ItemStack + // UUID is a UUID identifying the recipe. Since the CraftingEvent packet no longer exists, this can always be empty. + UUID uuid.UUID + // Block is the block name that is required to craft the output of the recipe. The block is not prefixed + // with 'minecraft:', so it will look like 'crafting_table' as an example. + Block string + // Priority ... + Priority int32 + // AssumeSymmetry specifies if the recipe is symmetrical. If this is set to true, the recipe will be + // mirrored along the diagonal axis. This means that the recipe will be the same if rotated 180 degrees. + AssumeSymmetry bool + // UnlockRequirement is a requirement that must be met in order to unlock the recipe. + UnlockRequirement RecipeUnlockRequirement + // RecipeNetworkID is a unique ID used to identify the recipe over network. Each recipe must have a unique + // network ID. Recommended is to just increment a variable for each unique recipe registered. + // This field must never be 0. + RecipeNetworkID uint32 +} + +// ShapedChemistryRecipe is a recipe specifically made for chemistry related features, which exist only in the +// Education Edition. It functions the same as a normal ShapedRecipe. +type ShapedChemistryRecipe struct { + ShapedRecipe +} + +// FurnaceRecipe is a recipe that is specifically used for all kinds of furnaces. These recipes don't just +// apply to furnaces, but also blast furnaces and smokers. +type FurnaceRecipe struct { + // InputType is the item type of the input item. The metadata value of the item is not used in the + // FurnaceRecipe. Use FurnaceDataRecipe to allow an item with only one metadata value. + InputType protocol.ItemType + // Output is the item that is created as a result of smelting/cooking an item in the furnace. + Output protocol.ItemStack + // Block is the block name that is required to create the output of the recipe. The block is not prefixed + // with 'minecraft:', so it will look like 'furnace' as an example. + Block string +} + +// FurnaceDataRecipe is a recipe specifically used for furnace-type crafting stations. It is equal to +// FurnaceRecipe, except it has an input item with a specific metadata value, instead of any metadata value. +type FurnaceDataRecipe struct { + FurnaceRecipe +} + +// MultiRecipe serves as an 'enable' switch for multi-shape recipes. +type MultiRecipe struct { + // UUID is a UUID identifying the recipe. Since the CraftingEvent packet no longer exists, this can always be empty. + UUID uuid.UUID + // RecipeNetworkID is a unique ID used to identify the recipe over network. Each recipe must have a unique + // network ID. Recommended is to just increment a variable for each unique recipe registered. + // This field must never be 0. + RecipeNetworkID uint32 +} + +// SmithingTransformRecipe is a recipe specifically used for smithing tables. It has three input items and adds them +// together, resulting in a new item. +type SmithingTransformRecipe struct { + // RecipeNetworkID is a unique ID used to identify the recipe over network. Each recipe must have a unique + // network ID. Recommended is to just increment a variable for each unique recipe registered. + // This field must never be 0. + RecipeNetworkID uint32 + // RecipeID is a unique ID of the recipe. This ID must be unique amongst all other types of recipes too, + // but its functionality is not exactly known. + RecipeID string + // Template is the item that is used to shape the Base item based on the Addition being applied. + Template protocol.ItemDescriptorCount + // Base is the item that the Addition is being applied to in the smithing table. + Base protocol.ItemDescriptorCount + // Addition is the item that is being added to the Base item to result in a modified item. + Addition protocol.ItemDescriptorCount + // Result is the resulting item from the two items being added together. + Result protocol.ItemStack + // Block is the block name that is required to create the output of the recipe. The block is not prefixed with + // 'minecraft:', so it will look like 'smithing_table' as an example. + Block string +} + +// SmithingTrimRecipe is a recipe specifically used for applying armour trims to an armour piece inside a smithing table. +type SmithingTrimRecipe struct { + // RecipeNetworkID is a unique ID used to identify the recipe over network. Each recipe must have a unique + // network ID. Recommended is to just increment a variable for each unique recipe registered. + // This field must never be 0. + RecipeNetworkID uint32 + // RecipeID is a unique ID of the recipe. This ID must be unique amongst all other types of recipes too, + // but its functionality is not exactly known. + RecipeID string + // Template is the item that is used to shape the Base item based on the Addition being applied. + Template protocol.ItemDescriptorCount + // Base is the item that the Addition is being applied to in the smithing table. + Base protocol.ItemDescriptorCount + // Addition is the item that is being added to the Base item to result in a modified item. + Addition protocol.ItemDescriptorCount + // Block is the block name that is required to create the output of the recipe. The block is not prefixed with + // 'minecraft:', so it will look like 'smithing_table' as an example. + Block string +} + +// FromLatest ... +func (recipe *ShapelessRecipe) FromLatest(v protocol.ShapelessRecipe) *ShapelessRecipe { + recipe.RecipeID = v.RecipeID + recipe.Input = v.Input + recipe.Output = v.Output + recipe.UUID = v.UUID + recipe.Block = v.Block + recipe.Priority = v.Priority + recipe.UnlockRequirement = (&RecipeUnlockRequirement{}).FromLatest(v.UnlockRequirement) + recipe.RecipeNetworkID = v.RecipeNetworkID + return recipe +} + +// ToLatest ... +func (recipe *ShapelessRecipe) ToLatest() protocol.ShapelessRecipe { + return protocol.ShapelessRecipe{ + RecipeID: recipe.RecipeID, + Input: recipe.Input, + Output: recipe.Output, + UUID: recipe.UUID, + Block: recipe.Block, + Priority: recipe.Priority, + UnlockRequirement: recipe.UnlockRequirement.ToLatest(), + RecipeNetworkID: recipe.RecipeNetworkID, + } +} + +// Marshal ... +func (recipe *ShapelessRecipe) Marshal(w *Writer) { + marshalShapeless(w, recipe) +} + +// Unmarshal ... +func (recipe *ShapelessRecipe) Unmarshal(r *Reader) { + marshalShapeless(r, recipe) +} + +// FromLatest ... +func (recipe *ShulkerBoxRecipe) FromLatest(v protocol.ShulkerBoxRecipe) *ShulkerBoxRecipe { + recipe.ShapelessRecipe = *(&ShapelessRecipe{}).FromLatest(v.ShapelessRecipe) + return recipe +} + +// ToLatest ... +func (recipe *ShulkerBoxRecipe) ToLatest() protocol.ShulkerBoxRecipe { + return protocol.ShulkerBoxRecipe{ + ShapelessRecipe: recipe.ShapelessRecipe.ToLatest(), + } +} + +// Marshal ... +func (recipe *ShulkerBoxRecipe) Marshal(w *Writer) { + marshalShapeless(w, &recipe.ShapelessRecipe) +} + +// Unmarshal ... +func (recipe *ShulkerBoxRecipe) Unmarshal(r *Reader) { + marshalShapeless(r, &recipe.ShapelessRecipe) +} + +// FromLatest ... +func (recipe *ShapelessChemistryRecipe) FromLatest(v protocol.ShapelessChemistryRecipe) *ShapelessChemistryRecipe { + recipe.ShapelessRecipe = *(&ShapelessRecipe{}).FromLatest(v.ShapelessRecipe) + return recipe +} + +// ToLatest ... +func (recipe *ShapelessChemistryRecipe) ToLatest() protocol.ShapelessChemistryRecipe { + return protocol.ShapelessChemistryRecipe{ + ShapelessRecipe: recipe.ShapelessRecipe.ToLatest(), + } +} + +// Marshal ... +func (recipe *ShapelessChemistryRecipe) Marshal(w *Writer) { + marshalShapeless(w, &recipe.ShapelessRecipe) +} + +// Unmarshal ... +func (recipe *ShapelessChemistryRecipe) Unmarshal(r *Reader) { + marshalShapeless(r, &recipe.ShapelessRecipe) +} + +// FromLatest ... +func (recipe *ShapedRecipe) FromLatest(v protocol.ShapedRecipe) *ShapedRecipe { + recipe.RecipeID = v.RecipeID + recipe.Width = v.Width + recipe.Height = v.Height + recipe.Input = v.Input + recipe.Output = v.Output + recipe.UUID = v.UUID + recipe.Block = v.Block + recipe.AssumeSymmetry = v.AssumeSymmetry + recipe.UnlockRequirement = (&RecipeUnlockRequirement{}).FromLatest(v.UnlockRequirement) + recipe.Priority = v.Priority + recipe.RecipeNetworkID = v.RecipeNetworkID + return recipe +} + +// ToLatest ... +func (recipe *ShapedRecipe) ToLatest() protocol.ShapedRecipe { + return protocol.ShapedRecipe{ + RecipeID: recipe.RecipeID, + Width: recipe.Width, + Height: recipe.Height, + Input: recipe.Input, + Output: recipe.Output, + UUID: recipe.UUID, + Block: recipe.Block, + AssumeSymmetry: recipe.AssumeSymmetry, + UnlockRequirement: recipe.UnlockRequirement.ToLatest(), + Priority: recipe.Priority, + RecipeNetworkID: recipe.RecipeNetworkID, + } +} + +// Marshal ... +func (recipe *ShapedRecipe) Marshal(w *Writer) { + marshalShaped(w, recipe) +} + +// Unmarshal ... +func (recipe *ShapedRecipe) Unmarshal(r *Reader) { + marshalShaped(r, recipe) +} + +// FromLatest ... +func (recipe *ShapedChemistryRecipe) FromLatest(v protocol.ShapedChemistryRecipe) *ShapedChemistryRecipe { + recipe.ShapedRecipe = *(&ShapedRecipe{}).FromLatest(v.ShapedRecipe) + return recipe +} + +// ToLatest ... +func (recipe *ShapedChemistryRecipe) ToLatest() protocol.ShapedChemistryRecipe { + return protocol.ShapedChemistryRecipe{ + ShapedRecipe: recipe.ShapedRecipe.ToLatest(), + } +} + +// Marshal ... +func (recipe *ShapedChemistryRecipe) Marshal(w *Writer) { + marshalShaped(w, &recipe.ShapedRecipe) +} + +// Unmarshal ... +func (recipe *ShapedChemistryRecipe) Unmarshal(r *Reader) { + marshalShaped(r, &recipe.ShapedRecipe) +} + +// FromLatest ... +func (recipe *FurnaceRecipe) FromLatest(v protocol.FurnaceRecipe) *FurnaceRecipe { + recipe.InputType = v.InputType + recipe.Output = v.Output + recipe.Block = v.Block + return recipe +} + +// ToLatest ... +func (recipe *FurnaceRecipe) ToLatest() protocol.FurnaceRecipe { + return protocol.FurnaceRecipe{ + InputType: recipe.InputType, + Output: recipe.Output, + Block: recipe.Block, + } +} + +// Marshal ... +func (recipe *FurnaceRecipe) Marshal(w *Writer) { + w.Varint32(&recipe.InputType.NetworkID) + w.Item(&recipe.Output) + w.String(&recipe.Block) +} + +// Unmarshal ... +func (recipe *FurnaceRecipe) Unmarshal(r *Reader) { + r.Varint32(&recipe.InputType.NetworkID) + r.Item(&recipe.Output) + r.String(&recipe.Block) +} + +// FromLatest ... +func (recipe *FurnaceDataRecipe) FromLatest(v protocol.FurnaceDataRecipe) *FurnaceDataRecipe { + recipe.FurnaceRecipe = *(&FurnaceRecipe{}).FromLatest(v.FurnaceRecipe) + return recipe +} + +// ToLatest ... +func (recipe *FurnaceDataRecipe) ToLatest() protocol.FurnaceDataRecipe { + return protocol.FurnaceDataRecipe{ + FurnaceRecipe: recipe.FurnaceRecipe.ToLatest(), + } +} + +// Marshal ... +func (recipe *FurnaceDataRecipe) Marshal(w *Writer) { + w.Varint32(&recipe.InputType.NetworkID) + aux := int32(recipe.InputType.MetadataValue) + w.Varint32(&aux) + w.Item(&recipe.Output) + w.String(&recipe.Block) +} + +// Unmarshal ... +func (recipe *FurnaceDataRecipe) Unmarshal(r *Reader) { + var dataValue int32 + r.Varint32(&recipe.InputType.NetworkID) + r.Varint32(&dataValue) + recipe.InputType.MetadataValue = uint32(dataValue) + r.Item(&recipe.Output) + r.String(&recipe.Block) +} + +// FromLatest ... +func (recipe *MultiRecipe) FromLatest(v protocol.MultiRecipe) *MultiRecipe { + recipe.UUID = v.UUID + recipe.RecipeNetworkID = v.RecipeNetworkID + return recipe +} + +// ToLatest ... +func (recipe *MultiRecipe) ToLatest() protocol.MultiRecipe { + return protocol.MultiRecipe{ + UUID: recipe.UUID, + RecipeNetworkID: recipe.RecipeNetworkID, + } +} + +// Marshal ... +func (recipe *MultiRecipe) Marshal(w *Writer) { + w.UUID(&recipe.UUID) + w.Varuint32(&recipe.RecipeNetworkID) +} + +// Unmarshal ... +func (recipe *MultiRecipe) Unmarshal(r *Reader) { + r.UUID(&recipe.UUID) + r.Varuint32(&recipe.RecipeNetworkID) +} + +// FromLatest ... +func (recipe *SmithingTransformRecipe) FromLatest(v protocol.SmithingTransformRecipe) *SmithingTransformRecipe { + recipe.RecipeNetworkID = v.RecipeNetworkID + recipe.RecipeID = v.RecipeID + recipe.Template = v.Template + recipe.Base = v.Base + recipe.Addition = v.Addition + recipe.Result = v.Result + recipe.Block = v.Block + return recipe +} + +// ToLatest ... +func (recipe *SmithingTransformRecipe) ToLatest() protocol.SmithingTransformRecipe { + return protocol.SmithingTransformRecipe{ + RecipeNetworkID: recipe.RecipeNetworkID, + RecipeID: recipe.RecipeID, + Template: recipe.Template, + Base: recipe.Base, + Addition: recipe.Addition, + Result: recipe.Result, + Block: recipe.Block, + } +} + +// Marshal ... +func (recipe *SmithingTransformRecipe) Marshal(w *Writer) { + w.String(&recipe.RecipeID) + w.ItemDescriptorCount(&recipe.Template) + w.ItemDescriptorCount(&recipe.Base) + w.ItemDescriptorCount(&recipe.Addition) + w.Item(&recipe.Result) + w.String(&recipe.Block) + w.Varuint32(&recipe.RecipeNetworkID) +} + +// Unmarshal ... +func (recipe *SmithingTransformRecipe) Unmarshal(r *Reader) { + r.String(&recipe.RecipeID) + r.ItemDescriptorCount(&recipe.Template) + r.ItemDescriptorCount(&recipe.Base) + r.ItemDescriptorCount(&recipe.Addition) + r.Item(&recipe.Result) + r.String(&recipe.Block) + r.Varuint32(&recipe.RecipeNetworkID) +} + +// FromLatest ... +func (recipe *SmithingTrimRecipe) FromLatest(v protocol.SmithingTrimRecipe) *SmithingTrimRecipe { + recipe.RecipeNetworkID = v.RecipeNetworkID + recipe.RecipeID = v.RecipeID + recipe.Template = v.Template + recipe.Base = v.Base + recipe.Addition = v.Addition + recipe.Block = v.Block + return recipe +} + +// ToLatest ... +func (recipe *SmithingTrimRecipe) ToLatest() protocol.SmithingTrimRecipe { + return protocol.SmithingTrimRecipe{ + RecipeNetworkID: recipe.RecipeNetworkID, + RecipeID: recipe.RecipeID, + Template: recipe.Template, + Base: recipe.Base, + Addition: recipe.Addition, + Block: recipe.Block, + } +} + +// Marshal ... +func (recipe *SmithingTrimRecipe) Marshal(w *Writer) { + w.String(&recipe.RecipeID) + w.ItemDescriptorCount(&recipe.Template) + w.ItemDescriptorCount(&recipe.Base) + w.ItemDescriptorCount(&recipe.Addition) + w.String(&recipe.Block) + w.Varuint32(&recipe.RecipeNetworkID) +} + +// Unmarshal ... +func (recipe *SmithingTrimRecipe) Unmarshal(r *Reader) { + r.String(&recipe.RecipeID) + r.ItemDescriptorCount(&recipe.Template) + r.ItemDescriptorCount(&recipe.Base) + r.ItemDescriptorCount(&recipe.Addition) + r.String(&recipe.Block) + r.Varuint32(&recipe.RecipeNetworkID) +} + +// marshalShaped ... +func marshalShaped(r protocol.IO, recipe *ShapedRecipe) { + r.String(&recipe.RecipeID) + r.Varint32(&recipe.Width) + r.Varint32(&recipe.Height) + protocol.FuncSliceOfLen(r, uint32(recipe.Width*recipe.Height), &recipe.Input, r.ItemDescriptorCount) + protocol.FuncSlice(r, &recipe.Output, r.Item) + r.UUID(&recipe.UUID) + r.String(&recipe.Block) + r.Varint32(&recipe.Priority) + r.Bool(&recipe.AssumeSymmetry) + if IsProtoGTE(r, ID685) { + protocol.Single(r, &recipe.UnlockRequirement) + } + r.Varuint32(&recipe.RecipeNetworkID) +} + +// marshalShapeless ... +func marshalShapeless(r protocol.IO, recipe *ShapelessRecipe) { + r.String(&recipe.RecipeID) + protocol.FuncSlice(r, &recipe.Input, r.ItemDescriptorCount) + protocol.FuncSlice(r, &recipe.Output, r.Item) + r.UUID(&recipe.UUID) + r.String(&recipe.Block) + r.Varint32(&recipe.Priority) + if IsProtoGTE(r, ID685) { + protocol.Single(r, &recipe.UnlockRequirement) + } + r.Varuint32(&recipe.RecipeNetworkID) +} diff --git a/legacyver/protocol.go b/legacyver/protocol.go index 6901fb7..98fae62 100644 --- a/legacyver/protocol.go +++ b/legacyver/protocol.go @@ -76,6 +76,16 @@ func convertPacketFunc(pid uint32, cur func() packet.Packet) func() packet.Packe return func() packet.Packet { return &legacypacket.InventoryTransaction{} } case packet.IDItemStackRequest: return func() packet.Packet { return &legacypacket.ItemStackRequest{} } + case packet.IDCraftingData: + return func() packet.Packet { return &legacypacket.CraftingData{} } + case packet.IDContainerClose: + return func() packet.Packet { return &legacypacket.ContainerClose{} } + case packet.IDText: + return func() packet.Packet { return &legacypacket.Text{} } + case packet.IDStartGame: + return func() packet.Packet { return &legacypacket.StartGame{} } + case packet.IDCodeBuilderSource: + return func() packet.Packet { return &legacypacket.CodeBuilderSource{} } default: return cur } @@ -127,6 +137,8 @@ func (p *Protocol) ConvertFromLatest(pk packet.Packet, conn *minecraft.Conn) []p func (p *Protocol) downgradePackets(pks []packet.Packet, conn *minecraft.Conn) []packet.Packet { for pkIndex, pk := range pks { switch pk := pk.(type) { + case *packet.ClientCacheStatus: + pk.Enabled = false // TODO: enable when chunk translation is not broken case *packet.CameraPresets: presets := make([]proto.CameraPreset, len(pk.Presets)) for i, p := range pk.Presets { @@ -135,9 +147,6 @@ func (p *Protocol) downgradePackets(pks []packet.Packet, conn *minecraft.Conn) [ pks[pkIndex] = &legacypacket.CameraPresets{ Presets: presets, } - case *packet.StartGame: - pk.GameVersion = p.ver - pk.BaseGameVersion = p.ver case *packet.PlayerAuthInput: inputData := pk.InputData if p.ID() < proto.ID766 { @@ -398,6 +407,126 @@ func (p *Protocol) downgradePackets(pks []packet.Packet, conn *minecraft.Conn) [ requests[i] = (&proto.ItemStackRequest{}).FromLatest(r) } pks[pkIndex] = &legacypacket.ItemStackRequest{Requests: requests} + case *packet.Text: + pks[pkIndex] = &legacypacket.Text{ + TextType: pk.TextType, + NeedsTranslation: pk.NeedsTranslation, + SourceName: pk.SourceName, + Message: pk.Message, + Parameters: pk.Parameters, + XUID: pk.XUID, + PlatformChatID: pk.PlatformChatID, + FilteredMessage: pk.FilteredMessage, + } + case *packet.ContainerClose: + pks[pkIndex] = &legacypacket.ContainerClose{ + WindowID: pk.WindowID, + ContainerType: pk.ContainerType, + ServerSide: pk.ServerSide, + } + case *packet.CraftingData: + recipes := make([]proto.Recipe, len(pk.Recipes)) + for i, r := range pk.Recipes { + recipes[i] = proto.RecipeFromLatest(r) + } + pks[pkIndex] = &legacypacket.CraftingData{ + Recipes: recipes, + PotionRecipes: pk.PotionRecipes, + PotionContainerChangeRecipes: pk.PotionContainerChangeRecipes, + MaterialReducers: pk.MaterialReducers, + ClearRecipes: pk.ClearRecipes, + } + case *packet.StartGame: + // Adjust game version + pk.GameVersion = p.ver + pk.BaseGameVersion = p.ver + + pks[pkIndex] = &legacypacket.StartGame{ + EntityUniqueID: pk.EntityUniqueID, + EntityRuntimeID: pk.EntityRuntimeID, + PlayerGameMode: pk.PlayerGameMode, + PlayerPosition: pk.PlayerPosition, + Pitch: pk.Pitch, + Yaw: pk.Yaw, + WorldSeed: pk.WorldSeed, + SpawnBiomeType: pk.SpawnBiomeType, + UserDefinedBiomeName: pk.UserDefinedBiomeName, + Dimension: pk.Dimension, + Generator: pk.Generator, + WorldGameMode: pk.WorldGameMode, + Hardcore: pk.Hardcore, + Difficulty: pk.Difficulty, + WorldSpawn: pk.WorldSpawn, + AchievementsDisabled: pk.AchievementsDisabled, + EditorWorldType: pk.EditorWorldType, + CreatedInEditor: pk.CreatedInEditor, + ExportedFromEditor: pk.ExportedFromEditor, + DayCycleLockTime: pk.DayCycleLockTime, + EducationEditionOffer: pk.EducationEditionOffer, + EducationFeaturesEnabled: pk.EducationFeaturesEnabled, + EducationProductID: pk.EducationProductID, + RainLevel: pk.RainLevel, + LightningLevel: pk.LightningLevel, + ConfirmedPlatformLockedContent: pk.ConfirmedPlatformLockedContent, + MultiPlayerGame: pk.MultiPlayerGame, + LANBroadcastEnabled: pk.LANBroadcastEnabled, + XBLBroadcastMode: pk.XBLBroadcastMode, + PlatformBroadcastMode: pk.PlatformBroadcastMode, + CommandsEnabled: pk.CommandsEnabled, + TexturePackRequired: pk.TexturePackRequired, + GameRules: pk.GameRules, + Experiments: pk.Experiments, + ExperimentsPreviouslyToggled: pk.ExperimentsPreviouslyToggled, + BonusChestEnabled: pk.BonusChestEnabled, + StartWithMapEnabled: pk.StartWithMapEnabled, + PlayerPermissions: pk.PlayerPermissions, + ServerChunkTickRadius: pk.ServerChunkTickRadius, + HasLockedBehaviourPack: pk.HasLockedBehaviourPack, + HasLockedTexturePack: pk.HasLockedTexturePack, + FromLockedWorldTemplate: pk.FromLockedWorldTemplate, + MSAGamerTagsOnly: pk.MSAGamerTagsOnly, + FromWorldTemplate: pk.FromWorldTemplate, + WorldTemplateSettingsLocked: pk.WorldTemplateSettingsLocked, + OnlySpawnV1Villagers: pk.OnlySpawnV1Villagers, + PersonaDisabled: pk.PersonaDisabled, + CustomSkinsDisabled: pk.CustomSkinsDisabled, + EmoteChatMuted: pk.EmoteChatMuted, + BaseGameVersion: pk.BaseGameVersion, + LimitedWorldWidth: pk.LimitedWorldWidth, + LimitedWorldDepth: pk.LimitedWorldDepth, + NewNether: pk.NewNether, + EducationSharedResourceURI: pk.EducationSharedResourceURI, + ForceExperimentalGameplay: pk.ForceExperimentalGameplay, + LevelID: pk.LevelID, + WorldName: pk.WorldName, + TemplateContentIdentity: pk.TemplateContentIdentity, + Trial: pk.Trial, + PlayerMovementSettings: pk.PlayerMovementSettings, + Time: pk.Time, + EnchantmentSeed: pk.EnchantmentSeed, + Blocks: pk.Blocks, + Items: pk.Items, + MultiPlayerCorrelationID: pk.MultiPlayerCorrelationID, + ServerAuthoritativeInventory: pk.ServerAuthoritativeInventory, + GameVersion: pk.GameVersion, + PropertyData: pk.PropertyData, + ServerBlockStateChecksum: pk.ServerBlockStateChecksum, + ClientSideGeneration: pk.ClientSideGeneration, + WorldTemplateID: pk.WorldTemplateID, + ChatRestrictionLevel: pk.ChatRestrictionLevel, + DisablePlayerInteractions: pk.DisablePlayerInteractions, + ServerID: pk.ServerID, + WorldID: pk.WorldID, + ScenarioID: pk.ScenarioID, + UseBlockNetworkIDHashes: pk.UseBlockNetworkIDHashes, + ServerAuthoritativeSound: pk.ServerAuthoritativeSound, + } + case *packet.CodeBuilderSource: + pks[pkIndex] = &legacypacket.CodeBuilderSource{ + Operation: pk.Operation, + Category: pk.Category, + CodeStatus: pk.CodeStatus, + } } } @@ -674,6 +803,122 @@ func (p *Protocol) upgradePackets(pks []packet.Packet, conn *minecraft.Conn) []p requests[i] = r.ToLatest() } pks[pkIndex] = &packet.ItemStackRequest{Requests: requests} + case *legacypacket.CraftingData: + recipes := make([]protocol.Recipe, len(pk.Recipes)) + for i, r := range pk.Recipes { + recipes[i] = proto.RecipeToLatest(r) + } + pks[pkIndex] = &packet.CraftingData{ + Recipes: recipes, + PotionRecipes: pk.PotionRecipes, + PotionContainerChangeRecipes: pk.PotionContainerChangeRecipes, + MaterialReducers: pk.MaterialReducers, + ClearRecipes: pk.ClearRecipes, + } + case *legacypacket.ContainerClose: + pks[pkIndex] = &packet.ContainerClose{ + WindowID: pk.WindowID, + ContainerType: pk.ContainerType, + ServerSide: pk.ServerSide, + } + case *legacypacket.Text: + pks[pkIndex] = &packet.Text{ + TextType: pk.TextType, + NeedsTranslation: pk.NeedsTranslation, + SourceName: pk.SourceName, + Message: pk.Message, + Parameters: pk.Parameters, + XUID: pk.XUID, + PlatformChatID: pk.PlatformChatID, + FilteredMessage: pk.FilteredMessage, + } + case *legacypacket.StartGame: + pks[pkIndex] = &packet.StartGame{ + EntityUniqueID: pk.EntityUniqueID, + EntityRuntimeID: pk.EntityRuntimeID, + PlayerGameMode: pk.PlayerGameMode, + PlayerPosition: pk.PlayerPosition, + Pitch: pk.Pitch, + Yaw: pk.Yaw, + WorldSeed: pk.WorldSeed, + SpawnBiomeType: pk.SpawnBiomeType, + UserDefinedBiomeName: pk.UserDefinedBiomeName, + Dimension: pk.Dimension, + Generator: pk.Generator, + WorldGameMode: pk.WorldGameMode, + Hardcore: pk.Hardcore, + Difficulty: pk.Difficulty, + WorldSpawn: pk.WorldSpawn, + AchievementsDisabled: pk.AchievementsDisabled, + EditorWorldType: pk.EditorWorldType, + CreatedInEditor: pk.CreatedInEditor, + ExportedFromEditor: pk.ExportedFromEditor, + DayCycleLockTime: pk.DayCycleLockTime, + EducationEditionOffer: pk.EducationEditionOffer, + EducationFeaturesEnabled: pk.EducationFeaturesEnabled, + EducationProductID: pk.EducationProductID, + RainLevel: pk.RainLevel, + LightningLevel: pk.LightningLevel, + ConfirmedPlatformLockedContent: pk.ConfirmedPlatformLockedContent, + MultiPlayerGame: pk.MultiPlayerGame, + LANBroadcastEnabled: pk.LANBroadcastEnabled, + XBLBroadcastMode: pk.XBLBroadcastMode, + PlatformBroadcastMode: pk.PlatformBroadcastMode, + CommandsEnabled: pk.CommandsEnabled, + TexturePackRequired: pk.TexturePackRequired, + GameRules: pk.GameRules, + Experiments: pk.Experiments, + ExperimentsPreviouslyToggled: pk.ExperimentsPreviouslyToggled, + BonusChestEnabled: pk.BonusChestEnabled, + StartWithMapEnabled: pk.StartWithMapEnabled, + PlayerPermissions: pk.PlayerPermissions, + ServerChunkTickRadius: pk.ServerChunkTickRadius, + HasLockedBehaviourPack: pk.HasLockedBehaviourPack, + HasLockedTexturePack: pk.HasLockedTexturePack, + FromLockedWorldTemplate: pk.FromLockedWorldTemplate, + MSAGamerTagsOnly: pk.MSAGamerTagsOnly, + FromWorldTemplate: pk.FromWorldTemplate, + WorldTemplateSettingsLocked: pk.WorldTemplateSettingsLocked, + OnlySpawnV1Villagers: pk.OnlySpawnV1Villagers, + PersonaDisabled: pk.PersonaDisabled, + CustomSkinsDisabled: pk.CustomSkinsDisabled, + EmoteChatMuted: pk.EmoteChatMuted, + BaseGameVersion: pk.BaseGameVersion, + LimitedWorldWidth: pk.LimitedWorldWidth, + LimitedWorldDepth: pk.LimitedWorldDepth, + NewNether: pk.NewNether, + EducationSharedResourceURI: pk.EducationSharedResourceURI, + ForceExperimentalGameplay: pk.ForceExperimentalGameplay, + LevelID: pk.LevelID, + WorldName: pk.WorldName, + TemplateContentIdentity: pk.TemplateContentIdentity, + Trial: pk.Trial, + PlayerMovementSettings: pk.PlayerMovementSettings, + Time: pk.Time, + EnchantmentSeed: pk.EnchantmentSeed, + Blocks: pk.Blocks, + Items: pk.Items, + MultiPlayerCorrelationID: pk.MultiPlayerCorrelationID, + ServerAuthoritativeInventory: pk.ServerAuthoritativeInventory, + GameVersion: pk.GameVersion, + PropertyData: pk.PropertyData, + ServerBlockStateChecksum: pk.ServerBlockStateChecksum, + ClientSideGeneration: pk.ClientSideGeneration, + WorldTemplateID: pk.WorldTemplateID, + ChatRestrictionLevel: pk.ChatRestrictionLevel, + DisablePlayerInteractions: pk.DisablePlayerInteractions, + ServerID: pk.ServerID, + WorldID: pk.WorldID, + ScenarioID: pk.ScenarioID, + UseBlockNetworkIDHashes: pk.UseBlockNetworkIDHashes, + ServerAuthoritativeSound: pk.ServerAuthoritativeSound, + } + case *legacypacket.CodeBuilderSource: + pks[pkIndex] = &packet.CodeBuilderSource{ + Operation: pk.Operation, + Category: pk.Category, + CodeStatus: pk.CodeStatus, + } } } return pks diff --git a/legacyver/v671.go b/legacyver/v671.go new file mode 100644 index 0000000..383fd12 --- /dev/null +++ b/legacyver/v671.go @@ -0,0 +1,37 @@ +package legacyver + +import ( + _ "embed" + "github.com/akmalfairuz/legacy-version/internal/chunk" + "github.com/akmalfairuz/legacy-version/legacyver/proto" + "github.com/akmalfairuz/legacy-version/mapping" +) + +const ( + // ItemVersion671 ... + ItemVersion671 = 181 + // BlockVersion671 ... + BlockVersion671 int32 = (1 << 24) | (20 << 16) | (80 << 8) +) + +var ( + //go:embed data/item_runtime_ids_671.nbt + itemRuntimeIDData671 []byte + //go:embed data/required_item_list_671.json + requiredItemList671 []byte + //go:embed data/block_states_671.nbt + blockStateData671 []byte +) + +// New671 ... +func New671() *Protocol { + itemMapping := mapping.NewItemMapping(itemRuntimeIDData671, requiredItemList671, ItemVersion671, false) + blockMapping := mapping.NewBlockMapping(blockStateData671) + + return &Protocol{ + ver: "1.20.80", + id: proto.ID671, + blockTranslator: NewBlockTranslator(blockMapping, latestBlockMapping, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion671), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion671), false), + itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest, blockMapping, blockMappingLatest), + } +} diff --git a/legacyver/v685.go b/legacyver/v685.go index ae901bb..dc70d99 100644 --- a/legacyver/v685.go +++ b/legacyver/v685.go @@ -15,7 +15,7 @@ const ( ) // New685 uses same data as 686 -func New685(direct bool) *Protocol { +func New685() *Protocol { itemMapping := mapping.NewItemMapping(itemRuntimeIDData686, requiredItemList686, ItemVersion685, false) blockMapping := mapping.NewBlockMapping(blockStateData686) diff --git a/legacyver/v686.go b/legacyver/v686.go index 0970632..82b396e 100644 --- a/legacyver/v686.go +++ b/legacyver/v686.go @@ -23,7 +23,7 @@ var ( blockStateData686 []byte ) -func New686(direct bool) *Protocol { +func New686() *Protocol { itemMapping := mapping.NewItemMapping(itemRuntimeIDData686, requiredItemList686, ItemVersion686, false) blockMapping := mapping.NewBlockMapping(blockStateData686) diff --git a/legacyver/v712.go b/legacyver/v712.go index 2aa1cc6..ab6a6da 100644 --- a/legacyver/v712.go +++ b/legacyver/v712.go @@ -23,7 +23,7 @@ var ( blockStateData712 []byte ) -func New712(direct bool) *Protocol { +func New712() *Protocol { itemMapping := mapping.NewItemMapping(itemRuntimeIDData712, requiredItemList712, ItemVersion712, false) blockMapping := mapping.NewBlockMapping(blockStateData712) diff --git a/legacyver/v729.go b/legacyver/v729.go index 2749805..0016069 100644 --- a/legacyver/v729.go +++ b/legacyver/v729.go @@ -23,7 +23,7 @@ var ( blockStateData729 []byte ) -func New729(direct bool) *Protocol { +func New729() *Protocol { itemMapping := mapping.NewItemMapping(itemRuntimeIDData729, requiredItemList729, ItemVersion729, false) blockMapping := mapping.NewBlockMapping(blockStateData729) diff --git a/legacyver/v748.go b/legacyver/v748.go index 949d7cc..1db72dc 100644 --- a/legacyver/v748.go +++ b/legacyver/v748.go @@ -23,7 +23,7 @@ var ( blockStateData748 []byte ) -func New748(direct bool) *Protocol { +func New748() *Protocol { itemMapping := mapping.NewItemMapping(itemRuntimeIDData748, requiredItemList748, ItemVersion748, false) blockMapping := mapping.NewBlockMapping(blockStateData748)