From a8f9cc229ce53acfc3bc3c70c5d3bbb47e0f95eb Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Sun, 1 Jun 2025 20:21:04 +0200 Subject: [PATCH 01/62] Initial 1.21.6 changes --- README.md | 2 +- .../java/org/geysermc/geyser/item/Items.java | 21 ++++++- .../item/hashing/DataComponentHashers.java | 25 ++++---- .../geysermc/geyser/level/WorldManager.java | 10 ---- .../geysermc/geyser/level/block/Blocks.java | 4 ++ .../level/block/property/Properties.java | 1 + .../geyser/session/cache/FormCache.java | 4 +- .../geyser/session/cache/InputCache.java | 16 +----- .../geyser/session/cache/tags/BlockTag.java | 53 +++++++++-------- .../geyser/session/cache/tags/ItemTag.java | 57 ++++++++++--------- .../player/BedrockInteractTranslator.java | 5 +- .../BedrockSetPlayerGameTypeTranslator.java | 17 +++--- .../dialogues/JavaClearDialogTranslator.java | 40 +++++++++++++ .../JavaShowDialogGameTranslator.java | 40 +++++++++++++ ...vaShowDialogueConfigurationTranslator.java | 40 +++++++++++++ .../level/JavaTrackedWaypointTranslator.java | 39 +++++++++++++ gradle.properties | 2 +- gradle/libs.versions.toml | 2 +- 18 files changed, 271 insertions(+), 107 deletions(-) create mode 100644 core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaClearDialogTranslator.java create mode 100644 core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaShowDialogGameTranslator.java create mode 100644 core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaShowDialogueConfigurationTranslator.java create mode 100644 core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaTrackedWaypointTranslator.java diff --git a/README.md b/README.md index 3da04c09d..49d1214e4 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ The ultimate goal of this project is to allow Minecraft: Bedrock Edition users t Special thanks to the DragonProxy project for being a trailblazer in protocol translation and for all the team members who have joined us here! ## Supported Versions -Geyser is currently supporting Minecraft Bedrock 1.21.50 - 1.21.80 and Minecraft Java 1.21.5. For more information, please see [here](https://geysermc.org/wiki/geyser/supported-versions/). +Geyser is currently supporting Minecraft Bedrock 1.21.50 - 1.21.80 and Minecraft Java 1.21.6. For more information, please see [here](https://geysermc.org/wiki/geyser/supported-versions/). ## Setting Up Take a look [here](https://geysermc.org/wiki/geyser/setup/) for how to set up Geyser. diff --git a/core/src/main/java/org/geysermc/geyser/item/Items.java b/core/src/main/java/org/geysermc/geyser/item/Items.java index 5fd64c4d4..1c693a52f 100644 --- a/core/src/main/java/org/geysermc/geyser/item/Items.java +++ b/core/src/main/java/org/geysermc/geyser/item/Items.java @@ -685,6 +685,7 @@ public final class Items { public static final Item BLACK_CONCRETE_POWDER = register(new BlockItem(builder(), Blocks.BLACK_CONCRETE_POWDER)); public static final Item TURTLE_EGG = register(new BlockItem(builder(), Blocks.TURTLE_EGG)); public static final Item SNIFFER_EGG = register(new BlockItem(builder(), Blocks.SNIFFER_EGG)); + public static final Item DRIED_GHAST = register(new BlockItem(builder(), Blocks.DRIED_GHAST)); public static final Item DEAD_TUBE_CORAL_BLOCK = register(new BlockItem(builder(), Blocks.DEAD_TUBE_CORAL_BLOCK)); public static final Item DEAD_BRAIN_CORAL_BLOCK = register(new BlockItem(builder(), Blocks.DEAD_BRAIN_CORAL_BLOCK)); public static final Item DEAD_BUBBLE_CORAL_BLOCK = register(new BlockItem(builder(), Blocks.DEAD_BUBBLE_CORAL_BLOCK)); @@ -867,6 +868,22 @@ public final class Items { public static final Item RAIL = register(new BlockItem(builder(), Blocks.RAIL)); public static final Item ACTIVATOR_RAIL = register(new BlockItem(builder(), Blocks.ACTIVATOR_RAIL)); public static final Item SADDLE = register(new Item("saddle", builder())); + public static final Item WHITE_HARNESS = register(new Item("white_harness", builder())); + public static final Item ORANGE_HARNESS = register(new Item("orange_harness", builder())); + public static final Item MAGENTA_HARNESS = register(new Item("magenta_harness", builder())); + public static final Item LIGHT_BLUE_HARNESS = register(new Item("light_blue_harness", builder())); + public static final Item YELLOW_HARNESS = register(new Item("yellow_harness", builder())); + public static final Item LIME_HARNESS = register(new Item("lime_harness", builder())); + public static final Item PINK_HARNESS = register(new Item("pink_harness", builder())); + public static final Item GRAY_HARNESS = register(new Item("gray_harness", builder())); + public static final Item LIGHT_GRAY_HARNESS = register(new Item("light_gray_harness", builder())); + public static final Item CYAN_HARNESS = register(new Item("cyan_harness", builder())); + public static final Item PURPLE_HARNESS = register(new Item("purple_harness", builder())); + public static final Item BLUE_HARNESS = register(new Item("blue_harness", builder())); + public static final Item BROWN_HARNESS = register(new Item("brown_harness", builder())); + public static final Item GREEN_HARNESS = register(new Item("green_harness", builder())); + public static final Item RED_HARNESS = register(new Item("red_harness", builder())); + public static final Item BLACK_HARNESS = register(new Item("black_harness", builder())); public static final Item MINECART = register(new Item("minecart", builder())); public static final Item CHEST_MINECART = register(new Item("chest_minecart", builder())); public static final Item FURNACE_MINECART = register(new Item("furnace_minecart", builder())); @@ -1131,7 +1148,7 @@ public final class Items { public static final Item BLAZE_POWDER = register(new Item("blaze_powder", builder())); public static final Item MAGMA_CREAM = register(new Item("magma_cream", builder())); public static final Item BREWING_STAND = register(new BlockItem(builder(), Blocks.BREWING_STAND)); - public static final Item CAULDRON = register(new BlockItem(builder(), Blocks.CAULDRON, Blocks.POWDER_SNOW_CAULDRON, Blocks.WATER_CAULDRON, Blocks.LAVA_CAULDRON)); + public static final Item CAULDRON = register(new BlockItem(builder(), Blocks.CAULDRON, Blocks.LAVA_CAULDRON, Blocks.POWDER_SNOW_CAULDRON, Blocks.WATER_CAULDRON)); public static final Item ENDER_EYE = register(new Item("ender_eye", builder())); public static final Item GLISTERING_MELON_SLICE = register(new Item("glistering_melon_slice", builder())); public static final Item ARMADILLO_SPAWN_EGG = register(new SpawnEggItem("armadillo_spawn_egg", builder())); @@ -1160,6 +1177,7 @@ public final class Items { public static final Item FOX_SPAWN_EGG = register(new SpawnEggItem("fox_spawn_egg", builder())); public static final Item FROG_SPAWN_EGG = register(new SpawnEggItem("frog_spawn_egg", builder())); public static final Item GHAST_SPAWN_EGG = register(new SpawnEggItem("ghast_spawn_egg", builder())); + public static final Item HAPPY_GHAST_SPAWN_EGG = register(new SpawnEggItem("happy_ghast_spawn_egg", builder())); public static final Item GLOW_SQUID_SPAWN_EGG = register(new SpawnEggItem("glow_squid_spawn_egg", builder())); public static final Item GOAT_SPAWN_EGG = register(new SpawnEggItem("goat_spawn_egg", builder())); public static final Item GUARDIAN_SPAWN_EGG = register(new SpawnEggItem("guardian_spawn_egg", builder())); @@ -1316,6 +1334,7 @@ public final class Items { public static final Item MUSIC_DISC_5 = register(new Item("music_disc_5", builder())); public static final Item MUSIC_DISC_PIGSTEP = register(new Item("music_disc_pigstep", builder())); public static final Item MUSIC_DISC_PRECIPICE = register(new Item("music_disc_precipice", builder())); + public static final Item MUSIC_DISC_TEARS = register(new Item("music_disc_tears", builder())); public static final Item DISC_FRAGMENT_5 = register(new Item("disc_fragment_5", builder())); public static final Item TRIDENT = register(new Item("trident", builder().attackDamage(9.0))); public static final Item NAUTILUS_SHELL = register(new Item("nautilus_shell", builder())); diff --git a/core/src/main/java/org/geysermc/geyser/item/hashing/DataComponentHashers.java b/core/src/main/java/org/geysermc/geyser/item/hashing/DataComponentHashers.java index 247cfeb3a..b1ee34ee9 100644 --- a/core/src/main/java/org/geysermc/geyser/item/hashing/DataComponentHashers.java +++ b/core/src/main/java/org/geysermc/geyser/item/hashing/DataComponentHashers.java @@ -44,9 +44,7 @@ import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.cache.registry.JavaRegistries; import org.geysermc.geyser.util.MinecraftKey; import org.geysermc.mcprotocollib.protocol.data.game.entity.Effect; -import org.geysermc.mcprotocollib.protocol.data.game.entity.EquipmentSlot; import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.GlobalPos; -import org.geysermc.mcprotocollib.protocol.data.game.entity.type.EntityType; import org.geysermc.mcprotocollib.protocol.data.game.item.HashedStack; import org.geysermc.mcprotocollib.protocol.data.game.item.ItemStack; import org.geysermc.mcprotocollib.protocol.data.game.item.component.BlockStateProperties; @@ -413,17 +411,18 @@ public class DataComponentHashers { testHash(session, DataComponentTypes.ENCHANTABLE, 3, -1834983819); - testHash(session, DataComponentTypes.EQUIPPABLE, new Equippable(EquipmentSlot.BODY, BuiltinSound.ITEM_ARMOR_EQUIP_GENERIC, null, null, null, - true, true, true, false), 1294431019); - testHash(session, DataComponentTypes.EQUIPPABLE, new Equippable(EquipmentSlot.BODY, BuiltinSound.ITEM_ARMOR_EQUIP_CHAIN, MinecraftKey.key("testing"), null, null, - true, true, true, false), 1226203061); - testHash(session, DataComponentTypes.EQUIPPABLE, new Equippable(EquipmentSlot.BODY, BuiltinSound.AMBIENT_CAVE, null, null, null, - false, true, false, false), 1416408052); - testHash(session, DataComponentTypes.EQUIPPABLE, new Equippable(EquipmentSlot.BODY, BuiltinSound.ENTITY_BREEZE_WIND_BURST, null, MinecraftKey.key("testing"), - new HolderSet(new int[]{EntityType.ACACIA_BOAT.ordinal()}), false, true, false, false), 1711275245); - - testHash(session, DataComponentTypes.EQUIPPABLE, new Equippable(EquipmentSlot.HELMET, BuiltinSound.ITEM_ARMOR_EQUIP_GENERIC, null, null, null, - true, true, true, false), 497790992); // TODO broken because equipment slot names don't match + // TODO +// testHash(session, DataComponentTypes.EQUIPPABLE, new Equippable(EquipmentSlot.BODY, BuiltinSound.ITEM_ARMOR_EQUIP_GENERIC, null, null, null, +// true, true, true, false), 1294431019); +// testHash(session, DataComponentTypes.EQUIPPABLE, new Equippable(EquipmentSlot.BODY, BuiltinSound.ITEM_ARMOR_EQUIP_CHAIN, MinecraftKey.key("testing"), null, null, +// true, true, true, false), 1226203061); +// testHash(session, DataComponentTypes.EQUIPPABLE, new Equippable(EquipmentSlot.BODY, BuiltinSound.AMBIENT_CAVE, null, null, null, +// false, true, false, false), 1416408052); +// testHash(session, DataComponentTypes.EQUIPPABLE, new Equippable(EquipmentSlot.BODY, BuiltinSound.ENTITY_BREEZE_WIND_BURST, null, MinecraftKey.key("testing"), +// new HolderSet(new int[]{EntityType.ACACIA_BOAT.ordinal()}), false, true, false, false), 1711275245); +// +// testHash(session, DataComponentTypes.EQUIPPABLE, new Equippable(EquipmentSlot.HELMET, BuiltinSound.ITEM_ARMOR_EQUIP_GENERIC, null, null, null, +// true, true, true, false), 497790992); // TODO broken because equipment slot names don't match testHash(session, DataComponentTypes.REPAIRABLE, new HolderSet(new int[]{Items.AMETHYST_BLOCK.javaId(), Items.PUMPKIN.javaId()}), -36715567); diff --git a/core/src/main/java/org/geysermc/geyser/level/WorldManager.java b/core/src/main/java/org/geysermc/geyser/level/WorldManager.java index b0422913d..67590373c 100644 --- a/core/src/main/java/org/geysermc/geyser/level/WorldManager.java +++ b/core/src/main/java/org/geysermc/geyser/level/WorldManager.java @@ -147,16 +147,6 @@ public abstract class WorldManager { */ public abstract int getGameRuleInt(GeyserSession session, GameRule gameRule); - /** - * Change the game mode of the given session - * - * @param session The session of the player to change the game mode of - * @param gameMode The game mode to change the player to - */ - public void setPlayerGameMode(GeyserSession session, GameMode gameMode) { - session.sendCommand("gamemode " + gameMode.name().toLowerCase(Locale.ROOT)); - } - /** * Get the default game mode of the server * diff --git a/core/src/main/java/org/geysermc/geyser/level/block/Blocks.java b/core/src/main/java/org/geysermc/geyser/level/block/Blocks.java index e00be5c21..2f3cdfa00 100644 --- a/core/src/main/java/org/geysermc/geyser/level/block/Blocks.java +++ b/core/src/main/java/org/geysermc/geyser/level/block/Blocks.java @@ -1804,6 +1804,10 @@ public final class Blocks { .intState(HATCH))); public static final Block SNIFFER_EGG = register(new Block("sniffer_egg", builder().destroyTime(0.5f) .intState(HATCH))); + public static final Block DRIED_GHAST = register(new Block("dried_ghast", builder() + .enumState(HORIZONTAL_FACING, Direction.NORTH, Direction.SOUTH, Direction.WEST, Direction.EAST) + .intState(DRIED_GHAST_HYDRATION_LEVELS) + .booleanState(WATERLOGGED))); public static final Block DEAD_TUBE_CORAL_BLOCK = register(new Block("dead_tube_coral_block", builder().requiresCorrectToolForDrops().destroyTime(1.5f))); public static final Block DEAD_BRAIN_CORAL_BLOCK = register(new Block("dead_brain_coral_block", builder().requiresCorrectToolForDrops().destroyTime(1.5f))); public static final Block DEAD_BUBBLE_CORAL_BLOCK = register(new Block("dead_bubble_coral_block", builder().requiresCorrectToolForDrops().destroyTime(1.5f))); diff --git a/core/src/main/java/org/geysermc/geyser/level/block/property/Properties.java b/core/src/main/java/org/geysermc/geyser/level/block/property/Properties.java index a837bd532..5506130e3 100644 --- a/core/src/main/java/org/geysermc/geyser/level/block/property/Properties.java +++ b/core/src/main/java/org/geysermc/geyser/level/block/property/Properties.java @@ -119,6 +119,7 @@ public final class Properties { public static final IntegerProperty STAGE = IntegerProperty.create("stage", 0, 1); public static final IntegerProperty STABILITY_DISTANCE = IntegerProperty.create("distance", 0, 7); public static final IntegerProperty RESPAWN_ANCHOR_CHARGES = IntegerProperty.create("charges", 0, 4); + public static final IntegerProperty DRIED_GHAST_HYDRATION_LEVELS = IntegerProperty.create("hydration", 0, 3); public static final IntegerProperty ROTATION_16 = IntegerProperty.create("rotation", 0, 15); public static final BasicEnumProperty BED_PART = BasicEnumProperty.create("part", "head", "foot"); public static final EnumProperty CHEST_TYPE = EnumProperty.create("type", ChestType.VALUES); diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/FormCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/FormCache.java index be5deece3..4425357fe 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/FormCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/FormCache.java @@ -111,9 +111,7 @@ public class FormCache { } String responseData = response.getFormData(); - //todo work on a proper solution in Cumulus, but that'd require all Floodgate instances to update as well and - // drops support for older Bedrock versions (because Cumulus isn't made to support multiple versions). That's - // why this hotfix exists. + // TODO drop once 1.21.70 is no longer supported if (form instanceof CustomForm customForm && GameProtocol.isTheOneVersionWithBrokenForms(session) && response.getCancelReason().isEmpty()) { // Labels are no longer included as a json null, so we have to manually add them for now. IntList labelIndexes = new IntArrayList(); diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/InputCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/InputCache.java index 5d6b60521..b19c2c108 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/InputCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/InputCache.java @@ -34,9 +34,7 @@ import org.cloudburstmc.protocol.bedrock.data.PlayerAuthInputData; import org.cloudburstmc.protocol.bedrock.packet.PlayerAuthInputPacket; import org.geysermc.geyser.entity.type.player.SessionPlayerEntity; import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.mcprotocollib.protocol.data.game.entity.player.PlayerState; import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.level.ServerboundPlayerInputPacket; -import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.player.ServerboundPlayerCommandPacket; import java.util.Set; @@ -88,21 +86,9 @@ public final class InputCache { // using the "raw" values allows us sending key presses even with locked input // There appear to be cases where the raw value is not sent - e.g. sneaking with a shield on mobile (1.21.80) .withJump(bedrockInput.contains(PlayerAuthInputData.JUMP_CURRENT_RAW) || bedrockInput.contains(PlayerAuthInputData.JUMP_DOWN)) - .withShift(bedrockInput.contains(PlayerAuthInputData.SNEAK_CURRENT_RAW) || bedrockInput.contains(PlayerAuthInputData.SNEAK_DOWN)) + .withShift(isSneaking(bedrockInput)) .withSprint(bedrockInput.contains(PlayerAuthInputData.SPRINT_DOWN)); - // Send sneaking before inputs; matches Java edition - boolean sneaking = isSneaking(bedrockInput); - if (session.isSneaking() != sneaking) { - if (sneaking) { - session.sendDownstreamGamePacket(new ServerboundPlayerCommandPacket(entity.javaId(), PlayerState.START_SNEAKING)); - session.startSneaking(); - } else { - session.sendDownstreamGamePacket(new ServerboundPlayerCommandPacket(entity.javaId(), PlayerState.STOP_SNEAKING)); - session.stopSneaking(); - } - } - if (oldInputPacket != this.inputPacket) { // Simple equality check is fine since we're checking for an instance change. session.sendDownstreamGamePacket(this.inputPacket); } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java index 924b168a4..7c08dbed1 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java @@ -42,48 +42,45 @@ public final class BlockTag { public static final Tag BUTTONS = create("buttons"); public static final Tag WOOL_CARPETS = create("wool_carpets"); public static final Tag WOODEN_DOORS = create("wooden_doors"); - public static final Tag MOB_INTERACTABLE_DOORS = create("mob_interactable_doors"); public static final Tag WOODEN_STAIRS = create("wooden_stairs"); public static final Tag WOODEN_SLABS = create("wooden_slabs"); public static final Tag WOODEN_FENCES = create("wooden_fences"); - public static final Tag PRESSURE_PLATES = create("pressure_plates"); + public static final Tag FENCE_GATES = create("fence_gates"); public static final Tag WOODEN_PRESSURE_PLATES = create("wooden_pressure_plates"); - public static final Tag STONE_PRESSURE_PLATES = create("stone_pressure_plates"); - public static final Tag WOODEN_TRAPDOORS = create("wooden_trapdoors"); public static final Tag DOORS = create("doors"); public static final Tag SAPLINGS = create("saplings"); - public static final Tag LOGS_THAT_BURN = create("logs_that_burn"); - public static final Tag OVERWORLD_NATURAL_LOGS = create("overworld_natural_logs"); - public static final Tag LOGS = create("logs"); + public static final Tag BAMBOO_BLOCKS = create("bamboo_blocks"); + public static final Tag OAK_LOGS = create("oak_logs"); public static final Tag DARK_OAK_LOGS = create("dark_oak_logs"); public static final Tag PALE_OAK_LOGS = create("pale_oak_logs"); - public static final Tag OAK_LOGS = create("oak_logs"); public static final Tag BIRCH_LOGS = create("birch_logs"); public static final Tag ACACIA_LOGS = create("acacia_logs"); - public static final Tag CHERRY_LOGS = create("cherry_logs"); - public static final Tag JUNGLE_LOGS = create("jungle_logs"); public static final Tag SPRUCE_LOGS = create("spruce_logs"); public static final Tag MANGROVE_LOGS = create("mangrove_logs"); + public static final Tag JUNGLE_LOGS = create("jungle_logs"); + public static final Tag CHERRY_LOGS = create("cherry_logs"); public static final Tag CRIMSON_STEMS = create("crimson_stems"); public static final Tag WARPED_STEMS = create("warped_stems"); - public static final Tag BAMBOO_BLOCKS = create("bamboo_blocks"); public static final Tag WART_BLOCKS = create("wart_blocks"); - public static final Tag BANNERS = create("banners"); + public static final Tag LOGS_THAT_BURN = create("logs_that_burn"); + public static final Tag LOGS = create("logs"); public static final Tag SAND = create("sand"); public static final Tag SMELTS_TO_GLASS = create("smelts_to_glass"); - public static final Tag STAIRS = create("stairs"); public static final Tag SLABS = create("slabs"); public static final Tag WALLS = create("walls"); + public static final Tag STAIRS = create("stairs"); public static final Tag ANVIL = create("anvil"); public static final Tag RAILS = create("rails"); public static final Tag LEAVES = create("leaves"); + public static final Tag WOODEN_TRAPDOORS = create("wooden_trapdoors"); public static final Tag TRAPDOORS = create("trapdoors"); public static final Tag SMALL_FLOWERS = create("small_flowers"); + public static final Tag FLOWERS = create("flowers"); public static final Tag BEDS = create("beds"); public static final Tag FENCES = create("fences"); - public static final Tag FLOWERS = create("flowers"); - public static final Tag BEE_ATTRACTIVE = create("bee_attractive"); - public static final Tag PIGLIN_REPELLENTS = create("piglin_repellents"); + public static final Tag SOUL_FIRE_BASE_BLOCKS = create("soul_fire_base_blocks"); + public static final Tag CANDLES = create("candles"); + public static final Tag DAMPENS_VIBRATIONS = create("dampens_vibrations"); public static final Tag GOLD_ORES = create("gold_ores"); public static final Tag IRON_ORES = create("iron_ores"); public static final Tag DIAMOND_ORES = create("diamond_ores"); @@ -92,13 +89,21 @@ public final class BlockTag { public static final Tag COAL_ORES = create("coal_ores"); public static final Tag EMERALD_ORES = create("emerald_ores"); public static final Tag COPPER_ORES = create("copper_ores"); - public static final Tag CANDLES = create("candles"); public static final Tag DIRT = create("dirt"); public static final Tag TERRACOTTA = create("terracotta"); - public static final Tag BADLANDS_TERRACOTTA = create("badlands_terracotta"); - public static final Tag CONCRETE_POWDER = create("concrete_powder"); public static final Tag COMPLETES_FIND_TREE_TUTORIAL = create("completes_find_tree_tutorial"); public static final Tag SHULKER_BOXES = create("shulker_boxes"); + public static final Tag CEILING_HANGING_SIGNS = create("ceiling_hanging_signs"); + public static final Tag STANDING_SIGNS = create("standing_signs"); + public static final Tag BEE_ATTRACTIVE = create("bee_attractive"); + public static final Tag MOB_INTERACTABLE_DOORS = create("mob_interactable_doors"); + public static final Tag PRESSURE_PLATES = create("pressure_plates"); + public static final Tag STONE_PRESSURE_PLATES = create("stone_pressure_plates"); + public static final Tag OVERWORLD_NATURAL_LOGS = create("overworld_natural_logs"); + public static final Tag BANNERS = create("banners"); + public static final Tag PIGLIN_REPELLENTS = create("piglin_repellents"); + public static final Tag BADLANDS_TERRACOTTA = create("badlands_terracotta"); + public static final Tag CONCRETE_POWDER = create("concrete_powder"); public static final Tag FLOWER_POTS = create("flower_pots"); public static final Tag ENDERMAN_HOLDABLE = create("enderman_holdable"); public static final Tag ICE = create("ice"); @@ -110,10 +115,8 @@ public final class BlockTag { public static final Tag CORAL_PLANTS = create("coral_plants"); public static final Tag CORALS = create("corals"); public static final Tag BAMBOO_PLANTABLE_ON = create("bamboo_plantable_on"); - public static final Tag STANDING_SIGNS = create("standing_signs"); public static final Tag WALL_SIGNS = create("wall_signs"); public static final Tag SIGNS = create("signs"); - public static final Tag CEILING_HANGING_SIGNS = create("ceiling_hanging_signs"); public static final Tag WALL_HANGING_SIGNS = create("wall_hanging_signs"); public static final Tag ALL_HANGING_SIGNS = create("all_hanging_signs"); public static final Tag ALL_SIGNS = create("all_signs"); @@ -133,12 +136,10 @@ public final class BlockTag { public static final Tag CLIMBABLE = create("climbable"); public static final Tag FALL_DAMAGE_RESETTING = create("fall_damage_resetting"); public static final Tag HOGLIN_REPELLENTS = create("hoglin_repellents"); - public static final Tag SOUL_FIRE_BASE_BLOCKS = create("soul_fire_base_blocks"); public static final Tag STRIDER_WARM_BLOCKS = create("strider_warm_blocks"); public static final Tag CAMPFIRES = create("campfires"); public static final Tag GUARDED_BY_PIGLINS = create("guarded_by_piglins"); public static final Tag PREVENT_MOB_SPAWNING_INSIDE = create("prevent_mob_spawning_inside"); - public static final Tag FENCE_GATES = create("fence_gates"); public static final Tag UNSTABLE_BOTTOM_CENTER = create("unstable_bottom_center"); public static final Tag MUSHROOM_GROW_BLOCK = create("mushroom_grow_block"); public static final Tag EDIBLE_FOR_SHEEP = create("edible_for_sheep"); @@ -157,8 +158,8 @@ public final class BlockTag { public static final Tag INSIDE_STEP_SOUND_BLOCKS = create("inside_step_sound_blocks"); public static final Tag COMBINATION_STEP_SOUND_BLOCKS = create("combination_step_sound_blocks"); public static final Tag CAMEL_SAND_STEP_SOUND_BLOCKS = create("camel_sand_step_sound_blocks"); + public static final Tag HAPPY_GHAST_AVOIDS = create("happy_ghast_avoids"); public static final Tag OCCLUDES_VIBRATION_SIGNALS = create("occludes_vibration_signals"); - public static final Tag DAMPENS_VIBRATIONS = create("dampens_vibrations"); public static final Tag DRIPSTONE_REPLACEABLE_BLOCKS = create("dripstone_replaceable_blocks"); public static final Tag CAVE_VINES = create("cave_vines"); public static final Tag MOSS_REPLACEABLE = create("moss_replaceable"); @@ -223,7 +224,9 @@ public final class BlockTag { public static final Tag MAINTAINS_FARMLAND = create("maintains_farmland"); public static final Tag BLOCKS_WIND_CHARGE_EXPLOSIONS = create("blocks_wind_charge_explosions"); public static final Tag DOES_NOT_BLOCK_HOPPERS = create("does_not_block_hoppers"); - public static final Tag PLAYS_AMBIENT_DESERT_BLOCK_SOUNDS = create("plays_ambient_desert_block_sounds"); + public static final Tag TRIGGERS_AMBIENT_DESERT_SAND_BLOCK_SOUNDS = create("triggers_ambient_desert_sand_block_sounds"); + public static final Tag TRIGGERS_AMBIENT_DESERT_DRY_VEGETATION_BLOCK_SOUNDS = create("triggers_ambient_desert_dry_vegetation_block_sounds"); + public static final Tag TRIGGERS_AMBIENT_DRIED_GHAST_BLOCK_SOUNDS = create("triggers_ambient_dried_ghast_block_sounds"); public static final Tag AIR = create("air"); private BlockTag() {} diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java index 50398a765..34fb02afd 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java @@ -47,45 +47,62 @@ public final class ItemTag { public static final Tag WOODEN_FENCES = create("wooden_fences"); public static final Tag FENCE_GATES = create("fence_gates"); public static final Tag WOODEN_PRESSURE_PLATES = create("wooden_pressure_plates"); - public static final Tag WOODEN_TRAPDOORS = create("wooden_trapdoors"); public static final Tag DOORS = create("doors"); public static final Tag SAPLINGS = create("saplings"); - public static final Tag LOGS_THAT_BURN = create("logs_that_burn"); - public static final Tag LOGS = create("logs"); + public static final Tag BAMBOO_BLOCKS = create("bamboo_blocks"); + public static final Tag OAK_LOGS = create("oak_logs"); public static final Tag DARK_OAK_LOGS = create("dark_oak_logs"); public static final Tag PALE_OAK_LOGS = create("pale_oak_logs"); - public static final Tag OAK_LOGS = create("oak_logs"); public static final Tag BIRCH_LOGS = create("birch_logs"); public static final Tag ACACIA_LOGS = create("acacia_logs"); - public static final Tag CHERRY_LOGS = create("cherry_logs"); - public static final Tag JUNGLE_LOGS = create("jungle_logs"); public static final Tag SPRUCE_LOGS = create("spruce_logs"); public static final Tag MANGROVE_LOGS = create("mangrove_logs"); + public static final Tag JUNGLE_LOGS = create("jungle_logs"); + public static final Tag CHERRY_LOGS = create("cherry_logs"); public static final Tag CRIMSON_STEMS = create("crimson_stems"); public static final Tag WARPED_STEMS = create("warped_stems"); - public static final Tag BAMBOO_BLOCKS = create("bamboo_blocks"); public static final Tag WART_BLOCKS = create("wart_blocks"); - public static final Tag BANNERS = create("banners"); + public static final Tag LOGS_THAT_BURN = create("logs_that_burn"); + public static final Tag LOGS = create("logs"); public static final Tag SAND = create("sand"); public static final Tag SMELTS_TO_GLASS = create("smelts_to_glass"); - public static final Tag STAIRS = create("stairs"); public static final Tag SLABS = create("slabs"); public static final Tag WALLS = create("walls"); + public static final Tag STAIRS = create("stairs"); public static final Tag ANVIL = create("anvil"); public static final Tag RAILS = create("rails"); public static final Tag LEAVES = create("leaves"); + public static final Tag WOODEN_TRAPDOORS = create("wooden_trapdoors"); public static final Tag TRAPDOORS = create("trapdoors"); public static final Tag SMALL_FLOWERS = create("small_flowers"); public static final Tag FLOWERS = create("flowers"); public static final Tag BEDS = create("beds"); public static final Tag FENCES = create("fences"); + public static final Tag SOUL_FIRE_BASE_BLOCKS = create("soul_fire_base_blocks"); + public static final Tag CANDLES = create("candles"); + public static final Tag DAMPENS_VIBRATIONS = create("dampens_vibrations"); + public static final Tag GOLD_ORES = create("gold_ores"); + public static final Tag IRON_ORES = create("iron_ores"); + public static final Tag DIAMOND_ORES = create("diamond_ores"); + public static final Tag REDSTONE_ORES = create("redstone_ores"); + public static final Tag LAPIS_ORES = create("lapis_ores"); + public static final Tag COAL_ORES = create("coal_ores"); + public static final Tag EMERALD_ORES = create("emerald_ores"); + public static final Tag COPPER_ORES = create("copper_ores"); + public static final Tag DIRT = create("dirt"); + public static final Tag TERRACOTTA = create("terracotta"); + public static final Tag COMPLETES_FIND_TREE_TUTORIAL = create("completes_find_tree_tutorial"); + public static final Tag SHULKER_BOXES = create("shulker_boxes"); + public static final Tag SIGNS = create("signs"); + public static final Tag HANGING_SIGNS = create("hanging_signs"); + public static final Tag BEE_FOOD = create("bee_food"); + public static final Tag BANNERS = create("banners"); public static final Tag PIGLIN_REPELLENTS = create("piglin_repellents"); public static final Tag PIGLIN_LOVED = create("piglin_loved"); public static final Tag IGNORED_BY_PIGLIN_BABIES = create("ignored_by_piglin_babies"); public static final Tag PIGLIN_SAFE_ARMOR = create("piglin_safe_armor"); public static final Tag DUPLICATES_ALLAYS = create("duplicates_allays"); public static final Tag BREWING_FUEL = create("brewing_fuel"); - public static final Tag SHULKER_BOXES = create("shulker_boxes"); public static final Tag EGGS = create("eggs"); public static final Tag MEAT = create("meat"); public static final Tag SNIFFER_FOOD = create("sniffer_food"); @@ -98,9 +115,11 @@ public final class ItemTag { public static final Tag CAT_FOOD = create("cat_food"); public static final Tag HORSE_FOOD = create("horse_food"); public static final Tag HORSE_TEMPT_ITEMS = create("horse_tempt_items"); + public static final Tag HARNESSES = create("harnesses"); + public static final Tag HAPPY_GHAST_FOOD = create("happy_ghast_food"); + public static final Tag HAPPY_GHAST_TEMPT_ITEMS = create("happy_ghast_tempt_items"); public static final Tag CAMEL_FOOD = create("camel_food"); public static final Tag ARMADILLO_FOOD = create("armadillo_food"); - public static final Tag BEE_FOOD = create("bee_food"); public static final Tag CHICKEN_FOOD = create("chicken_food"); public static final Tag FROG_FOOD = create("frog_food"); public static final Tag HOGLIN_FOOD = create("hoglin_food"); @@ -117,24 +136,10 @@ public final class ItemTag { public static final Tag PARROT_FOOD = create("parrot_food"); public static final Tag PARROT_POISONOUS_FOOD = create("parrot_poisonous_food"); public static final Tag AXOLOTL_FOOD = create("axolotl_food"); - public static final Tag GOLD_ORES = create("gold_ores"); - public static final Tag IRON_ORES = create("iron_ores"); - public static final Tag DIAMOND_ORES = create("diamond_ores"); - public static final Tag REDSTONE_ORES = create("redstone_ores"); - public static final Tag LAPIS_ORES = create("lapis_ores"); - public static final Tag COAL_ORES = create("coal_ores"); - public static final Tag EMERALD_ORES = create("emerald_ores"); - public static final Tag COPPER_ORES = create("copper_ores"); public static final Tag NON_FLAMMABLE_WOOD = create("non_flammable_wood"); - public static final Tag SOUL_FIRE_BASE_BLOCKS = create("soul_fire_base_blocks"); - public static final Tag CANDLES = create("candles"); - public static final Tag DIRT = create("dirt"); - public static final Tag TERRACOTTA = create("terracotta"); - public static final Tag COMPLETES_FIND_TREE_TUTORIAL = create("completes_find_tree_tutorial"); public static final Tag BOATS = create("boats"); public static final Tag CHEST_BOATS = create("chest_boats"); public static final Tag FISHES = create("fishes"); - public static final Tag SIGNS = create("signs"); public static final Tag CREEPER_DROP_MUSIC_DISCS = create("creeper_drop_music_discs"); public static final Tag COALS = create("coals"); public static final Tag ARROWS = create("arrows"); @@ -157,10 +162,8 @@ public final class ItemTag { public static final Tag REPAIRS_WOLF_ARMOR = create("repairs_wolf_armor"); public static final Tag STONE_CRAFTING_MATERIALS = create("stone_crafting_materials"); public static final Tag FREEZE_IMMUNE_WEARABLES = create("freeze_immune_wearables"); - public static final Tag DAMPENS_VIBRATIONS = create("dampens_vibrations"); public static final Tag CLUSTER_MAX_HARVESTABLES = create("cluster_max_harvestables"); public static final Tag COMPASSES = create("compasses"); - public static final Tag HANGING_SIGNS = create("hanging_signs"); public static final Tag CREEPER_IGNITERS = create("creeper_igniters"); public static final Tag NOTEBLOCK_TOP_INSTRUMENTS = create("noteblock_top_instruments"); public static final Tag FOOT_ARMOR = create("foot_armor"); diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockInteractTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockInteractTranslator.java index b58e29def..512670d19 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockInteractTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockInteractTranslator.java @@ -75,8 +75,9 @@ public class BedrockInteractTranslator extends PacketTranslator session.sendDownstreamGamePacket(attackPacket); break; case LEAVE_VEHICLE: - ServerboundPlayerCommandPacket sneakPacket = new ServerboundPlayerCommandPacket(entity.getEntityId(), PlayerState.START_SNEAKING); - session.sendDownstreamGamePacket(sneakPacket); + // TODO ensure that shifting is actually sent!!! + //ServerboundPlayerCommandPacket sneakPacket = new ServerboundPlayerCommandPacket(entity.getEntityId(), PlayerState); + //session.sendDownstreamGamePacket(sneakPacket); // Reset steering to avoid these accidentally triggering session#isHandsBusy session.setSteeringLeft(false); diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockSetPlayerGameTypeTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockSetPlayerGameTypeTranslator.java index 0590ca0ad..5160cd2c0 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockSetPlayerGameTypeTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/bedrock/entity/player/BedrockSetPlayerGameTypeTranslator.java @@ -26,12 +26,12 @@ package org.geysermc.geyser.translator.protocol.bedrock.entity.player; import org.cloudburstmc.protocol.bedrock.packet.SetPlayerGameTypePacket; -import org.geysermc.geyser.Permissions; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; import org.geysermc.geyser.util.EntityUtils; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.GameMode; +import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.player.ServerboundChangeGameModePacket; /** * In vanilla Bedrock, if you have operator status, this sets the player's gamemode without confirmation from the server. @@ -45,8 +45,13 @@ public class BedrockSetPlayerGameTypeTranslator extends PacketTranslator= 2 && session.hasPermission(Permissions.SERVER_SETTINGS)) { + // Revert to current game mode first - gamemode sending will be done server-authorative + SetPlayerGameTypePacket playerGameTypePacket = new SetPlayerGameTypePacket(); + playerGameTypePacket.setGamemode(EntityUtils.toBedrockGamemode(session.getGameMode()).ordinal()); + session.sendUpstreamPacket(playerGameTypePacket); + + // We will still inform the server that we want to change gamemodes, granted we have the permission to + if (session.getOpPermissionLevel() >= 2) { if (packet.getGamemode() != session.getGameMode().ordinal()) { // Bedrock has more Gamemodes than Java, leading to cases 5 (for "default") and 6 (for "spectator") being sent // https://github.com/CloudburstMC/Protocol/blob/3.0/bedrock-codec/src/main/java/org/cloudburstmc/protocol/bedrock/data/GameType.java @@ -57,12 +62,8 @@ public class BedrockSetPlayerGameTypeTranslator extends PacketTranslator GameMode.SPECTATOR; default -> GameMode.SURVIVAL; }; - session.getGeyser().getWorldManager().setPlayerGameMode(session, gameMode); + session.sendDownstreamGamePacket(new ServerboundChangeGameModePacket(gameMode)); } - } else { - SetPlayerGameTypePacket playerGameTypePacket = new SetPlayerGameTypePacket(); - playerGameTypePacket.setGamemode(EntityUtils.toBedrockGamemode(session.getGameMode()).ordinal()); - session.sendUpstreamPacket(playerGameTypePacket); } } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaClearDialogTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaClearDialogTranslator.java new file mode 100644 index 000000000..9b2411a13 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaClearDialogTranslator.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.translator.protocol.java.dialogues; + +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.protocol.PacketTranslator; +import org.geysermc.geyser.translator.protocol.Translator; +import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ClientboundClearDialogPacket; + +@Translator(packet = ClientboundClearDialogPacket.class) +public class JavaClearDialogTranslator extends PacketTranslator { + + @Override + public void translate(GeyserSession session, ClientboundClearDialogPacket packet) { + + } +} diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaShowDialogGameTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaShowDialogGameTranslator.java new file mode 100644 index 000000000..30431d221 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaShowDialogGameTranslator.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.translator.protocol.java.dialogues; + +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.protocol.PacketTranslator; +import org.geysermc.geyser.translator.protocol.Translator; +import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.ClientboundShowDialogGamePacket; + +@Translator(packet = ClientboundShowDialogGamePacket.class) +public class JavaShowDialogGameTranslator extends PacketTranslator { + + @Override + public void translate(GeyserSession session, ClientboundShowDialogGamePacket packet) { + + } +} diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaShowDialogueConfigurationTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaShowDialogueConfigurationTranslator.java new file mode 100644 index 000000000..1cd2de17d --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaShowDialogueConfigurationTranslator.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.translator.protocol.java.dialogues; + +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.protocol.PacketTranslator; +import org.geysermc.geyser.translator.protocol.Translator; +import org.geysermc.mcprotocollib.protocol.packet.configuration.clientbound.ClientboundShowDialogConfigurationPacket; + +@Translator(packet = ClientboundShowDialogConfigurationPacket.class) +public class JavaShowDialogueConfigurationTranslator extends PacketTranslator { + + @Override + public void translate(GeyserSession session, ClientboundShowDialogConfigurationPacket packet) { + + } +} diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaTrackedWaypointTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaTrackedWaypointTranslator.java new file mode 100644 index 000000000..a0de8ba6c --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/level/JavaTrackedWaypointTranslator.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.translator.protocol.java.level; + +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.protocol.PacketTranslator; +import org.geysermc.geyser.translator.protocol.Translator; +import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.level.ClientboundTrackedWaypointPacket; + +@Translator(packet = ClientboundTrackedWaypointPacket.class) +public class JavaTrackedWaypointTranslator extends PacketTranslator { + + @Override + public void translate(GeyserSession session, ClientboundTrackedWaypointPacket packet) { + } +} diff --git a/gradle.properties b/gradle.properties index ef4eac81e..d5fc8c0f7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,5 +8,5 @@ org.gradle.vfs.watch=false group=org.geysermc id=geyser -version=2.7.1-SNAPSHOT +version=2.8.0-SNAPSHOT description=Allows for players from Minecraft: Bedrock Edition to join Minecraft: Java Edition servers. diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ce4d1a3b5..08498f99d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,7 +14,7 @@ protocol-common = "3.0.0.Beta6-20250506.012145-17" protocol-codec = "3.0.0.Beta6-20250506.012145-17" raknet = "1.0.0.CR3-20250218.160705-18" minecraftauth = "4.1.1" -mcprotocollib = "1.21.5-20250509.144049-29" +mcprotocollib = "1.21.6-SNAPSHOT" adventure = "4.14.0" adventure-platform = "4.3.0" junit = "5.9.2" From e6668b60b3c3d69860b6832b551235c3fe102a25 Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Sun, 1 Jun 2025 21:11:08 +0200 Subject: [PATCH 02/62] It is alive! Preliminarily dropped support for 1.21.50/60, lots of todo's --- .../geysermc/geyser/network/GameProtocol.java | 14 +- .../populator/BlockRegistryPopulator.java | 11 +- .../populator/ItemRegistryPopulator.java | 54 +- .../populator/TagRegistryPopulator.java | 6 +- .../conversion/Conversion800_786.java | 41 + .../resources/java/item_data_components.json | 5027 +++++++++-------- core/src/main/resources/mappings | 2 +- 7 files changed, 2765 insertions(+), 2390 deletions(-) create mode 100644 core/src/main/java/org/geysermc/geyser/registry/populator/conversion/Conversion800_786.java diff --git a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java index 04f7a9153..3569a2bed 100644 --- a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java +++ b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java @@ -27,8 +27,6 @@ package org.geysermc.geyser.network; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec; -import org.cloudburstmc.protocol.bedrock.codec.v766.Bedrock_v766; -import org.cloudburstmc.protocol.bedrock.codec.v776.Bedrock_v776; import org.cloudburstmc.protocol.bedrock.codec.v786.Bedrock_v786; import org.cloudburstmc.protocol.bedrock.codec.v800.Bedrock_v800; import org.cloudburstmc.protocol.bedrock.netty.codec.packet.BedrockPacketCodec; @@ -65,12 +63,12 @@ public final class GameProtocol { private static final PacketCodec DEFAULT_JAVA_CODEC = MinecraftCodec.CODEC; static { - SUPPORTED_BEDROCK_CODECS.add(CodecProcessor.processCodec(Bedrock_v766.CODEC.toBuilder() - .minecraftVersion("1.21.50 - 1.21.51") - .build())); - SUPPORTED_BEDROCK_CODECS.add(CodecProcessor.processCodec(Bedrock_v776.CODEC.toBuilder() - .minecraftVersion("1.21.60 - 1.21.62") - .build())); + //SUPPORTED_BEDROCK_CODECS.add(CodecProcessor.processCodec(Bedrock_v766.CODEC.toBuilder() + // .minecraftVersion("1.21.50 - 1.21.51") + // .build())); + //SUPPORTED_BEDROCK_CODECS.add(CodecProcessor.processCodec(Bedrock_v776.CODEC.toBuilder() + // .minecraftVersion("1.21.60 - 1.21.62") + // .build())); SUPPORTED_BEDROCK_CODECS.add(CodecProcessor.processCodec(Bedrock_v786.CODEC.toBuilder() .minecraftVersion("1.21.70 - 1.21.73") .build())); diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java index 10d9c8fe2..3e8b049fb 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java @@ -42,8 +42,6 @@ import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.nbt.NbtMapBuilder; import org.cloudburstmc.nbt.NbtType; import org.cloudburstmc.nbt.NbtUtils; -import org.cloudburstmc.protocol.bedrock.codec.v766.Bedrock_v766; -import org.cloudburstmc.protocol.bedrock.codec.v776.Bedrock_v776; import org.cloudburstmc.protocol.bedrock.codec.v786.Bedrock_v786; import org.cloudburstmc.protocol.bedrock.codec.v800.Bedrock_v800; import org.cloudburstmc.protocol.bedrock.data.BlockPropertyData; @@ -58,8 +56,7 @@ import org.geysermc.geyser.level.block.type.Block; import org.geysermc.geyser.level.block.type.BlockState; import org.geysermc.geyser.level.block.type.FlowerPotBlock; import org.geysermc.geyser.registry.BlockRegistries; -import org.geysermc.geyser.registry.populator.conversion.Conversion776_766; -import org.geysermc.geyser.registry.populator.conversion.Conversion786_776; +import org.geysermc.geyser.registry.populator.conversion.Conversion800_786; import org.geysermc.geyser.registry.type.BlockMappings; import org.geysermc.geyser.registry.type.GeyserBedrockBlock; @@ -119,9 +116,9 @@ public final class BlockRegistryPopulator { private static void registerBedrockBlocks() { var blockMappers = ImmutableMap., Remapper>builder() - .put(ObjectIntPair.of("1_21_50", Bedrock_v766.CODEC.getProtocolVersion()), Conversion776_766::remapBlock) - .put(ObjectIntPair.of("1_21_60", Bedrock_v776.CODEC.getProtocolVersion()), Conversion786_776::remapBlock) - .put(ObjectIntPair.of("1_21_70", Bedrock_v786.CODEC.getProtocolVersion()), tag -> tag) + //.put(ObjectIntPair.of("1_21_50", Bedrock_v766.CODEC.getProtocolVersion()), Conversion776_766::remapBlock) + //.put(ObjectIntPair.of("1_21_60", Bedrock_v776.CODEC.getProtocolVersion()), Conversion786_776::remapBlock) + .put(ObjectIntPair.of("1_21_70", Bedrock_v786.CODEC.getProtocolVersion()), Conversion800_786::remapBlock) .put(ObjectIntPair.of("1_21_80", Bedrock_v800.CODEC.getProtocolVersion()), tag -> tag) .build(); diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java index bdf9c285e..46723121e 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java @@ -45,8 +45,6 @@ import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.nbt.NbtMapBuilder; import org.cloudburstmc.nbt.NbtType; import org.cloudburstmc.nbt.NbtUtils; -import org.cloudburstmc.protocol.bedrock.codec.v766.Bedrock_v766; -import org.cloudburstmc.protocol.bedrock.codec.v776.Bedrock_v776; import org.cloudburstmc.protocol.bedrock.codec.v786.Bedrock_v786; import org.cloudburstmc.protocol.bedrock.codec.v800.Bedrock_v800; import org.cloudburstmc.protocol.bedrock.data.definitions.BlockDefinition; @@ -113,24 +111,46 @@ public class ItemRegistryPopulator { public static void populate() { // 1.21.5 + //Map itemFallbacks = new HashMap<>(); + //itemFallbacks.put(Items.BUSH, Items.SHORT_GRASS); + //itemFallbacks.put(Items.CACTUS_FLOWER, Items.BUBBLE_CORAL_FAN); + //itemFallbacks.put(Items.FIREFLY_BUSH, Items.SHORT_GRASS); + //itemFallbacks.put(Items.LEAF_LITTER, Items.PINK_PETALS); + //itemFallbacks.put(Items.SHORT_DRY_GRASS, Items.DEAD_BUSH); + //itemFallbacks.put(Items.TALL_DRY_GRASS, Items.TALL_GRASS); + //itemFallbacks.put(Items.WILDFLOWERS, Items.PINK_PETALS); + //itemFallbacks.put(Items.TEST_BLOCK, Items.STRUCTURE_BLOCK); + //itemFallbacks.put(Items.TEST_INSTANCE_BLOCK, Items.JIGSAW); + //itemFallbacks.put(Items.BLUE_EGG, Items.EGG); + //itemFallbacks.put(Items.BROWN_EGG, Items.EGG); + + // 1.21.6 Map itemFallbacks = new HashMap<>(); - itemFallbacks.put(Items.BUSH, Items.SHORT_GRASS); - itemFallbacks.put(Items.CACTUS_FLOWER, Items.BUBBLE_CORAL_FAN); - itemFallbacks.put(Items.FIREFLY_BUSH, Items.SHORT_GRASS); - itemFallbacks.put(Items.LEAF_LITTER, Items.PINK_PETALS); - itemFallbacks.put(Items.SHORT_DRY_GRASS, Items.DEAD_BUSH); - itemFallbacks.put(Items.TALL_DRY_GRASS, Items.TALL_GRASS); - itemFallbacks.put(Items.WILDFLOWERS, Items.PINK_PETALS); - itemFallbacks.put(Items.TEST_BLOCK, Items.STRUCTURE_BLOCK); - itemFallbacks.put(Items.TEST_INSTANCE_BLOCK, Items.JIGSAW); - itemFallbacks.put(Items.BLUE_EGG, Items.EGG); - itemFallbacks.put(Items.BROWN_EGG, Items.EGG); + itemFallbacks.put(Items.BLACK_HARNESS, Items.SADDLE); + itemFallbacks.put(Items.BLUE_HARNESS, Items.SADDLE); + itemFallbacks.put(Items.BROWN_HARNESS, Items.SADDLE); + itemFallbacks.put(Items.RED_HARNESS, Items.SADDLE); + itemFallbacks.put(Items.GREEN_HARNESS, Items.SADDLE); + itemFallbacks.put(Items.YELLOW_HARNESS, Items.SADDLE); + itemFallbacks.put(Items.ORANGE_HARNESS, Items.SADDLE); + itemFallbacks.put(Items.MAGENTA_HARNESS, Items.SADDLE); + itemFallbacks.put(Items.LIGHT_BLUE_HARNESS, Items.SADDLE); + itemFallbacks.put(Items.LIME_HARNESS, Items.SADDLE); + itemFallbacks.put(Items.PINK_HARNESS, Items.SADDLE); + itemFallbacks.put(Items.GRAY_HARNESS, Items.SADDLE); + itemFallbacks.put(Items.CYAN_HARNESS, Items.SADDLE); + itemFallbacks.put(Items.PURPLE_HARNESS, Items.SADDLE); + itemFallbacks.put(Items.LIGHT_GRAY_HARNESS, Items.SADDLE); + itemFallbacks.put(Items.WHITE_HARNESS, Items.SADDLE); + itemFallbacks.put(Items.HAPPY_GHAST_SPAWN_EGG, Items.EGG); + itemFallbacks.put(Items.DRIED_GHAST, Items.PLAYER_HEAD); + itemFallbacks.put(Items.MUSIC_DISC_TEARS, Items.MUSIC_DISC_5); List paletteVersions = new ArrayList<>(2); - paletteVersions.add(new PaletteVersion("1_21_50", Bedrock_v766.CODEC.getProtocolVersion(), itemFallbacks, (item, mapping) -> mapping)); - paletteVersions.add(new PaletteVersion("1_21_60", Bedrock_v776.CODEC.getProtocolVersion(), itemFallbacks, (item, mapping) -> mapping)); - paletteVersions.add(new PaletteVersion("1_21_70", Bedrock_v786.CODEC.getProtocolVersion())); - paletteVersions.add(new PaletteVersion("1_21_80", Bedrock_v800.CODEC.getProtocolVersion())); + //paletteVersions.add(new PaletteVersion("1_21_50", Bedrock_v766.CODEC.getProtocolVersion(), itemFallbacks, (item, mapping) -> mapping)); + //paletteVersions.add(new PaletteVersion("1_21_60", Bedrock_v776.CODEC.getProtocolVersion(), itemFallbacks, (item, mapping) -> mapping)); + paletteVersions.add(new PaletteVersion("1_21_70", Bedrock_v786.CODEC.getProtocolVersion(), itemFallbacks, (item, mapping) -> mapping)); + paletteVersions.add(new PaletteVersion("1_21_80", Bedrock_v800.CODEC.getProtocolVersion(), Map.of(Items.MUSIC_DISC_TEARS, Items.MUSIC_DISC_5), (item, mapping) -> mapping)); GeyserBootstrap bootstrap = GeyserImpl.getInstance().getBootstrap(); diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/TagRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/TagRegistryPopulator.java index c9f74eef4..851ac77cb 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/TagRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/TagRegistryPopulator.java @@ -33,8 +33,6 @@ import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenCustomHashMap; import it.unimi.dsi.fastutil.objects.ObjectIntPair; -import org.cloudburstmc.protocol.bedrock.codec.v766.Bedrock_v766; -import org.cloudburstmc.protocol.bedrock.codec.v776.Bedrock_v776; import org.cloudburstmc.protocol.bedrock.codec.v786.Bedrock_v786; import org.cloudburstmc.protocol.bedrock.codec.v800.Bedrock_v800; import org.geysermc.geyser.GeyserBootstrap; @@ -69,8 +67,8 @@ public final class TagRegistryPopulator { }; List> paletteVersions = List.of( - ObjectIntPair.of("1_21_50", Bedrock_v766.CODEC.getProtocolVersion()), - ObjectIntPair.of("1_21_60", Bedrock_v776.CODEC.getProtocolVersion()), +// ObjectIntPair.of("1_21_50", Bedrock_v766.CODEC.getProtocolVersion()), +// ObjectIntPair.of("1_21_60", Bedrock_v776.CODEC.getProtocolVersion()), ObjectIntPair.of("1_21_70", Bedrock_v786.CODEC.getProtocolVersion()), // Not a typo, they're the same file ObjectIntPair.of("1_21_70", Bedrock_v800.CODEC.getProtocolVersion()) diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/conversion/Conversion800_786.java b/core/src/main/java/org/geysermc/geyser/registry/populator/conversion/Conversion800_786.java new file mode 100644 index 000000000..034424445 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/conversion/Conversion800_786.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.registry.populator.conversion; + +import org.cloudburstmc.nbt.NbtMap; + +public class Conversion800_786 { + + public static NbtMap remapBlock(NbtMap nbtMap) { + + final String name = nbtMap.getString("name"); + if (name.equals("minecraft:dried_ghast")) { + return ConversionHelper.withoutStates("unknown"); + } + + return nbtMap; + } +} diff --git a/core/src/main/resources/java/item_data_components.json b/core/src/main/resources/java/item_data_components.json index 6ff0f613d..98d239312 100644 --- a/core/src/main/resources/java/item_data_components.json +++ b/core/src/main/resources/java/item_data_components.json @@ -4,7 +4,7 @@ "key": "minecraft:air", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw1taW5lY3JhZnQ6YWly", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAE2Jsb2NrLm1pbmVjcmFmdC5haXIA", @@ -20,7 +20,7 @@ "key": "minecraft:stone", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw9taW5lY3JhZnQ6c3RvbmU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFWJsb2NrLm1pbmVjcmFmdC5zdG9uZQA=", @@ -36,7 +36,7 @@ "key": "minecraft:granite", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxFtaW5lY3JhZnQ6Z3Jhbml0ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2Jsb2NrLm1pbmVjcmFmdC5ncmFuaXRlAA==", @@ -52,7 +52,7 @@ "key": "minecraft:polished_granite", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6cG9saXNoZWRfZ3Jhbml0ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF9ncmFuaXRlAA==", @@ -68,7 +68,7 @@ "key": "minecraft:diorite", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxFtaW5lY3JhZnQ6ZGlvcml0ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2Jsb2NrLm1pbmVjcmFmdC5kaW9yaXRlAA==", @@ -84,7 +84,7 @@ "key": "minecraft:polished_diorite", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6cG9saXNoZWRfZGlvcml0ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF9kaW9yaXRlAA==", @@ -100,7 +100,7 @@ "key": "minecraft:andesite", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6YW5kZXNpdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGJsb2NrLm1pbmVjcmFmdC5hbmRlc2l0ZQA=", @@ -116,7 +116,7 @@ "key": "minecraft:polished_andesite", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6cG9saXNoZWRfYW5kZXNpdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF9hbmRlc2l0ZQA=", @@ -132,7 +132,7 @@ "key": "minecraft:deepslate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6ZGVlcHNsYXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5kZWVwc2xhdGUA", @@ -148,7 +148,7 @@ "key": "minecraft:cobbled_deepslate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6Y29iYmxlZF9kZWVwc2xhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5jb2JibGVkX2RlZXBzbGF0ZQA=", @@ -164,7 +164,7 @@ "key": "minecraft:polished_deepslate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6cG9saXNoZWRfZGVlcHNsYXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF9kZWVwc2xhdGUA", @@ -180,7 +180,7 @@ "key": "minecraft:calcite", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxFtaW5lY3JhZnQ6Y2FsY2l0ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2Jsb2NrLm1pbmVjcmFmdC5jYWxjaXRlAA==", @@ -196,7 +196,7 @@ "key": "minecraft:tuff", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw5taW5lY3JhZnQ6dHVmZg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFGJsb2NrLm1pbmVjcmFmdC50dWZmAA==", @@ -212,7 +212,7 @@ "key": "minecraft:tuff_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6dHVmZl9zbGFi", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC50dWZmX3NsYWIA", @@ -228,7 +228,7 @@ "key": "minecraft:tuff_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6dHVmZl9zdGFpcnM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC50dWZmX3N0YWlycwA=", @@ -244,7 +244,7 @@ "key": "minecraft:tuff_wall", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6dHVmZl93YWxs", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC50dWZmX3dhbGwA", @@ -260,7 +260,7 @@ "key": "minecraft:chiseled_tuff", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6Y2hpc2VsZWRfdHVmZg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5jaGlzZWxlZF90dWZmAA==", @@ -276,7 +276,7 @@ "key": "minecraft:polished_tuff", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6cG9saXNoZWRfdHVmZg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF90dWZmAA==", @@ -292,7 +292,7 @@ "key": "minecraft:polished_tuff_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6cG9saXNoZWRfdHVmZl9zbGFi", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF90dWZmX3NsYWIA", @@ -308,7 +308,7 @@ "key": "minecraft:polished_tuff_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6cG9saXNoZWRfdHVmZl9zdGFpcnM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF90dWZmX3N0YWlycwA=", @@ -324,7 +324,7 @@ "key": "minecraft:polished_tuff_wall", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6cG9saXNoZWRfdHVmZl93YWxs", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF90dWZmX3dhbGwA", @@ -340,7 +340,7 @@ "key": "minecraft:tuff_bricks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6dHVmZl9icmlja3M=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC50dWZmX2JyaWNrcwA=", @@ -356,7 +356,7 @@ "key": "minecraft:tuff_brick_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6dHVmZl9icmlja19zbGFi", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC50dWZmX2JyaWNrX3NsYWIA", @@ -372,7 +372,7 @@ "key": "minecraft:tuff_brick_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6dHVmZl9icmlja19zdGFpcnM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC50dWZmX2JyaWNrX3N0YWlycwA=", @@ -388,7 +388,7 @@ "key": "minecraft:tuff_brick_wall", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6dHVmZl9icmlja193YWxs", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC50dWZmX2JyaWNrX3dhbGwA", @@ -404,7 +404,7 @@ "key": "minecraft:chiseled_tuff_bricks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6Y2hpc2VsZWRfdHVmZl9icmlja3M=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5jaGlzZWxlZF90dWZmX2JyaWNrcwA=", @@ -420,7 +420,7 @@ "key": "minecraft:dripstone_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6ZHJpcHN0b25lX2Jsb2Nr", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5kcmlwc3RvbmVfYmxvY2sA", @@ -436,7 +436,7 @@ "key": "minecraft:grass_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6Z3Jhc3NfYmxvY2s=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5ncmFzc19ibG9jawA=", @@ -452,7 +452,7 @@ "key": "minecraft:dirt", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw5taW5lY3JhZnQ6ZGlydA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFGJsb2NrLm1pbmVjcmFmdC5kaXJ0AA==", @@ -468,7 +468,7 @@ "key": "minecraft:coarse_dirt", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6Y29hcnNlX2RpcnQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5jb2Fyc2VfZGlydAA=", @@ -484,7 +484,7 @@ "key": "minecraft:podzol", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxBtaW5lY3JhZnQ6cG9kem9s", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFmJsb2NrLm1pbmVjcmFmdC5wb2R6b2wA", @@ -500,7 +500,7 @@ "key": "minecraft:rooted_dirt", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6cm9vdGVkX2RpcnQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5yb290ZWRfZGlydAA=", @@ -516,7 +516,7 @@ "key": "minecraft:mud", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw1taW5lY3JhZnQ6bXVk", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAE2Jsb2NrLm1pbmVjcmFmdC5tdWQA", @@ -532,7 +532,7 @@ "key": "minecraft:crimson_nylium", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6Y3JpbXNvbl9ueWxpdW0=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5jcmltc29uX255bGl1bQA=", @@ -548,7 +548,7 @@ "key": "minecraft:warped_nylium", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6d2FycGVkX255bGl1bQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC53YXJwZWRfbnlsaXVtAA==", @@ -564,7 +564,7 @@ "key": "minecraft:cobblestone", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6Y29iYmxlc3RvbmU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5jb2JibGVzdG9uZQA=", @@ -580,7 +580,7 @@ "key": "minecraft:oak_planks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6b2FrX3BsYW5rcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5vYWtfcGxhbmtzAA==", @@ -596,7 +596,7 @@ "key": "minecraft:spruce_planks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6c3BydWNlX3BsYW5rcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5zcHJ1Y2VfcGxhbmtzAA==", @@ -612,7 +612,7 @@ "key": "minecraft:birch_planks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6YmlyY2hfcGxhbmtz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5iaXJjaF9wbGFua3MA", @@ -628,7 +628,7 @@ "key": "minecraft:jungle_planks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6anVuZ2xlX3BsYW5rcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5qdW5nbGVfcGxhbmtzAA==", @@ -644,7 +644,7 @@ "key": "minecraft:acacia_planks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6YWNhY2lhX3BsYW5rcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5hY2FjaWFfcGxhbmtzAA==", @@ -660,7 +660,7 @@ "key": "minecraft:cherry_planks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6Y2hlcnJ5X3BsYW5rcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5jaGVycnlfcGxhbmtzAA==", @@ -676,7 +676,7 @@ "key": "minecraft:dark_oak_planks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6ZGFya19vYWtfcGxhbmtz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5kYXJrX29ha19wbGFua3MA", @@ -692,7 +692,7 @@ "key": "minecraft:pale_oak_planks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6cGFsZV9vYWtfcGxhbmtz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5wYWxlX29ha19wbGFua3MA", @@ -708,7 +708,7 @@ "key": "minecraft:mangrove_planks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6bWFuZ3JvdmVfcGxhbmtz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5tYW5ncm92ZV9wbGFua3MA", @@ -724,7 +724,7 @@ "key": "minecraft:bamboo_planks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6YmFtYm9vX3BsYW5rcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5iYW1ib29fcGxhbmtzAA==", @@ -740,7 +740,7 @@ "key": "minecraft:crimson_planks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6Y3JpbXNvbl9wbGFua3M=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5jcmltc29uX3BsYW5rcwA=", @@ -756,7 +756,7 @@ "key": "minecraft:warped_planks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6d2FycGVkX3BsYW5rcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC53YXJwZWRfcGxhbmtzAA==", @@ -772,7 +772,7 @@ "key": "minecraft:bamboo_mosaic", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6YmFtYm9vX21vc2FpYw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5iYW1ib29fbW9zYWljAA==", @@ -788,7 +788,7 @@ "key": "minecraft:oak_sapling", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6b2FrX3NhcGxpbmc=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5vYWtfc2FwbGluZwA=", @@ -804,7 +804,7 @@ "key": "minecraft:spruce_sapling", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6c3BydWNlX3NhcGxpbmc=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5zcHJ1Y2Vfc2FwbGluZwA=", @@ -820,7 +820,7 @@ "key": "minecraft:birch_sapling", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6YmlyY2hfc2FwbGluZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5iaXJjaF9zYXBsaW5nAA==", @@ -836,7 +836,7 @@ "key": "minecraft:jungle_sapling", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6anVuZ2xlX3NhcGxpbmc=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5qdW5nbGVfc2FwbGluZwA=", @@ -852,7 +852,7 @@ "key": "minecraft:acacia_sapling", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6YWNhY2lhX3NhcGxpbmc=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5hY2FjaWFfc2FwbGluZwA=", @@ -868,7 +868,7 @@ "key": "minecraft:cherry_sapling", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6Y2hlcnJ5X3NhcGxpbmc=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5jaGVycnlfc2FwbGluZwA=", @@ -884,7 +884,7 @@ "key": "minecraft:dark_oak_sapling", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6ZGFya19vYWtfc2FwbGluZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5kYXJrX29ha19zYXBsaW5nAA==", @@ -900,7 +900,7 @@ "key": "minecraft:pale_oak_sapling", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6cGFsZV9vYWtfc2FwbGluZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5wYWxlX29ha19zYXBsaW5nAA==", @@ -916,7 +916,7 @@ "key": "minecraft:mangrove_propagule", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6bWFuZ3JvdmVfcHJvcGFndWxl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5tYW5ncm92ZV9wcm9wYWd1bGUA", @@ -932,7 +932,7 @@ "key": "minecraft:bedrock", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxFtaW5lY3JhZnQ6YmVkcm9jaw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2Jsb2NrLm1pbmVjcmFmdC5iZWRyb2NrAA==", @@ -948,7 +948,7 @@ "key": "minecraft:sand", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw5taW5lY3JhZnQ6c2FuZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFGJsb2NrLm1pbmVjcmFmdC5zYW5kAA==", @@ -964,7 +964,7 @@ "key": "minecraft:suspicious_sand", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6c3VzcGljaW91c19zYW5k", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5zdXNwaWNpb3VzX3NhbmQA", @@ -980,7 +980,7 @@ "key": "minecraft:suspicious_gravel", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6c3VzcGljaW91c19ncmF2ZWw=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5zdXNwaWNpb3VzX2dyYXZlbAA=", @@ -996,7 +996,7 @@ "key": "minecraft:red_sand", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6cmVkX3NhbmQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGJsb2NrLm1pbmVjcmFmdC5yZWRfc2FuZAA=", @@ -1012,7 +1012,7 @@ "key": "minecraft:gravel", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxBtaW5lY3JhZnQ6Z3JhdmVs", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFmJsb2NrLm1pbmVjcmFmdC5ncmF2ZWwA", @@ -1028,7 +1028,7 @@ "key": "minecraft:coal_ore", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6Y29hbF9vcmU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGJsb2NrLm1pbmVjcmFmdC5jb2FsX29yZQA=", @@ -1044,7 +1044,7 @@ "key": "minecraft:deepslate_coal_ore", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6ZGVlcHNsYXRlX2NvYWxfb3Jl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5kZWVwc2xhdGVfY29hbF9vcmUA", @@ -1060,7 +1060,7 @@ "key": "minecraft:iron_ore", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6aXJvbl9vcmU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGJsb2NrLm1pbmVjcmFmdC5pcm9uX29yZQA=", @@ -1076,7 +1076,7 @@ "key": "minecraft:deepslate_iron_ore", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6ZGVlcHNsYXRlX2lyb25fb3Jl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5kZWVwc2xhdGVfaXJvbl9vcmUA", @@ -1092,7 +1092,7 @@ "key": "minecraft:copper_ore", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6Y29wcGVyX29yZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5jb3BwZXJfb3JlAA==", @@ -1108,7 +1108,7 @@ "key": "minecraft:deepslate_copper_ore", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6ZGVlcHNsYXRlX2NvcHBlcl9vcmU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5kZWVwc2xhdGVfY29wcGVyX29yZQA=", @@ -1124,7 +1124,7 @@ "key": "minecraft:gold_ore", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6Z29sZF9vcmU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGJsb2NrLm1pbmVjcmFmdC5nb2xkX29yZQA=", @@ -1140,7 +1140,7 @@ "key": "minecraft:deepslate_gold_ore", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6ZGVlcHNsYXRlX2dvbGRfb3Jl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5kZWVwc2xhdGVfZ29sZF9vcmUA", @@ -1156,7 +1156,7 @@ "key": "minecraft:redstone_ore", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6cmVkc3RvbmVfb3Jl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5yZWRzdG9uZV9vcmUA", @@ -1172,7 +1172,7 @@ "key": "minecraft:deepslate_redstone_ore", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6ZGVlcHNsYXRlX3JlZHN0b25lX29yZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5kZWVwc2xhdGVfcmVkc3RvbmVfb3JlAA==", @@ -1188,7 +1188,7 @@ "key": "minecraft:emerald_ore", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6ZW1lcmFsZF9vcmU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5lbWVyYWxkX29yZQA=", @@ -1204,7 +1204,7 @@ "key": "minecraft:deepslate_emerald_ore", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6ZGVlcHNsYXRlX2VtZXJhbGRfb3Jl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5kZWVwc2xhdGVfZW1lcmFsZF9vcmUA", @@ -1220,7 +1220,7 @@ "key": "minecraft:lapis_ore", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6bGFwaXNfb3Jl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5sYXBpc19vcmUA", @@ -1236,7 +1236,7 @@ "key": "minecraft:deepslate_lapis_ore", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6ZGVlcHNsYXRlX2xhcGlzX29yZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5kZWVwc2xhdGVfbGFwaXNfb3JlAA==", @@ -1252,7 +1252,7 @@ "key": "minecraft:diamond_ore", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6ZGlhbW9uZF9vcmU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5kaWFtb25kX29yZQA=", @@ -1268,7 +1268,7 @@ "key": "minecraft:deepslate_diamond_ore", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6ZGVlcHNsYXRlX2RpYW1vbmRfb3Jl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5kZWVwc2xhdGVfZGlhbW9uZF9vcmUA", @@ -1284,7 +1284,7 @@ "key": "minecraft:nether_gold_ore", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6bmV0aGVyX2dvbGRfb3Jl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5uZXRoZXJfZ29sZF9vcmUA", @@ -1300,7 +1300,7 @@ "key": "minecraft:nether_quartz_ore", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6bmV0aGVyX3F1YXJ0el9vcmU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5uZXRoZXJfcXVhcnR6X29yZQA=", @@ -1316,7 +1316,7 @@ "key": "minecraft:ancient_debris", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:damage_resistant": "GBFtaW5lY3JhZnQ6aXNfZmlyZQ==", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6YW5jaWVudF9kZWJyaXM=", @@ -1333,7 +1333,7 @@ "key": "minecraft:coal_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6Y29hbF9ibG9jaw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5jb2FsX2Jsb2NrAA==", @@ -1349,7 +1349,7 @@ "key": "minecraft:raw_iron_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6cmF3X2lyb25fYmxvY2s=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5yYXdfaXJvbl9ibG9jawA=", @@ -1365,7 +1365,7 @@ "key": "minecraft:raw_copper_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6cmF3X2NvcHBlcl9ibG9jaw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5yYXdfY29wcGVyX2Jsb2NrAA==", @@ -1381,7 +1381,7 @@ "key": "minecraft:raw_gold_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6cmF3X2dvbGRfYmxvY2s=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5yYXdfZ29sZF9ibG9jawA=", @@ -1397,7 +1397,7 @@ "key": "minecraft:heavy_core", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6aGVhdnlfY29yZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5oZWF2eV9jb3JlAA==", @@ -1413,7 +1413,7 @@ "key": "minecraft:amethyst_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6YW1ldGh5c3RfYmxvY2s=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5hbWV0aHlzdF9ibG9jawA=", @@ -1429,7 +1429,7 @@ "key": "minecraft:budding_amethyst", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6YnVkZGluZ19hbWV0aHlzdA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5idWRkaW5nX2FtZXRoeXN0AA==", @@ -1445,7 +1445,7 @@ "key": "minecraft:iron_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6aXJvbl9ibG9jaw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5pcm9uX2Jsb2NrAA==", @@ -1461,7 +1461,7 @@ "key": "minecraft:copper_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6Y29wcGVyX2Jsb2Nr", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5jb3BwZXJfYmxvY2sA", @@ -1477,7 +1477,7 @@ "key": "minecraft:gold_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6Z29sZF9ibG9jaw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5nb2xkX2Jsb2NrAA==", @@ -1493,7 +1493,7 @@ "key": "minecraft:diamond_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6ZGlhbW9uZF9ibG9jaw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5kaWFtb25kX2Jsb2NrAA==", @@ -1509,7 +1509,7 @@ "key": "minecraft:netherite_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:damage_resistant": "GBFtaW5lY3JhZnQ6aXNfZmlyZQ==", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6bmV0aGVyaXRlX2Jsb2Nr", @@ -1526,7 +1526,7 @@ "key": "minecraft:exposed_copper", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6ZXhwb3NlZF9jb3BwZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5leHBvc2VkX2NvcHBlcgA=", @@ -1542,7 +1542,7 @@ "key": "minecraft:weathered_copper", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6d2VhdGhlcmVkX2NvcHBlcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC53ZWF0aGVyZWRfY29wcGVyAA==", @@ -1558,7 +1558,7 @@ "key": "minecraft:oxidized_copper", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6b3hpZGl6ZWRfY29wcGVy", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5veGlkaXplZF9jb3BwZXIA", @@ -1574,7 +1574,7 @@ "key": "minecraft:chiseled_copper", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6Y2hpc2VsZWRfY29wcGVy", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5jaGlzZWxlZF9jb3BwZXIA", @@ -1590,7 +1590,7 @@ "key": "minecraft:exposed_chiseled_copper", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6ZXhwb3NlZF9jaGlzZWxlZF9jb3BwZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5leHBvc2VkX2NoaXNlbGVkX2NvcHBlcgA=", @@ -1606,7 +1606,7 @@ "key": "minecraft:weathered_chiseled_copper", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByNtaW5lY3JhZnQ6d2VhdGhlcmVkX2NoaXNlbGVkX2NvcHBlcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKWJsb2NrLm1pbmVjcmFmdC53ZWF0aGVyZWRfY2hpc2VsZWRfY29wcGVyAA==", @@ -1622,7 +1622,7 @@ "key": "minecraft:oxidized_chiseled_copper", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByJtaW5lY3JhZnQ6b3hpZGl6ZWRfY2hpc2VsZWRfY29wcGVy", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKGJsb2NrLm1pbmVjcmFmdC5veGlkaXplZF9jaGlzZWxlZF9jb3BwZXIA", @@ -1638,7 +1638,7 @@ "key": "minecraft:cut_copper", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6Y3V0X2NvcHBlcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5jdXRfY29wcGVyAA==", @@ -1654,7 +1654,7 @@ "key": "minecraft:exposed_cut_copper", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6ZXhwb3NlZF9jdXRfY29wcGVy", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5leHBvc2VkX2N1dF9jb3BwZXIA", @@ -1670,7 +1670,7 @@ "key": "minecraft:weathered_cut_copper", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6d2VhdGhlcmVkX2N1dF9jb3BwZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC53ZWF0aGVyZWRfY3V0X2NvcHBlcgA=", @@ -1686,7 +1686,7 @@ "key": "minecraft:oxidized_cut_copper", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6b3hpZGl6ZWRfY3V0X2NvcHBlcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5veGlkaXplZF9jdXRfY29wcGVyAA==", @@ -1702,7 +1702,7 @@ "key": "minecraft:cut_copper_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6Y3V0X2NvcHBlcl9zdGFpcnM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5jdXRfY29wcGVyX3N0YWlycwA=", @@ -1718,7 +1718,7 @@ "key": "minecraft:exposed_cut_copper_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByNtaW5lY3JhZnQ6ZXhwb3NlZF9jdXRfY29wcGVyX3N0YWlycw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKWJsb2NrLm1pbmVjcmFmdC5leHBvc2VkX2N1dF9jb3BwZXJfc3RhaXJzAA==", @@ -1734,7 +1734,7 @@ "key": "minecraft:weathered_cut_copper_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByVtaW5lY3JhZnQ6d2VhdGhlcmVkX2N1dF9jb3BwZXJfc3RhaXJz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAK2Jsb2NrLm1pbmVjcmFmdC53ZWF0aGVyZWRfY3V0X2NvcHBlcl9zdGFpcnMA", @@ -1750,7 +1750,7 @@ "key": "minecraft:oxidized_cut_copper_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByRtaW5lY3JhZnQ6b3hpZGl6ZWRfY3V0X2NvcHBlcl9zdGFpcnM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKmJsb2NrLm1pbmVjcmFmdC5veGlkaXplZF9jdXRfY29wcGVyX3N0YWlycwA=", @@ -1766,7 +1766,7 @@ "key": "minecraft:cut_copper_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6Y3V0X2NvcHBlcl9zbGFi", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5jdXRfY29wcGVyX3NsYWIA", @@ -1782,7 +1782,7 @@ "key": "minecraft:exposed_cut_copper_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6ZXhwb3NlZF9jdXRfY29wcGVyX3NsYWI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5leHBvc2VkX2N1dF9jb3BwZXJfc2xhYgA=", @@ -1798,7 +1798,7 @@ "key": "minecraft:weathered_cut_copper_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByNtaW5lY3JhZnQ6d2VhdGhlcmVkX2N1dF9jb3BwZXJfc2xhYg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKWJsb2NrLm1pbmVjcmFmdC53ZWF0aGVyZWRfY3V0X2NvcHBlcl9zbGFiAA==", @@ -1814,7 +1814,7 @@ "key": "minecraft:oxidized_cut_copper_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByJtaW5lY3JhZnQ6b3hpZGl6ZWRfY3V0X2NvcHBlcl9zbGFi", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKGJsb2NrLm1pbmVjcmFmdC5veGlkaXplZF9jdXRfY29wcGVyX3NsYWIA", @@ -1830,7 +1830,7 @@ "key": "minecraft:waxed_copper_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6d2F4ZWRfY29wcGVyX2Jsb2Nr", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC53YXhlZF9jb3BwZXJfYmxvY2sA", @@ -1846,7 +1846,7 @@ "key": "minecraft:waxed_exposed_copper", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6d2F4ZWRfZXhwb3NlZF9jb3BwZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC53YXhlZF9leHBvc2VkX2NvcHBlcgA=", @@ -1862,7 +1862,7 @@ "key": "minecraft:waxed_weathered_copper", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6d2F4ZWRfd2VhdGhlcmVkX2NvcHBlcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC53YXhlZF93ZWF0aGVyZWRfY29wcGVyAA==", @@ -1878,7 +1878,7 @@ "key": "minecraft:waxed_oxidized_copper", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6d2F4ZWRfb3hpZGl6ZWRfY29wcGVy", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC53YXhlZF9veGlkaXplZF9jb3BwZXIA", @@ -1894,7 +1894,7 @@ "key": "minecraft:waxed_chiseled_copper", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6d2F4ZWRfY2hpc2VsZWRfY29wcGVy", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC53YXhlZF9jaGlzZWxlZF9jb3BwZXIA", @@ -1910,7 +1910,7 @@ "key": "minecraft:waxed_exposed_chiseled_copper", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BydtaW5lY3JhZnQ6d2F4ZWRfZXhwb3NlZF9jaGlzZWxlZF9jb3BwZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUALWJsb2NrLm1pbmVjcmFmdC53YXhlZF9leHBvc2VkX2NoaXNlbGVkX2NvcHBlcgA=", @@ -1926,7 +1926,7 @@ "key": "minecraft:waxed_weathered_chiseled_copper", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByltaW5lY3JhZnQ6d2F4ZWRfd2VhdGhlcmVkX2NoaXNlbGVkX2NvcHBlcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAL2Jsb2NrLm1pbmVjcmFmdC53YXhlZF93ZWF0aGVyZWRfY2hpc2VsZWRfY29wcGVyAA==", @@ -1942,7 +1942,7 @@ "key": "minecraft:waxed_oxidized_chiseled_copper", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByhtaW5lY3JhZnQ6d2F4ZWRfb3hpZGl6ZWRfY2hpc2VsZWRfY29wcGVy", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUALmJsb2NrLm1pbmVjcmFmdC53YXhlZF9veGlkaXplZF9jaGlzZWxlZF9jb3BwZXIA", @@ -1958,7 +1958,7 @@ "key": "minecraft:waxed_cut_copper", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6d2F4ZWRfY3V0X2NvcHBlcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC53YXhlZF9jdXRfY29wcGVyAA==", @@ -1974,7 +1974,7 @@ "key": "minecraft:waxed_exposed_cut_copper", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByJtaW5lY3JhZnQ6d2F4ZWRfZXhwb3NlZF9jdXRfY29wcGVy", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKGJsb2NrLm1pbmVjcmFmdC53YXhlZF9leHBvc2VkX2N1dF9jb3BwZXIA", @@ -1990,7 +1990,7 @@ "key": "minecraft:waxed_weathered_cut_copper", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByRtaW5lY3JhZnQ6d2F4ZWRfd2VhdGhlcmVkX2N1dF9jb3BwZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKmJsb2NrLm1pbmVjcmFmdC53YXhlZF93ZWF0aGVyZWRfY3V0X2NvcHBlcgA=", @@ -2006,7 +2006,7 @@ "key": "minecraft:waxed_oxidized_cut_copper", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByNtaW5lY3JhZnQ6d2F4ZWRfb3hpZGl6ZWRfY3V0X2NvcHBlcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKWJsb2NrLm1pbmVjcmFmdC53YXhlZF9veGlkaXplZF9jdXRfY29wcGVyAA==", @@ -2022,7 +2022,7 @@ "key": "minecraft:waxed_cut_copper_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6d2F4ZWRfY3V0X2NvcHBlcl9zdGFpcnM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC53YXhlZF9jdXRfY29wcGVyX3N0YWlycwA=", @@ -2038,7 +2038,7 @@ "key": "minecraft:waxed_exposed_cut_copper_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByltaW5lY3JhZnQ6d2F4ZWRfZXhwb3NlZF9jdXRfY29wcGVyX3N0YWlycw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAL2Jsb2NrLm1pbmVjcmFmdC53YXhlZF9leHBvc2VkX2N1dF9jb3BwZXJfc3RhaXJzAA==", @@ -2054,7 +2054,7 @@ "key": "minecraft:waxed_weathered_cut_copper_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByttaW5lY3JhZnQ6d2F4ZWRfd2VhdGhlcmVkX2N1dF9jb3BwZXJfc3RhaXJz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAMWJsb2NrLm1pbmVjcmFmdC53YXhlZF93ZWF0aGVyZWRfY3V0X2NvcHBlcl9zdGFpcnMA", @@ -2070,7 +2070,7 @@ "key": "minecraft:waxed_oxidized_cut_copper_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByptaW5lY3JhZnQ6d2F4ZWRfb3hpZGl6ZWRfY3V0X2NvcHBlcl9zdGFpcnM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAMGJsb2NrLm1pbmVjcmFmdC53YXhlZF9veGlkaXplZF9jdXRfY29wcGVyX3N0YWlycwA=", @@ -2086,7 +2086,7 @@ "key": "minecraft:waxed_cut_copper_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6d2F4ZWRfY3V0X2NvcHBlcl9zbGFi", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC53YXhlZF9jdXRfY29wcGVyX3NsYWIA", @@ -2102,7 +2102,7 @@ "key": "minecraft:waxed_exposed_cut_copper_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BydtaW5lY3JhZnQ6d2F4ZWRfZXhwb3NlZF9jdXRfY29wcGVyX3NsYWI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUALWJsb2NrLm1pbmVjcmFmdC53YXhlZF9leHBvc2VkX2N1dF9jb3BwZXJfc2xhYgA=", @@ -2118,7 +2118,7 @@ "key": "minecraft:waxed_weathered_cut_copper_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByltaW5lY3JhZnQ6d2F4ZWRfd2VhdGhlcmVkX2N1dF9jb3BwZXJfc2xhYg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAL2Jsb2NrLm1pbmVjcmFmdC53YXhlZF93ZWF0aGVyZWRfY3V0X2NvcHBlcl9zbGFiAA==", @@ -2134,7 +2134,7 @@ "key": "minecraft:waxed_oxidized_cut_copper_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByhtaW5lY3JhZnQ6d2F4ZWRfb3hpZGl6ZWRfY3V0X2NvcHBlcl9zbGFi", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUALmJsb2NrLm1pbmVjcmFmdC53YXhlZF9veGlkaXplZF9jdXRfY29wcGVyX3NsYWIA", @@ -2150,7 +2150,7 @@ "key": "minecraft:oak_log", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxFtaW5lY3JhZnQ6b2FrX2xvZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2Jsb2NrLm1pbmVjcmFmdC5vYWtfbG9nAA==", @@ -2166,7 +2166,7 @@ "key": "minecraft:spruce_log", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6c3BydWNlX2xvZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5zcHJ1Y2VfbG9nAA==", @@ -2182,7 +2182,7 @@ "key": "minecraft:birch_log", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6YmlyY2hfbG9n", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5iaXJjaF9sb2cA", @@ -2198,7 +2198,7 @@ "key": "minecraft:jungle_log", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6anVuZ2xlX2xvZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5qdW5nbGVfbG9nAA==", @@ -2214,7 +2214,7 @@ "key": "minecraft:acacia_log", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6YWNhY2lhX2xvZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5hY2FjaWFfbG9nAA==", @@ -2230,7 +2230,7 @@ "key": "minecraft:cherry_log", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6Y2hlcnJ5X2xvZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5jaGVycnlfbG9nAA==", @@ -2246,7 +2246,7 @@ "key": "minecraft:pale_oak_log", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6cGFsZV9vYWtfbG9n", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5wYWxlX29ha19sb2cA", @@ -2262,7 +2262,7 @@ "key": "minecraft:dark_oak_log", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6ZGFya19vYWtfbG9n", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5kYXJrX29ha19sb2cA", @@ -2278,7 +2278,7 @@ "key": "minecraft:mangrove_log", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6bWFuZ3JvdmVfbG9n", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5tYW5ncm92ZV9sb2cA", @@ -2294,7 +2294,7 @@ "key": "minecraft:mangrove_roots", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6bWFuZ3JvdmVfcm9vdHM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5tYW5ncm92ZV9yb290cwA=", @@ -2310,7 +2310,7 @@ "key": "minecraft:muddy_mangrove_roots", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6bXVkZHlfbWFuZ3JvdmVfcm9vdHM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5tdWRkeV9tYW5ncm92ZV9yb290cwA=", @@ -2326,7 +2326,7 @@ "key": "minecraft:crimson_stem", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6Y3JpbXNvbl9zdGVt", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5jcmltc29uX3N0ZW0A", @@ -2342,7 +2342,7 @@ "key": "minecraft:warped_stem", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6d2FycGVkX3N0ZW0=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC53YXJwZWRfc3RlbQA=", @@ -2358,7 +2358,7 @@ "key": "minecraft:bamboo_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6YmFtYm9vX2Jsb2Nr", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5iYW1ib29fYmxvY2sA", @@ -2374,7 +2374,7 @@ "key": "minecraft:stripped_oak_log", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6c3RyaXBwZWRfb2FrX2xvZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5zdHJpcHBlZF9vYWtfbG9nAA==", @@ -2390,7 +2390,7 @@ "key": "minecraft:stripped_spruce_log", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6c3RyaXBwZWRfc3BydWNlX2xvZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5zdHJpcHBlZF9zcHJ1Y2VfbG9nAA==", @@ -2406,7 +2406,7 @@ "key": "minecraft:stripped_birch_log", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6c3RyaXBwZWRfYmlyY2hfbG9n", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5zdHJpcHBlZF9iaXJjaF9sb2cA", @@ -2422,7 +2422,7 @@ "key": "minecraft:stripped_jungle_log", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6c3RyaXBwZWRfanVuZ2xlX2xvZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5zdHJpcHBlZF9qdW5nbGVfbG9nAA==", @@ -2438,7 +2438,7 @@ "key": "minecraft:stripped_acacia_log", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6c3RyaXBwZWRfYWNhY2lhX2xvZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5zdHJpcHBlZF9hY2FjaWFfbG9nAA==", @@ -2454,7 +2454,7 @@ "key": "minecraft:stripped_cherry_log", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6c3RyaXBwZWRfY2hlcnJ5X2xvZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5zdHJpcHBlZF9jaGVycnlfbG9nAA==", @@ -2470,7 +2470,7 @@ "key": "minecraft:stripped_dark_oak_log", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6c3RyaXBwZWRfZGFya19vYWtfbG9n", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5zdHJpcHBlZF9kYXJrX29ha19sb2cA", @@ -2486,7 +2486,7 @@ "key": "minecraft:stripped_pale_oak_log", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6c3RyaXBwZWRfcGFsZV9vYWtfbG9n", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5zdHJpcHBlZF9wYWxlX29ha19sb2cA", @@ -2502,7 +2502,7 @@ "key": "minecraft:stripped_mangrove_log", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6c3RyaXBwZWRfbWFuZ3JvdmVfbG9n", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5zdHJpcHBlZF9tYW5ncm92ZV9sb2cA", @@ -2518,7 +2518,7 @@ "key": "minecraft:stripped_crimson_stem", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6c3RyaXBwZWRfY3JpbXNvbl9zdGVt", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5zdHJpcHBlZF9jcmltc29uX3N0ZW0A", @@ -2534,7 +2534,7 @@ "key": "minecraft:stripped_warped_stem", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6c3RyaXBwZWRfd2FycGVkX3N0ZW0=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5zdHJpcHBlZF93YXJwZWRfc3RlbQA=", @@ -2550,7 +2550,7 @@ "key": "minecraft:stripped_oak_wood", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6c3RyaXBwZWRfb2FrX3dvb2Q=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5zdHJpcHBlZF9vYWtfd29vZAA=", @@ -2566,7 +2566,7 @@ "key": "minecraft:stripped_spruce_wood", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6c3RyaXBwZWRfc3BydWNlX3dvb2Q=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5zdHJpcHBlZF9zcHJ1Y2Vfd29vZAA=", @@ -2582,7 +2582,7 @@ "key": "minecraft:stripped_birch_wood", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6c3RyaXBwZWRfYmlyY2hfd29vZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5zdHJpcHBlZF9iaXJjaF93b29kAA==", @@ -2598,7 +2598,7 @@ "key": "minecraft:stripped_jungle_wood", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6c3RyaXBwZWRfanVuZ2xlX3dvb2Q=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5zdHJpcHBlZF9qdW5nbGVfd29vZAA=", @@ -2614,7 +2614,7 @@ "key": "minecraft:stripped_acacia_wood", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6c3RyaXBwZWRfYWNhY2lhX3dvb2Q=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5zdHJpcHBlZF9hY2FjaWFfd29vZAA=", @@ -2630,7 +2630,7 @@ "key": "minecraft:stripped_cherry_wood", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6c3RyaXBwZWRfY2hlcnJ5X3dvb2Q=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5zdHJpcHBlZF9jaGVycnlfd29vZAA=", @@ -2646,7 +2646,7 @@ "key": "minecraft:stripped_dark_oak_wood", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6c3RyaXBwZWRfZGFya19vYWtfd29vZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5zdHJpcHBlZF9kYXJrX29ha193b29kAA==", @@ -2662,7 +2662,7 @@ "key": "minecraft:stripped_pale_oak_wood", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6c3RyaXBwZWRfcGFsZV9vYWtfd29vZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5zdHJpcHBlZF9wYWxlX29ha193b29kAA==", @@ -2678,7 +2678,7 @@ "key": "minecraft:stripped_mangrove_wood", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6c3RyaXBwZWRfbWFuZ3JvdmVfd29vZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5zdHJpcHBlZF9tYW5ncm92ZV93b29kAA==", @@ -2694,7 +2694,7 @@ "key": "minecraft:stripped_crimson_hyphae", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6c3RyaXBwZWRfY3JpbXNvbl9oeXBoYWU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5zdHJpcHBlZF9jcmltc29uX2h5cGhhZQA=", @@ -2710,7 +2710,7 @@ "key": "minecraft:stripped_warped_hyphae", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6c3RyaXBwZWRfd2FycGVkX2h5cGhhZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5zdHJpcHBlZF93YXJwZWRfaHlwaGFlAA==", @@ -2726,7 +2726,7 @@ "key": "minecraft:stripped_bamboo_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6c3RyaXBwZWRfYmFtYm9vX2Jsb2Nr", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5zdHJpcHBlZF9iYW1ib29fYmxvY2sA", @@ -2742,7 +2742,7 @@ "key": "minecraft:oak_wood", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6b2FrX3dvb2Q=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGJsb2NrLm1pbmVjcmFmdC5vYWtfd29vZAA=", @@ -2758,7 +2758,7 @@ "key": "minecraft:spruce_wood", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6c3BydWNlX3dvb2Q=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5zcHJ1Y2Vfd29vZAA=", @@ -2774,7 +2774,7 @@ "key": "minecraft:birch_wood", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6YmlyY2hfd29vZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5iaXJjaF93b29kAA==", @@ -2790,7 +2790,7 @@ "key": "minecraft:jungle_wood", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6anVuZ2xlX3dvb2Q=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5qdW5nbGVfd29vZAA=", @@ -2806,7 +2806,7 @@ "key": "minecraft:acacia_wood", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6YWNhY2lhX3dvb2Q=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5hY2FjaWFfd29vZAA=", @@ -2822,7 +2822,7 @@ "key": "minecraft:cherry_wood", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6Y2hlcnJ5X3dvb2Q=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5jaGVycnlfd29vZAA=", @@ -2838,7 +2838,7 @@ "key": "minecraft:pale_oak_wood", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6cGFsZV9vYWtfd29vZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5wYWxlX29ha193b29kAA==", @@ -2854,7 +2854,7 @@ "key": "minecraft:dark_oak_wood", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6ZGFya19vYWtfd29vZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5kYXJrX29ha193b29kAA==", @@ -2870,7 +2870,7 @@ "key": "minecraft:mangrove_wood", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6bWFuZ3JvdmVfd29vZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5tYW5ncm92ZV93b29kAA==", @@ -2886,7 +2886,7 @@ "key": "minecraft:crimson_hyphae", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6Y3JpbXNvbl9oeXBoYWU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5jcmltc29uX2h5cGhhZQA=", @@ -2902,7 +2902,7 @@ "key": "minecraft:warped_hyphae", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6d2FycGVkX2h5cGhhZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC53YXJwZWRfaHlwaGFlAA==", @@ -2918,7 +2918,7 @@ "key": "minecraft:oak_leaves", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6b2FrX2xlYXZlcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5vYWtfbGVhdmVzAA==", @@ -2934,7 +2934,7 @@ "key": "minecraft:spruce_leaves", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6c3BydWNlX2xlYXZlcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5zcHJ1Y2VfbGVhdmVzAA==", @@ -2950,7 +2950,7 @@ "key": "minecraft:birch_leaves", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6YmlyY2hfbGVhdmVz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5iaXJjaF9sZWF2ZXMA", @@ -2966,7 +2966,7 @@ "key": "minecraft:jungle_leaves", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6anVuZ2xlX2xlYXZlcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5qdW5nbGVfbGVhdmVzAA==", @@ -2982,7 +2982,7 @@ "key": "minecraft:acacia_leaves", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6YWNhY2lhX2xlYXZlcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5hY2FjaWFfbGVhdmVzAA==", @@ -2998,7 +2998,7 @@ "key": "minecraft:cherry_leaves", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6Y2hlcnJ5X2xlYXZlcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5jaGVycnlfbGVhdmVzAA==", @@ -3014,7 +3014,7 @@ "key": "minecraft:dark_oak_leaves", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6ZGFya19vYWtfbGVhdmVz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5kYXJrX29ha19sZWF2ZXMA", @@ -3030,7 +3030,7 @@ "key": "minecraft:pale_oak_leaves", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6cGFsZV9vYWtfbGVhdmVz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5wYWxlX29ha19sZWF2ZXMA", @@ -3046,7 +3046,7 @@ "key": "minecraft:mangrove_leaves", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6bWFuZ3JvdmVfbGVhdmVz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5tYW5ncm92ZV9sZWF2ZXMA", @@ -3062,7 +3062,7 @@ "key": "minecraft:azalea_leaves", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6YXphbGVhX2xlYXZlcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5hemFsZWFfbGVhdmVzAA==", @@ -3078,7 +3078,7 @@ "key": "minecraft:flowering_azalea_leaves", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6Zmxvd2VyaW5nX2F6YWxlYV9sZWF2ZXM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5mbG93ZXJpbmdfYXphbGVhX2xlYXZlcwA=", @@ -3094,7 +3094,7 @@ "key": "minecraft:sponge", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxBtaW5lY3JhZnQ6c3Bvbmdl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFmJsb2NrLm1pbmVjcmFmdC5zcG9uZ2UA", @@ -3110,7 +3110,7 @@ "key": "minecraft:wet_sponge", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6d2V0X3Nwb25nZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC53ZXRfc3BvbmdlAA==", @@ -3126,7 +3126,7 @@ "key": "minecraft:glass", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw9taW5lY3JhZnQ6Z2xhc3M=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFWJsb2NrLm1pbmVjcmFmdC5nbGFzcwA=", @@ -3142,7 +3142,7 @@ "key": "minecraft:tinted_glass", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6dGludGVkX2dsYXNz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC50aW50ZWRfZ2xhc3MA", @@ -3158,7 +3158,7 @@ "key": "minecraft:lapis_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6bGFwaXNfYmxvY2s=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5sYXBpc19ibG9jawA=", @@ -3174,7 +3174,7 @@ "key": "minecraft:sandstone", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6c2FuZHN0b25l", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5zYW5kc3RvbmUA", @@ -3190,7 +3190,7 @@ "key": "minecraft:chiseled_sandstone", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6Y2hpc2VsZWRfc2FuZHN0b25l", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5jaGlzZWxlZF9zYW5kc3RvbmUA", @@ -3206,7 +3206,7 @@ "key": "minecraft:cut_sandstone", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6Y3V0X3NhbmRzdG9uZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5jdXRfc2FuZHN0b25lAA==", @@ -3222,7 +3222,7 @@ "key": "minecraft:cobweb", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxBtaW5lY3JhZnQ6Y29id2Vi", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFmJsb2NrLm1pbmVjcmFmdC5jb2J3ZWIA", @@ -3238,7 +3238,7 @@ "key": "minecraft:short_grass", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6c2hvcnRfZ3Jhc3M=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5zaG9ydF9ncmFzcwA=", @@ -3254,7 +3254,7 @@ "key": "minecraft:fern", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw5taW5lY3JhZnQ6ZmVybg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFGJsb2NrLm1pbmVjcmFmdC5mZXJuAA==", @@ -3270,7 +3270,7 @@ "key": "minecraft:bush", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw5taW5lY3JhZnQ6YnVzaA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFGJsb2NrLm1pbmVjcmFmdC5idXNoAA==", @@ -3286,7 +3286,7 @@ "key": "minecraft:azalea", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxBtaW5lY3JhZnQ6YXphbGVh", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFmJsb2NrLm1pbmVjcmFmdC5hemFsZWEA", @@ -3302,7 +3302,7 @@ "key": "minecraft:flowering_azalea", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6Zmxvd2VyaW5nX2F6YWxlYQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5mbG93ZXJpbmdfYXphbGVhAA==", @@ -3318,7 +3318,7 @@ "key": "minecraft:dead_bush", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6ZGVhZF9idXNo", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5kZWFkX2J1c2gA", @@ -3334,7 +3334,7 @@ "key": "minecraft:firefly_bush", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6ZmlyZWZseV9idXNo", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5maXJlZmx5X2J1c2gA", @@ -3350,7 +3350,7 @@ "key": "minecraft:short_dry_grass", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6c2hvcnRfZHJ5X2dyYXNz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5zaG9ydF9kcnlfZ3Jhc3MA", @@ -3366,7 +3366,7 @@ "key": "minecraft:tall_dry_grass", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6dGFsbF9kcnlfZ3Jhc3M=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC50YWxsX2RyeV9ncmFzcwA=", @@ -3382,7 +3382,7 @@ "key": "minecraft:seagrass", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6c2VhZ3Jhc3M=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGJsb2NrLm1pbmVjcmFmdC5zZWFncmFzcwA=", @@ -3398,7 +3398,7 @@ "key": "minecraft:sea_pickle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6c2VhX3BpY2tsZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5zZWFfcGlja2xlAA==", @@ -3414,7 +3414,7 @@ "key": "minecraft:white_wool", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6d2hpdGVfd29vbA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC53aGl0ZV93b29sAA==", @@ -3430,7 +3430,7 @@ "key": "minecraft:orange_wool", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6b3JhbmdlX3dvb2w=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5vcmFuZ2Vfd29vbAA=", @@ -3446,7 +3446,7 @@ "key": "minecraft:magenta_wool", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6bWFnZW50YV93b29s", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5tYWdlbnRhX3dvb2wA", @@ -3462,7 +3462,7 @@ "key": "minecraft:light_blue_wool", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6bGlnaHRfYmx1ZV93b29s", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5saWdodF9ibHVlX3dvb2wA", @@ -3478,7 +3478,7 @@ "key": "minecraft:yellow_wool", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6eWVsbG93X3dvb2w=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC55ZWxsb3dfd29vbAA=", @@ -3494,7 +3494,7 @@ "key": "minecraft:lime_wool", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6bGltZV93b29s", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5saW1lX3dvb2wA", @@ -3510,7 +3510,7 @@ "key": "minecraft:pink_wool", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6cGlua193b29s", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5waW5rX3dvb2wA", @@ -3526,7 +3526,7 @@ "key": "minecraft:gray_wool", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6Z3JheV93b29s", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5ncmF5X3dvb2wA", @@ -3542,7 +3542,7 @@ "key": "minecraft:light_gray_wool", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6bGlnaHRfZ3JheV93b29s", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5saWdodF9ncmF5X3dvb2wA", @@ -3558,7 +3558,7 @@ "key": "minecraft:cyan_wool", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6Y3lhbl93b29s", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5jeWFuX3dvb2wA", @@ -3574,7 +3574,7 @@ "key": "minecraft:purple_wool", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6cHVycGxlX3dvb2w=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5wdXJwbGVfd29vbAA=", @@ -3590,7 +3590,7 @@ "key": "minecraft:blue_wool", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6Ymx1ZV93b29s", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5ibHVlX3dvb2wA", @@ -3606,7 +3606,7 @@ "key": "minecraft:brown_wool", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6YnJvd25fd29vbA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5icm93bl93b29sAA==", @@ -3622,7 +3622,7 @@ "key": "minecraft:green_wool", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6Z3JlZW5fd29vbA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5ncmVlbl93b29sAA==", @@ -3638,7 +3638,7 @@ "key": "minecraft:red_wool", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6cmVkX3dvb2w=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGJsb2NrLm1pbmVjcmFmdC5yZWRfd29vbAA=", @@ -3654,7 +3654,7 @@ "key": "minecraft:black_wool", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6YmxhY2tfd29vbA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5ibGFja193b29sAA==", @@ -3670,7 +3670,7 @@ "key": "minecraft:dandelion", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6ZGFuZGVsaW9u", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5kYW5kZWxpb24A", @@ -3686,7 +3686,7 @@ "key": "minecraft:open_eyeblossom", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6b3Blbl9leWVibG9zc29t", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5vcGVuX2V5ZWJsb3Nzb20A", @@ -3702,7 +3702,7 @@ "key": "minecraft:closed_eyeblossom", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6Y2xvc2VkX2V5ZWJsb3Nzb20=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5jbG9zZWRfZXllYmxvc3NvbQA=", @@ -3718,7 +3718,7 @@ "key": "minecraft:poppy", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw9taW5lY3JhZnQ6cG9wcHk=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFWJsb2NrLm1pbmVjcmFmdC5wb3BweQA=", @@ -3734,7 +3734,7 @@ "key": "minecraft:blue_orchid", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6Ymx1ZV9vcmNoaWQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5ibHVlX29yY2hpZAA=", @@ -3750,7 +3750,7 @@ "key": "minecraft:allium", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxBtaW5lY3JhZnQ6YWxsaXVt", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFmJsb2NrLm1pbmVjcmFmdC5hbGxpdW0A", @@ -3766,7 +3766,7 @@ "key": "minecraft:azure_bluet", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6YXp1cmVfYmx1ZXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5henVyZV9ibHVldAA=", @@ -3782,7 +3782,7 @@ "key": "minecraft:red_tulip", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6cmVkX3R1bGlw", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5yZWRfdHVsaXAA", @@ -3798,7 +3798,7 @@ "key": "minecraft:orange_tulip", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6b3JhbmdlX3R1bGlw", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5vcmFuZ2VfdHVsaXAA", @@ -3814,7 +3814,7 @@ "key": "minecraft:white_tulip", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6d2hpdGVfdHVsaXA=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC53aGl0ZV90dWxpcAA=", @@ -3830,7 +3830,7 @@ "key": "minecraft:pink_tulip", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6cGlua190dWxpcA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5waW5rX3R1bGlwAA==", @@ -3846,7 +3846,7 @@ "key": "minecraft:oxeye_daisy", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6b3hleWVfZGFpc3k=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5veGV5ZV9kYWlzeQA=", @@ -3862,7 +3862,7 @@ "key": "minecraft:cornflower", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6Y29ybmZsb3dlcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5jb3JuZmxvd2VyAA==", @@ -3878,7 +3878,7 @@ "key": "minecraft:lily_of_the_valley", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6bGlseV9vZl90aGVfdmFsbGV5", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5saWx5X29mX3RoZV92YWxsZXkA", @@ -3894,7 +3894,7 @@ "key": "minecraft:wither_rose", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6d2l0aGVyX3Jvc2U=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC53aXRoZXJfcm9zZQA=", @@ -3910,7 +3910,7 @@ "key": "minecraft:torchflower", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6dG9yY2hmbG93ZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC50b3JjaGZsb3dlcgA=", @@ -3926,7 +3926,7 @@ "key": "minecraft:pitcher_plant", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6cGl0Y2hlcl9wbGFudA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5waXRjaGVyX3BsYW50AA==", @@ -3942,7 +3942,7 @@ "key": "minecraft:spore_blossom", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6c3BvcmVfYmxvc3NvbQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5zcG9yZV9ibG9zc29tAA==", @@ -3958,7 +3958,7 @@ "key": "minecraft:brown_mushroom", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6YnJvd25fbXVzaHJvb20=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5icm93bl9tdXNocm9vbQA=", @@ -3974,7 +3974,7 @@ "key": "minecraft:red_mushroom", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6cmVkX211c2hyb29t", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5yZWRfbXVzaHJvb20A", @@ -3990,7 +3990,7 @@ "key": "minecraft:crimson_fungus", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6Y3JpbXNvbl9mdW5ndXM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5jcmltc29uX2Z1bmd1cwA=", @@ -4006,7 +4006,7 @@ "key": "minecraft:warped_fungus", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6d2FycGVkX2Z1bmd1cw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC53YXJwZWRfZnVuZ3VzAA==", @@ -4022,7 +4022,7 @@ "key": "minecraft:crimson_roots", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6Y3JpbXNvbl9yb290cw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5jcmltc29uX3Jvb3RzAA==", @@ -4038,7 +4038,7 @@ "key": "minecraft:warped_roots", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6d2FycGVkX3Jvb3Rz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC53YXJwZWRfcm9vdHMA", @@ -4054,7 +4054,7 @@ "key": "minecraft:nether_sprouts", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6bmV0aGVyX3Nwcm91dHM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5uZXRoZXJfc3Byb3V0cwA=", @@ -4070,7 +4070,7 @@ "key": "minecraft:weeping_vines", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6d2VlcGluZ192aW5lcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC53ZWVwaW5nX3ZpbmVzAA==", @@ -4086,7 +4086,7 @@ "key": "minecraft:twisting_vines", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6dHdpc3RpbmdfdmluZXM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC50d2lzdGluZ192aW5lcwA=", @@ -4102,7 +4102,7 @@ "key": "minecraft:sugar_cane", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6c3VnYXJfY2FuZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5zdWdhcl9jYW5lAA==", @@ -4118,7 +4118,7 @@ "key": "minecraft:kelp", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw5taW5lY3JhZnQ6a2VscA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFGJsb2NrLm1pbmVjcmFmdC5rZWxwAA==", @@ -4134,7 +4134,7 @@ "key": "minecraft:pink_petals", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6cGlua19wZXRhbHM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5waW5rX3BldGFscwA=", @@ -4150,7 +4150,7 @@ "key": "minecraft:wildflowers", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6d2lsZGZsb3dlcnM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC53aWxkZmxvd2VycwA=", @@ -4166,7 +4166,7 @@ "key": "minecraft:leaf_litter", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6bGVhZl9saXR0ZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5sZWFmX2xpdHRlcgA=", @@ -4182,7 +4182,7 @@ "key": "minecraft:moss_carpet", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6bW9zc19jYXJwZXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5tb3NzX2NhcnBldAA=", @@ -4198,7 +4198,7 @@ "key": "minecraft:moss_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6bW9zc19ibG9jaw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5tb3NzX2Jsb2NrAA==", @@ -4214,7 +4214,7 @@ "key": "minecraft:pale_moss_carpet", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6cGFsZV9tb3NzX2NhcnBldA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5wYWxlX21vc3NfY2FycGV0AA==", @@ -4230,7 +4230,7 @@ "key": "minecraft:pale_hanging_moss", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6cGFsZV9oYW5naW5nX21vc3M=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5wYWxlX2hhbmdpbmdfbW9zcwA=", @@ -4246,7 +4246,7 @@ "key": "minecraft:pale_moss_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6cGFsZV9tb3NzX2Jsb2Nr", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5wYWxlX21vc3NfYmxvY2sA", @@ -4262,7 +4262,7 @@ "key": "minecraft:hanging_roots", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6aGFuZ2luZ19yb290cw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5oYW5naW5nX3Jvb3RzAA==", @@ -4278,7 +4278,7 @@ "key": "minecraft:big_dripleaf", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6YmlnX2RyaXBsZWFm", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5iaWdfZHJpcGxlYWYA", @@ -4294,7 +4294,7 @@ "key": "minecraft:small_dripleaf", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6c21hbGxfZHJpcGxlYWY=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5zbWFsbF9kcmlwbGVhZgA=", @@ -4310,7 +4310,7 @@ "key": "minecraft:bamboo", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxBtaW5lY3JhZnQ6YmFtYm9v", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFmJsb2NrLm1pbmVjcmFmdC5iYW1ib28A", @@ -4326,7 +4326,7 @@ "key": "minecraft:oak_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6b2FrX3NsYWI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGJsb2NrLm1pbmVjcmFmdC5vYWtfc2xhYgA=", @@ -4342,7 +4342,7 @@ "key": "minecraft:spruce_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6c3BydWNlX3NsYWI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5zcHJ1Y2Vfc2xhYgA=", @@ -4358,7 +4358,7 @@ "key": "minecraft:birch_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6YmlyY2hfc2xhYg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5iaXJjaF9zbGFiAA==", @@ -4374,7 +4374,7 @@ "key": "minecraft:jungle_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6anVuZ2xlX3NsYWI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5qdW5nbGVfc2xhYgA=", @@ -4390,7 +4390,7 @@ "key": "minecraft:acacia_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6YWNhY2lhX3NsYWI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5hY2FjaWFfc2xhYgA=", @@ -4406,7 +4406,7 @@ "key": "minecraft:cherry_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6Y2hlcnJ5X3NsYWI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5jaGVycnlfc2xhYgA=", @@ -4422,7 +4422,7 @@ "key": "minecraft:dark_oak_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6ZGFya19vYWtfc2xhYg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5kYXJrX29ha19zbGFiAA==", @@ -4438,7 +4438,7 @@ "key": "minecraft:pale_oak_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6cGFsZV9vYWtfc2xhYg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5wYWxlX29ha19zbGFiAA==", @@ -4454,7 +4454,7 @@ "key": "minecraft:mangrove_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6bWFuZ3JvdmVfc2xhYg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5tYW5ncm92ZV9zbGFiAA==", @@ -4470,7 +4470,7 @@ "key": "minecraft:bamboo_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6YmFtYm9vX3NsYWI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5iYW1ib29fc2xhYgA=", @@ -4486,7 +4486,7 @@ "key": "minecraft:bamboo_mosaic_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6YmFtYm9vX21vc2FpY19zbGFi", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5iYW1ib29fbW9zYWljX3NsYWIA", @@ -4502,7 +4502,7 @@ "key": "minecraft:crimson_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6Y3JpbXNvbl9zbGFi", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5jcmltc29uX3NsYWIA", @@ -4518,7 +4518,7 @@ "key": "minecraft:warped_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6d2FycGVkX3NsYWI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC53YXJwZWRfc2xhYgA=", @@ -4534,7 +4534,7 @@ "key": "minecraft:stone_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6c3RvbmVfc2xhYg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5zdG9uZV9zbGFiAA==", @@ -4550,7 +4550,7 @@ "key": "minecraft:smooth_stone_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6c21vb3RoX3N0b25lX3NsYWI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5zbW9vdGhfc3RvbmVfc2xhYgA=", @@ -4566,7 +4566,7 @@ "key": "minecraft:sandstone_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6c2FuZHN0b25lX3NsYWI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5zYW5kc3RvbmVfc2xhYgA=", @@ -4582,7 +4582,7 @@ "key": "minecraft:cut_sandstone_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6Y3V0X3NhbmRzdG9uZV9zbGFi", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5jdXRfc2FuZHN0b25lX3NsYWIA", @@ -4598,7 +4598,7 @@ "key": "minecraft:petrified_oak_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6cGV0cmlmaWVkX29ha19zbGFi", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5wZXRyaWZpZWRfb2FrX3NsYWIA", @@ -4614,7 +4614,7 @@ "key": "minecraft:cobblestone_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6Y29iYmxlc3RvbmVfc2xhYg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5jb2JibGVzdG9uZV9zbGFiAA==", @@ -4630,7 +4630,7 @@ "key": "minecraft:brick_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6YnJpY2tfc2xhYg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5icmlja19zbGFiAA==", @@ -4646,7 +4646,7 @@ "key": "minecraft:stone_brick_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6c3RvbmVfYnJpY2tfc2xhYg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5zdG9uZV9icmlja19zbGFiAA==", @@ -4662,7 +4662,7 @@ "key": "minecraft:mud_brick_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6bXVkX2JyaWNrX3NsYWI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5tdWRfYnJpY2tfc2xhYgA=", @@ -4678,7 +4678,7 @@ "key": "minecraft:nether_brick_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6bmV0aGVyX2JyaWNrX3NsYWI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5uZXRoZXJfYnJpY2tfc2xhYgA=", @@ -4694,7 +4694,7 @@ "key": "minecraft:quartz_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6cXVhcnR6X3NsYWI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5xdWFydHpfc2xhYgA=", @@ -4710,7 +4710,7 @@ "key": "minecraft:red_sandstone_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6cmVkX3NhbmRzdG9uZV9zbGFi", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5yZWRfc2FuZHN0b25lX3NsYWIA", @@ -4726,7 +4726,7 @@ "key": "minecraft:cut_red_sandstone_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6Y3V0X3JlZF9zYW5kc3RvbmVfc2xhYg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5jdXRfcmVkX3NhbmRzdG9uZV9zbGFiAA==", @@ -4742,7 +4742,7 @@ "key": "minecraft:purpur_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6cHVycHVyX3NsYWI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5wdXJwdXJfc2xhYgA=", @@ -4758,7 +4758,7 @@ "key": "minecraft:prismarine_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6cHJpc21hcmluZV9zbGFi", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5wcmlzbWFyaW5lX3NsYWIA", @@ -4774,7 +4774,7 @@ "key": "minecraft:prismarine_brick_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6cHJpc21hcmluZV9icmlja19zbGFi", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5wcmlzbWFyaW5lX2JyaWNrX3NsYWIA", @@ -4790,7 +4790,7 @@ "key": "minecraft:dark_prismarine_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6ZGFya19wcmlzbWFyaW5lX3NsYWI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5kYXJrX3ByaXNtYXJpbmVfc2xhYgA=", @@ -4806,7 +4806,7 @@ "key": "minecraft:smooth_quartz", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6c21vb3RoX3F1YXJ0eg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5zbW9vdGhfcXVhcnR6AA==", @@ -4822,7 +4822,7 @@ "key": "minecraft:smooth_red_sandstone", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6c21vb3RoX3JlZF9zYW5kc3RvbmU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5zbW9vdGhfcmVkX3NhbmRzdG9uZQA=", @@ -4838,7 +4838,7 @@ "key": "minecraft:smooth_sandstone", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6c21vb3RoX3NhbmRzdG9uZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5zbW9vdGhfc2FuZHN0b25lAA==", @@ -4854,7 +4854,7 @@ "key": "minecraft:smooth_stone", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6c21vb3RoX3N0b25l", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5zbW9vdGhfc3RvbmUA", @@ -4870,7 +4870,7 @@ "key": "minecraft:bricks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxBtaW5lY3JhZnQ6YnJpY2tz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFmJsb2NrLm1pbmVjcmFmdC5icmlja3MA", @@ -4886,7 +4886,7 @@ "key": "minecraft:bookshelf", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6Ym9va3NoZWxm", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5ib29rc2hlbGYA", @@ -4902,7 +4902,7 @@ "key": "minecraft:chiseled_bookshelf", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6Y2hpc2VsZWRfYm9va3NoZWxm", @@ -4919,14 +4919,14 @@ "key": "minecraft:decorated_pot", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6ZGVjb3JhdGVkX3BvdA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5kZWNvcmF0ZWRfcG90AA==", "minecraft:lore": "CAA=", "minecraft:max_stack_size": "AUA=", - "minecraft:pot_decorations": "QQTDB8MHwwfDBw==", + "minecraft:pot_decorations": "QQTUB9QH1AfUBw==", "minecraft:rarity": "CQA=", "minecraft:repair_cost": "EAA=", "minecraft:tooltip_display": "DwAA" @@ -4937,7 +4937,7 @@ "key": "minecraft:mossy_cobblestone", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6bW9zc3lfY29iYmxlc3RvbmU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5tb3NzeV9jb2JibGVzdG9uZQA=", @@ -4953,7 +4953,7 @@ "key": "minecraft:obsidian", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6b2JzaWRpYW4=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGJsb2NrLm1pbmVjcmFmdC5vYnNpZGlhbgA=", @@ -4969,7 +4969,7 @@ "key": "minecraft:torch", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw9taW5lY3JhZnQ6dG9yY2g=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFWJsb2NrLm1pbmVjcmFmdC50b3JjaAA=", @@ -4985,7 +4985,7 @@ "key": "minecraft:end_rod", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxFtaW5lY3JhZnQ6ZW5kX3JvZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2Jsb2NrLm1pbmVjcmFmdC5lbmRfcm9kAA==", @@ -5001,7 +5001,7 @@ "key": "minecraft:chorus_plant", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6Y2hvcnVzX3BsYW50", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5jaG9ydXNfcGxhbnQA", @@ -5017,7 +5017,7 @@ "key": "minecraft:chorus_flower", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6Y2hvcnVzX2Zsb3dlcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5jaG9ydXNfZmxvd2VyAA==", @@ -5033,7 +5033,7 @@ "key": "minecraft:purpur_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6cHVycHVyX2Jsb2Nr", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5wdXJwdXJfYmxvY2sA", @@ -5049,7 +5049,7 @@ "key": "minecraft:purpur_pillar", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6cHVycHVyX3BpbGxhcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5wdXJwdXJfcGlsbGFyAA==", @@ -5065,7 +5065,7 @@ "key": "minecraft:purpur_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6cHVycHVyX3N0YWlycw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5wdXJwdXJfc3RhaXJzAA==", @@ -5081,7 +5081,7 @@ "key": "minecraft:spawner", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxFtaW5lY3JhZnQ6c3Bhd25lcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2Jsb2NrLm1pbmVjcmFmdC5zcGF3bmVyAA==", @@ -5097,7 +5097,7 @@ "key": "minecraft:creaking_heart", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6Y3JlYWtpbmdfaGVhcnQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5jcmVha2luZ19oZWFydAA=", @@ -5113,7 +5113,7 @@ "key": "minecraft:chest", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw9taW5lY3JhZnQ6Y2hlc3Q=", @@ -5130,7 +5130,7 @@ "key": "minecraft:crafting_table", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6Y3JhZnRpbmdfdGFibGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5jcmFmdGluZ190YWJsZQA=", @@ -5146,7 +5146,7 @@ "key": "minecraft:farmland", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6ZmFybWxhbmQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGJsb2NrLm1pbmVjcmFmdC5mYXJtbGFuZAA=", @@ -5162,7 +5162,7 @@ "key": "minecraft:furnace", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxFtaW5lY3JhZnQ6ZnVybmFjZQ==", @@ -5179,7 +5179,7 @@ "key": "minecraft:ladder", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxBtaW5lY3JhZnQ6bGFkZGVy", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFmJsb2NrLm1pbmVjcmFmdC5sYWRkZXIA", @@ -5195,7 +5195,7 @@ "key": "minecraft:cobblestone_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6Y29iYmxlc3RvbmVfc3RhaXJz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5jb2JibGVzdG9uZV9zdGFpcnMA", @@ -5211,7 +5211,7 @@ "key": "minecraft:snow", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw5taW5lY3JhZnQ6c25vdw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFGJsb2NrLm1pbmVjcmFmdC5zbm93AA==", @@ -5227,7 +5227,7 @@ "key": "minecraft:ice", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw1taW5lY3JhZnQ6aWNl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAE2Jsb2NrLm1pbmVjcmFmdC5pY2UA", @@ -5243,7 +5243,7 @@ "key": "minecraft:snow_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6c25vd19ibG9jaw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5zbm93X2Jsb2NrAA==", @@ -5259,7 +5259,7 @@ "key": "minecraft:cactus", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxBtaW5lY3JhZnQ6Y2FjdHVz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFmJsb2NrLm1pbmVjcmFmdC5jYWN0dXMA", @@ -5275,7 +5275,7 @@ "key": "minecraft:cactus_flower", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6Y2FjdHVzX2Zsb3dlcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5jYWN0dXNfZmxvd2VyAA==", @@ -5291,7 +5291,7 @@ "key": "minecraft:clay", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw5taW5lY3JhZnQ6Y2xheQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFGJsb2NrLm1pbmVjcmFmdC5jbGF5AA==", @@ -5307,7 +5307,7 @@ "key": "minecraft:jukebox", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxFtaW5lY3JhZnQ6anVrZWJveA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2Jsb2NrLm1pbmVjcmFmdC5qdWtlYm94AA==", @@ -5323,7 +5323,7 @@ "key": "minecraft:oak_fence", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6b2FrX2ZlbmNl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5vYWtfZmVuY2UA", @@ -5339,7 +5339,7 @@ "key": "minecraft:spruce_fence", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6c3BydWNlX2ZlbmNl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5zcHJ1Y2VfZmVuY2UA", @@ -5355,7 +5355,7 @@ "key": "minecraft:birch_fence", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6YmlyY2hfZmVuY2U=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5iaXJjaF9mZW5jZQA=", @@ -5371,7 +5371,7 @@ "key": "minecraft:jungle_fence", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6anVuZ2xlX2ZlbmNl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5qdW5nbGVfZmVuY2UA", @@ -5387,7 +5387,7 @@ "key": "minecraft:acacia_fence", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6YWNhY2lhX2ZlbmNl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5hY2FjaWFfZmVuY2UA", @@ -5403,7 +5403,7 @@ "key": "minecraft:cherry_fence", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6Y2hlcnJ5X2ZlbmNl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5jaGVycnlfZmVuY2UA", @@ -5419,7 +5419,7 @@ "key": "minecraft:dark_oak_fence", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6ZGFya19vYWtfZmVuY2U=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5kYXJrX29ha19mZW5jZQA=", @@ -5435,7 +5435,7 @@ "key": "minecraft:pale_oak_fence", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6cGFsZV9vYWtfZmVuY2U=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5wYWxlX29ha19mZW5jZQA=", @@ -5451,7 +5451,7 @@ "key": "minecraft:mangrove_fence", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6bWFuZ3JvdmVfZmVuY2U=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5tYW5ncm92ZV9mZW5jZQA=", @@ -5467,7 +5467,7 @@ "key": "minecraft:bamboo_fence", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6YmFtYm9vX2ZlbmNl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5iYW1ib29fZmVuY2UA", @@ -5483,7 +5483,7 @@ "key": "minecraft:crimson_fence", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6Y3JpbXNvbl9mZW5jZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5jcmltc29uX2ZlbmNlAA==", @@ -5499,7 +5499,7 @@ "key": "minecraft:warped_fence", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6d2FycGVkX2ZlbmNl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC53YXJwZWRfZmVuY2UA", @@ -5515,7 +5515,7 @@ "key": "minecraft:pumpkin", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxFtaW5lY3JhZnQ6cHVtcGtpbg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2Jsb2NrLm1pbmVjcmFmdC5wdW1wa2luAA==", @@ -5530,10 +5530,10 @@ "id": 345, "key": "minecraft:carved_pumpkin", "components": { - "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQEhJm1pbmVjcmFmdDp3YXlwb2ludF90cmFuc21pdF9yYW5nZV9oaWRlv/AAAAAAAAACBwE=", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HARHAAEabWluZWNyYWZ0Om1pc2MvcHVtcGtpbmJsdXIAAQABAA==", + "minecraft:equippable": "HARHAAEabWluZWNyYWZ0Om1pc2MvcHVtcGtpbmJsdXIAAQABAACRCg==", "minecraft:item_model": "BxhtaW5lY3JhZnQ6Y2FydmVkX3B1bXBraW4=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5jYXJ2ZWRfcHVtcGtpbgA=", "minecraft:lore": "CAA=", @@ -5548,7 +5548,7 @@ "key": "minecraft:jack_o_lantern", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6amFja19vX2xhbnRlcm4=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5qYWNrX29fbGFudGVybgA=", @@ -5564,7 +5564,7 @@ "key": "minecraft:netherrack", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6bmV0aGVycmFjaw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5uZXRoZXJyYWNrAA==", @@ -5580,7 +5580,7 @@ "key": "minecraft:soul_sand", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6c291bF9zYW5k", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5zb3VsX3NhbmQA", @@ -5596,7 +5596,7 @@ "key": "minecraft:soul_soil", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6c291bF9zb2ls", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5zb3VsX3NvaWwA", @@ -5612,7 +5612,7 @@ "key": "minecraft:basalt", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxBtaW5lY3JhZnQ6YmFzYWx0", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFmJsb2NrLm1pbmVjcmFmdC5iYXNhbHQA", @@ -5628,7 +5628,7 @@ "key": "minecraft:polished_basalt", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6cG9saXNoZWRfYmFzYWx0", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF9iYXNhbHQA", @@ -5644,7 +5644,7 @@ "key": "minecraft:smooth_basalt", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6c21vb3RoX2Jhc2FsdA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5zbW9vdGhfYmFzYWx0AA==", @@ -5660,7 +5660,7 @@ "key": "minecraft:soul_torch", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6c291bF90b3JjaA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5zb3VsX3RvcmNoAA==", @@ -5676,7 +5676,7 @@ "key": "minecraft:glowstone", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6Z2xvd3N0b25l", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5nbG93c3RvbmUA", @@ -5692,7 +5692,7 @@ "key": "minecraft:infested_stone", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6aW5mZXN0ZWRfc3RvbmU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5pbmZlc3RlZF9zdG9uZQA=", @@ -5708,7 +5708,7 @@ "key": "minecraft:infested_cobblestone", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6aW5mZXN0ZWRfY29iYmxlc3RvbmU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5pbmZlc3RlZF9jb2JibGVzdG9uZQA=", @@ -5724,7 +5724,7 @@ "key": "minecraft:infested_stone_bricks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6aW5mZXN0ZWRfc3RvbmVfYnJpY2tz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5pbmZlc3RlZF9zdG9uZV9icmlja3MA", @@ -5740,7 +5740,7 @@ "key": "minecraft:infested_mossy_stone_bricks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByVtaW5lY3JhZnQ6aW5mZXN0ZWRfbW9zc3lfc3RvbmVfYnJpY2tz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAK2Jsb2NrLm1pbmVjcmFmdC5pbmZlc3RlZF9tb3NzeV9zdG9uZV9icmlja3MA", @@ -5756,7 +5756,7 @@ "key": "minecraft:infested_cracked_stone_bricks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BydtaW5lY3JhZnQ6aW5mZXN0ZWRfY3JhY2tlZF9zdG9uZV9icmlja3M=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUALWJsb2NrLm1pbmVjcmFmdC5pbmZlc3RlZF9jcmFja2VkX3N0b25lX2JyaWNrcwA=", @@ -5772,7 +5772,7 @@ "key": "minecraft:infested_chiseled_stone_bricks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByhtaW5lY3JhZnQ6aW5mZXN0ZWRfY2hpc2VsZWRfc3RvbmVfYnJpY2tz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUALmJsb2NrLm1pbmVjcmFmdC5pbmZlc3RlZF9jaGlzZWxlZF9zdG9uZV9icmlja3MA", @@ -5788,7 +5788,7 @@ "key": "minecraft:infested_deepslate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6aW5mZXN0ZWRfZGVlcHNsYXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5pbmZlc3RlZF9kZWVwc2xhdGUA", @@ -5804,7 +5804,7 @@ "key": "minecraft:stone_bricks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6c3RvbmVfYnJpY2tz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5zdG9uZV9icmlja3MA", @@ -5820,7 +5820,7 @@ "key": "minecraft:mossy_stone_bricks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6bW9zc3lfc3RvbmVfYnJpY2tz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5tb3NzeV9zdG9uZV9icmlja3MA", @@ -5836,7 +5836,7 @@ "key": "minecraft:cracked_stone_bricks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6Y3JhY2tlZF9zdG9uZV9icmlja3M=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5jcmFja2VkX3N0b25lX2JyaWNrcwA=", @@ -5852,7 +5852,7 @@ "key": "minecraft:chiseled_stone_bricks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6Y2hpc2VsZWRfc3RvbmVfYnJpY2tz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5jaGlzZWxlZF9zdG9uZV9icmlja3MA", @@ -5868,7 +5868,7 @@ "key": "minecraft:packed_mud", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6cGFja2VkX211ZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5wYWNrZWRfbXVkAA==", @@ -5884,7 +5884,7 @@ "key": "minecraft:mud_bricks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6bXVkX2JyaWNrcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5tdWRfYnJpY2tzAA==", @@ -5900,7 +5900,7 @@ "key": "minecraft:deepslate_bricks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6ZGVlcHNsYXRlX2JyaWNrcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5kZWVwc2xhdGVfYnJpY2tzAA==", @@ -5916,7 +5916,7 @@ "key": "minecraft:cracked_deepslate_bricks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByJtaW5lY3JhZnQ6Y3JhY2tlZF9kZWVwc2xhdGVfYnJpY2tz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKGJsb2NrLm1pbmVjcmFmdC5jcmFja2VkX2RlZXBzbGF0ZV9icmlja3MA", @@ -5932,7 +5932,7 @@ "key": "minecraft:deepslate_tiles", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6ZGVlcHNsYXRlX3RpbGVz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5kZWVwc2xhdGVfdGlsZXMA", @@ -5948,7 +5948,7 @@ "key": "minecraft:cracked_deepslate_tiles", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6Y3JhY2tlZF9kZWVwc2xhdGVfdGlsZXM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5jcmFja2VkX2RlZXBzbGF0ZV90aWxlcwA=", @@ -5964,7 +5964,7 @@ "key": "minecraft:chiseled_deepslate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6Y2hpc2VsZWRfZGVlcHNsYXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5jaGlzZWxlZF9kZWVwc2xhdGUA", @@ -5980,7 +5980,7 @@ "key": "minecraft:reinforced_deepslate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6cmVpbmZvcmNlZF9kZWVwc2xhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5yZWluZm9yY2VkX2RlZXBzbGF0ZQA=", @@ -5996,7 +5996,7 @@ "key": "minecraft:brown_mushroom_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6YnJvd25fbXVzaHJvb21fYmxvY2s=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5icm93bl9tdXNocm9vbV9ibG9jawA=", @@ -6012,7 +6012,7 @@ "key": "minecraft:red_mushroom_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6cmVkX211c2hyb29tX2Jsb2Nr", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5yZWRfbXVzaHJvb21fYmxvY2sA", @@ -6028,7 +6028,7 @@ "key": "minecraft:mushroom_stem", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6bXVzaHJvb21fc3RlbQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5tdXNocm9vbV9zdGVtAA==", @@ -6044,7 +6044,7 @@ "key": "minecraft:iron_bars", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6aXJvbl9iYXJz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5pcm9uX2JhcnMA", @@ -6060,7 +6060,7 @@ "key": "minecraft:chain", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw9taW5lY3JhZnQ6Y2hhaW4=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFWJsb2NrLm1pbmVjcmFmdC5jaGFpbgA=", @@ -6076,7 +6076,7 @@ "key": "minecraft:glass_pane", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6Z2xhc3NfcGFuZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5nbGFzc19wYW5lAA==", @@ -6092,7 +6092,7 @@ "key": "minecraft:melon", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw9taW5lY3JhZnQ6bWVsb24=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFWJsb2NrLm1pbmVjcmFmdC5tZWxvbgA=", @@ -6108,7 +6108,7 @@ "key": "minecraft:vine", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw5taW5lY3JhZnQ6dmluZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFGJsb2NrLm1pbmVjcmFmdC52aW5lAA==", @@ -6124,7 +6124,7 @@ "key": "minecraft:glow_lichen", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6Z2xvd19saWNoZW4=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5nbG93X2xpY2hlbgA=", @@ -6140,7 +6140,7 @@ "key": "minecraft:resin_clump", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6cmVzaW5fY2x1bXA=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGml0ZW0ubWluZWNyYWZ0LnJlc2luX2NsdW1wAA==", @@ -6156,7 +6156,7 @@ "key": "minecraft:resin_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6cmVzaW5fYmxvY2s=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5yZXNpbl9ibG9jawA=", @@ -6172,7 +6172,7 @@ "key": "minecraft:resin_bricks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6cmVzaW5fYnJpY2tz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5yZXNpbl9icmlja3MA", @@ -6188,7 +6188,7 @@ "key": "minecraft:resin_brick_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6cmVzaW5fYnJpY2tfc3RhaXJz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5yZXNpbl9icmlja19zdGFpcnMA", @@ -6204,7 +6204,7 @@ "key": "minecraft:resin_brick_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6cmVzaW5fYnJpY2tfc2xhYg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5yZXNpbl9icmlja19zbGFiAA==", @@ -6220,7 +6220,7 @@ "key": "minecraft:resin_brick_wall", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6cmVzaW5fYnJpY2tfd2FsbA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5yZXNpbl9icmlja193YWxsAA==", @@ -6236,7 +6236,7 @@ "key": "minecraft:chiseled_resin_bricks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6Y2hpc2VsZWRfcmVzaW5fYnJpY2tz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5jaGlzZWxlZF9yZXNpbl9icmlja3MA", @@ -6252,7 +6252,7 @@ "key": "minecraft:brick_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6YnJpY2tfc3RhaXJz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5icmlja19zdGFpcnMA", @@ -6268,7 +6268,7 @@ "key": "minecraft:stone_brick_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6c3RvbmVfYnJpY2tfc3RhaXJz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5zdG9uZV9icmlja19zdGFpcnMA", @@ -6284,7 +6284,7 @@ "key": "minecraft:mud_brick_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6bXVkX2JyaWNrX3N0YWlycw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5tdWRfYnJpY2tfc3RhaXJzAA==", @@ -6300,7 +6300,7 @@ "key": "minecraft:mycelium", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6bXljZWxpdW0=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGJsb2NrLm1pbmVjcmFmdC5teWNlbGl1bQA=", @@ -6316,7 +6316,7 @@ "key": "minecraft:lily_pad", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6bGlseV9wYWQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGJsb2NrLm1pbmVjcmFmdC5saWx5X3BhZAA=", @@ -6332,7 +6332,7 @@ "key": "minecraft:nether_bricks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6bmV0aGVyX2JyaWNrcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5uZXRoZXJfYnJpY2tzAA==", @@ -6348,7 +6348,7 @@ "key": "minecraft:cracked_nether_bricks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6Y3JhY2tlZF9uZXRoZXJfYnJpY2tz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5jcmFja2VkX25ldGhlcl9icmlja3MA", @@ -6364,7 +6364,7 @@ "key": "minecraft:chiseled_nether_bricks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6Y2hpc2VsZWRfbmV0aGVyX2JyaWNrcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5jaGlzZWxlZF9uZXRoZXJfYnJpY2tzAA==", @@ -6380,7 +6380,7 @@ "key": "minecraft:nether_brick_fence", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6bmV0aGVyX2JyaWNrX2ZlbmNl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5uZXRoZXJfYnJpY2tfZmVuY2UA", @@ -6396,7 +6396,7 @@ "key": "minecraft:nether_brick_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6bmV0aGVyX2JyaWNrX3N0YWlycw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5uZXRoZXJfYnJpY2tfc3RhaXJzAA==", @@ -6412,7 +6412,7 @@ "key": "minecraft:sculk", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw9taW5lY3JhZnQ6c2N1bGs=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFWJsb2NrLm1pbmVjcmFmdC5zY3VsawA=", @@ -6428,7 +6428,7 @@ "key": "minecraft:sculk_vein", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6c2N1bGtfdmVpbg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5zY3Vsa192ZWluAA==", @@ -6444,7 +6444,7 @@ "key": "minecraft:sculk_catalyst", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6c2N1bGtfY2F0YWx5c3Q=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5zY3Vsa19jYXRhbHlzdAA=", @@ -6460,7 +6460,7 @@ "key": "minecraft:sculk_shrieker", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6c2N1bGtfc2hyaWVrZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5zY3Vsa19zaHJpZWtlcgA=", @@ -6476,7 +6476,7 @@ "key": "minecraft:enchanting_table", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6ZW5jaGFudGluZ190YWJsZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5lbmNoYW50aW5nX3RhYmxlAA==", @@ -6492,7 +6492,7 @@ "key": "minecraft:end_portal_frame", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6ZW5kX3BvcnRhbF9mcmFtZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5lbmRfcG9ydGFsX2ZyYW1lAA==", @@ -6508,7 +6508,7 @@ "key": "minecraft:end_stone", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6ZW5kX3N0b25l", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5lbmRfc3RvbmUA", @@ -6524,7 +6524,7 @@ "key": "minecraft:end_stone_bricks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6ZW5kX3N0b25lX2JyaWNrcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5lbmRfc3RvbmVfYnJpY2tzAA==", @@ -6540,7 +6540,7 @@ "key": "minecraft:dragon_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6ZHJhZ29uX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5kcmFnb25fZWdnAA==", @@ -6556,7 +6556,7 @@ "key": "minecraft:sandstone_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6c2FuZHN0b25lX3N0YWlycw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5zYW5kc3RvbmVfc3RhaXJzAA==", @@ -6572,7 +6572,7 @@ "key": "minecraft:ender_chest", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6ZW5kZXJfY2hlc3Q=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5lbmRlcl9jaGVzdAA=", @@ -6588,7 +6588,7 @@ "key": "minecraft:emerald_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6ZW1lcmFsZF9ibG9jaw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5lbWVyYWxkX2Jsb2NrAA==", @@ -6604,7 +6604,7 @@ "key": "minecraft:oak_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6b2FrX3N0YWlycw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5vYWtfc3RhaXJzAA==", @@ -6620,7 +6620,7 @@ "key": "minecraft:spruce_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6c3BydWNlX3N0YWlycw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5zcHJ1Y2Vfc3RhaXJzAA==", @@ -6636,7 +6636,7 @@ "key": "minecraft:birch_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6YmlyY2hfc3RhaXJz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5iaXJjaF9zdGFpcnMA", @@ -6652,7 +6652,7 @@ "key": "minecraft:jungle_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6anVuZ2xlX3N0YWlycw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5qdW5nbGVfc3RhaXJzAA==", @@ -6668,7 +6668,7 @@ "key": "minecraft:acacia_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6YWNhY2lhX3N0YWlycw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5hY2FjaWFfc3RhaXJzAA==", @@ -6684,7 +6684,7 @@ "key": "minecraft:cherry_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6Y2hlcnJ5X3N0YWlycw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5jaGVycnlfc3RhaXJzAA==", @@ -6700,7 +6700,7 @@ "key": "minecraft:dark_oak_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6ZGFya19vYWtfc3RhaXJz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5kYXJrX29ha19zdGFpcnMA", @@ -6716,7 +6716,7 @@ "key": "minecraft:pale_oak_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6cGFsZV9vYWtfc3RhaXJz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5wYWxlX29ha19zdGFpcnMA", @@ -6732,7 +6732,7 @@ "key": "minecraft:mangrove_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6bWFuZ3JvdmVfc3RhaXJz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5tYW5ncm92ZV9zdGFpcnMA", @@ -6748,7 +6748,7 @@ "key": "minecraft:bamboo_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6YmFtYm9vX3N0YWlycw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5iYW1ib29fc3RhaXJzAA==", @@ -6764,7 +6764,7 @@ "key": "minecraft:bamboo_mosaic_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6YmFtYm9vX21vc2FpY19zdGFpcnM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5iYW1ib29fbW9zYWljX3N0YWlycwA=", @@ -6780,7 +6780,7 @@ "key": "minecraft:crimson_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6Y3JpbXNvbl9zdGFpcnM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5jcmltc29uX3N0YWlycwA=", @@ -6796,7 +6796,7 @@ "key": "minecraft:warped_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6d2FycGVkX3N0YWlycw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC53YXJwZWRfc3RhaXJzAA==", @@ -6812,7 +6812,7 @@ "key": "minecraft:command_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6Y29tbWFuZF9ibG9jaw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5jb21tYW5kX2Jsb2NrAA==", @@ -6828,7 +6828,7 @@ "key": "minecraft:beacon", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxBtaW5lY3JhZnQ6YmVhY29u", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFmJsb2NrLm1pbmVjcmFmdC5iZWFjb24A", @@ -6844,7 +6844,7 @@ "key": "minecraft:cobblestone_wall", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6Y29iYmxlc3RvbmVfd2FsbA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5jb2JibGVzdG9uZV93YWxsAA==", @@ -6860,7 +6860,7 @@ "key": "minecraft:mossy_cobblestone_wall", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6bW9zc3lfY29iYmxlc3RvbmVfd2FsbA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5tb3NzeV9jb2JibGVzdG9uZV93YWxsAA==", @@ -6876,7 +6876,7 @@ "key": "minecraft:brick_wall", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6YnJpY2tfd2FsbA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5icmlja193YWxsAA==", @@ -6892,7 +6892,7 @@ "key": "minecraft:prismarine_wall", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6cHJpc21hcmluZV93YWxs", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5wcmlzbWFyaW5lX3dhbGwA", @@ -6908,7 +6908,7 @@ "key": "minecraft:red_sandstone_wall", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6cmVkX3NhbmRzdG9uZV93YWxs", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5yZWRfc2FuZHN0b25lX3dhbGwA", @@ -6924,7 +6924,7 @@ "key": "minecraft:mossy_stone_brick_wall", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6bW9zc3lfc3RvbmVfYnJpY2tfd2FsbA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5tb3NzeV9zdG9uZV9icmlja193YWxsAA==", @@ -6940,7 +6940,7 @@ "key": "minecraft:granite_wall", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6Z3Jhbml0ZV93YWxs", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5ncmFuaXRlX3dhbGwA", @@ -6956,7 +6956,7 @@ "key": "minecraft:stone_brick_wall", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6c3RvbmVfYnJpY2tfd2FsbA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5zdG9uZV9icmlja193YWxsAA==", @@ -6972,7 +6972,7 @@ "key": "minecraft:mud_brick_wall", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6bXVkX2JyaWNrX3dhbGw=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5tdWRfYnJpY2tfd2FsbAA=", @@ -6988,7 +6988,7 @@ "key": "minecraft:nether_brick_wall", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6bmV0aGVyX2JyaWNrX3dhbGw=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5uZXRoZXJfYnJpY2tfd2FsbAA=", @@ -7004,7 +7004,7 @@ "key": "minecraft:andesite_wall", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6YW5kZXNpdGVfd2FsbA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5hbmRlc2l0ZV93YWxsAA==", @@ -7020,7 +7020,7 @@ "key": "minecraft:red_nether_brick_wall", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6cmVkX25ldGhlcl9icmlja193YWxs", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5yZWRfbmV0aGVyX2JyaWNrX3dhbGwA", @@ -7036,7 +7036,7 @@ "key": "minecraft:sandstone_wall", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6c2FuZHN0b25lX3dhbGw=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5zYW5kc3RvbmVfd2FsbAA=", @@ -7052,7 +7052,7 @@ "key": "minecraft:end_stone_brick_wall", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6ZW5kX3N0b25lX2JyaWNrX3dhbGw=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5lbmRfc3RvbmVfYnJpY2tfd2FsbAA=", @@ -7068,7 +7068,7 @@ "key": "minecraft:diorite_wall", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6ZGlvcml0ZV93YWxs", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5kaW9yaXRlX3dhbGwA", @@ -7084,7 +7084,7 @@ "key": "minecraft:blackstone_wall", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6YmxhY2tzdG9uZV93YWxs", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5ibGFja3N0b25lX3dhbGwA", @@ -7100,7 +7100,7 @@ "key": "minecraft:polished_blackstone_wall", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByJtaW5lY3JhZnQ6cG9saXNoZWRfYmxhY2tzdG9uZV93YWxs", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKGJsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF9ibGFja3N0b25lX3dhbGwA", @@ -7116,7 +7116,7 @@ "key": "minecraft:polished_blackstone_brick_wall", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByhtaW5lY3JhZnQ6cG9saXNoZWRfYmxhY2tzdG9uZV9icmlja193YWxs", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUALmJsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF9ibGFja3N0b25lX2JyaWNrX3dhbGwA", @@ -7132,7 +7132,7 @@ "key": "minecraft:cobbled_deepslate_wall", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6Y29iYmxlZF9kZWVwc2xhdGVfd2FsbA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5jb2JibGVkX2RlZXBzbGF0ZV93YWxsAA==", @@ -7148,7 +7148,7 @@ "key": "minecraft:polished_deepslate_wall", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6cG9saXNoZWRfZGVlcHNsYXRlX3dhbGw=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF9kZWVwc2xhdGVfd2FsbAA=", @@ -7164,7 +7164,7 @@ "key": "minecraft:deepslate_brick_wall", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6ZGVlcHNsYXRlX2JyaWNrX3dhbGw=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5kZWVwc2xhdGVfYnJpY2tfd2FsbAA=", @@ -7180,7 +7180,7 @@ "key": "minecraft:deepslate_tile_wall", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6ZGVlcHNsYXRlX3RpbGVfd2FsbA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5kZWVwc2xhdGVfdGlsZV93YWxsAA==", @@ -7196,7 +7196,7 @@ "key": "minecraft:anvil", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw9taW5lY3JhZnQ6YW52aWw=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFWJsb2NrLm1pbmVjcmFmdC5hbnZpbAA=", @@ -7212,7 +7212,7 @@ "key": "minecraft:chipped_anvil", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6Y2hpcHBlZF9hbnZpbA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5jaGlwcGVkX2FudmlsAA==", @@ -7228,7 +7228,7 @@ "key": "minecraft:damaged_anvil", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6ZGFtYWdlZF9hbnZpbA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5kYW1hZ2VkX2FudmlsAA==", @@ -7244,7 +7244,7 @@ "key": "minecraft:chiseled_quartz_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6Y2hpc2VsZWRfcXVhcnR6X2Jsb2Nr", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5jaGlzZWxlZF9xdWFydHpfYmxvY2sA", @@ -7260,7 +7260,7 @@ "key": "minecraft:quartz_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6cXVhcnR6X2Jsb2Nr", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5xdWFydHpfYmxvY2sA", @@ -7276,7 +7276,7 @@ "key": "minecraft:quartz_bricks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6cXVhcnR6X2JyaWNrcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5xdWFydHpfYnJpY2tzAA==", @@ -7292,7 +7292,7 @@ "key": "minecraft:quartz_pillar", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6cXVhcnR6X3BpbGxhcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5xdWFydHpfcGlsbGFyAA==", @@ -7308,7 +7308,7 @@ "key": "minecraft:quartz_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6cXVhcnR6X3N0YWlycw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5xdWFydHpfc3RhaXJzAA==", @@ -7324,7 +7324,7 @@ "key": "minecraft:white_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6d2hpdGVfdGVycmFjb3R0YQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC53aGl0ZV90ZXJyYWNvdHRhAA==", @@ -7340,7 +7340,7 @@ "key": "minecraft:orange_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6b3JhbmdlX3RlcnJhY290dGE=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5vcmFuZ2VfdGVycmFjb3R0YQA=", @@ -7356,7 +7356,7 @@ "key": "minecraft:magenta_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6bWFnZW50YV90ZXJyYWNvdHRh", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5tYWdlbnRhX3RlcnJhY290dGEA", @@ -7372,7 +7372,7 @@ "key": "minecraft:light_blue_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6bGlnaHRfYmx1ZV90ZXJyYWNvdHRh", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5saWdodF9ibHVlX3RlcnJhY290dGEA", @@ -7388,7 +7388,7 @@ "key": "minecraft:yellow_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6eWVsbG93X3RlcnJhY290dGE=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC55ZWxsb3dfdGVycmFjb3R0YQA=", @@ -7404,7 +7404,7 @@ "key": "minecraft:lime_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6bGltZV90ZXJyYWNvdHRh", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5saW1lX3RlcnJhY290dGEA", @@ -7420,7 +7420,7 @@ "key": "minecraft:pink_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6cGlua190ZXJyYWNvdHRh", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5waW5rX3RlcnJhY290dGEA", @@ -7436,7 +7436,7 @@ "key": "minecraft:gray_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6Z3JheV90ZXJyYWNvdHRh", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5ncmF5X3RlcnJhY290dGEA", @@ -7452,7 +7452,7 @@ "key": "minecraft:light_gray_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6bGlnaHRfZ3JheV90ZXJyYWNvdHRh", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5saWdodF9ncmF5X3RlcnJhY290dGEA", @@ -7468,7 +7468,7 @@ "key": "minecraft:cyan_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6Y3lhbl90ZXJyYWNvdHRh", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5jeWFuX3RlcnJhY290dGEA", @@ -7484,7 +7484,7 @@ "key": "minecraft:purple_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6cHVycGxlX3RlcnJhY290dGE=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5wdXJwbGVfdGVycmFjb3R0YQA=", @@ -7500,7 +7500,7 @@ "key": "minecraft:blue_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6Ymx1ZV90ZXJyYWNvdHRh", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5ibHVlX3RlcnJhY290dGEA", @@ -7516,7 +7516,7 @@ "key": "minecraft:brown_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6YnJvd25fdGVycmFjb3R0YQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5icm93bl90ZXJyYWNvdHRhAA==", @@ -7532,7 +7532,7 @@ "key": "minecraft:green_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6Z3JlZW5fdGVycmFjb3R0YQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5ncmVlbl90ZXJyYWNvdHRhAA==", @@ -7548,7 +7548,7 @@ "key": "minecraft:red_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6cmVkX3RlcnJhY290dGE=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5yZWRfdGVycmFjb3R0YQA=", @@ -7564,7 +7564,7 @@ "key": "minecraft:black_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6YmxhY2tfdGVycmFjb3R0YQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5ibGFja190ZXJyYWNvdHRhAA==", @@ -7580,7 +7580,7 @@ "key": "minecraft:barrier", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxFtaW5lY3JhZnQ6YmFycmllcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2Jsb2NrLm1pbmVjcmFmdC5iYXJyaWVyAA==", @@ -7597,7 +7597,7 @@ "components": { "minecraft:attribute_modifiers": "DQA=", "minecraft:block_state": "QwEFbGV2ZWwCMTU=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw9taW5lY3JhZnQ6bGlnaHQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFWJsb2NrLm1pbmVjcmFmdC5saWdodAA=", @@ -7613,7 +7613,7 @@ "key": "minecraft:hay_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6aGF5X2Jsb2Nr", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5oYXlfYmxvY2sA", @@ -7629,9 +7629,9 @@ "key": "minecraft:white_carpet", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAa/BgEWbWluZWNyYWZ0OndoaXRlX2NhcnBldAABA0uAAQEBAQA=", + "minecraft:equippable": "HAbWBgEWbWluZWNyYWZ0OndoaXRlX2NhcnBldAABA0yBAQEBAQAB1wY=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6d2hpdGVfY2FycGV0", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC53aGl0ZV9jYXJwZXQA", "minecraft:lore": "CAA=", @@ -7646,9 +7646,9 @@ "key": "minecraft:orange_carpet", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAa/BgEXbWluZWNyYWZ0Om9yYW5nZV9jYXJwZXQAAQNLgAEBAQEA", + "minecraft:equippable": "HAbWBgEXbWluZWNyYWZ0Om9yYW5nZV9jYXJwZXQAAQNMgQEBAQEAAdcG", "minecraft:item_model": "BxdtaW5lY3JhZnQ6b3JhbmdlX2NhcnBldA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5vcmFuZ2VfY2FycGV0AA==", "minecraft:lore": "CAA=", @@ -7663,9 +7663,9 @@ "key": "minecraft:magenta_carpet", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAa/BgEYbWluZWNyYWZ0Om1hZ2VudGFfY2FycGV0AAEDS4ABAQEBAA==", + "minecraft:equippable": "HAbWBgEYbWluZWNyYWZ0Om1hZ2VudGFfY2FycGV0AAEDTIEBAQEBAAHXBg==", "minecraft:item_model": "BxhtaW5lY3JhZnQ6bWFnZW50YV9jYXJwZXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5tYWdlbnRhX2NhcnBldAA=", "minecraft:lore": "CAA=", @@ -7680,9 +7680,9 @@ "key": "minecraft:light_blue_carpet", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAa/BgEbbWluZWNyYWZ0OmxpZ2h0X2JsdWVfY2FycGV0AAEDS4ABAQEBAA==", + "minecraft:equippable": "HAbWBgEbbWluZWNyYWZ0OmxpZ2h0X2JsdWVfY2FycGV0AAEDTIEBAQEBAAHXBg==", "minecraft:item_model": "BxttaW5lY3JhZnQ6bGlnaHRfYmx1ZV9jYXJwZXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5saWdodF9ibHVlX2NhcnBldAA=", "minecraft:lore": "CAA=", @@ -7697,9 +7697,9 @@ "key": "minecraft:yellow_carpet", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAa/BgEXbWluZWNyYWZ0OnllbGxvd19jYXJwZXQAAQNLgAEBAQEA", + "minecraft:equippable": "HAbWBgEXbWluZWNyYWZ0OnllbGxvd19jYXJwZXQAAQNMgQEBAQEAAdcG", "minecraft:item_model": "BxdtaW5lY3JhZnQ6eWVsbG93X2NhcnBldA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC55ZWxsb3dfY2FycGV0AA==", "minecraft:lore": "CAA=", @@ -7714,9 +7714,9 @@ "key": "minecraft:lime_carpet", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAa/BgEVbWluZWNyYWZ0OmxpbWVfY2FycGV0AAEDS4ABAQEBAA==", + "minecraft:equippable": "HAbWBgEVbWluZWNyYWZ0OmxpbWVfY2FycGV0AAEDTIEBAQEBAAHXBg==", "minecraft:item_model": "BxVtaW5lY3JhZnQ6bGltZV9jYXJwZXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5saW1lX2NhcnBldAA=", "minecraft:lore": "CAA=", @@ -7731,9 +7731,9 @@ "key": "minecraft:pink_carpet", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAa/BgEVbWluZWNyYWZ0OnBpbmtfY2FycGV0AAEDS4ABAQEBAA==", + "minecraft:equippable": "HAbWBgEVbWluZWNyYWZ0OnBpbmtfY2FycGV0AAEDTIEBAQEBAAHXBg==", "minecraft:item_model": "BxVtaW5lY3JhZnQ6cGlua19jYXJwZXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5waW5rX2NhcnBldAA=", "minecraft:lore": "CAA=", @@ -7748,9 +7748,9 @@ "key": "minecraft:gray_carpet", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAa/BgEVbWluZWNyYWZ0OmdyYXlfY2FycGV0AAEDS4ABAQEBAA==", + "minecraft:equippable": "HAbWBgEVbWluZWNyYWZ0OmdyYXlfY2FycGV0AAEDTIEBAQEBAAHXBg==", "minecraft:item_model": "BxVtaW5lY3JhZnQ6Z3JheV9jYXJwZXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5ncmF5X2NhcnBldAA=", "minecraft:lore": "CAA=", @@ -7765,9 +7765,9 @@ "key": "minecraft:light_gray_carpet", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAa/BgEbbWluZWNyYWZ0OmxpZ2h0X2dyYXlfY2FycGV0AAEDS4ABAQEBAA==", + "minecraft:equippable": "HAbWBgEbbWluZWNyYWZ0OmxpZ2h0X2dyYXlfY2FycGV0AAEDTIEBAQEBAAHXBg==", "minecraft:item_model": "BxttaW5lY3JhZnQ6bGlnaHRfZ3JheV9jYXJwZXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5saWdodF9ncmF5X2NhcnBldAA=", "minecraft:lore": "CAA=", @@ -7782,9 +7782,9 @@ "key": "minecraft:cyan_carpet", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAa/BgEVbWluZWNyYWZ0OmN5YW5fY2FycGV0AAEDS4ABAQEBAA==", + "minecraft:equippable": "HAbWBgEVbWluZWNyYWZ0OmN5YW5fY2FycGV0AAEDTIEBAQEBAAHXBg==", "minecraft:item_model": "BxVtaW5lY3JhZnQ6Y3lhbl9jYXJwZXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5jeWFuX2NhcnBldAA=", "minecraft:lore": "CAA=", @@ -7799,9 +7799,9 @@ "key": "minecraft:purple_carpet", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAa/BgEXbWluZWNyYWZ0OnB1cnBsZV9jYXJwZXQAAQNLgAEBAQEA", + "minecraft:equippable": "HAbWBgEXbWluZWNyYWZ0OnB1cnBsZV9jYXJwZXQAAQNMgQEBAQEAAdcG", "minecraft:item_model": "BxdtaW5lY3JhZnQ6cHVycGxlX2NhcnBldA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5wdXJwbGVfY2FycGV0AA==", "minecraft:lore": "CAA=", @@ -7816,9 +7816,9 @@ "key": "minecraft:blue_carpet", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAa/BgEVbWluZWNyYWZ0OmJsdWVfY2FycGV0AAEDS4ABAQEBAA==", + "minecraft:equippable": "HAbWBgEVbWluZWNyYWZ0OmJsdWVfY2FycGV0AAEDTIEBAQEBAAHXBg==", "minecraft:item_model": "BxVtaW5lY3JhZnQ6Ymx1ZV9jYXJwZXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5ibHVlX2NhcnBldAA=", "minecraft:lore": "CAA=", @@ -7833,9 +7833,9 @@ "key": "minecraft:brown_carpet", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAa/BgEWbWluZWNyYWZ0OmJyb3duX2NhcnBldAABA0uAAQEBAQA=", + "minecraft:equippable": "HAbWBgEWbWluZWNyYWZ0OmJyb3duX2NhcnBldAABA0yBAQEBAQAB1wY=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6YnJvd25fY2FycGV0", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5icm93bl9jYXJwZXQA", "minecraft:lore": "CAA=", @@ -7850,9 +7850,9 @@ "key": "minecraft:green_carpet", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAa/BgEWbWluZWNyYWZ0OmdyZWVuX2NhcnBldAABA0uAAQEBAQA=", + "minecraft:equippable": "HAbWBgEWbWluZWNyYWZ0OmdyZWVuX2NhcnBldAABA0yBAQEBAQAB1wY=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6Z3JlZW5fY2FycGV0", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5ncmVlbl9jYXJwZXQA", "minecraft:lore": "CAA=", @@ -7867,9 +7867,9 @@ "key": "minecraft:red_carpet", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAa/BgEUbWluZWNyYWZ0OnJlZF9jYXJwZXQAAQNLgAEBAQEA", + "minecraft:equippable": "HAbWBgEUbWluZWNyYWZ0OnJlZF9jYXJwZXQAAQNMgQEBAQEAAdcG", "minecraft:item_model": "BxRtaW5lY3JhZnQ6cmVkX2NhcnBldA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5yZWRfY2FycGV0AA==", "minecraft:lore": "CAA=", @@ -7884,9 +7884,9 @@ "key": "minecraft:black_carpet", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAa/BgEWbWluZWNyYWZ0OmJsYWNrX2NhcnBldAABA0uAAQEBAQA=", + "minecraft:equippable": "HAbWBgEWbWluZWNyYWZ0OmJsYWNrX2NhcnBldAABA0yBAQEBAQAB1wY=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6YmxhY2tfY2FycGV0", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5ibGFja19jYXJwZXQA", "minecraft:lore": "CAA=", @@ -7901,7 +7901,7 @@ "key": "minecraft:terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6dGVycmFjb3R0YQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC50ZXJyYWNvdHRhAA==", @@ -7917,7 +7917,7 @@ "key": "minecraft:packed_ice", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6cGFja2VkX2ljZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5wYWNrZWRfaWNlAA==", @@ -7933,7 +7933,7 @@ "key": "minecraft:dirt_path", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6ZGlydF9wYXRo", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5kaXJ0X3BhdGgA", @@ -7949,7 +7949,7 @@ "key": "minecraft:sunflower", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6c3VuZmxvd2Vy", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5zdW5mbG93ZXIA", @@ -7965,7 +7965,7 @@ "key": "minecraft:lilac", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw9taW5lY3JhZnQ6bGlsYWM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFWJsb2NrLm1pbmVjcmFmdC5saWxhYwA=", @@ -7981,7 +7981,7 @@ "key": "minecraft:rose_bush", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6cm9zZV9idXNo", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5yb3NlX2J1c2gA", @@ -7997,7 +7997,7 @@ "key": "minecraft:peony", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw9taW5lY3JhZnQ6cGVvbnk=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFWJsb2NrLm1pbmVjcmFmdC5wZW9ueQA=", @@ -8013,7 +8013,7 @@ "key": "minecraft:tall_grass", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6dGFsbF9ncmFzcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC50YWxsX2dyYXNzAA==", @@ -8029,7 +8029,7 @@ "key": "minecraft:large_fern", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6bGFyZ2VfZmVybg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5sYXJnZV9mZXJuAA==", @@ -8045,7 +8045,7 @@ "key": "minecraft:white_stained_glass", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6d2hpdGVfc3RhaW5lZF9nbGFzcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC53aGl0ZV9zdGFpbmVkX2dsYXNzAA==", @@ -8061,7 +8061,7 @@ "key": "minecraft:orange_stained_glass", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6b3JhbmdlX3N0YWluZWRfZ2xhc3M=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5vcmFuZ2Vfc3RhaW5lZF9nbGFzcwA=", @@ -8077,7 +8077,7 @@ "key": "minecraft:magenta_stained_glass", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6bWFnZW50YV9zdGFpbmVkX2dsYXNz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5tYWdlbnRhX3N0YWluZWRfZ2xhc3MA", @@ -8093,7 +8093,7 @@ "key": "minecraft:light_blue_stained_glass", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByJtaW5lY3JhZnQ6bGlnaHRfYmx1ZV9zdGFpbmVkX2dsYXNz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKGJsb2NrLm1pbmVjcmFmdC5saWdodF9ibHVlX3N0YWluZWRfZ2xhc3MA", @@ -8109,7 +8109,7 @@ "key": "minecraft:yellow_stained_glass", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6eWVsbG93X3N0YWluZWRfZ2xhc3M=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC55ZWxsb3dfc3RhaW5lZF9nbGFzcwA=", @@ -8125,7 +8125,7 @@ "key": "minecraft:lime_stained_glass", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6bGltZV9zdGFpbmVkX2dsYXNz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5saW1lX3N0YWluZWRfZ2xhc3MA", @@ -8141,7 +8141,7 @@ "key": "minecraft:pink_stained_glass", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6cGlua19zdGFpbmVkX2dsYXNz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5waW5rX3N0YWluZWRfZ2xhc3MA", @@ -8157,7 +8157,7 @@ "key": "minecraft:gray_stained_glass", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6Z3JheV9zdGFpbmVkX2dsYXNz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5ncmF5X3N0YWluZWRfZ2xhc3MA", @@ -8173,7 +8173,7 @@ "key": "minecraft:light_gray_stained_glass", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByJtaW5lY3JhZnQ6bGlnaHRfZ3JheV9zdGFpbmVkX2dsYXNz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKGJsb2NrLm1pbmVjcmFmdC5saWdodF9ncmF5X3N0YWluZWRfZ2xhc3MA", @@ -8189,7 +8189,7 @@ "key": "minecraft:cyan_stained_glass", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6Y3lhbl9zdGFpbmVkX2dsYXNz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5jeWFuX3N0YWluZWRfZ2xhc3MA", @@ -8205,7 +8205,7 @@ "key": "minecraft:purple_stained_glass", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6cHVycGxlX3N0YWluZWRfZ2xhc3M=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5wdXJwbGVfc3RhaW5lZF9nbGFzcwA=", @@ -8221,7 +8221,7 @@ "key": "minecraft:blue_stained_glass", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6Ymx1ZV9zdGFpbmVkX2dsYXNz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5ibHVlX3N0YWluZWRfZ2xhc3MA", @@ -8237,7 +8237,7 @@ "key": "minecraft:brown_stained_glass", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6YnJvd25fc3RhaW5lZF9nbGFzcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5icm93bl9zdGFpbmVkX2dsYXNzAA==", @@ -8253,7 +8253,7 @@ "key": "minecraft:green_stained_glass", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6Z3JlZW5fc3RhaW5lZF9nbGFzcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5ncmVlbl9zdGFpbmVkX2dsYXNzAA==", @@ -8269,7 +8269,7 @@ "key": "minecraft:red_stained_glass", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6cmVkX3N0YWluZWRfZ2xhc3M=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5yZWRfc3RhaW5lZF9nbGFzcwA=", @@ -8285,7 +8285,7 @@ "key": "minecraft:black_stained_glass", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6YmxhY2tfc3RhaW5lZF9nbGFzcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5ibGFja19zdGFpbmVkX2dsYXNzAA==", @@ -8301,7 +8301,7 @@ "key": "minecraft:white_stained_glass_pane", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByJtaW5lY3JhZnQ6d2hpdGVfc3RhaW5lZF9nbGFzc19wYW5l", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKGJsb2NrLm1pbmVjcmFmdC53aGl0ZV9zdGFpbmVkX2dsYXNzX3BhbmUA", @@ -8317,7 +8317,7 @@ "key": "minecraft:orange_stained_glass_pane", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByNtaW5lY3JhZnQ6b3JhbmdlX3N0YWluZWRfZ2xhc3NfcGFuZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKWJsb2NrLm1pbmVjcmFmdC5vcmFuZ2Vfc3RhaW5lZF9nbGFzc19wYW5lAA==", @@ -8333,7 +8333,7 @@ "key": "minecraft:magenta_stained_glass_pane", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByRtaW5lY3JhZnQ6bWFnZW50YV9zdGFpbmVkX2dsYXNzX3BhbmU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKmJsb2NrLm1pbmVjcmFmdC5tYWdlbnRhX3N0YWluZWRfZ2xhc3NfcGFuZQA=", @@ -8349,7 +8349,7 @@ "key": "minecraft:light_blue_stained_glass_pane", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BydtaW5lY3JhZnQ6bGlnaHRfYmx1ZV9zdGFpbmVkX2dsYXNzX3BhbmU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUALWJsb2NrLm1pbmVjcmFmdC5saWdodF9ibHVlX3N0YWluZWRfZ2xhc3NfcGFuZQA=", @@ -8365,7 +8365,7 @@ "key": "minecraft:yellow_stained_glass_pane", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByNtaW5lY3JhZnQ6eWVsbG93X3N0YWluZWRfZ2xhc3NfcGFuZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKWJsb2NrLm1pbmVjcmFmdC55ZWxsb3dfc3RhaW5lZF9nbGFzc19wYW5lAA==", @@ -8381,7 +8381,7 @@ "key": "minecraft:lime_stained_glass_pane", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6bGltZV9zdGFpbmVkX2dsYXNzX3BhbmU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5saW1lX3N0YWluZWRfZ2xhc3NfcGFuZQA=", @@ -8397,7 +8397,7 @@ "key": "minecraft:pink_stained_glass_pane", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6cGlua19zdGFpbmVkX2dsYXNzX3BhbmU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5waW5rX3N0YWluZWRfZ2xhc3NfcGFuZQA=", @@ -8413,7 +8413,7 @@ "key": "minecraft:gray_stained_glass_pane", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6Z3JheV9zdGFpbmVkX2dsYXNzX3BhbmU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5ncmF5X3N0YWluZWRfZ2xhc3NfcGFuZQA=", @@ -8429,7 +8429,7 @@ "key": "minecraft:light_gray_stained_glass_pane", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BydtaW5lY3JhZnQ6bGlnaHRfZ3JheV9zdGFpbmVkX2dsYXNzX3BhbmU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUALWJsb2NrLm1pbmVjcmFmdC5saWdodF9ncmF5X3N0YWluZWRfZ2xhc3NfcGFuZQA=", @@ -8445,7 +8445,7 @@ "key": "minecraft:cyan_stained_glass_pane", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6Y3lhbl9zdGFpbmVkX2dsYXNzX3BhbmU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5jeWFuX3N0YWluZWRfZ2xhc3NfcGFuZQA=", @@ -8461,7 +8461,7 @@ "key": "minecraft:purple_stained_glass_pane", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByNtaW5lY3JhZnQ6cHVycGxlX3N0YWluZWRfZ2xhc3NfcGFuZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKWJsb2NrLm1pbmVjcmFmdC5wdXJwbGVfc3RhaW5lZF9nbGFzc19wYW5lAA==", @@ -8477,7 +8477,7 @@ "key": "minecraft:blue_stained_glass_pane", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6Ymx1ZV9zdGFpbmVkX2dsYXNzX3BhbmU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5ibHVlX3N0YWluZWRfZ2xhc3NfcGFuZQA=", @@ -8493,7 +8493,7 @@ "key": "minecraft:brown_stained_glass_pane", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByJtaW5lY3JhZnQ6YnJvd25fc3RhaW5lZF9nbGFzc19wYW5l", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKGJsb2NrLm1pbmVjcmFmdC5icm93bl9zdGFpbmVkX2dsYXNzX3BhbmUA", @@ -8509,7 +8509,7 @@ "key": "minecraft:green_stained_glass_pane", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByJtaW5lY3JhZnQ6Z3JlZW5fc3RhaW5lZF9nbGFzc19wYW5l", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKGJsb2NrLm1pbmVjcmFmdC5ncmVlbl9zdGFpbmVkX2dsYXNzX3BhbmUA", @@ -8525,7 +8525,7 @@ "key": "minecraft:red_stained_glass_pane", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6cmVkX3N0YWluZWRfZ2xhc3NfcGFuZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5yZWRfc3RhaW5lZF9nbGFzc19wYW5lAA==", @@ -8541,7 +8541,7 @@ "key": "minecraft:black_stained_glass_pane", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByJtaW5lY3JhZnQ6YmxhY2tfc3RhaW5lZF9nbGFzc19wYW5l", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKGJsb2NrLm1pbmVjcmFmdC5ibGFja19zdGFpbmVkX2dsYXNzX3BhbmUA", @@ -8557,7 +8557,7 @@ "key": "minecraft:prismarine", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6cHJpc21hcmluZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5wcmlzbWFyaW5lAA==", @@ -8573,7 +8573,7 @@ "key": "minecraft:prismarine_bricks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6cHJpc21hcmluZV9icmlja3M=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5wcmlzbWFyaW5lX2JyaWNrcwA=", @@ -8589,7 +8589,7 @@ "key": "minecraft:dark_prismarine", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6ZGFya19wcmlzbWFyaW5l", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5kYXJrX3ByaXNtYXJpbmUA", @@ -8605,7 +8605,7 @@ "key": "minecraft:prismarine_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6cHJpc21hcmluZV9zdGFpcnM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5wcmlzbWFyaW5lX3N0YWlycwA=", @@ -8621,7 +8621,7 @@ "key": "minecraft:prismarine_brick_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6cHJpc21hcmluZV9icmlja19zdGFpcnM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5wcmlzbWFyaW5lX2JyaWNrX3N0YWlycwA=", @@ -8637,7 +8637,7 @@ "key": "minecraft:dark_prismarine_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6ZGFya19wcmlzbWFyaW5lX3N0YWlycw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5kYXJrX3ByaXNtYXJpbmVfc3RhaXJzAA==", @@ -8653,7 +8653,7 @@ "key": "minecraft:sea_lantern", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6c2VhX2xhbnRlcm4=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5zZWFfbGFudGVybgA=", @@ -8669,7 +8669,7 @@ "key": "minecraft:red_sandstone", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6cmVkX3NhbmRzdG9uZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5yZWRfc2FuZHN0b25lAA==", @@ -8685,7 +8685,7 @@ "key": "minecraft:chiseled_red_sandstone", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6Y2hpc2VsZWRfcmVkX3NhbmRzdG9uZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5jaGlzZWxlZF9yZWRfc2FuZHN0b25lAA==", @@ -8701,7 +8701,7 @@ "key": "minecraft:cut_red_sandstone", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6Y3V0X3JlZF9zYW5kc3RvbmU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5jdXRfcmVkX3NhbmRzdG9uZQA=", @@ -8717,7 +8717,7 @@ "key": "minecraft:red_sandstone_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6cmVkX3NhbmRzdG9uZV9zdGFpcnM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5yZWRfc2FuZHN0b25lX3N0YWlycwA=", @@ -8733,7 +8733,7 @@ "key": "minecraft:repeating_command_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6cmVwZWF0aW5nX2NvbW1hbmRfYmxvY2s=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5yZXBlYXRpbmdfY29tbWFuZF9ibG9jawA=", @@ -8749,7 +8749,7 @@ "key": "minecraft:chain_command_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6Y2hhaW5fY29tbWFuZF9ibG9jaw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5jaGFpbl9jb21tYW5kX2Jsb2NrAA==", @@ -8765,7 +8765,7 @@ "key": "minecraft:magma_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6bWFnbWFfYmxvY2s=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5tYWdtYV9ibG9jawA=", @@ -8781,7 +8781,7 @@ "key": "minecraft:nether_wart_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6bmV0aGVyX3dhcnRfYmxvY2s=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5uZXRoZXJfd2FydF9ibG9jawA=", @@ -8797,7 +8797,7 @@ "key": "minecraft:warped_wart_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6d2FycGVkX3dhcnRfYmxvY2s=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC53YXJwZWRfd2FydF9ibG9jawA=", @@ -8813,7 +8813,7 @@ "key": "minecraft:red_nether_bricks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6cmVkX25ldGhlcl9icmlja3M=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5yZWRfbmV0aGVyX2JyaWNrcwA=", @@ -8829,7 +8829,7 @@ "key": "minecraft:bone_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6Ym9uZV9ibG9jaw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5ib25lX2Jsb2NrAA==", @@ -8845,7 +8845,7 @@ "key": "minecraft:structure_void", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6c3RydWN0dXJlX3ZvaWQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5zdHJ1Y3R1cmVfdm9pZAA=", @@ -8861,7 +8861,7 @@ "key": "minecraft:shulker_box", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6c2h1bGtlcl9ib3g=", @@ -8878,7 +8878,7 @@ "key": "minecraft:white_shulker_box", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6d2hpdGVfc2h1bGtlcl9ib3g=", @@ -8895,7 +8895,7 @@ "key": "minecraft:orange_shulker_box", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6b3JhbmdlX3NodWxrZXJfYm94", @@ -8912,7 +8912,7 @@ "key": "minecraft:magenta_shulker_box", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6bWFnZW50YV9zaHVsa2VyX2JveA==", @@ -8929,7 +8929,7 @@ "key": "minecraft:light_blue_shulker_box", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6bGlnaHRfYmx1ZV9zaHVsa2VyX2JveA==", @@ -8946,7 +8946,7 @@ "key": "minecraft:yellow_shulker_box", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6eWVsbG93X3NodWxrZXJfYm94", @@ -8963,7 +8963,7 @@ "key": "minecraft:lime_shulker_box", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6bGltZV9zaHVsa2VyX2JveA==", @@ -8980,7 +8980,7 @@ "key": "minecraft:pink_shulker_box", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6cGlua19zaHVsa2VyX2JveA==", @@ -8997,7 +8997,7 @@ "key": "minecraft:gray_shulker_box", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6Z3JheV9zaHVsa2VyX2JveA==", @@ -9014,7 +9014,7 @@ "key": "minecraft:light_gray_shulker_box", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6bGlnaHRfZ3JheV9zaHVsa2VyX2JveA==", @@ -9031,7 +9031,7 @@ "key": "minecraft:cyan_shulker_box", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6Y3lhbl9zaHVsa2VyX2JveA==", @@ -9048,7 +9048,7 @@ "key": "minecraft:purple_shulker_box", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6cHVycGxlX3NodWxrZXJfYm94", @@ -9065,7 +9065,7 @@ "key": "minecraft:blue_shulker_box", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6Ymx1ZV9zaHVsa2VyX2JveA==", @@ -9082,7 +9082,7 @@ "key": "minecraft:brown_shulker_box", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6YnJvd25fc2h1bGtlcl9ib3g=", @@ -9099,7 +9099,7 @@ "key": "minecraft:green_shulker_box", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6Z3JlZW5fc2h1bGtlcl9ib3g=", @@ -9116,7 +9116,7 @@ "key": "minecraft:red_shulker_box", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6cmVkX3NodWxrZXJfYm94", @@ -9133,7 +9133,7 @@ "key": "minecraft:black_shulker_box", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6YmxhY2tfc2h1bGtlcl9ib3g=", @@ -9150,7 +9150,7 @@ "key": "minecraft:white_glazed_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6d2hpdGVfZ2xhemVkX3RlcnJhY290dGE=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC53aGl0ZV9nbGF6ZWRfdGVycmFjb3R0YQA=", @@ -9166,7 +9166,7 @@ "key": "minecraft:orange_glazed_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByJtaW5lY3JhZnQ6b3JhbmdlX2dsYXplZF90ZXJyYWNvdHRh", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKGJsb2NrLm1pbmVjcmFmdC5vcmFuZ2VfZ2xhemVkX3RlcnJhY290dGEA", @@ -9182,7 +9182,7 @@ "key": "minecraft:magenta_glazed_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByNtaW5lY3JhZnQ6bWFnZW50YV9nbGF6ZWRfdGVycmFjb3R0YQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKWJsb2NrLm1pbmVjcmFmdC5tYWdlbnRhX2dsYXplZF90ZXJyYWNvdHRhAA==", @@ -9198,7 +9198,7 @@ "key": "minecraft:light_blue_glazed_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByZtaW5lY3JhZnQ6bGlnaHRfYmx1ZV9nbGF6ZWRfdGVycmFjb3R0YQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUALGJsb2NrLm1pbmVjcmFmdC5saWdodF9ibHVlX2dsYXplZF90ZXJyYWNvdHRhAA==", @@ -9214,7 +9214,7 @@ "key": "minecraft:yellow_glazed_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByJtaW5lY3JhZnQ6eWVsbG93X2dsYXplZF90ZXJyYWNvdHRh", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKGJsb2NrLm1pbmVjcmFmdC55ZWxsb3dfZ2xhemVkX3RlcnJhY290dGEA", @@ -9230,7 +9230,7 @@ "key": "minecraft:lime_glazed_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6bGltZV9nbGF6ZWRfdGVycmFjb3R0YQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5saW1lX2dsYXplZF90ZXJyYWNvdHRhAA==", @@ -9246,7 +9246,7 @@ "key": "minecraft:pink_glazed_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6cGlua19nbGF6ZWRfdGVycmFjb3R0YQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5waW5rX2dsYXplZF90ZXJyYWNvdHRhAA==", @@ -9262,7 +9262,7 @@ "key": "minecraft:gray_glazed_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6Z3JheV9nbGF6ZWRfdGVycmFjb3R0YQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5ncmF5X2dsYXplZF90ZXJyYWNvdHRhAA==", @@ -9278,7 +9278,7 @@ "key": "minecraft:light_gray_glazed_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByZtaW5lY3JhZnQ6bGlnaHRfZ3JheV9nbGF6ZWRfdGVycmFjb3R0YQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUALGJsb2NrLm1pbmVjcmFmdC5saWdodF9ncmF5X2dsYXplZF90ZXJyYWNvdHRhAA==", @@ -9294,7 +9294,7 @@ "key": "minecraft:cyan_glazed_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6Y3lhbl9nbGF6ZWRfdGVycmFjb3R0YQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5jeWFuX2dsYXplZF90ZXJyYWNvdHRhAA==", @@ -9310,7 +9310,7 @@ "key": "minecraft:purple_glazed_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByJtaW5lY3JhZnQ6cHVycGxlX2dsYXplZF90ZXJyYWNvdHRh", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKGJsb2NrLm1pbmVjcmFmdC5wdXJwbGVfZ2xhemVkX3RlcnJhY290dGEA", @@ -9326,7 +9326,7 @@ "key": "minecraft:blue_glazed_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6Ymx1ZV9nbGF6ZWRfdGVycmFjb3R0YQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5ibHVlX2dsYXplZF90ZXJyYWNvdHRhAA==", @@ -9342,7 +9342,7 @@ "key": "minecraft:brown_glazed_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6YnJvd25fZ2xhemVkX3RlcnJhY290dGE=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5icm93bl9nbGF6ZWRfdGVycmFjb3R0YQA=", @@ -9358,7 +9358,7 @@ "key": "minecraft:green_glazed_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6Z3JlZW5fZ2xhemVkX3RlcnJhY290dGE=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5ncmVlbl9nbGF6ZWRfdGVycmFjb3R0YQA=", @@ -9374,7 +9374,7 @@ "key": "minecraft:red_glazed_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6cmVkX2dsYXplZF90ZXJyYWNvdHRh", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5yZWRfZ2xhemVkX3RlcnJhY290dGEA", @@ -9390,7 +9390,7 @@ "key": "minecraft:black_glazed_terracotta", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6YmxhY2tfZ2xhemVkX3RlcnJhY290dGE=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5ibGFja19nbGF6ZWRfdGVycmFjb3R0YQA=", @@ -9406,7 +9406,7 @@ "key": "minecraft:white_concrete", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6d2hpdGVfY29uY3JldGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC53aGl0ZV9jb25jcmV0ZQA=", @@ -9422,7 +9422,7 @@ "key": "minecraft:orange_concrete", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6b3JhbmdlX2NvbmNyZXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5vcmFuZ2VfY29uY3JldGUA", @@ -9438,7 +9438,7 @@ "key": "minecraft:magenta_concrete", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6bWFnZW50YV9jb25jcmV0ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5tYWdlbnRhX2NvbmNyZXRlAA==", @@ -9454,7 +9454,7 @@ "key": "minecraft:light_blue_concrete", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6bGlnaHRfYmx1ZV9jb25jcmV0ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5saWdodF9ibHVlX2NvbmNyZXRlAA==", @@ -9470,7 +9470,7 @@ "key": "minecraft:yellow_concrete", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6eWVsbG93X2NvbmNyZXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC55ZWxsb3dfY29uY3JldGUA", @@ -9486,7 +9486,7 @@ "key": "minecraft:lime_concrete", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6bGltZV9jb25jcmV0ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5saW1lX2NvbmNyZXRlAA==", @@ -9502,7 +9502,7 @@ "key": "minecraft:pink_concrete", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6cGlua19jb25jcmV0ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5waW5rX2NvbmNyZXRlAA==", @@ -9518,7 +9518,7 @@ "key": "minecraft:gray_concrete", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6Z3JheV9jb25jcmV0ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5ncmF5X2NvbmNyZXRlAA==", @@ -9534,7 +9534,7 @@ "key": "minecraft:light_gray_concrete", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6bGlnaHRfZ3JheV9jb25jcmV0ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5saWdodF9ncmF5X2NvbmNyZXRlAA==", @@ -9550,7 +9550,7 @@ "key": "minecraft:cyan_concrete", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6Y3lhbl9jb25jcmV0ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5jeWFuX2NvbmNyZXRlAA==", @@ -9566,7 +9566,7 @@ "key": "minecraft:purple_concrete", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6cHVycGxlX2NvbmNyZXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5wdXJwbGVfY29uY3JldGUA", @@ -9582,7 +9582,7 @@ "key": "minecraft:blue_concrete", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6Ymx1ZV9jb25jcmV0ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5ibHVlX2NvbmNyZXRlAA==", @@ -9598,7 +9598,7 @@ "key": "minecraft:brown_concrete", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6YnJvd25fY29uY3JldGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5icm93bl9jb25jcmV0ZQA=", @@ -9614,7 +9614,7 @@ "key": "minecraft:green_concrete", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6Z3JlZW5fY29uY3JldGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5ncmVlbl9jb25jcmV0ZQA=", @@ -9630,7 +9630,7 @@ "key": "minecraft:red_concrete", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6cmVkX2NvbmNyZXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5yZWRfY29uY3JldGUA", @@ -9646,7 +9646,7 @@ "key": "minecraft:black_concrete", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6YmxhY2tfY29uY3JldGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5ibGFja19jb25jcmV0ZQA=", @@ -9662,7 +9662,7 @@ "key": "minecraft:white_concrete_powder", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6d2hpdGVfY29uY3JldGVfcG93ZGVy", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC53aGl0ZV9jb25jcmV0ZV9wb3dkZXIA", @@ -9678,7 +9678,7 @@ "key": "minecraft:orange_concrete_powder", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6b3JhbmdlX2NvbmNyZXRlX3Bvd2Rlcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5vcmFuZ2VfY29uY3JldGVfcG93ZGVyAA==", @@ -9694,7 +9694,7 @@ "key": "minecraft:magenta_concrete_powder", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6bWFnZW50YV9jb25jcmV0ZV9wb3dkZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5tYWdlbnRhX2NvbmNyZXRlX3Bvd2RlcgA=", @@ -9710,7 +9710,7 @@ "key": "minecraft:light_blue_concrete_powder", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByRtaW5lY3JhZnQ6bGlnaHRfYmx1ZV9jb25jcmV0ZV9wb3dkZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKmJsb2NrLm1pbmVjcmFmdC5saWdodF9ibHVlX2NvbmNyZXRlX3Bvd2RlcgA=", @@ -9726,7 +9726,7 @@ "key": "minecraft:yellow_concrete_powder", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6eWVsbG93X2NvbmNyZXRlX3Bvd2Rlcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC55ZWxsb3dfY29uY3JldGVfcG93ZGVyAA==", @@ -9742,7 +9742,7 @@ "key": "minecraft:lime_concrete_powder", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6bGltZV9jb25jcmV0ZV9wb3dkZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5saW1lX2NvbmNyZXRlX3Bvd2RlcgA=", @@ -9758,7 +9758,7 @@ "key": "minecraft:pink_concrete_powder", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6cGlua19jb25jcmV0ZV9wb3dkZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5waW5rX2NvbmNyZXRlX3Bvd2RlcgA=", @@ -9774,7 +9774,7 @@ "key": "minecraft:gray_concrete_powder", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6Z3JheV9jb25jcmV0ZV9wb3dkZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5ncmF5X2NvbmNyZXRlX3Bvd2RlcgA=", @@ -9790,7 +9790,7 @@ "key": "minecraft:light_gray_concrete_powder", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByRtaW5lY3JhZnQ6bGlnaHRfZ3JheV9jb25jcmV0ZV9wb3dkZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKmJsb2NrLm1pbmVjcmFmdC5saWdodF9ncmF5X2NvbmNyZXRlX3Bvd2RlcgA=", @@ -9806,7 +9806,7 @@ "key": "minecraft:cyan_concrete_powder", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6Y3lhbl9jb25jcmV0ZV9wb3dkZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5jeWFuX2NvbmNyZXRlX3Bvd2RlcgA=", @@ -9822,7 +9822,7 @@ "key": "minecraft:purple_concrete_powder", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6cHVycGxlX2NvbmNyZXRlX3Bvd2Rlcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5wdXJwbGVfY29uY3JldGVfcG93ZGVyAA==", @@ -9838,7 +9838,7 @@ "key": "minecraft:blue_concrete_powder", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6Ymx1ZV9jb25jcmV0ZV9wb3dkZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5ibHVlX2NvbmNyZXRlX3Bvd2RlcgA=", @@ -9854,7 +9854,7 @@ "key": "minecraft:brown_concrete_powder", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6YnJvd25fY29uY3JldGVfcG93ZGVy", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5icm93bl9jb25jcmV0ZV9wb3dkZXIA", @@ -9870,7 +9870,7 @@ "key": "minecraft:green_concrete_powder", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6Z3JlZW5fY29uY3JldGVfcG93ZGVy", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5ncmVlbl9jb25jcmV0ZV9wb3dkZXIA", @@ -9886,7 +9886,7 @@ "key": "minecraft:red_concrete_powder", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6cmVkX2NvbmNyZXRlX3Bvd2Rlcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5yZWRfY29uY3JldGVfcG93ZGVyAA==", @@ -9902,7 +9902,7 @@ "key": "minecraft:black_concrete_powder", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6YmxhY2tfY29uY3JldGVfcG93ZGVy", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5ibGFja19jb25jcmV0ZV9wb3dkZXIA", @@ -9918,7 +9918,7 @@ "key": "minecraft:turtle_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6dHVydGxlX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC50dXJ0bGVfZWdnAA==", @@ -9934,7 +9934,7 @@ "key": "minecraft:sniffer_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6c25pZmZlcl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5zbmlmZmVyX2VnZwA=", @@ -9947,10 +9947,26 @@ }, { "id": 619, + "key": "minecraft:dried_ghast", + "components": { + "minecraft:attribute_modifiers": "DQA=", + "minecraft:break_sound": "R7EG", + "minecraft:enchantments": "CgA=", + "minecraft:item_model": "BxVtaW5lY3JhZnQ6ZHJpZWRfZ2hhc3Q=", + "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5kcmllZF9naGFzdAA=", + "minecraft:lore": "CAA=", + "minecraft:max_stack_size": "AUA=", + "minecraft:rarity": "CQA=", + "minecraft:repair_cost": "EAA=", + "minecraft:tooltip_display": "DwAA" + } + }, + { + "id": 620, "key": "minecraft:dead_tube_coral_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6ZGVhZF90dWJlX2NvcmFsX2Jsb2Nr", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5kZWFkX3R1YmVfY29yYWxfYmxvY2sA", @@ -9962,11 +9978,11 @@ } }, { - "id": 620, + "id": 621, "key": "minecraft:dead_brain_coral_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6ZGVhZF9icmFpbl9jb3JhbF9ibG9jaw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5kZWFkX2JyYWluX2NvcmFsX2Jsb2NrAA==", @@ -9978,11 +9994,11 @@ } }, { - "id": 621, + "id": 622, "key": "minecraft:dead_bubble_coral_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6ZGVhZF9idWJibGVfY29yYWxfYmxvY2s=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5kZWFkX2J1YmJsZV9jb3JhbF9ibG9jawA=", @@ -9994,11 +10010,11 @@ } }, { - "id": 622, + "id": 623, "key": "minecraft:dead_fire_coral_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6ZGVhZF9maXJlX2NvcmFsX2Jsb2Nr", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5kZWFkX2ZpcmVfY29yYWxfYmxvY2sA", @@ -10010,11 +10026,11 @@ } }, { - "id": 623, + "id": 624, "key": "minecraft:dead_horn_coral_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6ZGVhZF9ob3JuX2NvcmFsX2Jsb2Nr", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5kZWFkX2hvcm5fY29yYWxfYmxvY2sA", @@ -10026,11 +10042,11 @@ } }, { - "id": 624, + "id": 625, "key": "minecraft:tube_coral_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6dHViZV9jb3JhbF9ibG9jaw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC50dWJlX2NvcmFsX2Jsb2NrAA==", @@ -10042,11 +10058,11 @@ } }, { - "id": 625, + "id": 626, "key": "minecraft:brain_coral_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6YnJhaW5fY29yYWxfYmxvY2s=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5icmFpbl9jb3JhbF9ibG9jawA=", @@ -10058,11 +10074,11 @@ } }, { - "id": 626, + "id": 627, "key": "minecraft:bubble_coral_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6YnViYmxlX2NvcmFsX2Jsb2Nr", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5idWJibGVfY29yYWxfYmxvY2sA", @@ -10074,11 +10090,11 @@ } }, { - "id": 627, + "id": 628, "key": "minecraft:fire_coral_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6ZmlyZV9jb3JhbF9ibG9jaw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5maXJlX2NvcmFsX2Jsb2NrAA==", @@ -10090,11 +10106,11 @@ } }, { - "id": 628, + "id": 629, "key": "minecraft:horn_coral_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6aG9ybl9jb3JhbF9ibG9jaw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5ob3JuX2NvcmFsX2Jsb2NrAA==", @@ -10106,11 +10122,11 @@ } }, { - "id": 629, + "id": 630, "key": "minecraft:tube_coral", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6dHViZV9jb3JhbA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC50dWJlX2NvcmFsAA==", @@ -10122,11 +10138,11 @@ } }, { - "id": 630, + "id": 631, "key": "minecraft:brain_coral", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6YnJhaW5fY29yYWw=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5icmFpbl9jb3JhbAA=", @@ -10138,11 +10154,11 @@ } }, { - "id": 631, + "id": 632, "key": "minecraft:bubble_coral", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6YnViYmxlX2NvcmFs", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5idWJibGVfY29yYWwA", @@ -10154,11 +10170,11 @@ } }, { - "id": 632, + "id": 633, "key": "minecraft:fire_coral", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6ZmlyZV9jb3JhbA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5maXJlX2NvcmFsAA==", @@ -10170,11 +10186,11 @@ } }, { - "id": 633, + "id": 634, "key": "minecraft:horn_coral", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6aG9ybl9jb3JhbA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5ob3JuX2NvcmFsAA==", @@ -10186,11 +10202,11 @@ } }, { - "id": 634, + "id": 635, "key": "minecraft:dead_brain_coral", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6ZGVhZF9icmFpbl9jb3JhbA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5kZWFkX2JyYWluX2NvcmFsAA==", @@ -10202,11 +10218,11 @@ } }, { - "id": 635, + "id": 636, "key": "minecraft:dead_bubble_coral", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6ZGVhZF9idWJibGVfY29yYWw=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5kZWFkX2J1YmJsZV9jb3JhbAA=", @@ -10218,11 +10234,11 @@ } }, { - "id": 636, + "id": 637, "key": "minecraft:dead_fire_coral", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6ZGVhZF9maXJlX2NvcmFs", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5kZWFkX2ZpcmVfY29yYWwA", @@ -10234,11 +10250,11 @@ } }, { - "id": 637, + "id": 638, "key": "minecraft:dead_horn_coral", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6ZGVhZF9ob3JuX2NvcmFs", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5kZWFkX2hvcm5fY29yYWwA", @@ -10250,11 +10266,11 @@ } }, { - "id": 638, + "id": 639, "key": "minecraft:dead_tube_coral", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6ZGVhZF90dWJlX2NvcmFs", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5kZWFkX3R1YmVfY29yYWwA", @@ -10266,11 +10282,11 @@ } }, { - "id": 639, + "id": 640, "key": "minecraft:tube_coral_fan", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6dHViZV9jb3JhbF9mYW4=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC50dWJlX2NvcmFsX2ZhbgA=", @@ -10282,11 +10298,11 @@ } }, { - "id": 640, + "id": 641, "key": "minecraft:brain_coral_fan", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6YnJhaW5fY29yYWxfZmFu", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5icmFpbl9jb3JhbF9mYW4A", @@ -10298,11 +10314,11 @@ } }, { - "id": 641, + "id": 642, "key": "minecraft:bubble_coral_fan", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6YnViYmxlX2NvcmFsX2Zhbg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5idWJibGVfY29yYWxfZmFuAA==", @@ -10314,11 +10330,11 @@ } }, { - "id": 642, + "id": 643, "key": "minecraft:fire_coral_fan", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6ZmlyZV9jb3JhbF9mYW4=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5maXJlX2NvcmFsX2ZhbgA=", @@ -10330,11 +10346,11 @@ } }, { - "id": 643, + "id": 644, "key": "minecraft:horn_coral_fan", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6aG9ybl9jb3JhbF9mYW4=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5ob3JuX2NvcmFsX2ZhbgA=", @@ -10346,11 +10362,11 @@ } }, { - "id": 644, + "id": 645, "key": "minecraft:dead_tube_coral_fan", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6ZGVhZF90dWJlX2NvcmFsX2Zhbg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5kZWFkX3R1YmVfY29yYWxfZmFuAA==", @@ -10362,11 +10378,11 @@ } }, { - "id": 645, + "id": 646, "key": "minecraft:dead_brain_coral_fan", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6ZGVhZF9icmFpbl9jb3JhbF9mYW4=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5kZWFkX2JyYWluX2NvcmFsX2ZhbgA=", @@ -10378,11 +10394,11 @@ } }, { - "id": 646, + "id": 647, "key": "minecraft:dead_bubble_coral_fan", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6ZGVhZF9idWJibGVfY29yYWxfZmFu", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5kZWFkX2J1YmJsZV9jb3JhbF9mYW4A", @@ -10394,11 +10410,11 @@ } }, { - "id": 647, + "id": 648, "key": "minecraft:dead_fire_coral_fan", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6ZGVhZF9maXJlX2NvcmFsX2Zhbg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5kZWFkX2ZpcmVfY29yYWxfZmFuAA==", @@ -10410,11 +10426,11 @@ } }, { - "id": 648, + "id": 649, "key": "minecraft:dead_horn_coral_fan", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6ZGVhZF9ob3JuX2NvcmFsX2Zhbg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5kZWFkX2hvcm5fY29yYWxfZmFuAA==", @@ -10426,11 +10442,11 @@ } }, { - "id": 649, + "id": 650, "key": "minecraft:blue_ice", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6Ymx1ZV9pY2U=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGJsb2NrLm1pbmVjcmFmdC5ibHVlX2ljZQA=", @@ -10442,11 +10458,11 @@ } }, { - "id": 650, + "id": 651, "key": "minecraft:conduit", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxFtaW5lY3JhZnQ6Y29uZHVpdA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2Jsb2NrLm1pbmVjcmFmdC5jb25kdWl0AA==", @@ -10458,11 +10474,11 @@ } }, { - "id": 651, + "id": 652, "key": "minecraft:polished_granite_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6cG9saXNoZWRfZ3Jhbml0ZV9zdGFpcnM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF9ncmFuaXRlX3N0YWlycwA=", @@ -10474,11 +10490,11 @@ } }, { - "id": 652, + "id": 653, "key": "minecraft:smooth_red_sandstone_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByVtaW5lY3JhZnQ6c21vb3RoX3JlZF9zYW5kc3RvbmVfc3RhaXJz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAK2Jsb2NrLm1pbmVjcmFmdC5zbW9vdGhfcmVkX3NhbmRzdG9uZV9zdGFpcnMA", @@ -10490,11 +10506,11 @@ } }, { - "id": 653, + "id": 654, "key": "minecraft:mossy_stone_brick_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByJtaW5lY3JhZnQ6bW9zc3lfc3RvbmVfYnJpY2tfc3RhaXJz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKGJsb2NrLm1pbmVjcmFmdC5tb3NzeV9zdG9uZV9icmlja19zdGFpcnMA", @@ -10506,11 +10522,11 @@ } }, { - "id": 654, + "id": 655, "key": "minecraft:polished_diorite_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6cG9saXNoZWRfZGlvcml0ZV9zdGFpcnM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF9kaW9yaXRlX3N0YWlycwA=", @@ -10522,11 +10538,11 @@ } }, { - "id": 655, + "id": 656, "key": "minecraft:mossy_cobblestone_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByJtaW5lY3JhZnQ6bW9zc3lfY29iYmxlc3RvbmVfc3RhaXJz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKGJsb2NrLm1pbmVjcmFmdC5tb3NzeV9jb2JibGVzdG9uZV9zdGFpcnMA", @@ -10538,11 +10554,11 @@ } }, { - "id": 656, + "id": 657, "key": "minecraft:end_stone_brick_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6ZW5kX3N0b25lX2JyaWNrX3N0YWlycw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5lbmRfc3RvbmVfYnJpY2tfc3RhaXJzAA==", @@ -10554,11 +10570,11 @@ } }, { - "id": 657, + "id": 658, "key": "minecraft:stone_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6c3RvbmVfc3RhaXJz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5zdG9uZV9zdGFpcnMA", @@ -10570,11 +10586,11 @@ } }, { - "id": 658, + "id": 659, "key": "minecraft:smooth_sandstone_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6c21vb3RoX3NhbmRzdG9uZV9zdGFpcnM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5zbW9vdGhfc2FuZHN0b25lX3N0YWlycwA=", @@ -10586,11 +10602,11 @@ } }, { - "id": 659, + "id": 660, "key": "minecraft:smooth_quartz_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6c21vb3RoX3F1YXJ0el9zdGFpcnM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5zbW9vdGhfcXVhcnR6X3N0YWlycwA=", @@ -10602,11 +10618,11 @@ } }, { - "id": 660, + "id": 661, "key": "minecraft:granite_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6Z3Jhbml0ZV9zdGFpcnM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5ncmFuaXRlX3N0YWlycwA=", @@ -10618,11 +10634,11 @@ } }, { - "id": 661, + "id": 662, "key": "minecraft:andesite_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6YW5kZXNpdGVfc3RhaXJz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5hbmRlc2l0ZV9zdGFpcnMA", @@ -10634,11 +10650,11 @@ } }, { - "id": 662, + "id": 663, "key": "minecraft:red_nether_brick_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6cmVkX25ldGhlcl9icmlja19zdGFpcnM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5yZWRfbmV0aGVyX2JyaWNrX3N0YWlycwA=", @@ -10650,11 +10666,11 @@ } }, { - "id": 663, + "id": 664, "key": "minecraft:polished_andesite_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByJtaW5lY3JhZnQ6cG9saXNoZWRfYW5kZXNpdGVfc3RhaXJz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKGJsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF9hbmRlc2l0ZV9zdGFpcnMA", @@ -10666,11 +10682,11 @@ } }, { - "id": 664, + "id": 665, "key": "minecraft:diorite_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6ZGlvcml0ZV9zdGFpcnM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5kaW9yaXRlX3N0YWlycwA=", @@ -10682,11 +10698,11 @@ } }, { - "id": 665, + "id": 666, "key": "minecraft:cobbled_deepslate_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByJtaW5lY3JhZnQ6Y29iYmxlZF9kZWVwc2xhdGVfc3RhaXJz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKGJsb2NrLm1pbmVjcmFmdC5jb2JibGVkX2RlZXBzbGF0ZV9zdGFpcnMA", @@ -10698,11 +10714,11 @@ } }, { - "id": 666, + "id": 667, "key": "minecraft:polished_deepslate_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByNtaW5lY3JhZnQ6cG9saXNoZWRfZGVlcHNsYXRlX3N0YWlycw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKWJsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF9kZWVwc2xhdGVfc3RhaXJzAA==", @@ -10714,11 +10730,11 @@ } }, { - "id": 667, + "id": 668, "key": "minecraft:deepslate_brick_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6ZGVlcHNsYXRlX2JyaWNrX3N0YWlycw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5kZWVwc2xhdGVfYnJpY2tfc3RhaXJzAA==", @@ -10730,11 +10746,11 @@ } }, { - "id": 668, + "id": 669, "key": "minecraft:deepslate_tile_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6ZGVlcHNsYXRlX3RpbGVfc3RhaXJz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5kZWVwc2xhdGVfdGlsZV9zdGFpcnMA", @@ -10746,11 +10762,11 @@ } }, { - "id": 669, + "id": 670, "key": "minecraft:polished_granite_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6cG9saXNoZWRfZ3Jhbml0ZV9zbGFi", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF9ncmFuaXRlX3NsYWIA", @@ -10762,11 +10778,11 @@ } }, { - "id": 670, + "id": 671, "key": "minecraft:smooth_red_sandstone_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByNtaW5lY3JhZnQ6c21vb3RoX3JlZF9zYW5kc3RvbmVfc2xhYg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKWJsb2NrLm1pbmVjcmFmdC5zbW9vdGhfcmVkX3NhbmRzdG9uZV9zbGFiAA==", @@ -10778,11 +10794,11 @@ } }, { - "id": 671, + "id": 672, "key": "minecraft:mossy_stone_brick_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6bW9zc3lfc3RvbmVfYnJpY2tfc2xhYg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5tb3NzeV9zdG9uZV9icmlja19zbGFiAA==", @@ -10794,11 +10810,11 @@ } }, { - "id": 672, + "id": 673, "key": "minecraft:polished_diorite_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6cG9saXNoZWRfZGlvcml0ZV9zbGFi", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF9kaW9yaXRlX3NsYWIA", @@ -10810,11 +10826,11 @@ } }, { - "id": 673, + "id": 674, "key": "minecraft:mossy_cobblestone_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6bW9zc3lfY29iYmxlc3RvbmVfc2xhYg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5tb3NzeV9jb2JibGVzdG9uZV9zbGFiAA==", @@ -10826,11 +10842,11 @@ } }, { - "id": 674, + "id": 675, "key": "minecraft:end_stone_brick_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6ZW5kX3N0b25lX2JyaWNrX3NsYWI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5lbmRfc3RvbmVfYnJpY2tfc2xhYgA=", @@ -10842,11 +10858,11 @@ } }, { - "id": 675, + "id": 676, "key": "minecraft:smooth_sandstone_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6c21vb3RoX3NhbmRzdG9uZV9zbGFi", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5zbW9vdGhfc2FuZHN0b25lX3NsYWIA", @@ -10858,11 +10874,11 @@ } }, { - "id": 676, + "id": 677, "key": "minecraft:smooth_quartz_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6c21vb3RoX3F1YXJ0el9zbGFi", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5zbW9vdGhfcXVhcnR6X3NsYWIA", @@ -10874,11 +10890,11 @@ } }, { - "id": 677, + "id": 678, "key": "minecraft:granite_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6Z3Jhbml0ZV9zbGFi", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5ncmFuaXRlX3NsYWIA", @@ -10890,11 +10906,11 @@ } }, { - "id": 678, + "id": 679, "key": "minecraft:andesite_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6YW5kZXNpdGVfc2xhYg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5hbmRlc2l0ZV9zbGFiAA==", @@ -10906,11 +10922,11 @@ } }, { - "id": 679, + "id": 680, "key": "minecraft:red_nether_brick_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6cmVkX25ldGhlcl9icmlja19zbGFi", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5yZWRfbmV0aGVyX2JyaWNrX3NsYWIA", @@ -10922,11 +10938,11 @@ } }, { - "id": 680, + "id": 681, "key": "minecraft:polished_andesite_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6cG9saXNoZWRfYW5kZXNpdGVfc2xhYg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF9hbmRlc2l0ZV9zbGFiAA==", @@ -10938,11 +10954,11 @@ } }, { - "id": 681, + "id": 682, "key": "minecraft:diorite_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6ZGlvcml0ZV9zbGFi", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5kaW9yaXRlX3NsYWIA", @@ -10954,11 +10970,11 @@ } }, { - "id": 682, + "id": 683, "key": "minecraft:cobbled_deepslate_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6Y29iYmxlZF9kZWVwc2xhdGVfc2xhYg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5jb2JibGVkX2RlZXBzbGF0ZV9zbGFiAA==", @@ -10970,11 +10986,11 @@ } }, { - "id": 683, + "id": 684, "key": "minecraft:polished_deepslate_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6cG9saXNoZWRfZGVlcHNsYXRlX3NsYWI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF9kZWVwc2xhdGVfc2xhYgA=", @@ -10986,11 +11002,11 @@ } }, { - "id": 684, + "id": 685, "key": "minecraft:deepslate_brick_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6ZGVlcHNsYXRlX2JyaWNrX3NsYWI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5kZWVwc2xhdGVfYnJpY2tfc2xhYgA=", @@ -11002,11 +11018,11 @@ } }, { - "id": 685, + "id": 686, "key": "minecraft:deepslate_tile_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6ZGVlcHNsYXRlX3RpbGVfc2xhYg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5kZWVwc2xhdGVfdGlsZV9zbGFiAA==", @@ -11018,11 +11034,11 @@ } }, { - "id": 686, + "id": 687, "key": "minecraft:scaffolding", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6c2NhZmZvbGRpbmc=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5zY2FmZm9sZGluZwA=", @@ -11034,11 +11050,11 @@ } }, { - "id": 687, + "id": 688, "key": "minecraft:redstone", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6cmVkc3RvbmU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2l0ZW0ubWluZWNyYWZ0LnJlZHN0b25lAA==", @@ -11051,11 +11067,11 @@ } }, { - "id": 688, + "id": 689, "key": "minecraft:redstone_torch", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6cmVkc3RvbmVfdG9yY2g=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5yZWRzdG9uZV90b3JjaAA=", @@ -11067,11 +11083,11 @@ } }, { - "id": 689, + "id": 690, "key": "minecraft:redstone_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6cmVkc3RvbmVfYmxvY2s=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5yZWRzdG9uZV9ibG9jawA=", @@ -11083,11 +11099,11 @@ } }, { - "id": 690, + "id": 691, "key": "minecraft:repeater", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6cmVwZWF0ZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGJsb2NrLm1pbmVjcmFmdC5yZXBlYXRlcgA=", @@ -11099,11 +11115,11 @@ } }, { - "id": 691, + "id": 692, "key": "minecraft:comparator", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6Y29tcGFyYXRvcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5jb21wYXJhdG9yAA==", @@ -11115,11 +11131,11 @@ } }, { - "id": 692, + "id": 693, "key": "minecraft:piston", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxBtaW5lY3JhZnQ6cGlzdG9u", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFmJsb2NrLm1pbmVjcmFmdC5waXN0b24A", @@ -11131,11 +11147,11 @@ } }, { - "id": 693, + "id": 694, "key": "minecraft:sticky_piston", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6c3RpY2t5X3Bpc3Rvbg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5zdGlja3lfcGlzdG9uAA==", @@ -11147,11 +11163,11 @@ } }, { - "id": 694, + "id": 695, "key": "minecraft:slime_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6c2xpbWVfYmxvY2s=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5zbGltZV9ibG9jawA=", @@ -11163,11 +11179,11 @@ } }, { - "id": 695, + "id": 696, "key": "minecraft:honey_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6aG9uZXlfYmxvY2s=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5ob25leV9ibG9jawA=", @@ -11179,11 +11195,11 @@ } }, { - "id": 696, + "id": 697, "key": "minecraft:observer", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6b2JzZXJ2ZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGJsb2NrLm1pbmVjcmFmdC5vYnNlcnZlcgA=", @@ -11195,11 +11211,11 @@ } }, { - "id": 697, + "id": 698, "key": "minecraft:hopper", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxBtaW5lY3JhZnQ6aG9wcGVy", @@ -11212,11 +11228,11 @@ } }, { - "id": 698, + "id": 699, "key": "minecraft:dispenser", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6ZGlzcGVuc2Vy", @@ -11229,11 +11245,11 @@ } }, { - "id": 699, + "id": 700, "key": "minecraft:dropper", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxFtaW5lY3JhZnQ6ZHJvcHBlcg==", @@ -11246,11 +11262,11 @@ } }, { - "id": 700, + "id": 701, "key": "minecraft:lectern", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxFtaW5lY3JhZnQ6bGVjdGVybg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2Jsb2NrLm1pbmVjcmFmdC5sZWN0ZXJuAA==", @@ -11262,11 +11278,11 @@ } }, { - "id": 701, + "id": 702, "key": "minecraft:target", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxBtaW5lY3JhZnQ6dGFyZ2V0", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFmJsb2NrLm1pbmVjcmFmdC50YXJnZXQA", @@ -11278,11 +11294,11 @@ } }, { - "id": 702, + "id": 703, "key": "minecraft:lever", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw9taW5lY3JhZnQ6bGV2ZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFWJsb2NrLm1pbmVjcmFmdC5sZXZlcgA=", @@ -11294,11 +11310,11 @@ } }, { - "id": 703, + "id": 704, "key": "minecraft:lightning_rod", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6bGlnaHRuaW5nX3JvZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5saWdodG5pbmdfcm9kAA==", @@ -11310,11 +11326,11 @@ } }, { - "id": 704, + "id": 705, "key": "minecraft:daylight_detector", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6ZGF5bGlnaHRfZGV0ZWN0b3I=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5kYXlsaWdodF9kZXRlY3RvcgA=", @@ -11326,11 +11342,11 @@ } }, { - "id": 705, + "id": 706, "key": "minecraft:sculk_sensor", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6c2N1bGtfc2Vuc29y", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5zY3Vsa19zZW5zb3IA", @@ -11342,11 +11358,11 @@ } }, { - "id": 706, + "id": 707, "key": "minecraft:calibrated_sculk_sensor", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6Y2FsaWJyYXRlZF9zY3Vsa19zZW5zb3I=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5jYWxpYnJhdGVkX3NjdWxrX3NlbnNvcgA=", @@ -11358,11 +11374,11 @@ } }, { - "id": 707, + "id": 708, "key": "minecraft:tripwire_hook", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6dHJpcHdpcmVfaG9vaw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC50cmlwd2lyZV9ob29rAA==", @@ -11374,11 +11390,11 @@ } }, { - "id": 708, + "id": 709, "key": "minecraft:trapped_chest", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6dHJhcHBlZF9jaGVzdA==", @@ -11391,11 +11407,11 @@ } }, { - "id": 709, + "id": 710, "key": "minecraft:tnt", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw1taW5lY3JhZnQ6dG50", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAE2Jsb2NrLm1pbmVjcmFmdC50bnQA", @@ -11407,11 +11423,11 @@ } }, { - "id": 710, + "id": 711, "key": "minecraft:redstone_lamp", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6cmVkc3RvbmVfbGFtcA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5yZWRzdG9uZV9sYW1wAA==", @@ -11423,11 +11439,11 @@ } }, { - "id": 711, + "id": 712, "key": "minecraft:note_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6bm90ZV9ibG9jaw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5ub3RlX2Jsb2NrAA==", @@ -11439,11 +11455,11 @@ } }, { - "id": 712, + "id": 713, "key": "minecraft:stone_button", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6c3RvbmVfYnV0dG9u", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5zdG9uZV9idXR0b24A", @@ -11455,11 +11471,11 @@ } }, { - "id": 713, + "id": 714, "key": "minecraft:polished_blackstone_button", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByRtaW5lY3JhZnQ6cG9saXNoZWRfYmxhY2tzdG9uZV9idXR0b24=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKmJsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF9ibGFja3N0b25lX2J1dHRvbgA=", @@ -11471,11 +11487,11 @@ } }, { - "id": 714, + "id": 715, "key": "minecraft:oak_button", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6b2FrX2J1dHRvbg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5vYWtfYnV0dG9uAA==", @@ -11487,11 +11503,11 @@ } }, { - "id": 715, + "id": 716, "key": "minecraft:spruce_button", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6c3BydWNlX2J1dHRvbg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5zcHJ1Y2VfYnV0dG9uAA==", @@ -11503,11 +11519,11 @@ } }, { - "id": 716, + "id": 717, "key": "minecraft:birch_button", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6YmlyY2hfYnV0dG9u", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5iaXJjaF9idXR0b24A", @@ -11519,11 +11535,11 @@ } }, { - "id": 717, + "id": 718, "key": "minecraft:jungle_button", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6anVuZ2xlX2J1dHRvbg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5qdW5nbGVfYnV0dG9uAA==", @@ -11535,11 +11551,11 @@ } }, { - "id": 718, + "id": 719, "key": "minecraft:acacia_button", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6YWNhY2lhX2J1dHRvbg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5hY2FjaWFfYnV0dG9uAA==", @@ -11551,11 +11567,11 @@ } }, { - "id": 719, + "id": 720, "key": "minecraft:cherry_button", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6Y2hlcnJ5X2J1dHRvbg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5jaGVycnlfYnV0dG9uAA==", @@ -11567,11 +11583,11 @@ } }, { - "id": 720, + "id": 721, "key": "minecraft:dark_oak_button", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6ZGFya19vYWtfYnV0dG9u", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5kYXJrX29ha19idXR0b24A", @@ -11583,11 +11599,11 @@ } }, { - "id": 721, + "id": 722, "key": "minecraft:pale_oak_button", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6cGFsZV9vYWtfYnV0dG9u", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5wYWxlX29ha19idXR0b24A", @@ -11599,11 +11615,11 @@ } }, { - "id": 722, + "id": 723, "key": "minecraft:mangrove_button", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6bWFuZ3JvdmVfYnV0dG9u", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5tYW5ncm92ZV9idXR0b24A", @@ -11615,11 +11631,11 @@ } }, { - "id": 723, + "id": 724, "key": "minecraft:bamboo_button", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6YmFtYm9vX2J1dHRvbg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5iYW1ib29fYnV0dG9uAA==", @@ -11631,11 +11647,11 @@ } }, { - "id": 724, + "id": 725, "key": "minecraft:crimson_button", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6Y3JpbXNvbl9idXR0b24=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5jcmltc29uX2J1dHRvbgA=", @@ -11647,11 +11663,11 @@ } }, { - "id": 725, + "id": 726, "key": "minecraft:warped_button", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6d2FycGVkX2J1dHRvbg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC53YXJwZWRfYnV0dG9uAA==", @@ -11663,11 +11679,11 @@ } }, { - "id": 726, + "id": 727, "key": "minecraft:stone_pressure_plate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6c3RvbmVfcHJlc3N1cmVfcGxhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5zdG9uZV9wcmVzc3VyZV9wbGF0ZQA=", @@ -11679,11 +11695,11 @@ } }, { - "id": 727, + "id": 728, "key": "minecraft:polished_blackstone_pressure_plate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByxtaW5lY3JhZnQ6cG9saXNoZWRfYmxhY2tzdG9uZV9wcmVzc3VyZV9wbGF0ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAMmJsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF9ibGFja3N0b25lX3ByZXNzdXJlX3BsYXRlAA==", @@ -11695,11 +11711,11 @@ } }, { - "id": 728, + "id": 729, "key": "minecraft:light_weighted_pressure_plate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BydtaW5lY3JhZnQ6bGlnaHRfd2VpZ2h0ZWRfcHJlc3N1cmVfcGxhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUALWJsb2NrLm1pbmVjcmFmdC5saWdodF93ZWlnaHRlZF9wcmVzc3VyZV9wbGF0ZQA=", @@ -11711,11 +11727,11 @@ } }, { - "id": 729, + "id": 730, "key": "minecraft:heavy_weighted_pressure_plate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BydtaW5lY3JhZnQ6aGVhdnlfd2VpZ2h0ZWRfcHJlc3N1cmVfcGxhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUALWJsb2NrLm1pbmVjcmFmdC5oZWF2eV93ZWlnaHRlZF9wcmVzc3VyZV9wbGF0ZQA=", @@ -11727,11 +11743,11 @@ } }, { - "id": 730, + "id": 731, "key": "minecraft:oak_pressure_plate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6b2FrX3ByZXNzdXJlX3BsYXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5vYWtfcHJlc3N1cmVfcGxhdGUA", @@ -11743,11 +11759,11 @@ } }, { - "id": 731, + "id": 732, "key": "minecraft:spruce_pressure_plate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6c3BydWNlX3ByZXNzdXJlX3BsYXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5zcHJ1Y2VfcHJlc3N1cmVfcGxhdGUA", @@ -11759,11 +11775,11 @@ } }, { - "id": 732, + "id": 733, "key": "minecraft:birch_pressure_plate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6YmlyY2hfcHJlc3N1cmVfcGxhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5iaXJjaF9wcmVzc3VyZV9wbGF0ZQA=", @@ -11775,11 +11791,11 @@ } }, { - "id": 733, + "id": 734, "key": "minecraft:jungle_pressure_plate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6anVuZ2xlX3ByZXNzdXJlX3BsYXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5qdW5nbGVfcHJlc3N1cmVfcGxhdGUA", @@ -11791,11 +11807,11 @@ } }, { - "id": 734, + "id": 735, "key": "minecraft:acacia_pressure_plate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6YWNhY2lhX3ByZXNzdXJlX3BsYXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5hY2FjaWFfcHJlc3N1cmVfcGxhdGUA", @@ -11807,11 +11823,11 @@ } }, { - "id": 735, + "id": 736, "key": "minecraft:cherry_pressure_plate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6Y2hlcnJ5X3ByZXNzdXJlX3BsYXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5jaGVycnlfcHJlc3N1cmVfcGxhdGUA", @@ -11823,11 +11839,11 @@ } }, { - "id": 736, + "id": 737, "key": "minecraft:dark_oak_pressure_plate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6ZGFya19vYWtfcHJlc3N1cmVfcGxhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5kYXJrX29ha19wcmVzc3VyZV9wbGF0ZQA=", @@ -11839,11 +11855,11 @@ } }, { - "id": 737, + "id": 738, "key": "minecraft:pale_oak_pressure_plate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6cGFsZV9vYWtfcHJlc3N1cmVfcGxhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5wYWxlX29ha19wcmVzc3VyZV9wbGF0ZQA=", @@ -11855,11 +11871,11 @@ } }, { - "id": 738, + "id": 739, "key": "minecraft:mangrove_pressure_plate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6bWFuZ3JvdmVfcHJlc3N1cmVfcGxhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5tYW5ncm92ZV9wcmVzc3VyZV9wbGF0ZQA=", @@ -11871,11 +11887,11 @@ } }, { - "id": 739, + "id": 740, "key": "minecraft:bamboo_pressure_plate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6YmFtYm9vX3ByZXNzdXJlX3BsYXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5iYW1ib29fcHJlc3N1cmVfcGxhdGUA", @@ -11887,11 +11903,11 @@ } }, { - "id": 740, + "id": 741, "key": "minecraft:crimson_pressure_plate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6Y3JpbXNvbl9wcmVzc3VyZV9wbGF0ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC5jcmltc29uX3ByZXNzdXJlX3BsYXRlAA==", @@ -11903,11 +11919,11 @@ } }, { - "id": 741, + "id": 742, "key": "minecraft:warped_pressure_plate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6d2FycGVkX3ByZXNzdXJlX3BsYXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC53YXJwZWRfcHJlc3N1cmVfcGxhdGUA", @@ -11919,11 +11935,11 @@ } }, { - "id": 742, + "id": 743, "key": "minecraft:iron_door", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6aXJvbl9kb29y", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5pcm9uX2Rvb3IA", @@ -11935,11 +11951,11 @@ } }, { - "id": 743, + "id": 744, "key": "minecraft:oak_door", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6b2FrX2Rvb3I=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGJsb2NrLm1pbmVjcmFmdC5vYWtfZG9vcgA=", @@ -11951,11 +11967,11 @@ } }, { - "id": 744, + "id": 745, "key": "minecraft:spruce_door", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6c3BydWNlX2Rvb3I=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5zcHJ1Y2VfZG9vcgA=", @@ -11967,11 +11983,11 @@ } }, { - "id": 745, + "id": 746, "key": "minecraft:birch_door", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6YmlyY2hfZG9vcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5iaXJjaF9kb29yAA==", @@ -11983,11 +11999,11 @@ } }, { - "id": 746, + "id": 747, "key": "minecraft:jungle_door", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6anVuZ2xlX2Rvb3I=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5qdW5nbGVfZG9vcgA=", @@ -11999,11 +12015,11 @@ } }, { - "id": 747, + "id": 748, "key": "minecraft:acacia_door", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6YWNhY2lhX2Rvb3I=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5hY2FjaWFfZG9vcgA=", @@ -12015,11 +12031,11 @@ } }, { - "id": 748, + "id": 749, "key": "minecraft:cherry_door", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6Y2hlcnJ5X2Rvb3I=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5jaGVycnlfZG9vcgA=", @@ -12031,11 +12047,11 @@ } }, { - "id": 749, + "id": 750, "key": "minecraft:dark_oak_door", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6ZGFya19vYWtfZG9vcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5kYXJrX29ha19kb29yAA==", @@ -12047,11 +12063,11 @@ } }, { - "id": 750, + "id": 751, "key": "minecraft:pale_oak_door", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6cGFsZV9vYWtfZG9vcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5wYWxlX29ha19kb29yAA==", @@ -12063,11 +12079,11 @@ } }, { - "id": 751, + "id": 752, "key": "minecraft:mangrove_door", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6bWFuZ3JvdmVfZG9vcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5tYW5ncm92ZV9kb29yAA==", @@ -12079,11 +12095,11 @@ } }, { - "id": 752, + "id": 753, "key": "minecraft:bamboo_door", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6YmFtYm9vX2Rvb3I=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5iYW1ib29fZG9vcgA=", @@ -12095,11 +12111,11 @@ } }, { - "id": 753, + "id": 754, "key": "minecraft:crimson_door", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6Y3JpbXNvbl9kb29y", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5jcmltc29uX2Rvb3IA", @@ -12111,11 +12127,11 @@ } }, { - "id": 754, + "id": 755, "key": "minecraft:warped_door", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6d2FycGVkX2Rvb3I=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC53YXJwZWRfZG9vcgA=", @@ -12127,11 +12143,11 @@ } }, { - "id": 755, + "id": 756, "key": "minecraft:copper_door", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6Y29wcGVyX2Rvb3I=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5jb3BwZXJfZG9vcgA=", @@ -12143,11 +12159,11 @@ } }, { - "id": 756, + "id": 757, "key": "minecraft:exposed_copper_door", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6ZXhwb3NlZF9jb3BwZXJfZG9vcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5leHBvc2VkX2NvcHBlcl9kb29yAA==", @@ -12159,11 +12175,11 @@ } }, { - "id": 757, + "id": 758, "key": "minecraft:weathered_copper_door", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6d2VhdGhlcmVkX2NvcHBlcl9kb29y", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC53ZWF0aGVyZWRfY29wcGVyX2Rvb3IA", @@ -12175,11 +12191,11 @@ } }, { - "id": 758, + "id": 759, "key": "minecraft:oxidized_copper_door", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6b3hpZGl6ZWRfY29wcGVyX2Rvb3I=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5veGlkaXplZF9jb3BwZXJfZG9vcgA=", @@ -12191,11 +12207,11 @@ } }, { - "id": 759, + "id": 760, "key": "minecraft:waxed_copper_door", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6d2F4ZWRfY29wcGVyX2Rvb3I=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC53YXhlZF9jb3BwZXJfZG9vcgA=", @@ -12207,11 +12223,11 @@ } }, { - "id": 760, + "id": 761, "key": "minecraft:waxed_exposed_copper_door", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByNtaW5lY3JhZnQ6d2F4ZWRfZXhwb3NlZF9jb3BwZXJfZG9vcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKWJsb2NrLm1pbmVjcmFmdC53YXhlZF9leHBvc2VkX2NvcHBlcl9kb29yAA==", @@ -12223,11 +12239,11 @@ } }, { - "id": 761, + "id": 762, "key": "minecraft:waxed_weathered_copper_door", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByVtaW5lY3JhZnQ6d2F4ZWRfd2VhdGhlcmVkX2NvcHBlcl9kb29y", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAK2Jsb2NrLm1pbmVjcmFmdC53YXhlZF93ZWF0aGVyZWRfY29wcGVyX2Rvb3IA", @@ -12239,11 +12255,11 @@ } }, { - "id": 762, + "id": 763, "key": "minecraft:waxed_oxidized_copper_door", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByRtaW5lY3JhZnQ6d2F4ZWRfb3hpZGl6ZWRfY29wcGVyX2Rvb3I=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKmJsb2NrLm1pbmVjcmFmdC53YXhlZF9veGlkaXplZF9jb3BwZXJfZG9vcgA=", @@ -12255,11 +12271,11 @@ } }, { - "id": 763, + "id": 764, "key": "minecraft:iron_trapdoor", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6aXJvbl90cmFwZG9vcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5pcm9uX3RyYXBkb29yAA==", @@ -12271,11 +12287,11 @@ } }, { - "id": 764, + "id": 765, "key": "minecraft:oak_trapdoor", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6b2FrX3RyYXBkb29y", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5vYWtfdHJhcGRvb3IA", @@ -12287,11 +12303,11 @@ } }, { - "id": 765, + "id": 766, "key": "minecraft:spruce_trapdoor", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6c3BydWNlX3RyYXBkb29y", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5zcHJ1Y2VfdHJhcGRvb3IA", @@ -12303,11 +12319,11 @@ } }, { - "id": 766, + "id": 767, "key": "minecraft:birch_trapdoor", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6YmlyY2hfdHJhcGRvb3I=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5iaXJjaF90cmFwZG9vcgA=", @@ -12319,11 +12335,11 @@ } }, { - "id": 767, + "id": 768, "key": "minecraft:jungle_trapdoor", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6anVuZ2xlX3RyYXBkb29y", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5qdW5nbGVfdHJhcGRvb3IA", @@ -12335,11 +12351,11 @@ } }, { - "id": 768, + "id": 769, "key": "minecraft:acacia_trapdoor", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6YWNhY2lhX3RyYXBkb29y", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5hY2FjaWFfdHJhcGRvb3IA", @@ -12351,11 +12367,11 @@ } }, { - "id": 769, + "id": 770, "key": "minecraft:cherry_trapdoor", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6Y2hlcnJ5X3RyYXBkb29y", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5jaGVycnlfdHJhcGRvb3IA", @@ -12367,11 +12383,11 @@ } }, { - "id": 770, + "id": 771, "key": "minecraft:dark_oak_trapdoor", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6ZGFya19vYWtfdHJhcGRvb3I=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5kYXJrX29ha190cmFwZG9vcgA=", @@ -12383,11 +12399,11 @@ } }, { - "id": 771, + "id": 772, "key": "minecraft:pale_oak_trapdoor", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6cGFsZV9vYWtfdHJhcGRvb3I=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5wYWxlX29ha190cmFwZG9vcgA=", @@ -12399,11 +12415,11 @@ } }, { - "id": 772, + "id": 773, "key": "minecraft:mangrove_trapdoor", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6bWFuZ3JvdmVfdHJhcGRvb3I=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5tYW5ncm92ZV90cmFwZG9vcgA=", @@ -12415,11 +12431,11 @@ } }, { - "id": 773, + "id": 774, "key": "minecraft:bamboo_trapdoor", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6YmFtYm9vX3RyYXBkb29y", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5iYW1ib29fdHJhcGRvb3IA", @@ -12431,11 +12447,11 @@ } }, { - "id": 774, + "id": 775, "key": "minecraft:crimson_trapdoor", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6Y3JpbXNvbl90cmFwZG9vcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5jcmltc29uX3RyYXBkb29yAA==", @@ -12447,11 +12463,11 @@ } }, { - "id": 775, + "id": 776, "key": "minecraft:warped_trapdoor", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6d2FycGVkX3RyYXBkb29y", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC53YXJwZWRfdHJhcGRvb3IA", @@ -12463,11 +12479,11 @@ } }, { - "id": 776, + "id": 777, "key": "minecraft:copper_trapdoor", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6Y29wcGVyX3RyYXBkb29y", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5jb3BwZXJfdHJhcGRvb3IA", @@ -12479,11 +12495,11 @@ } }, { - "id": 777, + "id": 778, "key": "minecraft:exposed_copper_trapdoor", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6ZXhwb3NlZF9jb3BwZXJfdHJhcGRvb3I=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2Jsb2NrLm1pbmVjcmFmdC5leHBvc2VkX2NvcHBlcl90cmFwZG9vcgA=", @@ -12495,11 +12511,11 @@ } }, { - "id": 778, + "id": 779, "key": "minecraft:weathered_copper_trapdoor", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByNtaW5lY3JhZnQ6d2VhdGhlcmVkX2NvcHBlcl90cmFwZG9vcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKWJsb2NrLm1pbmVjcmFmdC53ZWF0aGVyZWRfY29wcGVyX3RyYXBkb29yAA==", @@ -12511,11 +12527,11 @@ } }, { - "id": 779, + "id": 780, "key": "minecraft:oxidized_copper_trapdoor", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByJtaW5lY3JhZnQ6b3hpZGl6ZWRfY29wcGVyX3RyYXBkb29y", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKGJsb2NrLm1pbmVjcmFmdC5veGlkaXplZF9jb3BwZXJfdHJhcGRvb3IA", @@ -12527,11 +12543,11 @@ } }, { - "id": 780, + "id": 781, "key": "minecraft:waxed_copper_trapdoor", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6d2F4ZWRfY29wcGVyX3RyYXBkb29y", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC53YXhlZF9jb3BwZXJfdHJhcGRvb3IA", @@ -12543,11 +12559,11 @@ } }, { - "id": 781, + "id": 782, "key": "minecraft:waxed_exposed_copper_trapdoor", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BydtaW5lY3JhZnQ6d2F4ZWRfZXhwb3NlZF9jb3BwZXJfdHJhcGRvb3I=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUALWJsb2NrLm1pbmVjcmFmdC53YXhlZF9leHBvc2VkX2NvcHBlcl90cmFwZG9vcgA=", @@ -12559,11 +12575,11 @@ } }, { - "id": 782, + "id": 783, "key": "minecraft:waxed_weathered_copper_trapdoor", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByltaW5lY3JhZnQ6d2F4ZWRfd2VhdGhlcmVkX2NvcHBlcl90cmFwZG9vcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAL2Jsb2NrLm1pbmVjcmFmdC53YXhlZF93ZWF0aGVyZWRfY29wcGVyX3RyYXBkb29yAA==", @@ -12575,11 +12591,11 @@ } }, { - "id": 783, + "id": 784, "key": "minecraft:waxed_oxidized_copper_trapdoor", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByhtaW5lY3JhZnQ6d2F4ZWRfb3hpZGl6ZWRfY29wcGVyX3RyYXBkb29y", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUALmJsb2NrLm1pbmVjcmFmdC53YXhlZF9veGlkaXplZF9jb3BwZXJfdHJhcGRvb3IA", @@ -12591,11 +12607,11 @@ } }, { - "id": 784, + "id": 785, "key": "minecraft:oak_fence_gate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6b2FrX2ZlbmNlX2dhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5vYWtfZmVuY2VfZ2F0ZQA=", @@ -12607,11 +12623,11 @@ } }, { - "id": 785, + "id": 786, "key": "minecraft:spruce_fence_gate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6c3BydWNlX2ZlbmNlX2dhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5zcHJ1Y2VfZmVuY2VfZ2F0ZQA=", @@ -12623,11 +12639,11 @@ } }, { - "id": 786, + "id": 787, "key": "minecraft:birch_fence_gate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6YmlyY2hfZmVuY2VfZ2F0ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5iaXJjaF9mZW5jZV9nYXRlAA==", @@ -12639,11 +12655,11 @@ } }, { - "id": 787, + "id": 788, "key": "minecraft:jungle_fence_gate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6anVuZ2xlX2ZlbmNlX2dhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5qdW5nbGVfZmVuY2VfZ2F0ZQA=", @@ -12655,11 +12671,11 @@ } }, { - "id": 788, + "id": 789, "key": "minecraft:acacia_fence_gate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6YWNhY2lhX2ZlbmNlX2dhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5hY2FjaWFfZmVuY2VfZ2F0ZQA=", @@ -12671,11 +12687,11 @@ } }, { - "id": 789, + "id": 790, "key": "minecraft:cherry_fence_gate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6Y2hlcnJ5X2ZlbmNlX2dhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5jaGVycnlfZmVuY2VfZ2F0ZQA=", @@ -12687,11 +12703,11 @@ } }, { - "id": 790, + "id": 791, "key": "minecraft:dark_oak_fence_gate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6ZGFya19vYWtfZmVuY2VfZ2F0ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5kYXJrX29ha19mZW5jZV9nYXRlAA==", @@ -12703,11 +12719,11 @@ } }, { - "id": 791, + "id": 792, "key": "minecraft:pale_oak_fence_gate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6cGFsZV9vYWtfZmVuY2VfZ2F0ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5wYWxlX29ha19mZW5jZV9nYXRlAA==", @@ -12719,11 +12735,11 @@ } }, { - "id": 792, + "id": 793, "key": "minecraft:mangrove_fence_gate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6bWFuZ3JvdmVfZmVuY2VfZ2F0ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5tYW5ncm92ZV9mZW5jZV9nYXRlAA==", @@ -12735,11 +12751,11 @@ } }, { - "id": 793, + "id": 794, "key": "minecraft:bamboo_fence_gate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6YmFtYm9vX2ZlbmNlX2dhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5iYW1ib29fZmVuY2VfZ2F0ZQA=", @@ -12751,11 +12767,11 @@ } }, { - "id": 794, + "id": 795, "key": "minecraft:crimson_fence_gate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6Y3JpbXNvbl9mZW5jZV9nYXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5jcmltc29uX2ZlbmNlX2dhdGUA", @@ -12767,11 +12783,11 @@ } }, { - "id": 795, + "id": 796, "key": "minecraft:warped_fence_gate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6d2FycGVkX2ZlbmNlX2dhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC53YXJwZWRfZmVuY2VfZ2F0ZQA=", @@ -12783,11 +12799,11 @@ } }, { - "id": 796, + "id": 797, "key": "minecraft:powered_rail", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6cG93ZXJlZF9yYWls", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5wb3dlcmVkX3JhaWwA", @@ -12799,11 +12815,11 @@ } }, { - "id": 797, + "id": 798, "key": "minecraft:detector_rail", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6ZGV0ZWN0b3JfcmFpbA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5kZXRlY3Rvcl9yYWlsAA==", @@ -12815,11 +12831,11 @@ } }, { - "id": 798, + "id": 799, "key": "minecraft:rail", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw5taW5lY3JhZnQ6cmFpbA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFGJsb2NrLm1pbmVjcmFmdC5yYWlsAA==", @@ -12831,11 +12847,11 @@ } }, { - "id": 799, + "id": 800, "key": "minecraft:activator_rail", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6YWN0aXZhdG9yX3JhaWw=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5hY3RpdmF0b3JfcmFpbAA=", @@ -12847,13 +12863,13 @@ } }, { - "id": 800, + "id": 801, "key": "minecraft:saddle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAfxBQEQbWluZWNyYWZ0OnNhZGRsZQABABptaW5lY3JhZnQ6Y2FuX2VxdWlwX3NhZGRsZQEBAQE=", + "minecraft:equippable": "HAeHBgEQbWluZWNyYWZ0OnNhZGRsZQABABptaW5lY3JhZnQ6Y2FuX2VxdWlwX3NhZGRsZQEBAQEBvw0=", "minecraft:item_model": "BxBtaW5lY3JhZnQ6c2FkZGxl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFWl0ZW0ubWluZWNyYWZ0LnNhZGRsZQA=", "minecraft:lore": "CAA=", @@ -12864,11 +12880,283 @@ } }, { - "id": 801, + "id": 802, + "key": "minecraft:white_harness", + "components": { + "minecraft:attribute_modifiers": "DQA=", + "minecraft:break_sound": "R7EG", + "minecraft:enchantments": "CgA=", + "minecraft:equippable": "HAbfBQEXbWluZWNyYWZ0OndoaXRlX2hhcm5lc3MAAQAbbWluZWNyYWZ0OmNhbl9lcXVpcF9oYXJuZXNzAQEBAQHgBQ==", + "minecraft:item_model": "BxdtaW5lY3JhZnQ6d2hpdGVfaGFybmVzcw==", + "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0LndoaXRlX2hhcm5lc3MA", + "minecraft:lore": "CAA=", + "minecraft:max_stack_size": "AQE=", + "minecraft:rarity": "CQA=", + "minecraft:repair_cost": "EAA=", + "minecraft:tooltip_display": "DwAA" + } + }, + { + "id": 803, + "key": "minecraft:orange_harness", + "components": { + "minecraft:attribute_modifiers": "DQA=", + "minecraft:break_sound": "R7EG", + "minecraft:enchantments": "CgA=", + "minecraft:equippable": "HAbfBQEYbWluZWNyYWZ0Om9yYW5nZV9oYXJuZXNzAAEAG21pbmVjcmFmdDpjYW5fZXF1aXBfaGFybmVzcwEBAQEB4AU=", + "minecraft:item_model": "BxhtaW5lY3JhZnQ6b3JhbmdlX2hhcm5lc3M=", + "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWl0ZW0ubWluZWNyYWZ0Lm9yYW5nZV9oYXJuZXNzAA==", + "minecraft:lore": "CAA=", + "minecraft:max_stack_size": "AQE=", + "minecraft:rarity": "CQA=", + "minecraft:repair_cost": "EAA=", + "minecraft:tooltip_display": "DwAA" + } + }, + { + "id": 804, + "key": "minecraft:magenta_harness", + "components": { + "minecraft:attribute_modifiers": "DQA=", + "minecraft:break_sound": "R7EG", + "minecraft:enchantments": "CgA=", + "minecraft:equippable": "HAbfBQEZbWluZWNyYWZ0Om1hZ2VudGFfaGFybmVzcwABABttaW5lY3JhZnQ6Y2FuX2VxdWlwX2hhcm5lc3MBAQEBAeAF", + "minecraft:item_model": "BxltaW5lY3JhZnQ6bWFnZW50YV9oYXJuZXNz", + "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHml0ZW0ubWluZWNyYWZ0Lm1hZ2VudGFfaGFybmVzcwA=", + "minecraft:lore": "CAA=", + "minecraft:max_stack_size": "AQE=", + "minecraft:rarity": "CQA=", + "minecraft:repair_cost": "EAA=", + "minecraft:tooltip_display": "DwAA" + } + }, + { + "id": 805, + "key": "minecraft:light_blue_harness", + "components": { + "minecraft:attribute_modifiers": "DQA=", + "minecraft:break_sound": "R7EG", + "minecraft:enchantments": "CgA=", + "minecraft:equippable": "HAbfBQEcbWluZWNyYWZ0OmxpZ2h0X2JsdWVfaGFybmVzcwABABttaW5lY3JhZnQ6Y2FuX2VxdWlwX2hhcm5lc3MBAQEBAeAF", + "minecraft:item_model": "BxxtaW5lY3JhZnQ6bGlnaHRfYmx1ZV9oYXJuZXNz", + "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWl0ZW0ubWluZWNyYWZ0LmxpZ2h0X2JsdWVfaGFybmVzcwA=", + "minecraft:lore": "CAA=", + "minecraft:max_stack_size": "AQE=", + "minecraft:rarity": "CQA=", + "minecraft:repair_cost": "EAA=", + "minecraft:tooltip_display": "DwAA" + } + }, + { + "id": 806, + "key": "minecraft:yellow_harness", + "components": { + "minecraft:attribute_modifiers": "DQA=", + "minecraft:break_sound": "R7EG", + "minecraft:enchantments": "CgA=", + "minecraft:equippable": "HAbfBQEYbWluZWNyYWZ0OnllbGxvd19oYXJuZXNzAAEAG21pbmVjcmFmdDpjYW5fZXF1aXBfaGFybmVzcwEBAQEB4AU=", + "minecraft:item_model": "BxhtaW5lY3JhZnQ6eWVsbG93X2hhcm5lc3M=", + "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWl0ZW0ubWluZWNyYWZ0LnllbGxvd19oYXJuZXNzAA==", + "minecraft:lore": "CAA=", + "minecraft:max_stack_size": "AQE=", + "minecraft:rarity": "CQA=", + "minecraft:repair_cost": "EAA=", + "minecraft:tooltip_display": "DwAA" + } + }, + { + "id": 807, + "key": "minecraft:lime_harness", + "components": { + "minecraft:attribute_modifiers": "DQA=", + "minecraft:break_sound": "R7EG", + "minecraft:enchantments": "CgA=", + "minecraft:equippable": "HAbfBQEWbWluZWNyYWZ0OmxpbWVfaGFybmVzcwABABttaW5lY3JhZnQ6Y2FuX2VxdWlwX2hhcm5lc3MBAQEBAeAF", + "minecraft:item_model": "BxZtaW5lY3JhZnQ6bGltZV9oYXJuZXNz", + "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2l0ZW0ubWluZWNyYWZ0LmxpbWVfaGFybmVzcwA=", + "minecraft:lore": "CAA=", + "minecraft:max_stack_size": "AQE=", + "minecraft:rarity": "CQA=", + "minecraft:repair_cost": "EAA=", + "minecraft:tooltip_display": "DwAA" + } + }, + { + "id": 808, + "key": "minecraft:pink_harness", + "components": { + "minecraft:attribute_modifiers": "DQA=", + "minecraft:break_sound": "R7EG", + "minecraft:enchantments": "CgA=", + "minecraft:equippable": "HAbfBQEWbWluZWNyYWZ0OnBpbmtfaGFybmVzcwABABttaW5lY3JhZnQ6Y2FuX2VxdWlwX2hhcm5lc3MBAQEBAeAF", + "minecraft:item_model": "BxZtaW5lY3JhZnQ6cGlua19oYXJuZXNz", + "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2l0ZW0ubWluZWNyYWZ0LnBpbmtfaGFybmVzcwA=", + "minecraft:lore": "CAA=", + "minecraft:max_stack_size": "AQE=", + "minecraft:rarity": "CQA=", + "minecraft:repair_cost": "EAA=", + "minecraft:tooltip_display": "DwAA" + } + }, + { + "id": 809, + "key": "minecraft:gray_harness", + "components": { + "minecraft:attribute_modifiers": "DQA=", + "minecraft:break_sound": "R7EG", + "minecraft:enchantments": "CgA=", + "minecraft:equippable": "HAbfBQEWbWluZWNyYWZ0OmdyYXlfaGFybmVzcwABABttaW5lY3JhZnQ6Y2FuX2VxdWlwX2hhcm5lc3MBAQEBAeAF", + "minecraft:item_model": "BxZtaW5lY3JhZnQ6Z3JheV9oYXJuZXNz", + "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2l0ZW0ubWluZWNyYWZ0LmdyYXlfaGFybmVzcwA=", + "minecraft:lore": "CAA=", + "minecraft:max_stack_size": "AQE=", + "minecraft:rarity": "CQA=", + "minecraft:repair_cost": "EAA=", + "minecraft:tooltip_display": "DwAA" + } + }, + { + "id": 810, + "key": "minecraft:light_gray_harness", + "components": { + "minecraft:attribute_modifiers": "DQA=", + "minecraft:break_sound": "R7EG", + "minecraft:enchantments": "CgA=", + "minecraft:equippable": "HAbfBQEcbWluZWNyYWZ0OmxpZ2h0X2dyYXlfaGFybmVzcwABABttaW5lY3JhZnQ6Y2FuX2VxdWlwX2hhcm5lc3MBAQEBAeAF", + "minecraft:item_model": "BxxtaW5lY3JhZnQ6bGlnaHRfZ3JheV9oYXJuZXNz", + "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWl0ZW0ubWluZWNyYWZ0LmxpZ2h0X2dyYXlfaGFybmVzcwA=", + "minecraft:lore": "CAA=", + "minecraft:max_stack_size": "AQE=", + "minecraft:rarity": "CQA=", + "minecraft:repair_cost": "EAA=", + "minecraft:tooltip_display": "DwAA" + } + }, + { + "id": 811, + "key": "minecraft:cyan_harness", + "components": { + "minecraft:attribute_modifiers": "DQA=", + "minecraft:break_sound": "R7EG", + "minecraft:enchantments": "CgA=", + "minecraft:equippable": "HAbfBQEWbWluZWNyYWZ0OmN5YW5faGFybmVzcwABABttaW5lY3JhZnQ6Y2FuX2VxdWlwX2hhcm5lc3MBAQEBAeAF", + "minecraft:item_model": "BxZtaW5lY3JhZnQ6Y3lhbl9oYXJuZXNz", + "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2l0ZW0ubWluZWNyYWZ0LmN5YW5faGFybmVzcwA=", + "minecraft:lore": "CAA=", + "minecraft:max_stack_size": "AQE=", + "minecraft:rarity": "CQA=", + "minecraft:repair_cost": "EAA=", + "minecraft:tooltip_display": "DwAA" + } + }, + { + "id": 812, + "key": "minecraft:purple_harness", + "components": { + "minecraft:attribute_modifiers": "DQA=", + "minecraft:break_sound": "R7EG", + "minecraft:enchantments": "CgA=", + "minecraft:equippable": "HAbfBQEYbWluZWNyYWZ0OnB1cnBsZV9oYXJuZXNzAAEAG21pbmVjcmFmdDpjYW5fZXF1aXBfaGFybmVzcwEBAQEB4AU=", + "minecraft:item_model": "BxhtaW5lY3JhZnQ6cHVycGxlX2hhcm5lc3M=", + "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWl0ZW0ubWluZWNyYWZ0LnB1cnBsZV9oYXJuZXNzAA==", + "minecraft:lore": "CAA=", + "minecraft:max_stack_size": "AQE=", + "minecraft:rarity": "CQA=", + "minecraft:repair_cost": "EAA=", + "minecraft:tooltip_display": "DwAA" + } + }, + { + "id": 813, + "key": "minecraft:blue_harness", + "components": { + "minecraft:attribute_modifiers": "DQA=", + "minecraft:break_sound": "R7EG", + "minecraft:enchantments": "CgA=", + "minecraft:equippable": "HAbfBQEWbWluZWNyYWZ0OmJsdWVfaGFybmVzcwABABttaW5lY3JhZnQ6Y2FuX2VxdWlwX2hhcm5lc3MBAQEBAeAF", + "minecraft:item_model": "BxZtaW5lY3JhZnQ6Ymx1ZV9oYXJuZXNz", + "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2l0ZW0ubWluZWNyYWZ0LmJsdWVfaGFybmVzcwA=", + "minecraft:lore": "CAA=", + "minecraft:max_stack_size": "AQE=", + "minecraft:rarity": "CQA=", + "minecraft:repair_cost": "EAA=", + "minecraft:tooltip_display": "DwAA" + } + }, + { + "id": 814, + "key": "minecraft:brown_harness", + "components": { + "minecraft:attribute_modifiers": "DQA=", + "minecraft:break_sound": "R7EG", + "minecraft:enchantments": "CgA=", + "minecraft:equippable": "HAbfBQEXbWluZWNyYWZ0OmJyb3duX2hhcm5lc3MAAQAbbWluZWNyYWZ0OmNhbl9lcXVpcF9oYXJuZXNzAQEBAQHgBQ==", + "minecraft:item_model": "BxdtaW5lY3JhZnQ6YnJvd25faGFybmVzcw==", + "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0LmJyb3duX2hhcm5lc3MA", + "minecraft:lore": "CAA=", + "minecraft:max_stack_size": "AQE=", + "minecraft:rarity": "CQA=", + "minecraft:repair_cost": "EAA=", + "minecraft:tooltip_display": "DwAA" + } + }, + { + "id": 815, + "key": "minecraft:green_harness", + "components": { + "minecraft:attribute_modifiers": "DQA=", + "minecraft:break_sound": "R7EG", + "minecraft:enchantments": "CgA=", + "minecraft:equippable": "HAbfBQEXbWluZWNyYWZ0OmdyZWVuX2hhcm5lc3MAAQAbbWluZWNyYWZ0OmNhbl9lcXVpcF9oYXJuZXNzAQEBAQHgBQ==", + "minecraft:item_model": "BxdtaW5lY3JhZnQ6Z3JlZW5faGFybmVzcw==", + "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0LmdyZWVuX2hhcm5lc3MA", + "minecraft:lore": "CAA=", + "minecraft:max_stack_size": "AQE=", + "minecraft:rarity": "CQA=", + "minecraft:repair_cost": "EAA=", + "minecraft:tooltip_display": "DwAA" + } + }, + { + "id": 816, + "key": "minecraft:red_harness", + "components": { + "minecraft:attribute_modifiers": "DQA=", + "minecraft:break_sound": "R7EG", + "minecraft:enchantments": "CgA=", + "minecraft:equippable": "HAbfBQEVbWluZWNyYWZ0OnJlZF9oYXJuZXNzAAEAG21pbmVjcmFmdDpjYW5fZXF1aXBfaGFybmVzcwEBAQEB4AU=", + "minecraft:item_model": "BxVtaW5lY3JhZnQ6cmVkX2hhcm5lc3M=", + "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGml0ZW0ubWluZWNyYWZ0LnJlZF9oYXJuZXNzAA==", + "minecraft:lore": "CAA=", + "minecraft:max_stack_size": "AQE=", + "minecraft:rarity": "CQA=", + "minecraft:repair_cost": "EAA=", + "minecraft:tooltip_display": "DwAA" + } + }, + { + "id": 817, + "key": "minecraft:black_harness", + "components": { + "minecraft:attribute_modifiers": "DQA=", + "minecraft:break_sound": "R7EG", + "minecraft:enchantments": "CgA=", + "minecraft:equippable": "HAbfBQEXbWluZWNyYWZ0OmJsYWNrX2hhcm5lc3MAAQAbbWluZWNyYWZ0OmNhbl9lcXVpcF9oYXJuZXNzAQEBAQHgBQ==", + "minecraft:item_model": "BxdtaW5lY3JhZnQ6YmxhY2tfaGFybmVzcw==", + "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0LmJsYWNrX2hhcm5lc3MA", + "minecraft:lore": "CAA=", + "minecraft:max_stack_size": "AQE=", + "minecraft:rarity": "CQA=", + "minecraft:repair_cost": "EAA=", + "minecraft:tooltip_display": "DwAA" + } + }, + { + "id": 818, "key": "minecraft:minecart", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6bWluZWNhcnQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2l0ZW0ubWluZWNyYWZ0Lm1pbmVjYXJ0AA==", @@ -12880,11 +13168,11 @@ } }, { - "id": 802, + "id": 819, "key": "minecraft:chest_minecart", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6Y2hlc3RfbWluZWNhcnQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWl0ZW0ubWluZWNyYWZ0LmNoZXN0X21pbmVjYXJ0AA==", @@ -12896,11 +13184,11 @@ } }, { - "id": 803, + "id": 820, "key": "minecraft:furnace_minecart", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6ZnVybmFjZV9taW5lY2FydA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0LmZ1cm5hY2VfbWluZWNhcnQA", @@ -12912,11 +13200,11 @@ } }, { - "id": 804, + "id": 821, "key": "minecraft:tnt_minecart", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6dG50X21pbmVjYXJ0", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2l0ZW0ubWluZWNyYWZ0LnRudF9taW5lY2FydAA=", @@ -12928,11 +13216,11 @@ } }, { - "id": 805, + "id": 822, "key": "minecraft:hopper_minecart", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6aG9wcGVyX21pbmVjYXJ0", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHml0ZW0ubWluZWNyYWZ0LmhvcHBlcl9taW5lY2FydAA=", @@ -12944,11 +13232,11 @@ } }, { - "id": 806, + "id": 823, "key": "minecraft:carrot_on_a_stick", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6Y2Fycm90X29uX2Ffc3RpY2s=", @@ -12962,11 +13250,11 @@ } }, { - "id": 807, + "id": 824, "key": "minecraft:warped_fungus_on_a_stick", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByJtaW5lY3JhZnQ6d2FycGVkX2Z1bmd1c19vbl9hX3N0aWNr", @@ -12980,11 +13268,11 @@ } }, { - "id": 808, + "id": 825, "key": "minecraft:phantom_membrane", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6cGhhbnRvbV9tZW1icmFuZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0LnBoYW50b21fbWVtYnJhbmUA", @@ -12996,14 +13284,14 @@ } }, { - "id": 809, + "id": 826, "key": "minecraft:elytra", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HANGARBtaW5lY3JhZnQ6ZWx5dHJhAAABAQAA", + "minecraft:equippable": "HANGARBtaW5lY3JhZnQ6ZWx5dHJhAAABAQAAAJEK", "minecraft:glider": "Hg==", "minecraft:item_model": "BxBtaW5lY3JhZnQ6ZWx5dHJh", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFWl0ZW0ubWluZWNyYWZ0LmVseXRyYQA=", @@ -13012,16 +13300,16 @@ "minecraft:max_stack_size": "AQE=", "minecraft:rarity": "CQM=", "minecraft:repair_cost": "EAA=", - "minecraft:repairable": "HQKoBg==", + "minecraft:repairable": "HQK5Bg==", "minecraft:tooltip_display": "DwAA" } }, { - "id": 810, + "id": 827, "key": "minecraft:oak_boat", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6b2FrX2JvYXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2l0ZW0ubWluZWNyYWZ0Lm9ha19ib2F0AA==", @@ -13033,11 +13321,11 @@ } }, { - "id": 811, + "id": 828, "key": "minecraft:oak_chest_boat", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6b2FrX2NoZXN0X2JvYXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWl0ZW0ubWluZWNyYWZ0Lm9ha19jaGVzdF9ib2F0AA==", @@ -13049,11 +13337,11 @@ } }, { - "id": 812, + "id": 829, "key": "minecraft:spruce_boat", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6c3BydWNlX2JvYXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGml0ZW0ubWluZWNyYWZ0LnNwcnVjZV9ib2F0AA==", @@ -13065,11 +13353,11 @@ } }, { - "id": 813, + "id": 830, "key": "minecraft:spruce_chest_boat", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6c3BydWNlX2NoZXN0X2JvYXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGl0ZW0ubWluZWNyYWZ0LnNwcnVjZV9jaGVzdF9ib2F0AA==", @@ -13081,11 +13369,11 @@ } }, { - "id": 814, + "id": 831, "key": "minecraft:birch_boat", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6YmlyY2hfYm9hdA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWl0ZW0ubWluZWNyYWZ0LmJpcmNoX2JvYXQA", @@ -13097,11 +13385,11 @@ } }, { - "id": 815, + "id": 832, "key": "minecraft:birch_chest_boat", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6YmlyY2hfY2hlc3RfYm9hdA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0LmJpcmNoX2NoZXN0X2JvYXQA", @@ -13113,11 +13401,11 @@ } }, { - "id": 816, + "id": 833, "key": "minecraft:jungle_boat", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6anVuZ2xlX2JvYXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGml0ZW0ubWluZWNyYWZ0Lmp1bmdsZV9ib2F0AA==", @@ -13129,11 +13417,11 @@ } }, { - "id": 817, + "id": 834, "key": "minecraft:jungle_chest_boat", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6anVuZ2xlX2NoZXN0X2JvYXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGl0ZW0ubWluZWNyYWZ0Lmp1bmdsZV9jaGVzdF9ib2F0AA==", @@ -13145,11 +13433,11 @@ } }, { - "id": 818, + "id": 835, "key": "minecraft:acacia_boat", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6YWNhY2lhX2JvYXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGml0ZW0ubWluZWNyYWZ0LmFjYWNpYV9ib2F0AA==", @@ -13161,11 +13449,11 @@ } }, { - "id": 819, + "id": 836, "key": "minecraft:acacia_chest_boat", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6YWNhY2lhX2NoZXN0X2JvYXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGl0ZW0ubWluZWNyYWZ0LmFjYWNpYV9jaGVzdF9ib2F0AA==", @@ -13177,11 +13465,11 @@ } }, { - "id": 820, + "id": 837, "key": "minecraft:cherry_boat", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6Y2hlcnJ5X2JvYXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGml0ZW0ubWluZWNyYWZ0LmNoZXJyeV9ib2F0AA==", @@ -13193,11 +13481,11 @@ } }, { - "id": 821, + "id": 838, "key": "minecraft:cherry_chest_boat", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6Y2hlcnJ5X2NoZXN0X2JvYXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGl0ZW0ubWluZWNyYWZ0LmNoZXJyeV9jaGVzdF9ib2F0AA==", @@ -13209,11 +13497,11 @@ } }, { - "id": 822, + "id": 839, "key": "minecraft:dark_oak_boat", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6ZGFya19vYWtfYm9hdA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0LmRhcmtfb2FrX2JvYXQA", @@ -13225,11 +13513,11 @@ } }, { - "id": 823, + "id": 840, "key": "minecraft:dark_oak_chest_boat", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6ZGFya19vYWtfY2hlc3RfYm9hdA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIml0ZW0ubWluZWNyYWZ0LmRhcmtfb2FrX2NoZXN0X2JvYXQA", @@ -13241,11 +13529,11 @@ } }, { - "id": 824, + "id": 841, "key": "minecraft:pale_oak_boat", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6cGFsZV9vYWtfYm9hdA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0LnBhbGVfb2FrX2JvYXQA", @@ -13257,11 +13545,11 @@ } }, { - "id": 825, + "id": 842, "key": "minecraft:pale_oak_chest_boat", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6cGFsZV9vYWtfY2hlc3RfYm9hdA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIml0ZW0ubWluZWNyYWZ0LnBhbGVfb2FrX2NoZXN0X2JvYXQA", @@ -13273,11 +13561,11 @@ } }, { - "id": 826, + "id": 843, "key": "minecraft:mangrove_boat", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6bWFuZ3JvdmVfYm9hdA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0Lm1hbmdyb3ZlX2JvYXQA", @@ -13289,11 +13577,11 @@ } }, { - "id": 827, + "id": 844, "key": "minecraft:mangrove_chest_boat", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6bWFuZ3JvdmVfY2hlc3RfYm9hdA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIml0ZW0ubWluZWNyYWZ0Lm1hbmdyb3ZlX2NoZXN0X2JvYXQA", @@ -13305,11 +13593,11 @@ } }, { - "id": 828, + "id": 845, "key": "minecraft:bamboo_raft", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6YmFtYm9vX3JhZnQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGml0ZW0ubWluZWNyYWZ0LmJhbWJvb19yYWZ0AA==", @@ -13321,11 +13609,11 @@ } }, { - "id": 829, + "id": 846, "key": "minecraft:bamboo_chest_raft", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6YmFtYm9vX2NoZXN0X3JhZnQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGl0ZW0ubWluZWNyYWZ0LmJhbWJvb19jaGVzdF9yYWZ0AA==", @@ -13337,11 +13625,11 @@ } }, { - "id": 830, + "id": 847, "key": "minecraft:structure_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6c3RydWN0dXJlX2Jsb2Nr", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5zdHJ1Y3R1cmVfYmxvY2sA", @@ -13353,11 +13641,11 @@ } }, { - "id": 831, + "id": 848, "key": "minecraft:jigsaw", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxBtaW5lY3JhZnQ6amlnc2F3", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFmJsb2NrLm1pbmVjcmFmdC5qaWdzYXcA", @@ -13369,12 +13657,12 @@ } }, { - "id": 832, + "id": 849, "key": "minecraft:test_block", "components": { "minecraft:attribute_modifiers": "DQA=", "minecraft:block_state": "QwEEbW9kZQVzdGFydA==", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6dGVzdF9ibG9jaw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC50ZXN0X2Jsb2NrAA==", @@ -13386,11 +13674,11 @@ } }, { - "id": 833, + "id": 850, "key": "minecraft:test_instance_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6dGVzdF9pbnN0YW5jZV9ibG9jaw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC50ZXN0X2luc3RhbmNlX2Jsb2NrAA==", @@ -13402,15 +13690,15 @@ } }, { - "id": 834, + "id": 851, "key": "minecraft:turtle_helmet", "components": { - "minecraft:attribute_modifiers": "DQIAFm1pbmVjcmFmdDphcm1vci5oZWxtZXRAAAAAAAAAAAAHARZtaW5lY3JhZnQ6YXJtb3IuaGVsbWV0AAAAAAAAAAAABw==", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQIAFm1pbmVjcmFmdDphcm1vci5oZWxtZXRAAAAAAAAAAAAHAAEWbWluZWNyYWZ0OmFybW9yLmhlbG1ldAAAAAAAAAAAAAcA", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gwk=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HARMARZtaW5lY3JhZnQ6dHVydGxlX3NjdXRlAAABAQEA", + "minecraft:equippable": "HARMARZtaW5lY3JhZnQ6dHVydGxlX3NjdXRlAAABAQEAAJEK", "minecraft:item_model": "BxdtaW5lY3JhZnQ6dHVydGxlX2hlbG1ldA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0LnR1cnRsZV9oZWxtZXQA", "minecraft:lore": "CAA=", @@ -13423,11 +13711,11 @@ } }, { - "id": 835, + "id": 852, "key": "minecraft:turtle_scute", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6dHVydGxlX3NjdXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2l0ZW0ubWluZWNyYWZ0LnR1cnRsZV9zY3V0ZQA=", @@ -13439,11 +13727,11 @@ } }, { - "id": 836, + "id": 853, "key": "minecraft:armadillo_scute", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6YXJtYWRpbGxvX3NjdXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHml0ZW0ubWluZWNyYWZ0LmFybWFkaWxsb19zY3V0ZQA=", @@ -13455,14 +13743,14 @@ } }, { - "id": 837, + "id": 854, "key": "minecraft:wolf_armor", "components": { - "minecraft:attribute_modifiers": "DQIAFG1pbmVjcmFmdDphcm1vci5ib2R5QCYAAAAAAAAACQEUbWluZWNyYWZ0OmFybW9yLmJvZHkAAAAAAAAAAAAJ", - "minecraft:break_sound": "R8UM", + "minecraft:attribute_modifiers": "DQIAFG1pbmVjcmFmdDphcm1vci5ib2R5QCYAAAAAAAAACQABFG1pbmVjcmFmdDphcm1vci5ib2R5AAAAAAAAAAAACQA=", + "minecraft:break_sound": "R90M", "minecraft:damage": "AwA=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAZNARltaW5lY3JhZnQ6YXJtYWRpbGxvX3NjdXRlAAECjgEBAQEA", + "minecraft:equippable": "HAZNARltaW5lY3JhZnQ6YXJtYWRpbGxvX3NjdXRlAAECjwEBAQEAAU4=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6d29sZl9hcm1vcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWl0ZW0ubWluZWNyYWZ0LndvbGZfYXJtb3IA", "minecraft:lore": "CAA=", @@ -13475,11 +13763,11 @@ } }, { - "id": 838, + "id": 855, "key": "minecraft:flint_and_steel", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6ZmxpbnRfYW5kX3N0ZWVs", @@ -13493,11 +13781,11 @@ } }, { - "id": 839, + "id": 856, "key": "minecraft:bowl", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw5taW5lY3JhZnQ6Ym93bA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAE2l0ZW0ubWluZWNyYWZ0LmJvd2wA", @@ -13509,12 +13797,12 @@ } }, { - "id": 840, + "id": 857, "key": "minecraft:apple", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FARAGZmaAA==", "minecraft:item_model": "Bw9taW5lY3JhZnQ6YXBwbGU=", @@ -13527,11 +13815,11 @@ } }, { - "id": 841, + "id": 858, "key": "minecraft:bow", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "GwE=", "minecraft:enchantments": "CgA=", @@ -13546,11 +13834,11 @@ } }, { - "id": 842, + "id": 859, "key": "minecraft:arrow", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw9taW5lY3JhZnQ6YXJyb3c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFGl0ZW0ubWluZWNyYWZ0LmFycm93AA==", @@ -13562,11 +13850,11 @@ } }, { - "id": 843, + "id": 860, "key": "minecraft:coal", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw5taW5lY3JhZnQ6Y29hbA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAE2l0ZW0ubWluZWNyYWZ0LmNvYWwA", @@ -13578,11 +13866,11 @@ } }, { - "id": 844, + "id": 861, "key": "minecraft:charcoal", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6Y2hhcmNvYWw=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2l0ZW0ubWluZWNyYWZ0LmNoYXJjb2FsAA==", @@ -13594,11 +13882,11 @@ } }, { - "id": 845, + "id": 862, "key": "minecraft:diamond", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxFtaW5lY3JhZnQ6ZGlhbW9uZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFml0ZW0ubWluZWNyYWZ0LmRpYW1vbmQA", @@ -13611,11 +13899,11 @@ } }, { - "id": 846, + "id": 863, "key": "minecraft:emerald", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxFtaW5lY3JhZnQ6ZW1lcmFsZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFml0ZW0ubWluZWNyYWZ0LmVtZXJhbGQA", @@ -13628,11 +13916,11 @@ } }, { - "id": 847, + "id": 864, "key": "minecraft:lapis_lazuli", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6bGFwaXNfbGF6dWxp", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2l0ZW0ubWluZWNyYWZ0LmxhcGlzX2xhenVsaQA=", @@ -13645,11 +13933,11 @@ } }, { - "id": 848, + "id": 865, "key": "minecraft:quartz", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxBtaW5lY3JhZnQ6cXVhcnR6", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFWl0ZW0ubWluZWNyYWZ0LnF1YXJ0egA=", @@ -13662,11 +13950,11 @@ } }, { - "id": 849, + "id": 866, "key": "minecraft:amethyst_shard", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6YW1ldGh5c3Rfc2hhcmQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWl0ZW0ubWluZWNyYWZ0LmFtZXRoeXN0X3NoYXJkAA==", @@ -13679,11 +13967,11 @@ } }, { - "id": 850, + "id": 867, "key": "minecraft:raw_iron", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6cmF3X2lyb24=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2l0ZW0ubWluZWNyYWZ0LnJhd19pcm9uAA==", @@ -13695,11 +13983,11 @@ } }, { - "id": 851, + "id": 868, "key": "minecraft:iron_ingot", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6aXJvbl9pbmdvdA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWl0ZW0ubWluZWNyYWZ0Lmlyb25faW5nb3QA", @@ -13712,11 +14000,11 @@ } }, { - "id": 852, + "id": 869, "key": "minecraft:raw_copper", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6cmF3X2NvcHBlcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWl0ZW0ubWluZWNyYWZ0LnJhd19jb3BwZXIA", @@ -13728,11 +14016,11 @@ } }, { - "id": 853, + "id": 870, "key": "minecraft:copper_ingot", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6Y29wcGVyX2luZ290", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2l0ZW0ubWluZWNyYWZ0LmNvcHBlcl9pbmdvdAA=", @@ -13745,11 +14033,11 @@ } }, { - "id": 854, + "id": 871, "key": "minecraft:raw_gold", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6cmF3X2dvbGQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2l0ZW0ubWluZWNyYWZ0LnJhd19nb2xkAA==", @@ -13761,11 +14049,11 @@ } }, { - "id": 855, + "id": 872, "key": "minecraft:gold_ingot", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6Z29sZF9pbmdvdA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWl0ZW0ubWluZWNyYWZ0LmdvbGRfaW5nb3QA", @@ -13778,11 +14066,11 @@ } }, { - "id": 856, + "id": 873, "key": "minecraft:netherite_ingot", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:damage_resistant": "GBFtaW5lY3JhZnQ6aXNfZmlyZQ==", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6bmV0aGVyaXRlX2luZ290", @@ -13796,11 +14084,11 @@ } }, { - "id": 857, + "id": 874, "key": "minecraft:netherite_scrap", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:damage_resistant": "GBFtaW5lY3JhZnQ6aXNfZmlyZQ==", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6bmV0aGVyaXRlX3NjcmFw", @@ -13813,11 +14101,11 @@ } }, { - "id": 858, + "id": 875, "key": "minecraft:wooden_sword", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VACAAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTAAzMzQAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VACAAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAMzM0AAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gw8=", "minecraft:enchantments": "CgA=", @@ -13835,11 +14123,11 @@ } }, { - "id": 859, + "id": 876, "key": "minecraft:wooden_shovel", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2U/+AAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTACAAAAAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2U/+AAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAgAAAAAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gw8=", "minecraft:enchantments": "CgA=", @@ -13857,11 +14145,11 @@ } }, { - "id": 860, + "id": 877, "key": "minecraft:wooden_pickaxe", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2U/8AAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTABmZmYAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2U/8AAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAZmZmAAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gw8=", "minecraft:enchantments": "CgA=", @@ -13879,11 +14167,11 @@ } }, { - "id": 861, + "id": 878, "key": "minecraft:wooden_axe", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAGAAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTACZmZoAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAGAAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAmZmaAAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gw8=", "minecraft:enchantments": "CgA=", @@ -13901,11 +14189,11 @@ } }, { - "id": 862, + "id": 879, "key": "minecraft:wooden_hoe", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2UAAAAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTACAAAAAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2UAAAAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAgAAAAAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gw8=", "minecraft:enchantments": "CgA=", @@ -13923,11 +14211,11 @@ } }, { - "id": 863, + "id": 880, "key": "minecraft:stone_sword", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAEAAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTAAzMzQAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAEAAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAMzM0AAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "GwU=", "minecraft:enchantments": "CgA=", @@ -13945,11 +14233,11 @@ } }, { - "id": 864, + "id": 881, "key": "minecraft:stone_shovel", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VABAAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTACAAAAAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VABAAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAgAAAAAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "GwU=", "minecraft:enchantments": "CgA=", @@ -13967,11 +14255,11 @@ } }, { - "id": 865, + "id": 882, "key": "minecraft:stone_pickaxe", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAAAAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTABmZmYAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAAAAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAZmZmAAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "GwU=", "minecraft:enchantments": "CgA=", @@ -13989,11 +14277,11 @@ } }, { - "id": 866, + "id": 883, "key": "minecraft:stone_axe", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAIAAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTACZmZoAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAIAAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAmZmaAAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "GwU=", "minecraft:enchantments": "CgA=", @@ -14011,11 +14299,11 @@ } }, { - "id": 867, + "id": 884, "key": "minecraft:stone_hoe", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2UAAAAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTAAAAAAAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2UAAAAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAAAAAAAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "GwU=", "minecraft:enchantments": "CgA=", @@ -14033,11 +14321,11 @@ } }, { - "id": 868, + "id": 885, "key": "minecraft:golden_sword", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VACAAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTAAzMzQAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VACAAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAMzM0AAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "GxY=", "minecraft:enchantments": "CgA=", @@ -14055,11 +14343,11 @@ } }, { - "id": 869, + "id": 886, "key": "minecraft:golden_shovel", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2U/+AAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTACAAAAAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2U/+AAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAgAAAAAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "GxY=", "minecraft:enchantments": "CgA=", @@ -14077,11 +14365,11 @@ } }, { - "id": 870, + "id": 887, "key": "minecraft:golden_pickaxe", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2U/8AAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTABmZmYAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2U/8AAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAZmZmAAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "GxY=", "minecraft:enchantments": "CgA=", @@ -14099,11 +14387,11 @@ } }, { - "id": 871, + "id": 888, "key": "minecraft:golden_axe", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAGAAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTACAAAAAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAGAAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAgAAAAAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "GxY=", "minecraft:enchantments": "CgA=", @@ -14121,11 +14409,11 @@ } }, { - "id": 872, + "id": 889, "key": "minecraft:golden_hoe", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2UAAAAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTACAAAAAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2UAAAAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAgAAAAAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "GxY=", "minecraft:enchantments": "CgA=", @@ -14143,11 +14431,11 @@ } }, { - "id": 873, + "id": 890, "key": "minecraft:iron_sword", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAFAAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTAAzMzQAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAFAAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAMzM0AAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gw4=", "minecraft:enchantments": "CgA=", @@ -14165,11 +14453,11 @@ } }, { - "id": 874, + "id": 891, "key": "minecraft:iron_shovel", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VADAAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTACAAAAAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VADAAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAgAAAAAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gw4=", "minecraft:enchantments": "CgA=", @@ -14187,11 +14475,11 @@ } }, { - "id": 875, + "id": 892, "key": "minecraft:iron_pickaxe", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VACAAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTABmZmYAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VACAAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAZmZmAAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gw4=", "minecraft:enchantments": "CgA=", @@ -14209,11 +14497,11 @@ } }, { - "id": 876, + "id": 893, "key": "minecraft:iron_axe", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAIAAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTACMzMwAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAIAAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAjMzMAAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gw4=", "minecraft:enchantments": "CgA=", @@ -14231,11 +14519,11 @@ } }, { - "id": 877, + "id": 894, "key": "minecraft:iron_hoe", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2UAAAAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWS/8AAAAAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2UAAAAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkv/AAAAAAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gw4=", "minecraft:enchantments": "CgA=", @@ -14253,11 +14541,11 @@ } }, { - "id": 878, + "id": 895, "key": "minecraft:diamond_sword", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAGAAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTAAzMzQAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAGAAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAMzM0AAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gwo=", "minecraft:enchantments": "CgA=", @@ -14275,11 +14563,11 @@ } }, { - "id": 879, + "id": 896, "key": "minecraft:diamond_shovel", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAEgAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTACAAAAAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAEgAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAgAAAAAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gwo=", "minecraft:enchantments": "CgA=", @@ -14297,11 +14585,11 @@ } }, { - "id": 880, + "id": 897, "key": "minecraft:diamond_pickaxe", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAEAAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTABmZmYAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAEAAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAZmZmAAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gwo=", "minecraft:enchantments": "CgA=", @@ -14319,11 +14607,11 @@ } }, { - "id": 881, + "id": 898, "key": "minecraft:diamond_axe", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAIAAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTACAAAAAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAIAAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAgAAAAAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gwo=", "minecraft:enchantments": "CgA=", @@ -14341,11 +14629,11 @@ } }, { - "id": 882, + "id": 899, "key": "minecraft:diamond_hoe", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2UAAAAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWQAAAAAAAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2UAAAAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkAAAAAAAAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gwo=", "minecraft:enchantments": "CgA=", @@ -14363,11 +14651,11 @@ } }, { - "id": 883, + "id": 900, "key": "minecraft:netherite_sword", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAHAAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTAAzMzQAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAHAAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAMzM0AAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:damage_resistant": "GBFtaW5lY3JhZnQ6aXNfZmlyZQ==", "minecraft:enchantable": "Gw8=", @@ -14386,11 +14674,11 @@ } }, { - "id": 884, + "id": 901, "key": "minecraft:netherite_shovel", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAFgAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTACAAAAAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAFgAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAgAAAAAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:damage_resistant": "GBFtaW5lY3JhZnQ6aXNfZmlyZQ==", "minecraft:enchantable": "Gw8=", @@ -14409,11 +14697,11 @@ } }, { - "id": 885, + "id": 902, "key": "minecraft:netherite_pickaxe", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAFAAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTABmZmYAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAFAAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAZmZmAAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:damage_resistant": "GBFtaW5lY3JhZnQ6aXNfZmlyZQ==", "minecraft:enchantable": "Gw8=", @@ -14432,11 +14720,11 @@ } }, { - "id": 886, + "id": 903, "key": "minecraft:netherite_axe", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAIgAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTACAAAAAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAIgAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAgAAAAAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:damage_resistant": "GBFtaW5lY3JhZnQ6aXNfZmlyZQ==", "minecraft:enchantable": "Gw8=", @@ -14455,11 +14743,11 @@ } }, { - "id": 887, + "id": 904, "key": "minecraft:netherite_hoe", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2UAAAAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWQAAAAAAAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2UAAAAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkAAAAAAAAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:damage_resistant": "GBFtaW5lY3JhZnQ6aXNfZmlyZQ==", "minecraft:enchantable": "Gw8=", @@ -14478,11 +14766,11 @@ } }, { - "id": 888, + "id": 905, "key": "minecraft:stick", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw9taW5lY3JhZnQ6c3RpY2s=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFGl0ZW0ubWluZWNyYWZ0LnN0aWNrAA==", @@ -14494,12 +14782,12 @@ } }, { - "id": 889, + "id": 906, "key": "minecraft:mushroom_stew", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAZA5mZnAA==", "minecraft:item_model": "BxdtaW5lY3JhZnQ6bXVzaHJvb21fc3Rldw==", @@ -14509,15 +14797,15 @@ "minecraft:rarity": "CQA=", "minecraft:repair_cost": "EAA=", "minecraft:tooltip_display": "DwAA", - "minecraft:use_remainder": "FgHHBgAA" + "minecraft:use_remainder": "FgHYBgAA" } }, { - "id": 890, + "id": 907, "key": "minecraft:string", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxBtaW5lY3JhZnQ6c3RyaW5n", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFWl0ZW0ubWluZWNyYWZ0LnN0cmluZwA=", @@ -14529,11 +14817,11 @@ } }, { - "id": 891, + "id": 908, "key": "minecraft:feather", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxFtaW5lY3JhZnQ6ZmVhdGhlcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFml0ZW0ubWluZWNyYWZ0LmZlYXRoZXIA", @@ -14545,11 +14833,11 @@ } }, { - "id": 892, + "id": 909, "key": "minecraft:gunpowder", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6Z3VucG93ZGVy", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGl0ZW0ubWluZWNyYWZ0Lmd1bnBvd2RlcgA=", @@ -14561,11 +14849,11 @@ } }, { - "id": 893, + "id": 910, "key": "minecraft:wheat_seeds", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6d2hlYXRfc2VlZHM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGml0ZW0ubWluZWNyYWZ0LndoZWF0X3NlZWRzAA==", @@ -14577,11 +14865,11 @@ } }, { - "id": 894, + "id": 911, "key": "minecraft:wheat", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw9taW5lY3JhZnQ6d2hlYXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFGl0ZW0ubWluZWNyYWZ0LndoZWF0AA==", @@ -14593,12 +14881,12 @@ } }, { - "id": 895, + "id": 912, "key": "minecraft:bread", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAVAwAAAAA==", "minecraft:item_model": "Bw9taW5lY3JhZnQ6YnJlYWQ=", @@ -14611,15 +14899,15 @@ } }, { - "id": 896, + "id": 913, "key": "minecraft:leather_helmet", "components": { - "minecraft:attribute_modifiers": "DQIAFm1pbmVjcmFmdDphcm1vci5oZWxtZXQ/8AAAAAAAAAAHARZtaW5lY3JhZnQ6YXJtb3IuaGVsbWV0AAAAAAAAAAAABw==", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQIAFm1pbmVjcmFmdDphcm1vci5oZWxtZXQ/8AAAAAAAAAAHAAEWbWluZWNyYWZ0OmFybW9yLmhlbG1ldAAAAAAAAAAAAAcA", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gw8=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HARKARFtaW5lY3JhZnQ6bGVhdGhlcgAAAQEBAA==", + "minecraft:equippable": "HARKARFtaW5lY3JhZnQ6bGVhdGhlcgAAAQEBAACRCg==", "minecraft:item_model": "BxhtaW5lY3JhZnQ6bGVhdGhlcl9oZWxtZXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWl0ZW0ubWluZWNyYWZ0LmxlYXRoZXJfaGVsbWV0AA==", "minecraft:lore": "CAA=", @@ -14632,15 +14920,15 @@ } }, { - "id": 897, + "id": 914, "key": "minecraft:leather_chestplate", "components": { - "minecraft:attribute_modifiers": "DQIAGm1pbmVjcmFmdDphcm1vci5jaGVzdHBsYXRlQAgAAAAAAAAABgEabWluZWNyYWZ0OmFybW9yLmNoZXN0cGxhdGUAAAAAAAAAAAAG", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQIAGm1pbmVjcmFmdDphcm1vci5jaGVzdHBsYXRlQAgAAAAAAAAABgABGm1pbmVjcmFmdDphcm1vci5jaGVzdHBsYXRlAAAAAAAAAAAABgA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gw8=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HANKARFtaW5lY3JhZnQ6bGVhdGhlcgAAAQEBAA==", + "minecraft:equippable": "HANKARFtaW5lY3JhZnQ6bGVhdGhlcgAAAQEBAACRCg==", "minecraft:item_model": "BxxtaW5lY3JhZnQ6bGVhdGhlcl9jaGVzdHBsYXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWl0ZW0ubWluZWNyYWZ0LmxlYXRoZXJfY2hlc3RwbGF0ZQA=", "minecraft:lore": "CAA=", @@ -14653,15 +14941,15 @@ } }, { - "id": 898, + "id": 915, "key": "minecraft:leather_leggings", "components": { - "minecraft:attribute_modifiers": "DQIAGG1pbmVjcmFmdDphcm1vci5sZWdnaW5nc0AAAAAAAAAAAAUBGG1pbmVjcmFmdDphcm1vci5sZWdnaW5ncwAAAAAAAAAAAAU=", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQIAGG1pbmVjcmFmdDphcm1vci5sZWdnaW5nc0AAAAAAAAAAAAUAARhtaW5lY3JhZnQ6YXJtb3IubGVnZ2luZ3MAAAAAAAAAAAAFAA==", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gw8=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAJKARFtaW5lY3JhZnQ6bGVhdGhlcgAAAQEBAA==", + "minecraft:equippable": "HAJKARFtaW5lY3JhZnQ6bGVhdGhlcgAAAQEBAACRCg==", "minecraft:item_model": "BxptaW5lY3JhZnQ6bGVhdGhlcl9sZWdnaW5ncw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0LmxlYXRoZXJfbGVnZ2luZ3MA", "minecraft:lore": "CAA=", @@ -14674,15 +14962,15 @@ } }, { - "id": 899, + "id": 916, "key": "minecraft:leather_boots", "components": { - "minecraft:attribute_modifiers": "DQIAFW1pbmVjcmFmdDphcm1vci5ib290cz/wAAAAAAAAAAQBFW1pbmVjcmFmdDphcm1vci5ib290cwAAAAAAAAAAAAQ=", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQIAFW1pbmVjcmFmdDphcm1vci5ib290cz/wAAAAAAAAAAQAARVtaW5lY3JhZnQ6YXJtb3IuYm9vdHMAAAAAAAAAAAAEAA==", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gw8=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAFKARFtaW5lY3JhZnQ6bGVhdGhlcgAAAQEBAA==", + "minecraft:equippable": "HAFKARFtaW5lY3JhZnQ6bGVhdGhlcgAAAQEBAACRCg==", "minecraft:item_model": "BxdtaW5lY3JhZnQ6bGVhdGhlcl9ib290cw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0LmxlYXRoZXJfYm9vdHMA", "minecraft:lore": "CAA=", @@ -14695,15 +14983,15 @@ } }, { - "id": 900, + "id": 917, "key": "minecraft:chainmail_helmet", "components": { - "minecraft:attribute_modifiers": "DQIAFm1pbmVjcmFmdDphcm1vci5oZWxtZXRAAAAAAAAAAAAHARZtaW5lY3JhZnQ6YXJtb3IuaGVsbWV0AAAAAAAAAAAABw==", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQIAFm1pbmVjcmFmdDphcm1vci5oZWxtZXRAAAAAAAAAAAAHAAEWbWluZWNyYWZ0OmFybW9yLmhlbG1ldAAAAAAAAAAAAAcA", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gww=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAREARNtaW5lY3JhZnQ6Y2hhaW5tYWlsAAABAQEA", + "minecraft:equippable": "HAREARNtaW5lY3JhZnQ6Y2hhaW5tYWlsAAABAQEAAJEK", "minecraft:item_model": "BxptaW5lY3JhZnQ6Y2hhaW5tYWlsX2hlbG1ldA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0LmNoYWlubWFpbF9oZWxtZXQA", "minecraft:lore": "CAA=", @@ -14716,15 +15004,15 @@ } }, { - "id": 901, + "id": 918, "key": "minecraft:chainmail_chestplate", "components": { - "minecraft:attribute_modifiers": "DQIAGm1pbmVjcmFmdDphcm1vci5jaGVzdHBsYXRlQBQAAAAAAAAABgEabWluZWNyYWZ0OmFybW9yLmNoZXN0cGxhdGUAAAAAAAAAAAAG", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQIAGm1pbmVjcmFmdDphcm1vci5jaGVzdHBsYXRlQBQAAAAAAAAABgABGm1pbmVjcmFmdDphcm1vci5jaGVzdHBsYXRlAAAAAAAAAAAABgA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gww=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HANEARNtaW5lY3JhZnQ6Y2hhaW5tYWlsAAABAQEA", + "minecraft:equippable": "HANEARNtaW5lY3JhZnQ6Y2hhaW5tYWlsAAABAQEAAJEK", "minecraft:item_model": "Bx5taW5lY3JhZnQ6Y2hhaW5tYWlsX2NoZXN0cGxhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2l0ZW0ubWluZWNyYWZ0LmNoYWlubWFpbF9jaGVzdHBsYXRlAA==", "minecraft:lore": "CAA=", @@ -14737,15 +15025,15 @@ } }, { - "id": 902, + "id": 919, "key": "minecraft:chainmail_leggings", "components": { - "minecraft:attribute_modifiers": "DQIAGG1pbmVjcmFmdDphcm1vci5sZWdnaW5nc0AQAAAAAAAAAAUBGG1pbmVjcmFmdDphcm1vci5sZWdnaW5ncwAAAAAAAAAAAAU=", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQIAGG1pbmVjcmFmdDphcm1vci5sZWdnaW5nc0AQAAAAAAAAAAUAARhtaW5lY3JhZnQ6YXJtb3IubGVnZ2luZ3MAAAAAAAAAAAAFAA==", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gww=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAJEARNtaW5lY3JhZnQ6Y2hhaW5tYWlsAAABAQEA", + "minecraft:equippable": "HAJEARNtaW5lY3JhZnQ6Y2hhaW5tYWlsAAABAQEAAJEK", "minecraft:item_model": "BxxtaW5lY3JhZnQ6Y2hhaW5tYWlsX2xlZ2dpbmdz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWl0ZW0ubWluZWNyYWZ0LmNoYWlubWFpbF9sZWdnaW5ncwA=", "minecraft:lore": "CAA=", @@ -14758,15 +15046,15 @@ } }, { - "id": 903, + "id": 920, "key": "minecraft:chainmail_boots", "components": { - "minecraft:attribute_modifiers": "DQIAFW1pbmVjcmFmdDphcm1vci5ib290cz/wAAAAAAAAAAQBFW1pbmVjcmFmdDphcm1vci5ib290cwAAAAAAAAAAAAQ=", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQIAFW1pbmVjcmFmdDphcm1vci5ib290cz/wAAAAAAAAAAQAARVtaW5lY3JhZnQ6YXJtb3IuYm9vdHMAAAAAAAAAAAAEAA==", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gww=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAFEARNtaW5lY3JhZnQ6Y2hhaW5tYWlsAAABAQEA", + "minecraft:equippable": "HAFEARNtaW5lY3JhZnQ6Y2hhaW5tYWlsAAABAQEAAJEK", "minecraft:item_model": "BxltaW5lY3JhZnQ6Y2hhaW5tYWlsX2Jvb3Rz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHml0ZW0ubWluZWNyYWZ0LmNoYWlubWFpbF9ib290cwA=", "minecraft:lore": "CAA=", @@ -14779,15 +15067,15 @@ } }, { - "id": 904, + "id": 921, "key": "minecraft:iron_helmet", "components": { - "minecraft:attribute_modifiers": "DQIAFm1pbmVjcmFmdDphcm1vci5oZWxtZXRAAAAAAAAAAAAHARZtaW5lY3JhZnQ6YXJtb3IuaGVsbWV0AAAAAAAAAAAABw==", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQIAFm1pbmVjcmFmdDphcm1vci5oZWxtZXRAAAAAAAAAAAAHAAEWbWluZWNyYWZ0OmFybW9yLmhlbG1ldAAAAAAAAAAAAAcA", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gwk=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HARJAQ5taW5lY3JhZnQ6aXJvbgAAAQEBAA==", + "minecraft:equippable": "HARJAQ5taW5lY3JhZnQ6aXJvbgAAAQEBAACRCg==", "minecraft:item_model": "BxVtaW5lY3JhZnQ6aXJvbl9oZWxtZXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGml0ZW0ubWluZWNyYWZ0Lmlyb25faGVsbWV0AA==", "minecraft:lore": "CAA=", @@ -14800,15 +15088,15 @@ } }, { - "id": 905, + "id": 922, "key": "minecraft:iron_chestplate", "components": { - "minecraft:attribute_modifiers": "DQIAGm1pbmVjcmFmdDphcm1vci5jaGVzdHBsYXRlQBgAAAAAAAAABgEabWluZWNyYWZ0OmFybW9yLmNoZXN0cGxhdGUAAAAAAAAAAAAG", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQIAGm1pbmVjcmFmdDphcm1vci5jaGVzdHBsYXRlQBgAAAAAAAAABgABGm1pbmVjcmFmdDphcm1vci5jaGVzdHBsYXRlAAAAAAAAAAAABgA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gwk=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HANJAQ5taW5lY3JhZnQ6aXJvbgAAAQEBAA==", + "minecraft:equippable": "HANJAQ5taW5lY3JhZnQ6aXJvbgAAAQEBAACRCg==", "minecraft:item_model": "BxltaW5lY3JhZnQ6aXJvbl9jaGVzdHBsYXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHml0ZW0ubWluZWNyYWZ0Lmlyb25fY2hlc3RwbGF0ZQA=", "minecraft:lore": "CAA=", @@ -14821,15 +15109,15 @@ } }, { - "id": 906, + "id": 923, "key": "minecraft:iron_leggings", "components": { - "minecraft:attribute_modifiers": "DQIAGG1pbmVjcmFmdDphcm1vci5sZWdnaW5nc0AUAAAAAAAAAAUBGG1pbmVjcmFmdDphcm1vci5sZWdnaW5ncwAAAAAAAAAAAAU=", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQIAGG1pbmVjcmFmdDphcm1vci5sZWdnaW5nc0AUAAAAAAAAAAUAARhtaW5lY3JhZnQ6YXJtb3IubGVnZ2luZ3MAAAAAAAAAAAAFAA==", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gwk=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAJJAQ5taW5lY3JhZnQ6aXJvbgAAAQEBAA==", + "minecraft:equippable": "HAJJAQ5taW5lY3JhZnQ6aXJvbgAAAQEBAACRCg==", "minecraft:item_model": "BxdtaW5lY3JhZnQ6aXJvbl9sZWdnaW5ncw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0Lmlyb25fbGVnZ2luZ3MA", "minecraft:lore": "CAA=", @@ -14842,15 +15130,15 @@ } }, { - "id": 907, + "id": 924, "key": "minecraft:iron_boots", "components": { - "minecraft:attribute_modifiers": "DQIAFW1pbmVjcmFmdDphcm1vci5ib290c0AAAAAAAAAAAAQBFW1pbmVjcmFmdDphcm1vci5ib290cwAAAAAAAAAAAAQ=", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQIAFW1pbmVjcmFmdDphcm1vci5ib290c0AAAAAAAAAAAAQAARVtaW5lY3JhZnQ6YXJtb3IuYm9vdHMAAAAAAAAAAAAEAA==", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gwk=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAFJAQ5taW5lY3JhZnQ6aXJvbgAAAQEBAA==", + "minecraft:equippable": "HAFJAQ5taW5lY3JhZnQ6aXJvbgAAAQEBAACRCg==", "minecraft:item_model": "BxRtaW5lY3JhZnQ6aXJvbl9ib290cw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWl0ZW0ubWluZWNyYWZ0Lmlyb25fYm9vdHMA", "minecraft:lore": "CAA=", @@ -14863,15 +15151,15 @@ } }, { - "id": 908, + "id": 925, "key": "minecraft:diamond_helmet", "components": { - "minecraft:attribute_modifiers": "DQIAFm1pbmVjcmFmdDphcm1vci5oZWxtZXRACAAAAAAAAAAHARZtaW5lY3JhZnQ6YXJtb3IuaGVsbWV0QAAAAAAAAAAABw==", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQIAFm1pbmVjcmFmdDphcm1vci5oZWxtZXRACAAAAAAAAAAHAAEWbWluZWNyYWZ0OmFybW9yLmhlbG1ldEAAAAAAAAAAAAcA", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gwo=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HARFARFtaW5lY3JhZnQ6ZGlhbW9uZAAAAQEBAA==", + "minecraft:equippable": "HARFARFtaW5lY3JhZnQ6ZGlhbW9uZAAAAQEBAACRCg==", "minecraft:item_model": "BxhtaW5lY3JhZnQ6ZGlhbW9uZF9oZWxtZXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWl0ZW0ubWluZWNyYWZ0LmRpYW1vbmRfaGVsbWV0AA==", "minecraft:lore": "CAA=", @@ -14884,15 +15172,15 @@ } }, { - "id": 909, + "id": 926, "key": "minecraft:diamond_chestplate", "components": { - "minecraft:attribute_modifiers": "DQIAGm1pbmVjcmFmdDphcm1vci5jaGVzdHBsYXRlQCAAAAAAAAAABgEabWluZWNyYWZ0OmFybW9yLmNoZXN0cGxhdGVAAAAAAAAAAAAG", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQIAGm1pbmVjcmFmdDphcm1vci5jaGVzdHBsYXRlQCAAAAAAAAAABgABGm1pbmVjcmFmdDphcm1vci5jaGVzdHBsYXRlQAAAAAAAAAAABgA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gwo=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HANFARFtaW5lY3JhZnQ6ZGlhbW9uZAAAAQEBAA==", + "minecraft:equippable": "HANFARFtaW5lY3JhZnQ6ZGlhbW9uZAAAAQEBAACRCg==", "minecraft:item_model": "BxxtaW5lY3JhZnQ6ZGlhbW9uZF9jaGVzdHBsYXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWl0ZW0ubWluZWNyYWZ0LmRpYW1vbmRfY2hlc3RwbGF0ZQA=", "minecraft:lore": "CAA=", @@ -14905,15 +15193,15 @@ } }, { - "id": 910, + "id": 927, "key": "minecraft:diamond_leggings", "components": { - "minecraft:attribute_modifiers": "DQIAGG1pbmVjcmFmdDphcm1vci5sZWdnaW5nc0AYAAAAAAAAAAUBGG1pbmVjcmFmdDphcm1vci5sZWdnaW5nc0AAAAAAAAAAAAU=", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQIAGG1pbmVjcmFmdDphcm1vci5sZWdnaW5nc0AYAAAAAAAAAAUAARhtaW5lY3JhZnQ6YXJtb3IubGVnZ2luZ3NAAAAAAAAAAAAFAA==", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gwo=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAJFARFtaW5lY3JhZnQ6ZGlhbW9uZAAAAQEBAA==", + "minecraft:equippable": "HAJFARFtaW5lY3JhZnQ6ZGlhbW9uZAAAAQEBAACRCg==", "minecraft:item_model": "BxptaW5lY3JhZnQ6ZGlhbW9uZF9sZWdnaW5ncw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0LmRpYW1vbmRfbGVnZ2luZ3MA", "minecraft:lore": "CAA=", @@ -14926,15 +15214,15 @@ } }, { - "id": 911, + "id": 928, "key": "minecraft:diamond_boots", "components": { - "minecraft:attribute_modifiers": "DQIAFW1pbmVjcmFmdDphcm1vci5ib290c0AIAAAAAAAAAAQBFW1pbmVjcmFmdDphcm1vci5ib290c0AAAAAAAAAAAAQ=", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQIAFW1pbmVjcmFmdDphcm1vci5ib290c0AIAAAAAAAAAAQAARVtaW5lY3JhZnQ6YXJtb3IuYm9vdHNAAAAAAAAAAAAEAA==", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gwo=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAFFARFtaW5lY3JhZnQ6ZGlhbW9uZAAAAQEBAA==", + "minecraft:equippable": "HAFFARFtaW5lY3JhZnQ6ZGlhbW9uZAAAAQEBAACRCg==", "minecraft:item_model": "BxdtaW5lY3JhZnQ6ZGlhbW9uZF9ib290cw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0LmRpYW1vbmRfYm9vdHMA", "minecraft:lore": "CAA=", @@ -14947,15 +15235,15 @@ } }, { - "id": 912, + "id": 929, "key": "minecraft:golden_helmet", "components": { - "minecraft:attribute_modifiers": "DQIAFm1pbmVjcmFmdDphcm1vci5oZWxtZXRAAAAAAAAAAAAHARZtaW5lY3JhZnQ6YXJtb3IuaGVsbWV0AAAAAAAAAAAABw==", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQIAFm1pbmVjcmFmdDphcm1vci5oZWxtZXRAAAAAAAAAAAAHAAEWbWluZWNyYWZ0OmFybW9yLmhlbG1ldAAAAAAAAAAAAAcA", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gxk=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HARIAQ5taW5lY3JhZnQ6Z29sZAAAAQEBAA==", + "minecraft:equippable": "HARIAQ5taW5lY3JhZnQ6Z29sZAAAAQEBAACRCg==", "minecraft:item_model": "BxdtaW5lY3JhZnQ6Z29sZGVuX2hlbG1ldA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0LmdvbGRlbl9oZWxtZXQA", "minecraft:lore": "CAA=", @@ -14968,15 +15256,15 @@ } }, { - "id": 913, + "id": 930, "key": "minecraft:golden_chestplate", "components": { - "minecraft:attribute_modifiers": "DQIAGm1pbmVjcmFmdDphcm1vci5jaGVzdHBsYXRlQBQAAAAAAAAABgEabWluZWNyYWZ0OmFybW9yLmNoZXN0cGxhdGUAAAAAAAAAAAAG", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQIAGm1pbmVjcmFmdDphcm1vci5jaGVzdHBsYXRlQBQAAAAAAAAABgABGm1pbmVjcmFmdDphcm1vci5jaGVzdHBsYXRlAAAAAAAAAAAABgA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gxk=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HANIAQ5taW5lY3JhZnQ6Z29sZAAAAQEBAA==", + "minecraft:equippable": "HANIAQ5taW5lY3JhZnQ6Z29sZAAAAQEBAACRCg==", "minecraft:item_model": "BxttaW5lY3JhZnQ6Z29sZGVuX2NoZXN0cGxhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGl0ZW0ubWluZWNyYWZ0LmdvbGRlbl9jaGVzdHBsYXRlAA==", "minecraft:lore": "CAA=", @@ -14989,15 +15277,15 @@ } }, { - "id": 914, + "id": 931, "key": "minecraft:golden_leggings", "components": { - "minecraft:attribute_modifiers": "DQIAGG1pbmVjcmFmdDphcm1vci5sZWdnaW5nc0AIAAAAAAAAAAUBGG1pbmVjcmFmdDphcm1vci5sZWdnaW5ncwAAAAAAAAAAAAU=", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQIAGG1pbmVjcmFmdDphcm1vci5sZWdnaW5nc0AIAAAAAAAAAAUAARhtaW5lY3JhZnQ6YXJtb3IubGVnZ2luZ3MAAAAAAAAAAAAFAA==", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gxk=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAJIAQ5taW5lY3JhZnQ6Z29sZAAAAQEBAA==", + "minecraft:equippable": "HAJIAQ5taW5lY3JhZnQ6Z29sZAAAAQEBAACRCg==", "minecraft:item_model": "BxltaW5lY3JhZnQ6Z29sZGVuX2xlZ2dpbmdz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHml0ZW0ubWluZWNyYWZ0LmdvbGRlbl9sZWdnaW5ncwA=", "minecraft:lore": "CAA=", @@ -15010,15 +15298,15 @@ } }, { - "id": 915, + "id": 932, "key": "minecraft:golden_boots", "components": { - "minecraft:attribute_modifiers": "DQIAFW1pbmVjcmFmdDphcm1vci5ib290cz/wAAAAAAAAAAQBFW1pbmVjcmFmdDphcm1vci5ib290cwAAAAAAAAAAAAQ=", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQIAFW1pbmVjcmFmdDphcm1vci5ib290cz/wAAAAAAAAAAQAARVtaW5lY3JhZnQ6YXJtb3IuYm9vdHMAAAAAAAAAAAAEAA==", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gxk=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAFIAQ5taW5lY3JhZnQ6Z29sZAAAAQEBAA==", + "minecraft:equippable": "HAFIAQ5taW5lY3JhZnQ6Z29sZAAAAQEBAACRCg==", "minecraft:item_model": "BxZtaW5lY3JhZnQ6Z29sZGVuX2Jvb3Rz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2l0ZW0ubWluZWNyYWZ0LmdvbGRlbl9ib290cwA=", "minecraft:lore": "CAA=", @@ -15031,16 +15319,16 @@ } }, { - "id": 916, + "id": 933, "key": "minecraft:netherite_helmet", "components": { - "minecraft:attribute_modifiers": "DQMAFm1pbmVjcmFmdDphcm1vci5oZWxtZXRACAAAAAAAAAAHARZtaW5lY3JhZnQ6YXJtb3IuaGVsbWV0QAgAAAAAAAAABw8WbWluZWNyYWZ0OmFybW9yLmhlbG1ldD+5mZmgAAAAAAc=", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQMAFm1pbmVjcmFmdDphcm1vci5oZWxtZXRACAAAAAAAAAAHAAEWbWluZWNyYWZ0OmFybW9yLmhlbG1ldEAIAAAAAAAAAAcAEBZtaW5lY3JhZnQ6YXJtb3IuaGVsbWV0P7mZmaAAAAAABwA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:damage_resistant": "GBFtaW5lY3JhZnQ6aXNfZmlyZQ==", "minecraft:enchantable": "Gw8=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HARLARNtaW5lY3JhZnQ6bmV0aGVyaXRlAAABAQEA", + "minecraft:equippable": "HARLARNtaW5lY3JhZnQ6bmV0aGVyaXRlAAABAQEAAJEK", "minecraft:item_model": "BxptaW5lY3JhZnQ6bmV0aGVyaXRlX2hlbG1ldA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0Lm5ldGhlcml0ZV9oZWxtZXQA", "minecraft:lore": "CAA=", @@ -15053,16 +15341,16 @@ } }, { - "id": 917, + "id": 934, "key": "minecraft:netherite_chestplate", "components": { - "minecraft:attribute_modifiers": "DQMAGm1pbmVjcmFmdDphcm1vci5jaGVzdHBsYXRlQCAAAAAAAAAABgEabWluZWNyYWZ0OmFybW9yLmNoZXN0cGxhdGVACAAAAAAAAAAGDxptaW5lY3JhZnQ6YXJtb3IuY2hlc3RwbGF0ZT+5mZmgAAAAAAY=", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQMAGm1pbmVjcmFmdDphcm1vci5jaGVzdHBsYXRlQCAAAAAAAAAABgABGm1pbmVjcmFmdDphcm1vci5jaGVzdHBsYXRlQAgAAAAAAAAABgAQGm1pbmVjcmFmdDphcm1vci5jaGVzdHBsYXRlP7mZmaAAAAAABgA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:damage_resistant": "GBFtaW5lY3JhZnQ6aXNfZmlyZQ==", "minecraft:enchantable": "Gw8=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HANLARNtaW5lY3JhZnQ6bmV0aGVyaXRlAAABAQEA", + "minecraft:equippable": "HANLARNtaW5lY3JhZnQ6bmV0aGVyaXRlAAABAQEAAJEK", "minecraft:item_model": "Bx5taW5lY3JhZnQ6bmV0aGVyaXRlX2NoZXN0cGxhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2l0ZW0ubWluZWNyYWZ0Lm5ldGhlcml0ZV9jaGVzdHBsYXRlAA==", "minecraft:lore": "CAA=", @@ -15075,16 +15363,16 @@ } }, { - "id": 918, + "id": 935, "key": "minecraft:netherite_leggings", "components": { - "minecraft:attribute_modifiers": "DQMAGG1pbmVjcmFmdDphcm1vci5sZWdnaW5nc0AYAAAAAAAAAAUBGG1pbmVjcmFmdDphcm1vci5sZWdnaW5nc0AIAAAAAAAAAAUPGG1pbmVjcmFmdDphcm1vci5sZWdnaW5ncz+5mZmgAAAAAAU=", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQMAGG1pbmVjcmFmdDphcm1vci5sZWdnaW5nc0AYAAAAAAAAAAUAARhtaW5lY3JhZnQ6YXJtb3IubGVnZ2luZ3NACAAAAAAAAAAFABAYbWluZWNyYWZ0OmFybW9yLmxlZ2dpbmdzP7mZmaAAAAAABQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:damage_resistant": "GBFtaW5lY3JhZnQ6aXNfZmlyZQ==", "minecraft:enchantable": "Gw8=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAJLARNtaW5lY3JhZnQ6bmV0aGVyaXRlAAABAQEA", + "minecraft:equippable": "HAJLARNtaW5lY3JhZnQ6bmV0aGVyaXRlAAABAQEAAJEK", "minecraft:item_model": "BxxtaW5lY3JhZnQ6bmV0aGVyaXRlX2xlZ2dpbmdz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWl0ZW0ubWluZWNyYWZ0Lm5ldGhlcml0ZV9sZWdnaW5ncwA=", "minecraft:lore": "CAA=", @@ -15097,16 +15385,16 @@ } }, { - "id": 919, + "id": 936, "key": "minecraft:netherite_boots", "components": { - "minecraft:attribute_modifiers": "DQMAFW1pbmVjcmFmdDphcm1vci5ib290c0AIAAAAAAAAAAQBFW1pbmVjcmFmdDphcm1vci5ib290c0AIAAAAAAAAAAQPFW1pbmVjcmFmdDphcm1vci5ib290cz+5mZmgAAAAAAQ=", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQMAFW1pbmVjcmFmdDphcm1vci5ib290c0AIAAAAAAAAAAQAARVtaW5lY3JhZnQ6YXJtb3IuYm9vdHNACAAAAAAAAAAEABAVbWluZWNyYWZ0OmFybW9yLmJvb3RzP7mZmaAAAAAABAA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:damage_resistant": "GBFtaW5lY3JhZnQ6aXNfZmlyZQ==", "minecraft:enchantable": "Gw8=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAFLARNtaW5lY3JhZnQ6bmV0aGVyaXRlAAABAQEA", + "minecraft:equippable": "HAFLARNtaW5lY3JhZnQ6bmV0aGVyaXRlAAABAQEAAJEK", "minecraft:item_model": "BxltaW5lY3JhZnQ6bmV0aGVyaXRlX2Jvb3Rz", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHml0ZW0ubWluZWNyYWZ0Lm5ldGhlcml0ZV9ib290cwA=", "minecraft:lore": "CAA=", @@ -15119,11 +15407,11 @@ } }, { - "id": 920, + "id": 937, "key": "minecraft:flint", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw9taW5lY3JhZnQ6ZmxpbnQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFGl0ZW0ubWluZWNyYWZ0LmZsaW50AA==", @@ -15135,12 +15423,12 @@ } }, { - "id": 921, + "id": 938, "key": "minecraft:porkchop", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAM/5mZnAA==", "minecraft:item_model": "BxJtaW5lY3JhZnQ6cG9ya2Nob3A=", @@ -15153,12 +15441,12 @@ } }, { - "id": 922, + "id": 939, "key": "minecraft:cooked_porkchop", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAhBTMzNAA==", "minecraft:item_model": "BxltaW5lY3JhZnQ6Y29va2VkX3BvcmtjaG9w", @@ -15171,11 +15459,11 @@ } }, { - "id": 923, + "id": 940, "key": "minecraft:painting", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6cGFpbnRpbmc=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2l0ZW0ubWluZWNyYWZ0LnBhaW50aW5nAA==", @@ -15187,12 +15475,12 @@ } }, { - "id": 924, + "id": 941, "key": "minecraft:golden_apple", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAQACCQFkAAEBABUA4BIAAQEAP4AAAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAQACCQFkAAEBABUA4BIAAQEAP4AAAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FARBGZmaAQ==", "minecraft:item_model": "BxZtaW5lY3JhZnQ6Z29sZGVuX2FwcGxl", @@ -15205,12 +15493,12 @@ } }, { - "id": 925, + "id": 942, "key": "minecraft:enchanted_golden_apple", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAQAECQGQAwABAQAKAPAuAAEBAAsA8C4AAQEAFQPgEgABAQA/gAAA", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAQAECQGQAwABAQAKAPAuAAEBAAsA8C4AAQEAFQPgEgABAQA/gAAA", "minecraft:enchantment_glint_override": "EgE=", "minecraft:enchantments": "CgA=", "minecraft:food": "FARBGZmaAQ==", @@ -15224,11 +15512,11 @@ } }, { - "id": 926, + "id": 943, "key": "minecraft:oak_sign", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6b2FrX3NpZ24=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGJsb2NrLm1pbmVjcmFmdC5vYWtfc2lnbgA=", @@ -15240,11 +15528,11 @@ } }, { - "id": 927, + "id": 944, "key": "minecraft:spruce_sign", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6c3BydWNlX3NpZ24=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5zcHJ1Y2Vfc2lnbgA=", @@ -15256,11 +15544,11 @@ } }, { - "id": 928, + "id": 945, "key": "minecraft:birch_sign", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6YmlyY2hfc2lnbg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5iaXJjaF9zaWduAA==", @@ -15272,11 +15560,11 @@ } }, { - "id": 929, + "id": 946, "key": "minecraft:jungle_sign", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6anVuZ2xlX3NpZ24=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5qdW5nbGVfc2lnbgA=", @@ -15288,11 +15576,11 @@ } }, { - "id": 930, + "id": 947, "key": "minecraft:acacia_sign", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6YWNhY2lhX3NpZ24=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5hY2FjaWFfc2lnbgA=", @@ -15304,11 +15592,11 @@ } }, { - "id": 931, + "id": 948, "key": "minecraft:cherry_sign", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6Y2hlcnJ5X3NpZ24=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5jaGVycnlfc2lnbgA=", @@ -15320,11 +15608,11 @@ } }, { - "id": 932, + "id": 949, "key": "minecraft:dark_oak_sign", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6ZGFya19vYWtfc2lnbg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5kYXJrX29ha19zaWduAA==", @@ -15336,11 +15624,11 @@ } }, { - "id": 933, + "id": 950, "key": "minecraft:pale_oak_sign", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6cGFsZV9vYWtfc2lnbg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5wYWxlX29ha19zaWduAA==", @@ -15352,11 +15640,11 @@ } }, { - "id": 934, + "id": 951, "key": "minecraft:mangrove_sign", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6bWFuZ3JvdmVfc2lnbg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5tYW5ncm92ZV9zaWduAA==", @@ -15368,11 +15656,11 @@ } }, { - "id": 935, + "id": 952, "key": "minecraft:bamboo_sign", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6YmFtYm9vX3NpZ24=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5iYW1ib29fc2lnbgA=", @@ -15384,11 +15672,11 @@ } }, { - "id": 936, + "id": 953, "key": "minecraft:crimson_sign", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6Y3JpbXNvbl9zaWdu", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5jcmltc29uX3NpZ24A", @@ -15400,11 +15688,11 @@ } }, { - "id": 937, + "id": 954, "key": "minecraft:warped_sign", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6d2FycGVkX3NpZ24=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC53YXJwZWRfc2lnbgA=", @@ -15416,11 +15704,11 @@ } }, { - "id": 938, + "id": 955, "key": "minecraft:oak_hanging_sign", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6b2FrX2hhbmdpbmdfc2lnbg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5vYWtfaGFuZ2luZ19zaWduAA==", @@ -15432,11 +15720,11 @@ } }, { - "id": 939, + "id": 956, "key": "minecraft:spruce_hanging_sign", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6c3BydWNlX2hhbmdpbmdfc2lnbg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5zcHJ1Y2VfaGFuZ2luZ19zaWduAA==", @@ -15448,11 +15736,11 @@ } }, { - "id": 940, + "id": 957, "key": "minecraft:birch_hanging_sign", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6YmlyY2hfaGFuZ2luZ19zaWdu", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5iaXJjaF9oYW5naW5nX3NpZ24A", @@ -15464,11 +15752,11 @@ } }, { - "id": 941, + "id": 958, "key": "minecraft:jungle_hanging_sign", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6anVuZ2xlX2hhbmdpbmdfc2lnbg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5qdW5nbGVfaGFuZ2luZ19zaWduAA==", @@ -15480,11 +15768,11 @@ } }, { - "id": 942, + "id": 959, "key": "minecraft:acacia_hanging_sign", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6YWNhY2lhX2hhbmdpbmdfc2lnbg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5hY2FjaWFfaGFuZ2luZ19zaWduAA==", @@ -15496,11 +15784,11 @@ } }, { - "id": 943, + "id": 960, "key": "minecraft:cherry_hanging_sign", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6Y2hlcnJ5X2hhbmdpbmdfc2lnbg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5jaGVycnlfaGFuZ2luZ19zaWduAA==", @@ -15512,11 +15800,11 @@ } }, { - "id": 944, + "id": 961, "key": "minecraft:dark_oak_hanging_sign", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6ZGFya19vYWtfaGFuZ2luZ19zaWdu", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5kYXJrX29ha19oYW5naW5nX3NpZ24A", @@ -15528,11 +15816,11 @@ } }, { - "id": 945, + "id": 962, "key": "minecraft:pale_oak_hanging_sign", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6cGFsZV9vYWtfaGFuZ2luZ19zaWdu", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5wYWxlX29ha19oYW5naW5nX3NpZ24A", @@ -15544,11 +15832,11 @@ } }, { - "id": 946, + "id": 963, "key": "minecraft:mangrove_hanging_sign", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6bWFuZ3JvdmVfaGFuZ2luZ19zaWdu", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5tYW5ncm92ZV9oYW5naW5nX3NpZ24A", @@ -15560,11 +15848,11 @@ } }, { - "id": 947, + "id": 964, "key": "minecraft:bamboo_hanging_sign", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6YmFtYm9vX2hhbmdpbmdfc2lnbg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5iYW1ib29faGFuZ2luZ19zaWduAA==", @@ -15576,11 +15864,11 @@ } }, { - "id": 948, + "id": 965, "key": "minecraft:crimson_hanging_sign", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6Y3JpbXNvbl9oYW5naW5nX3NpZ24=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5jcmltc29uX2hhbmdpbmdfc2lnbgA=", @@ -15592,11 +15880,11 @@ } }, { - "id": 949, + "id": 966, "key": "minecraft:warped_hanging_sign", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6d2FycGVkX2hhbmdpbmdfc2lnbg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC53YXJwZWRfaGFuZ2luZ19zaWduAA==", @@ -15608,11 +15896,11 @@ } }, { - "id": 950, + "id": 967, "key": "minecraft:bucket", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxBtaW5lY3JhZnQ6YnVja2V0", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFWl0ZW0ubWluZWNyYWZ0LmJ1Y2tldAA=", @@ -15624,11 +15912,11 @@ } }, { - "id": 951, + "id": 968, "key": "minecraft:water_bucket", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6d2F0ZXJfYnVja2V0", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2l0ZW0ubWluZWNyYWZ0LndhdGVyX2J1Y2tldAA=", @@ -15640,11 +15928,11 @@ } }, { - "id": 952, + "id": 969, "key": "minecraft:lava_bucket", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6bGF2YV9idWNrZXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGml0ZW0ubWluZWNyYWZ0LmxhdmFfYnVja2V0AA==", @@ -15656,11 +15944,11 @@ } }, { - "id": 953, + "id": 970, "key": "minecraft:powder_snow_bucket", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6cG93ZGVyX3Nub3dfYnVja2V0", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWl0ZW0ubWluZWNyYWZ0LnBvd2Rlcl9zbm93X2J1Y2tldAA=", @@ -15672,11 +15960,11 @@ } }, { - "id": 954, + "id": 971, "key": "minecraft:snowball", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6c25vd2JhbGw=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2l0ZW0ubWluZWNyYWZ0LnNub3diYWxsAA==", @@ -15688,11 +15976,11 @@ } }, { - "id": 955, + "id": 972, "key": "minecraft:leather", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxFtaW5lY3JhZnQ6bGVhdGhlcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFml0ZW0ubWluZWNyYWZ0LmxlYXRoZXIA", @@ -15704,12 +15992,12 @@ } }, { - "id": 956, + "id": 973, "key": "minecraft:milk_bucket", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0C3QQAAQI=", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0C5gQAAQI=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6bWlsa19idWNrZXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGml0ZW0ubWluZWNyYWZ0Lm1pbGtfYnVja2V0AA==", @@ -15718,15 +16006,15 @@ "minecraft:rarity": "CQA=", "minecraft:repair_cost": "EAA=", "minecraft:tooltip_display": "DwAA", - "minecraft:use_remainder": "FgG2BwAA" + "minecraft:use_remainder": "FgHHBwAA" } }, { - "id": 957, + "id": 974, "key": "minecraft:pufferfish_bucket", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:bucket_entity_data": "MgoA", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6cHVmZmVyZmlzaF9idWNrZXQ=", @@ -15739,11 +16027,11 @@ } }, { - "id": 958, + "id": 975, "key": "minecraft:salmon_bucket", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:bucket_entity_data": "MgoA", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6c2FsbW9uX2J1Y2tldA==", @@ -15756,11 +16044,11 @@ } }, { - "id": 959, + "id": 976, "key": "minecraft:cod_bucket", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:bucket_entity_data": "MgoA", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6Y29kX2J1Y2tldA==", @@ -15773,11 +16061,11 @@ } }, { - "id": 960, + "id": 977, "key": "minecraft:tropical_fish_bucket", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:bucket_entity_data": "MgoA", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6dHJvcGljYWxfZmlzaF9idWNrZXQ=", @@ -15790,11 +16078,11 @@ } }, { - "id": 961, + "id": 978, "key": "minecraft:axolotl_bucket", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:bucket_entity_data": "MgoA", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6YXhvbG90bF9idWNrZXQ=", @@ -15807,11 +16095,11 @@ } }, { - "id": 962, + "id": 979, "key": "minecraft:tadpole_bucket", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:bucket_entity_data": "MgoA", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6dGFkcG9sZV9idWNrZXQ=", @@ -15824,11 +16112,11 @@ } }, { - "id": 963, + "id": 980, "key": "minecraft:brick", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw9taW5lY3JhZnQ6YnJpY2s=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFGl0ZW0ubWluZWNyYWZ0LmJyaWNrAA==", @@ -15840,11 +16128,11 @@ } }, { - "id": 964, + "id": 981, "key": "minecraft:clay_ball", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6Y2xheV9iYWxs", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGl0ZW0ubWluZWNyYWZ0LmNsYXlfYmFsbAA=", @@ -15856,11 +16144,11 @@ } }, { - "id": 965, + "id": 982, "key": "minecraft:dried_kelp_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6ZHJpZWRfa2VscF9ibG9jaw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5kcmllZF9rZWxwX2Jsb2NrAA==", @@ -15872,11 +16160,11 @@ } }, { - "id": 966, + "id": 983, "key": "minecraft:paper", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw9taW5lY3JhZnQ6cGFwZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFGl0ZW0ubWluZWNyYWZ0LnBhcGVyAA==", @@ -15888,11 +16176,11 @@ } }, { - "id": 967, + "id": 984, "key": "minecraft:book", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantable": "GwE=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw5taW5lY3JhZnQ6Ym9vaw==", @@ -15905,11 +16193,11 @@ } }, { - "id": 968, + "id": 985, "key": "minecraft:slime_ball", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6c2xpbWVfYmFsbA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWl0ZW0ubWluZWNyYWZ0LnNsaW1lX2JhbGwA", @@ -15921,11 +16209,11 @@ } }, { - "id": 969, + "id": 986, "key": "minecraft:egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:chicken/variant": "VgATbWluZWNyYWZ0OnRlbXBlcmF0ZQ==", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw1taW5lY3JhZnQ6ZWdn", @@ -15938,11 +16226,11 @@ } }, { - "id": 970, + "id": 987, "key": "minecraft:blue_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:chicken/variant": "VgAObWluZWNyYWZ0OmNvbGQ=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6Ymx1ZV9lZ2c=", @@ -15955,11 +16243,11 @@ } }, { - "id": 971, + "id": 988, "key": "minecraft:brown_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:chicken/variant": "VgAObWluZWNyYWZ0Ondhcm0=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6YnJvd25fZWdn", @@ -15972,11 +16260,11 @@ } }, { - "id": 972, + "id": 989, "key": "minecraft:compass", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxFtaW5lY3JhZnQ6Y29tcGFzcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFml0ZW0ubWluZWNyYWZ0LmNvbXBhc3MA", @@ -15988,11 +16276,11 @@ } }, { - "id": 973, + "id": 990, "key": "minecraft:recovery_compass", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6cmVjb3ZlcnlfY29tcGFzcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0LnJlY292ZXJ5X2NvbXBhc3MA", @@ -16004,11 +16292,11 @@ } }, { - "id": 974, + "id": 991, "key": "minecraft:bundle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:bundle_contents": "KQA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxBtaW5lY3JhZnQ6YnVuZGxl", @@ -16021,11 +16309,11 @@ } }, { - "id": 975, + "id": 992, "key": "minecraft:white_bundle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:bundle_contents": "KQA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6d2hpdGVfYnVuZGxl", @@ -16038,11 +16326,11 @@ } }, { - "id": 976, + "id": 993, "key": "minecraft:orange_bundle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:bundle_contents": "KQA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6b3JhbmdlX2J1bmRsZQ==", @@ -16055,11 +16343,11 @@ } }, { - "id": 977, + "id": 994, "key": "minecraft:magenta_bundle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:bundle_contents": "KQA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6bWFnZW50YV9idW5kbGU=", @@ -16072,11 +16360,11 @@ } }, { - "id": 978, + "id": 995, "key": "minecraft:light_blue_bundle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:bundle_contents": "KQA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6bGlnaHRfYmx1ZV9idW5kbGU=", @@ -16089,11 +16377,11 @@ } }, { - "id": 979, + "id": 996, "key": "minecraft:yellow_bundle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:bundle_contents": "KQA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6eWVsbG93X2J1bmRsZQ==", @@ -16106,11 +16394,11 @@ } }, { - "id": 980, + "id": 997, "key": "minecraft:lime_bundle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:bundle_contents": "KQA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6bGltZV9idW5kbGU=", @@ -16123,11 +16411,11 @@ } }, { - "id": 981, + "id": 998, "key": "minecraft:pink_bundle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:bundle_contents": "KQA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6cGlua19idW5kbGU=", @@ -16140,11 +16428,11 @@ } }, { - "id": 982, + "id": 999, "key": "minecraft:gray_bundle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:bundle_contents": "KQA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6Z3JheV9idW5kbGU=", @@ -16157,11 +16445,11 @@ } }, { - "id": 983, + "id": 1000, "key": "minecraft:light_gray_bundle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:bundle_contents": "KQA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6bGlnaHRfZ3JheV9idW5kbGU=", @@ -16174,11 +16462,11 @@ } }, { - "id": 984, + "id": 1001, "key": "minecraft:cyan_bundle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:bundle_contents": "KQA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6Y3lhbl9idW5kbGU=", @@ -16191,11 +16479,11 @@ } }, { - "id": 985, + "id": 1002, "key": "minecraft:purple_bundle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:bundle_contents": "KQA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6cHVycGxlX2J1bmRsZQ==", @@ -16208,11 +16496,11 @@ } }, { - "id": 986, + "id": 1003, "key": "minecraft:blue_bundle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:bundle_contents": "KQA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6Ymx1ZV9idW5kbGU=", @@ -16225,11 +16513,11 @@ } }, { - "id": 987, + "id": 1004, "key": "minecraft:brown_bundle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:bundle_contents": "KQA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6YnJvd25fYnVuZGxl", @@ -16242,11 +16530,11 @@ } }, { - "id": 988, + "id": 1005, "key": "minecraft:green_bundle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:bundle_contents": "KQA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6Z3JlZW5fYnVuZGxl", @@ -16259,11 +16547,11 @@ } }, { - "id": 989, + "id": 1006, "key": "minecraft:red_bundle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:bundle_contents": "KQA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6cmVkX2J1bmRsZQ==", @@ -16276,11 +16564,11 @@ } }, { - "id": 990, + "id": 1007, "key": "minecraft:black_bundle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:bundle_contents": "KQA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6YmxhY2tfYnVuZGxl", @@ -16293,11 +16581,11 @@ } }, { - "id": 991, + "id": 1008, "key": "minecraft:fishing_rod", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "GwE=", "minecraft:enchantments": "CgA=", @@ -16312,11 +16600,11 @@ } }, { - "id": 992, + "id": 1009, "key": "minecraft:clock", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw9taW5lY3JhZnQ6Y2xvY2s=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFGl0ZW0ubWluZWNyYWZ0LmNsb2NrAA==", @@ -16328,11 +16616,11 @@ } }, { - "id": 993, + "id": 1010, "key": "minecraft:spyglass", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6c3B5Z2xhc3M=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2l0ZW0ubWluZWNyYWZ0LnNweWdsYXNzAA==", @@ -16344,11 +16632,11 @@ } }, { - "id": 994, + "id": 1011, "key": "minecraft:glowstone_dust", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6Z2xvd3N0b25lX2R1c3Q=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWl0ZW0ubWluZWNyYWZ0Lmdsb3dzdG9uZV9kdXN0AA==", @@ -16360,12 +16648,12 @@ } }, { - "id": 995, + "id": 1012, "key": "minecraft:cod", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAI+zMzNAA==", "minecraft:item_model": "Bw1taW5lY3JhZnQ6Y29k", @@ -16378,12 +16666,12 @@ } }, { - "id": 996, + "id": 1013, "key": "minecraft:salmon", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAI+zMzNAA==", "minecraft:item_model": "BxBtaW5lY3JhZnQ6c2FsbW9u", @@ -16396,12 +16684,12 @@ } }, { - "id": 997, + "id": 1014, "key": "minecraft:tropical_fish", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAE+TMzNAA==", "minecraft:item_model": "BxdtaW5lY3JhZnQ6dHJvcGljYWxfZmlzaA==", @@ -16414,12 +16702,12 @@ } }, { - "id": 998, + "id": 1015, "key": "minecraft:pufferfish", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAQADEgGwCQABAQAQAqwCAAEBAAgArAIAAQEAP4AAAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAQADEgGwCQABAQAQAqwCAAEBAAgArAIAAQEAP4AAAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAE+TMzNAA==", "minecraft:item_model": "BxRtaW5lY3JhZnQ6cHVmZmVyZmlzaA==", @@ -16432,12 +16720,12 @@ } }, { - "id": 999, + "id": 1016, "key": "minecraft:cooked_cod", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAVAwAAAAA==", "minecraft:item_model": "BxRtaW5lY3JhZnQ6Y29va2VkX2NvZA==", @@ -16450,12 +16738,12 @@ } }, { - "id": 1000, + "id": 1017, "key": "minecraft:cooked_salmon", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAZBGZmaAA==", "minecraft:item_model": "BxdtaW5lY3JhZnQ6Y29va2VkX3NhbG1vbg==", @@ -16468,11 +16756,11 @@ } }, { - "id": 1001, + "id": 1018, "key": "minecraft:ink_sac", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxFtaW5lY3JhZnQ6aW5rX3NhYw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFml0ZW0ubWluZWNyYWZ0Lmlua19zYWMA", @@ -16484,11 +16772,11 @@ } }, { - "id": 1002, + "id": 1019, "key": "minecraft:glow_ink_sac", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6Z2xvd19pbmtfc2Fj", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2l0ZW0ubWluZWNyYWZ0Lmdsb3dfaW5rX3NhYwA=", @@ -16500,11 +16788,11 @@ } }, { - "id": 1003, + "id": 1020, "key": "minecraft:cocoa_beans", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6Y29jb2FfYmVhbnM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGml0ZW0ubWluZWNyYWZ0LmNvY29hX2JlYW5zAA==", @@ -16516,11 +16804,11 @@ } }, { - "id": 1004, + "id": 1021, "key": "minecraft:white_dye", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6d2hpdGVfZHll", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGl0ZW0ubWluZWNyYWZ0LndoaXRlX2R5ZQA=", @@ -16532,11 +16820,11 @@ } }, { - "id": 1005, + "id": 1022, "key": "minecraft:orange_dye", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6b3JhbmdlX2R5ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWl0ZW0ubWluZWNyYWZ0Lm9yYW5nZV9keWUA", @@ -16548,11 +16836,11 @@ } }, { - "id": 1006, + "id": 1023, "key": "minecraft:magenta_dye", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6bWFnZW50YV9keWU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGml0ZW0ubWluZWNyYWZ0Lm1hZ2VudGFfZHllAA==", @@ -16564,11 +16852,11 @@ } }, { - "id": 1007, + "id": 1024, "key": "minecraft:light_blue_dye", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6bGlnaHRfYmx1ZV9keWU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWl0ZW0ubWluZWNyYWZ0LmxpZ2h0X2JsdWVfZHllAA==", @@ -16580,11 +16868,11 @@ } }, { - "id": 1008, + "id": 1025, "key": "minecraft:yellow_dye", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6eWVsbG93X2R5ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWl0ZW0ubWluZWNyYWZ0LnllbGxvd19keWUA", @@ -16596,11 +16884,11 @@ } }, { - "id": 1009, + "id": 1026, "key": "minecraft:lime_dye", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6bGltZV9keWU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2l0ZW0ubWluZWNyYWZ0LmxpbWVfZHllAA==", @@ -16612,11 +16900,11 @@ } }, { - "id": 1010, + "id": 1027, "key": "minecraft:pink_dye", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6cGlua19keWU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2l0ZW0ubWluZWNyYWZ0LnBpbmtfZHllAA==", @@ -16628,11 +16916,11 @@ } }, { - "id": 1011, + "id": 1028, "key": "minecraft:gray_dye", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6Z3JheV9keWU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2l0ZW0ubWluZWNyYWZ0LmdyYXlfZHllAA==", @@ -16644,11 +16932,11 @@ } }, { - "id": 1012, + "id": 1029, "key": "minecraft:light_gray_dye", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6bGlnaHRfZ3JheV9keWU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWl0ZW0ubWluZWNyYWZ0LmxpZ2h0X2dyYXlfZHllAA==", @@ -16660,11 +16948,11 @@ } }, { - "id": 1013, + "id": 1030, "key": "minecraft:cyan_dye", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6Y3lhbl9keWU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2l0ZW0ubWluZWNyYWZ0LmN5YW5fZHllAA==", @@ -16676,11 +16964,11 @@ } }, { - "id": 1014, + "id": 1031, "key": "minecraft:purple_dye", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6cHVycGxlX2R5ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWl0ZW0ubWluZWNyYWZ0LnB1cnBsZV9keWUA", @@ -16692,11 +16980,11 @@ } }, { - "id": 1015, + "id": 1032, "key": "minecraft:blue_dye", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6Ymx1ZV9keWU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2l0ZW0ubWluZWNyYWZ0LmJsdWVfZHllAA==", @@ -16708,11 +16996,11 @@ } }, { - "id": 1016, + "id": 1033, "key": "minecraft:brown_dye", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6YnJvd25fZHll", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGl0ZW0ubWluZWNyYWZ0LmJyb3duX2R5ZQA=", @@ -16724,11 +17012,11 @@ } }, { - "id": 1017, + "id": 1034, "key": "minecraft:green_dye", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6Z3JlZW5fZHll", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGl0ZW0ubWluZWNyYWZ0LmdyZWVuX2R5ZQA=", @@ -16740,11 +17028,11 @@ } }, { - "id": 1018, + "id": 1035, "key": "minecraft:red_dye", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxFtaW5lY3JhZnQ6cmVkX2R5ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFml0ZW0ubWluZWNyYWZ0LnJlZF9keWUA", @@ -16756,11 +17044,11 @@ } }, { - "id": 1019, + "id": 1036, "key": "minecraft:black_dye", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6YmxhY2tfZHll", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGl0ZW0ubWluZWNyYWZ0LmJsYWNrX2R5ZQA=", @@ -16772,11 +17060,11 @@ } }, { - "id": 1020, + "id": 1037, "key": "minecraft:bone_meal", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6Ym9uZV9tZWFs", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGl0ZW0ubWluZWNyYWZ0LmJvbmVfbWVhbAA=", @@ -16788,11 +17076,11 @@ } }, { - "id": 1021, + "id": 1038, "key": "minecraft:bone", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw5taW5lY3JhZnQ6Ym9uZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAE2l0ZW0ubWluZWNyYWZ0LmJvbmUA", @@ -16804,11 +17092,11 @@ } }, { - "id": 1022, + "id": 1039, "key": "minecraft:sugar", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw9taW5lY3JhZnQ6c3VnYXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFGl0ZW0ubWluZWNyYWZ0LnN1Z2FyAA==", @@ -16820,11 +17108,11 @@ } }, { - "id": 1023, + "id": 1040, "key": "minecraft:cake", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw5taW5lY3JhZnQ6Y2FrZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFGJsb2NrLm1pbmVjcmFmdC5jYWtlAA==", @@ -16836,11 +17124,11 @@ } }, { - "id": 1024, + "id": 1041, "key": "minecraft:white_bed", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6d2hpdGVfYmVk", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC53aGl0ZV9iZWQA", @@ -16852,11 +17140,11 @@ } }, { - "id": 1025, + "id": 1042, "key": "minecraft:orange_bed", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6b3JhbmdlX2JlZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5vcmFuZ2VfYmVkAA==", @@ -16868,11 +17156,11 @@ } }, { - "id": 1026, + "id": 1043, "key": "minecraft:magenta_bed", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6bWFnZW50YV9iZWQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5tYWdlbnRhX2JlZAA=", @@ -16884,11 +17172,11 @@ } }, { - "id": 1027, + "id": 1044, "key": "minecraft:light_blue_bed", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6bGlnaHRfYmx1ZV9iZWQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5saWdodF9ibHVlX2JlZAA=", @@ -16900,11 +17188,11 @@ } }, { - "id": 1028, + "id": 1045, "key": "minecraft:yellow_bed", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6eWVsbG93X2JlZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC55ZWxsb3dfYmVkAA==", @@ -16916,11 +17204,11 @@ } }, { - "id": 1029, + "id": 1046, "key": "minecraft:lime_bed", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6bGltZV9iZWQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGJsb2NrLm1pbmVjcmFmdC5saW1lX2JlZAA=", @@ -16932,11 +17220,11 @@ } }, { - "id": 1030, + "id": 1047, "key": "minecraft:pink_bed", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6cGlua19iZWQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGJsb2NrLm1pbmVjcmFmdC5waW5rX2JlZAA=", @@ -16948,11 +17236,11 @@ } }, { - "id": 1031, + "id": 1048, "key": "minecraft:gray_bed", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6Z3JheV9iZWQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGJsb2NrLm1pbmVjcmFmdC5ncmF5X2JlZAA=", @@ -16964,11 +17252,11 @@ } }, { - "id": 1032, + "id": 1049, "key": "minecraft:light_gray_bed", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6bGlnaHRfZ3JheV9iZWQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5saWdodF9ncmF5X2JlZAA=", @@ -16980,11 +17268,11 @@ } }, { - "id": 1033, + "id": 1050, "key": "minecraft:cyan_bed", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6Y3lhbl9iZWQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGJsb2NrLm1pbmVjcmFmdC5jeWFuX2JlZAA=", @@ -16996,11 +17284,11 @@ } }, { - "id": 1034, + "id": 1051, "key": "minecraft:purple_bed", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6cHVycGxlX2JlZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5wdXJwbGVfYmVkAA==", @@ -17012,11 +17300,11 @@ } }, { - "id": 1035, + "id": 1052, "key": "minecraft:blue_bed", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6Ymx1ZV9iZWQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGJsb2NrLm1pbmVjcmFmdC5ibHVlX2JlZAA=", @@ -17028,11 +17316,11 @@ } }, { - "id": 1036, + "id": 1053, "key": "minecraft:brown_bed", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6YnJvd25fYmVk", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5icm93bl9iZWQA", @@ -17044,11 +17332,11 @@ } }, { - "id": 1037, + "id": 1054, "key": "minecraft:green_bed", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6Z3JlZW5fYmVk", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5ncmVlbl9iZWQA", @@ -17060,11 +17348,11 @@ } }, { - "id": 1038, + "id": 1055, "key": "minecraft:red_bed", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxFtaW5lY3JhZnQ6cmVkX2JlZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2Jsb2NrLm1pbmVjcmFmdC5yZWRfYmVkAA==", @@ -17076,11 +17364,11 @@ } }, { - "id": 1039, + "id": 1056, "key": "minecraft:black_bed", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6YmxhY2tfYmVk", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5ibGFja19iZWQA", @@ -17092,12 +17380,12 @@ } }, { - "id": 1040, + "id": 1057, "key": "minecraft:cookie", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAI+zMzNAA==", "minecraft:item_model": "BxBtaW5lY3JhZnQ6Y29va2ll", @@ -17110,11 +17398,11 @@ } }, { - "id": 1041, + "id": 1058, "key": "minecraft:crafter", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxFtaW5lY3JhZnQ6Y3JhZnRlcg==", @@ -17127,11 +17415,11 @@ } }, { - "id": 1042, + "id": 1059, "key": "minecraft:filled_map", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6ZmlsbGVkX21hcA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWl0ZW0ubWluZWNyYWZ0LmZpbGxlZF9tYXAA", @@ -17145,11 +17433,11 @@ } }, { - "id": 1043, + "id": 1060, "key": "minecraft:shears", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxBtaW5lY3JhZnQ6c2hlYXJz", @@ -17164,12 +17452,12 @@ } }, { - "id": 1044, + "id": 1061, "key": "minecraft:melon_slice", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAI/mZmaAA==", "minecraft:item_model": "BxVtaW5lY3JhZnQ6bWVsb25fc2xpY2U=", @@ -17182,12 +17470,12 @@ } }, { - "id": 1045, + "id": 1062, "key": "minecraft:dried_kelp", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT9MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT9MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAE/GZmaAA==", "minecraft:item_model": "BxRtaW5lY3JhZnQ6ZHJpZWRfa2VscA==", @@ -17200,11 +17488,11 @@ } }, { - "id": 1046, + "id": 1063, "key": "minecraft:pumpkin_seeds", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6cHVtcGtpbl9zZWVkcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0LnB1bXBraW5fc2VlZHMA", @@ -17216,11 +17504,11 @@ } }, { - "id": 1047, + "id": 1064, "key": "minecraft:melon_seeds", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6bWVsb25fc2VlZHM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGml0ZW0ubWluZWNyYWZ0Lm1lbG9uX3NlZWRzAA==", @@ -17232,12 +17520,12 @@ } }, { - "id": 1048, + "id": 1065, "key": "minecraft:beef", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAM/5mZnAA==", "minecraft:item_model": "Bw5taW5lY3JhZnQ6YmVlZg==", @@ -17250,12 +17538,12 @@ } }, { - "id": 1049, + "id": 1066, "key": "minecraft:cooked_beef", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAhBTMzNAA==", "minecraft:item_model": "BxVtaW5lY3JhZnQ6Y29va2VkX2JlZWY=", @@ -17268,12 +17556,12 @@ } }, { - "id": 1050, + "id": 1067, "key": "minecraft:chicken", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAQABEADYBAABAQA+mZma", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAQABEADYBAABAQA+mZma", "minecraft:enchantments": "CgA=", "minecraft:food": "FAI/mZmaAA==", "minecraft:item_model": "BxFtaW5lY3JhZnQ6Y2hpY2tlbg==", @@ -17286,12 +17574,12 @@ } }, { - "id": 1051, + "id": 1068, "key": "minecraft:cooked_chicken", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAZA5mZnAA==", "minecraft:item_model": "BxhtaW5lY3JhZnQ6Y29va2VkX2NoaWNrZW4=", @@ -17304,12 +17592,12 @@ } }, { - "id": 1052, + "id": 1069, "key": "minecraft:rotten_flesh", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAQABEADYBAABAQA/TMzN", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAQABEADYBAABAQA/TMzN", "minecraft:enchantments": "CgA=", "minecraft:food": "FAQ/TMzNAA==", "minecraft:item_model": "BxZtaW5lY3JhZnQ6cm90dGVuX2ZsZXNo", @@ -17322,11 +17610,11 @@ } }, { - "id": 1053, + "id": 1070, "key": "minecraft:ender_pearl", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6ZW5kZXJfcGVhcmw=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGml0ZW0ubWluZWNyYWZ0LmVuZGVyX3BlYXJsAA==", @@ -17339,11 +17627,11 @@ } }, { - "id": 1054, + "id": 1071, "key": "minecraft:blaze_rod", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6YmxhemVfcm9k", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGl0ZW0ubWluZWNyYWZ0LmJsYXplX3JvZAA=", @@ -17355,11 +17643,11 @@ } }, { - "id": 1055, + "id": 1072, "key": "minecraft:ghast_tear", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6Z2hhc3RfdGVhcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWl0ZW0ubWluZWNyYWZ0LmdoYXN0X3RlYXIA", @@ -17371,11 +17659,11 @@ } }, { - "id": 1056, + "id": 1073, "key": "minecraft:gold_nugget", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6Z29sZF9udWdnZXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGml0ZW0ubWluZWNyYWZ0LmdvbGRfbnVnZ2V0AA==", @@ -17387,11 +17675,11 @@ } }, { - "id": 1057, + "id": 1074, "key": "minecraft:nether_wart", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6bmV0aGVyX3dhcnQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGml0ZW0ubWluZWNyYWZ0Lm5ldGhlcl93YXJ0AA==", @@ -17403,11 +17691,11 @@ } }, { - "id": 1058, + "id": 1075, "key": "minecraft:glass_bottle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6Z2xhc3NfYm90dGxl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2l0ZW0ubWluZWNyYWZ0LmdsYXNzX2JvdHRsZQA=", @@ -17419,12 +17707,12 @@ } }, { - "id": 1059, + "id": 1076, "key": "minecraft:potion", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0C3QQAAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0C5gQAAA==", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxBtaW5lY3JhZnQ6cG90aW9u", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFWl0ZW0ubWluZWNyYWZ0LnBvdGlvbgA=", @@ -17434,16 +17722,16 @@ "minecraft:rarity": "CQA=", "minecraft:repair_cost": "EAA=", "minecraft:tooltip_display": "DwAA", - "minecraft:use_remainder": "FgGiCAAA" + "minecraft:use_remainder": "FgGzCAAA" } }, { - "id": 1060, + "id": 1077, "key": "minecraft:spider_eye", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAQABEgBkAAEBAD+AAAA=", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAQABEgBkAAEBAD+AAAA=", "minecraft:enchantments": "CgA=", "minecraft:food": "FAJATMzNAA==", "minecraft:item_model": "BxRtaW5lY3JhZnQ6c3BpZGVyX2V5ZQ==", @@ -17456,11 +17744,11 @@ } }, { - "id": 1061, + "id": 1078, "key": "minecraft:fermented_spider_eye", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6ZmVybWVudGVkX3NwaWRlcl9leWU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2l0ZW0ubWluZWNyYWZ0LmZlcm1lbnRlZF9zcGlkZXJfZXllAA==", @@ -17472,11 +17760,11 @@ } }, { - "id": 1062, + "id": 1079, "key": "minecraft:blaze_powder", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6YmxhemVfcG93ZGVy", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2l0ZW0ubWluZWNyYWZ0LmJsYXplX3Bvd2RlcgA=", @@ -17488,11 +17776,11 @@ } }, { - "id": 1063, + "id": 1080, "key": "minecraft:magma_cream", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6bWFnbWFfY3JlYW0=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGml0ZW0ubWluZWNyYWZ0Lm1hZ21hX2NyZWFtAA==", @@ -17504,11 +17792,11 @@ } }, { - "id": 1064, + "id": 1081, "key": "minecraft:brewing_stand", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6YnJld2luZ19zdGFuZA==", @@ -17521,11 +17809,11 @@ } }, { - "id": 1065, + "id": 1082, "key": "minecraft:cauldron", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6Y2F1bGRyb24=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGJsb2NrLm1pbmVjcmFmdC5jYXVsZHJvbgA=", @@ -17537,11 +17825,11 @@ } }, { - "id": 1066, + "id": 1083, "key": "minecraft:ender_eye", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6ZW5kZXJfZXll", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGl0ZW0ubWluZWNyYWZ0LmVuZGVyX2V5ZQA=", @@ -17553,11 +17841,11 @@ } }, { - "id": 1067, + "id": 1084, "key": "minecraft:glistering_melon_slice", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6Z2xpc3RlcmluZ19tZWxvbl9zbGljZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWl0ZW0ubWluZWNyYWZ0LmdsaXN0ZXJpbmdfbWVsb25fc2xpY2UA", @@ -17569,11 +17857,11 @@ } }, { - "id": 1068, + "id": 1085, "key": "minecraft:armadillo_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6YXJtYWRpbGxvX3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIml0ZW0ubWluZWNyYWZ0LmFybWFkaWxsb19zcGF3bl9lZ2cA", @@ -17585,11 +17873,11 @@ } }, { - "id": 1069, + "id": 1086, "key": "minecraft:allay_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6YWxsYXlfc3Bhd25fZWdn", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHml0ZW0ubWluZWNyYWZ0LmFsbGF5X3NwYXduX2VnZwA=", @@ -17601,11 +17889,11 @@ } }, { - "id": 1070, + "id": 1087, "key": "minecraft:axolotl_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6YXhvbG90bF9zcGF3bl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGl0ZW0ubWluZWNyYWZ0LmF4b2xvdGxfc3Bhd25fZWdnAA==", @@ -17617,11 +17905,11 @@ } }, { - "id": 1071, + "id": 1088, "key": "minecraft:bat_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6YmF0X3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0LmJhdF9zcGF3bl9lZ2cA", @@ -17633,11 +17921,11 @@ } }, { - "id": 1072, + "id": 1089, "key": "minecraft:bee_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6YmVlX3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0LmJlZV9zcGF3bl9lZ2cA", @@ -17649,11 +17937,11 @@ } }, { - "id": 1073, + "id": 1090, "key": "minecraft:blaze_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6YmxhemVfc3Bhd25fZWdn", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHml0ZW0ubWluZWNyYWZ0LmJsYXplX3NwYXduX2VnZwA=", @@ -17665,11 +17953,11 @@ } }, { - "id": 1074, + "id": 1091, "key": "minecraft:bogged_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6Ym9nZ2VkX3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0LmJvZ2dlZF9zcGF3bl9lZ2cA", @@ -17681,11 +17969,11 @@ } }, { - "id": 1075, + "id": 1092, "key": "minecraft:breeze_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6YnJlZXplX3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0LmJyZWV6ZV9zcGF3bl9lZ2cA", @@ -17697,11 +17985,11 @@ } }, { - "id": 1076, + "id": 1093, "key": "minecraft:cat_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6Y2F0X3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0LmNhdF9zcGF3bl9lZ2cA", @@ -17713,11 +18001,11 @@ } }, { - "id": 1077, + "id": 1094, "key": "minecraft:camel_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6Y2FtZWxfc3Bhd25fZWdn", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHml0ZW0ubWluZWNyYWZ0LmNhbWVsX3NwYXduX2VnZwA=", @@ -17729,11 +18017,11 @@ } }, { - "id": 1078, + "id": 1095, "key": "minecraft:cave_spider_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6Y2F2ZV9zcGlkZXJfc3Bhd25fZWdn", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGl0ZW0ubWluZWNyYWZ0LmNhdmVfc3BpZGVyX3NwYXduX2VnZwA=", @@ -17745,11 +18033,11 @@ } }, { - "id": 1079, + "id": 1096, "key": "minecraft:chicken_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6Y2hpY2tlbl9zcGF3bl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGl0ZW0ubWluZWNyYWZ0LmNoaWNrZW5fc3Bhd25fZWdnAA==", @@ -17761,11 +18049,11 @@ } }, { - "id": 1080, + "id": 1097, "key": "minecraft:cod_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6Y29kX3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0LmNvZF9zcGF3bl9lZ2cA", @@ -17777,11 +18065,11 @@ } }, { - "id": 1081, + "id": 1098, "key": "minecraft:cow_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6Y293X3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0LmNvd19zcGF3bl9lZ2cA", @@ -17793,11 +18081,11 @@ } }, { - "id": 1082, + "id": 1099, "key": "minecraft:creeper_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6Y3JlZXBlcl9zcGF3bl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGl0ZW0ubWluZWNyYWZ0LmNyZWVwZXJfc3Bhd25fZWdnAA==", @@ -17809,11 +18097,11 @@ } }, { - "id": 1083, + "id": 1100, "key": "minecraft:dolphin_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6ZG9scGhpbl9zcGF3bl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGl0ZW0ubWluZWNyYWZ0LmRvbHBoaW5fc3Bhd25fZWdnAA==", @@ -17825,11 +18113,11 @@ } }, { - "id": 1084, + "id": 1101, "key": "minecraft:donkey_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6ZG9ua2V5X3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0LmRvbmtleV9zcGF3bl9lZ2cA", @@ -17841,11 +18129,11 @@ } }, { - "id": 1085, + "id": 1102, "key": "minecraft:drowned_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6ZHJvd25lZF9zcGF3bl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGl0ZW0ubWluZWNyYWZ0LmRyb3duZWRfc3Bhd25fZWdnAA==", @@ -17857,11 +18145,11 @@ } }, { - "id": 1086, + "id": 1103, "key": "minecraft:elder_guardian_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByJtaW5lY3JhZnQ6ZWxkZXJfZ3VhcmRpYW5fc3Bhd25fZWdn", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2l0ZW0ubWluZWNyYWZ0LmVsZGVyX2d1YXJkaWFuX3NwYXduX2VnZwA=", @@ -17873,11 +18161,11 @@ } }, { - "id": 1087, + "id": 1104, "key": "minecraft:ender_dragon_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6ZW5kZXJfZHJhZ29uX3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWl0ZW0ubWluZWNyYWZ0LmVuZGVyX2RyYWdvbl9zcGF3bl9lZ2cA", @@ -17889,11 +18177,11 @@ } }, { - "id": 1088, + "id": 1105, "key": "minecraft:enderman_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6ZW5kZXJtYW5fc3Bhd25fZWdn", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWl0ZW0ubWluZWNyYWZ0LmVuZGVybWFuX3NwYXduX2VnZwA=", @@ -17905,11 +18193,11 @@ } }, { - "id": 1089, + "id": 1106, "key": "minecraft:endermite_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6ZW5kZXJtaXRlX3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIml0ZW0ubWluZWNyYWZ0LmVuZGVybWl0ZV9zcGF3bl9lZ2cA", @@ -17921,11 +18209,11 @@ } }, { - "id": 1090, + "id": 1107, "key": "minecraft:evoker_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6ZXZva2VyX3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0LmV2b2tlcl9zcGF3bl9lZ2cA", @@ -17937,11 +18225,11 @@ } }, { - "id": 1091, + "id": 1108, "key": "minecraft:fox_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6Zm94X3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0LmZveF9zcGF3bl9lZ2cA", @@ -17953,11 +18241,11 @@ } }, { - "id": 1092, + "id": 1109, "key": "minecraft:frog_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6ZnJvZ19zcGF3bl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWl0ZW0ubWluZWNyYWZ0LmZyb2dfc3Bhd25fZWdnAA==", @@ -17969,11 +18257,11 @@ } }, { - "id": 1093, + "id": 1110, "key": "minecraft:ghast_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6Z2hhc3Rfc3Bhd25fZWdn", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHml0ZW0ubWluZWNyYWZ0LmdoYXN0X3NwYXduX2VnZwA=", @@ -17985,11 +18273,27 @@ } }, { - "id": 1094, + "id": 1111, + "key": "minecraft:happy_ghast_spawn_egg", + "components": { + "minecraft:attribute_modifiers": "DQA=", + "minecraft:break_sound": "R7EG", + "minecraft:enchantments": "CgA=", + "minecraft:item_model": "Bx9taW5lY3JhZnQ6aGFwcHlfZ2hhc3Rfc3Bhd25fZWdn", + "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGl0ZW0ubWluZWNyYWZ0LmhhcHB5X2doYXN0X3NwYXduX2VnZwA=", + "minecraft:lore": "CAA=", + "minecraft:max_stack_size": "AUA=", + "minecraft:rarity": "CQA=", + "minecraft:repair_cost": "EAA=", + "minecraft:tooltip_display": "DwAA" + } + }, + { + "id": 1112, "key": "minecraft:glow_squid_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6Z2xvd19zcXVpZF9zcGF3bl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2l0ZW0ubWluZWNyYWZ0Lmdsb3dfc3F1aWRfc3Bhd25fZWdnAA==", @@ -18001,11 +18305,11 @@ } }, { - "id": 1095, + "id": 1113, "key": "minecraft:goat_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6Z29hdF9zcGF3bl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWl0ZW0ubWluZWNyYWZ0LmdvYXRfc3Bhd25fZWdnAA==", @@ -18017,11 +18321,11 @@ } }, { - "id": 1096, + "id": 1114, "key": "minecraft:guardian_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6Z3VhcmRpYW5fc3Bhd25fZWdn", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWl0ZW0ubWluZWNyYWZ0Lmd1YXJkaWFuX3NwYXduX2VnZwA=", @@ -18033,11 +18337,11 @@ } }, { - "id": 1097, + "id": 1115, "key": "minecraft:hoglin_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6aG9nbGluX3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0LmhvZ2xpbl9zcGF3bl9lZ2cA", @@ -18049,11 +18353,11 @@ } }, { - "id": 1098, + "id": 1116, "key": "minecraft:horse_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6aG9yc2Vfc3Bhd25fZWdn", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHml0ZW0ubWluZWNyYWZ0LmhvcnNlX3NwYXduX2VnZwA=", @@ -18065,11 +18369,11 @@ } }, { - "id": 1099, + "id": 1117, "key": "minecraft:husk_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6aHVza19zcGF3bl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWl0ZW0ubWluZWNyYWZ0Lmh1c2tfc3Bhd25fZWdnAA==", @@ -18081,11 +18385,11 @@ } }, { - "id": 1100, + "id": 1118, "key": "minecraft:iron_golem_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6aXJvbl9nb2xlbV9zcGF3bl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2l0ZW0ubWluZWNyYWZ0Lmlyb25fZ29sZW1fc3Bhd25fZWdnAA==", @@ -18097,11 +18401,11 @@ } }, { - "id": 1101, + "id": 1119, "key": "minecraft:llama_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6bGxhbWFfc3Bhd25fZWdn", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHml0ZW0ubWluZWNyYWZ0LmxsYW1hX3NwYXduX2VnZwA=", @@ -18113,11 +18417,11 @@ } }, { - "id": 1102, + "id": 1120, "key": "minecraft:magma_cube_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6bWFnbWFfY3ViZV9zcGF3bl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2l0ZW0ubWluZWNyYWZ0Lm1hZ21hX2N1YmVfc3Bhd25fZWdnAA==", @@ -18129,11 +18433,11 @@ } }, { - "id": 1103, + "id": 1121, "key": "minecraft:mooshroom_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6bW9vc2hyb29tX3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIml0ZW0ubWluZWNyYWZ0Lm1vb3Nocm9vbV9zcGF3bl9lZ2cA", @@ -18145,11 +18449,11 @@ } }, { - "id": 1104, + "id": 1122, "key": "minecraft:mule_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6bXVsZV9zcGF3bl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWl0ZW0ubWluZWNyYWZ0Lm11bGVfc3Bhd25fZWdnAA==", @@ -18161,11 +18465,11 @@ } }, { - "id": 1105, + "id": 1123, "key": "minecraft:ocelot_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6b2NlbG90X3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0Lm9jZWxvdF9zcGF3bl9lZ2cA", @@ -18177,11 +18481,11 @@ } }, { - "id": 1106, + "id": 1124, "key": "minecraft:panda_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6cGFuZGFfc3Bhd25fZWdn", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHml0ZW0ubWluZWNyYWZ0LnBhbmRhX3NwYXduX2VnZwA=", @@ -18193,11 +18497,11 @@ } }, { - "id": 1107, + "id": 1125, "key": "minecraft:parrot_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6cGFycm90X3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0LnBhcnJvdF9zcGF3bl9lZ2cA", @@ -18209,11 +18513,11 @@ } }, { - "id": 1108, + "id": 1126, "key": "minecraft:phantom_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6cGhhbnRvbV9zcGF3bl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGl0ZW0ubWluZWNyYWZ0LnBoYW50b21fc3Bhd25fZWdnAA==", @@ -18225,11 +18529,11 @@ } }, { - "id": 1109, + "id": 1127, "key": "minecraft:pig_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6cGlnX3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0LnBpZ19zcGF3bl9lZ2cA", @@ -18241,11 +18545,11 @@ } }, { - "id": 1110, + "id": 1128, "key": "minecraft:piglin_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6cGlnbGluX3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0LnBpZ2xpbl9zcGF3bl9lZ2cA", @@ -18257,11 +18561,11 @@ } }, { - "id": 1111, + "id": 1129, "key": "minecraft:piglin_brute_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6cGlnbGluX2JydXRlX3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWl0ZW0ubWluZWNyYWZ0LnBpZ2xpbl9icnV0ZV9zcGF3bl9lZ2cA", @@ -18273,11 +18577,11 @@ } }, { - "id": 1112, + "id": 1130, "key": "minecraft:pillager_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6cGlsbGFnZXJfc3Bhd25fZWdn", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWl0ZW0ubWluZWNyYWZ0LnBpbGxhZ2VyX3NwYXduX2VnZwA=", @@ -18289,11 +18593,11 @@ } }, { - "id": 1113, + "id": 1131, "key": "minecraft:polar_bear_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6cG9sYXJfYmVhcl9zcGF3bl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2l0ZW0ubWluZWNyYWZ0LnBvbGFyX2JlYXJfc3Bhd25fZWdnAA==", @@ -18305,11 +18609,11 @@ } }, { - "id": 1114, + "id": 1132, "key": "minecraft:pufferfish_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6cHVmZmVyZmlzaF9zcGF3bl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2l0ZW0ubWluZWNyYWZ0LnB1ZmZlcmZpc2hfc3Bhd25fZWdnAA==", @@ -18321,11 +18625,11 @@ } }, { - "id": 1115, + "id": 1133, "key": "minecraft:rabbit_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6cmFiYml0X3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0LnJhYmJpdF9zcGF3bl9lZ2cA", @@ -18337,11 +18641,11 @@ } }, { - "id": 1116, + "id": 1134, "key": "minecraft:ravager_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6cmF2YWdlcl9zcGF3bl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGl0ZW0ubWluZWNyYWZ0LnJhdmFnZXJfc3Bhd25fZWdnAA==", @@ -18353,11 +18657,11 @@ } }, { - "id": 1117, + "id": 1135, "key": "minecraft:salmon_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6c2FsbW9uX3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0LnNhbG1vbl9zcGF3bl9lZ2cA", @@ -18369,11 +18673,11 @@ } }, { - "id": 1118, + "id": 1136, "key": "minecraft:sheep_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6c2hlZXBfc3Bhd25fZWdn", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHml0ZW0ubWluZWNyYWZ0LnNoZWVwX3NwYXduX2VnZwA=", @@ -18385,11 +18689,11 @@ } }, { - "id": 1119, + "id": 1137, "key": "minecraft:shulker_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6c2h1bGtlcl9zcGF3bl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGl0ZW0ubWluZWNyYWZ0LnNodWxrZXJfc3Bhd25fZWdnAA==", @@ -18401,11 +18705,11 @@ } }, { - "id": 1120, + "id": 1138, "key": "minecraft:silverfish_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6c2lsdmVyZmlzaF9zcGF3bl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2l0ZW0ubWluZWNyYWZ0LnNpbHZlcmZpc2hfc3Bhd25fZWdnAA==", @@ -18417,11 +18721,11 @@ } }, { - "id": 1121, + "id": 1139, "key": "minecraft:skeleton_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6c2tlbGV0b25fc3Bhd25fZWdn", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWl0ZW0ubWluZWNyYWZ0LnNrZWxldG9uX3NwYXduX2VnZwA=", @@ -18433,11 +18737,11 @@ } }, { - "id": 1122, + "id": 1140, "key": "minecraft:skeleton_horse_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByJtaW5lY3JhZnQ6c2tlbGV0b25faG9yc2Vfc3Bhd25fZWdn", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2l0ZW0ubWluZWNyYWZ0LnNrZWxldG9uX2hvcnNlX3NwYXduX2VnZwA=", @@ -18449,11 +18753,11 @@ } }, { - "id": 1123, + "id": 1141, "key": "minecraft:slime_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6c2xpbWVfc3Bhd25fZWdn", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHml0ZW0ubWluZWNyYWZ0LnNsaW1lX3NwYXduX2VnZwA=", @@ -18465,11 +18769,11 @@ } }, { - "id": 1124, + "id": 1142, "key": "minecraft:sniffer_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6c25pZmZlcl9zcGF3bl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGl0ZW0ubWluZWNyYWZ0LnNuaWZmZXJfc3Bhd25fZWdnAA==", @@ -18481,11 +18785,11 @@ } }, { - "id": 1125, + "id": 1143, "key": "minecraft:snow_golem_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6c25vd19nb2xlbV9zcGF3bl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2l0ZW0ubWluZWNyYWZ0LnNub3dfZ29sZW1fc3Bhd25fZWdnAA==", @@ -18497,11 +18801,11 @@ } }, { - "id": 1126, + "id": 1144, "key": "minecraft:spider_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6c3BpZGVyX3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0LnNwaWRlcl9zcGF3bl9lZ2cA", @@ -18513,11 +18817,11 @@ } }, { - "id": 1127, + "id": 1145, "key": "minecraft:squid_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6c3F1aWRfc3Bhd25fZWdn", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHml0ZW0ubWluZWNyYWZ0LnNxdWlkX3NwYXduX2VnZwA=", @@ -18529,11 +18833,11 @@ } }, { - "id": 1128, + "id": 1146, "key": "minecraft:stray_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6c3RyYXlfc3Bhd25fZWdn", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHml0ZW0ubWluZWNyYWZ0LnN0cmF5X3NwYXduX2VnZwA=", @@ -18545,11 +18849,11 @@ } }, { - "id": 1129, + "id": 1147, "key": "minecraft:strider_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6c3RyaWRlcl9zcGF3bl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGl0ZW0ubWluZWNyYWZ0LnN0cmlkZXJfc3Bhd25fZWdnAA==", @@ -18561,11 +18865,11 @@ } }, { - "id": 1130, + "id": 1148, "key": "minecraft:tadpole_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6dGFkcG9sZV9zcGF3bl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGl0ZW0ubWluZWNyYWZ0LnRhZHBvbGVfc3Bhd25fZWdnAA==", @@ -18577,11 +18881,11 @@ } }, { - "id": 1131, + "id": 1149, "key": "minecraft:trader_llama_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6dHJhZGVyX2xsYW1hX3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWl0ZW0ubWluZWNyYWZ0LnRyYWRlcl9sbGFtYV9zcGF3bl9lZ2cA", @@ -18593,11 +18897,11 @@ } }, { - "id": 1132, + "id": 1150, "key": "minecraft:tropical_fish_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByFtaW5lY3JhZnQ6dHJvcGljYWxfZmlzaF9zcGF3bl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJml0ZW0ubWluZWNyYWZ0LnRyb3BpY2FsX2Zpc2hfc3Bhd25fZWdnAA==", @@ -18609,11 +18913,11 @@ } }, { - "id": 1133, + "id": 1151, "key": "minecraft:turtle_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6dHVydGxlX3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0LnR1cnRsZV9zcGF3bl9lZ2cA", @@ -18625,11 +18929,11 @@ } }, { - "id": 1134, + "id": 1152, "key": "minecraft:vex_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6dmV4X3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0LnZleF9zcGF3bl9lZ2cA", @@ -18641,11 +18945,11 @@ } }, { - "id": 1135, + "id": 1153, "key": "minecraft:villager_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6dmlsbGFnZXJfc3Bhd25fZWdn", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWl0ZW0ubWluZWNyYWZ0LnZpbGxhZ2VyX3NwYXduX2VnZwA=", @@ -18657,11 +18961,11 @@ } }, { - "id": 1136, + "id": 1154, "key": "minecraft:vindicator_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6dmluZGljYXRvcl9zcGF3bl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2l0ZW0ubWluZWNyYWZ0LnZpbmRpY2F0b3Jfc3Bhd25fZWdnAA==", @@ -18673,11 +18977,11 @@ } }, { - "id": 1137, + "id": 1155, "key": "minecraft:wandering_trader_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByRtaW5lY3JhZnQ6d2FuZGVyaW5nX3RyYWRlcl9zcGF3bl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKWl0ZW0ubWluZWNyYWZ0LndhbmRlcmluZ190cmFkZXJfc3Bhd25fZWdnAA==", @@ -18689,11 +18993,11 @@ } }, { - "id": 1138, + "id": 1156, "key": "minecraft:warden_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6d2FyZGVuX3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0LndhcmRlbl9zcGF3bl9lZ2cA", @@ -18705,11 +19009,11 @@ } }, { - "id": 1139, + "id": 1157, "key": "minecraft:witch_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6d2l0Y2hfc3Bhd25fZWdn", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHml0ZW0ubWluZWNyYWZ0LndpdGNoX3NwYXduX2VnZwA=", @@ -18721,11 +19025,11 @@ } }, { - "id": 1140, + "id": 1158, "key": "minecraft:wither_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6d2l0aGVyX3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0LndpdGhlcl9zcGF3bl9lZ2cA", @@ -18737,11 +19041,11 @@ } }, { - "id": 1141, + "id": 1159, "key": "minecraft:wither_skeleton_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByNtaW5lY3JhZnQ6d2l0aGVyX3NrZWxldG9uX3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKGl0ZW0ubWluZWNyYWZ0LndpdGhlcl9za2VsZXRvbl9zcGF3bl9lZ2cA", @@ -18753,11 +19057,11 @@ } }, { - "id": 1142, + "id": 1160, "key": "minecraft:wolf_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6d29sZl9zcGF3bl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWl0ZW0ubWluZWNyYWZ0LndvbGZfc3Bhd25fZWdnAA==", @@ -18769,11 +19073,11 @@ } }, { - "id": 1143, + "id": 1161, "key": "minecraft:zoglin_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6em9nbGluX3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0LnpvZ2xpbl9zcGF3bl9lZ2cA", @@ -18785,11 +19089,11 @@ } }, { - "id": 1144, + "id": 1162, "key": "minecraft:creaking_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6Y3JlYWtpbmdfc3Bhd25fZWdn", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWl0ZW0ubWluZWNyYWZ0LmNyZWFraW5nX3NwYXduX2VnZwA=", @@ -18801,11 +19105,11 @@ } }, { - "id": 1145, + "id": 1163, "key": "minecraft:zombie_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6em9tYmllX3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0LnpvbWJpZV9zcGF3bl9lZ2cA", @@ -18817,11 +19121,11 @@ } }, { - "id": 1146, + "id": 1164, "key": "minecraft:zombie_horse_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6em9tYmllX2hvcnNlX3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWl0ZW0ubWluZWNyYWZ0LnpvbWJpZV9ob3JzZV9zcGF3bl9lZ2cA", @@ -18833,11 +19137,11 @@ } }, { - "id": 1147, + "id": 1165, "key": "minecraft:zombie_villager_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByNtaW5lY3JhZnQ6em9tYmllX3ZpbGxhZ2VyX3NwYXduX2VnZw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKGl0ZW0ubWluZWNyYWZ0LnpvbWJpZV92aWxsYWdlcl9zcGF3bl9lZ2cA", @@ -18849,11 +19153,11 @@ } }, { - "id": 1148, + "id": 1166, "key": "minecraft:zombified_piglin_spawn_egg", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByRtaW5lY3JhZnQ6em9tYmlmaWVkX3BpZ2xpbl9zcGF3bl9lZ2c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKWl0ZW0ubWluZWNyYWZ0LnpvbWJpZmllZF9waWdsaW5fc3Bhd25fZWdnAA==", @@ -18865,11 +19169,11 @@ } }, { - "id": 1149, + "id": 1167, "key": "minecraft:experience_bottle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantment_glint_override": "EgE=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6ZXhwZXJpZW5jZV9ib3R0bGU=", @@ -18882,11 +19186,11 @@ } }, { - "id": 1150, + "id": 1168, "key": "minecraft:fire_charge", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6ZmlyZV9jaGFyZ2U=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGml0ZW0ubWluZWNyYWZ0LmZpcmVfY2hhcmdlAA==", @@ -18898,11 +19202,11 @@ } }, { - "id": 1151, + "id": 1169, "key": "minecraft:wind_charge", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6d2luZF9jaGFyZ2U=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGml0ZW0ubWluZWNyYWZ0LndpbmRfY2hhcmdlAA==", @@ -18915,11 +19219,11 @@ } }, { - "id": 1152, + "id": 1170, "key": "minecraft:writable_book", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6d3JpdGFibGVfYm9vaw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0LndyaXRhYmxlX2Jvb2sA", @@ -18932,11 +19236,11 @@ } }, { - "id": 1153, + "id": 1171, "key": "minecraft:written_book", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantment_glint_override": "EgE=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6d3JpdHRlbl9ib29r", @@ -18949,11 +19253,11 @@ } }, { - "id": 1154, + "id": 1172, "key": "minecraft:breeze_rod", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6YnJlZXplX3JvZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWl0ZW0ubWluZWNyYWZ0LmJyZWV6ZV9yb2QA", @@ -18965,11 +19269,11 @@ } }, { - "id": 1155, + "id": 1173, "key": "minecraft:mace", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAFAAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTACzMzQAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAFAAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAszM0AAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "Gw8=", "minecraft:enchantments": "CgA=", @@ -18980,18 +19284,18 @@ "minecraft:max_stack_size": "AQE=", "minecraft:rarity": "CQM=", "minecraft:repair_cost": "EAA=", - "minecraft:repairable": "HQKCCQ==", + "minecraft:repairable": "HQKUCQ==", "minecraft:tool": "GQA/gAAAAgA=", "minecraft:tooltip_display": "DwAA", "minecraft:weapon": "GgEAAAAA" } }, { - "id": 1156, + "id": 1174, "key": "minecraft:item_frame", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6aXRlbV9mcmFtZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWl0ZW0ubWluZWNyYWZ0Lml0ZW1fZnJhbWUA", @@ -19003,11 +19307,11 @@ } }, { - "id": 1157, + "id": 1175, "key": "minecraft:glow_item_frame", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6Z2xvd19pdGVtX2ZyYW1l", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHml0ZW0ubWluZWNyYWZ0Lmdsb3dfaXRlbV9mcmFtZQA=", @@ -19019,11 +19323,11 @@ } }, { - "id": 1158, + "id": 1176, "key": "minecraft:flower_pot", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6Zmxvd2VyX3BvdA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5mbG93ZXJfcG90AA==", @@ -19035,12 +19339,12 @@ } }, { - "id": 1159, + "id": 1177, "key": "minecraft:carrot", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FANAZmZnAA==", "minecraft:item_model": "BxBtaW5lY3JhZnQ6Y2Fycm90", @@ -19053,12 +19357,12 @@ } }, { - "id": 1160, + "id": 1178, "key": "minecraft:potato", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAE/GZmaAA==", "minecraft:item_model": "BxBtaW5lY3JhZnQ6cG90YXRv", @@ -19071,12 +19375,12 @@ } }, { - "id": 1161, + "id": 1179, "key": "minecraft:baked_potato", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAVAwAAAAA==", "minecraft:item_model": "BxZtaW5lY3JhZnQ6YmFrZWRfcG90YXRv", @@ -19089,12 +19393,12 @@ } }, { - "id": 1162, + "id": 1180, "key": "minecraft:poisonous_potato", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAQABEgBkAAEBAD8ZmZo=", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAQABEgBkAAEBAD8ZmZo=", "minecraft:enchantments": "CgA=", "minecraft:food": "FAI/mZmaAA==", "minecraft:item_model": "BxptaW5lY3JhZnQ6cG9pc29ub3VzX3BvdGF0bw==", @@ -19107,11 +19411,11 @@ } }, { - "id": 1163, + "id": 1181, "key": "minecraft:map", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw1taW5lY3JhZnQ6bWFw", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAEml0ZW0ubWluZWNyYWZ0Lm1hcAA=", @@ -19123,12 +19427,12 @@ } }, { - "id": 1164, + "id": 1182, "key": "minecraft:golden_carrot", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAZBZmZnAA==", "minecraft:item_model": "BxdtaW5lY3JhZnQ6Z29sZGVuX2NhcnJvdA==", @@ -19141,13 +19445,13 @@ } }, { - "id": 1165, + "id": 1183, "key": "minecraft:skeleton_skull", "components": { - "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQEhJm1pbmVjcmFmdDp3YXlwb2ludF90cmFuc21pdF9yYW5nZV9oaWRlv/AAAAAAAAACBwE=", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HARHAAAAAQABAA==", + "minecraft:equippable": "HARHAAAAAQABAACRCg==", "minecraft:item_model": "BxhtaW5lY3JhZnQ6c2tlbGV0b25fc2t1bGw=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5za2VsZXRvbl9za3VsbAA=", "minecraft:lore": "CAA=", @@ -19158,13 +19462,13 @@ } }, { - "id": 1166, + "id": 1184, "key": "minecraft:wither_skeleton_skull", "components": { - "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQEhJm1pbmVjcmFmdDp3YXlwb2ludF90cmFuc21pdF9yYW5nZV9oaWRlv/AAAAAAAAACBwE=", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HARHAAAAAQABAA==", + "minecraft:equippable": "HARHAAAAAQABAACRCg==", "minecraft:item_model": "Bx9taW5lY3JhZnQ6d2l0aGVyX3NrZWxldG9uX3NrdWxs", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC53aXRoZXJfc2tlbGV0b25fc2t1bGwA", "minecraft:lore": "CAA=", @@ -19175,13 +19479,13 @@ } }, { - "id": 1167, + "id": 1185, "key": "minecraft:player_head", "components": { - "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQEhJm1pbmVjcmFmdDp3YXlwb2ludF90cmFuc21pdF9yYW5nZV9oaWRlv/AAAAAAAAACBwE=", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HARHAAAAAQABAA==", + "minecraft:equippable": "HARHAAAAAQABAACRCg==", "minecraft:item_model": "BxVtaW5lY3JhZnQ6cGxheWVyX2hlYWQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5wbGF5ZXJfaGVhZAA=", "minecraft:lore": "CAA=", @@ -19192,13 +19496,13 @@ } }, { - "id": 1168, + "id": 1186, "key": "minecraft:zombie_head", "components": { - "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQEhJm1pbmVjcmFmdDp3YXlwb2ludF90cmFuc21pdF9yYW5nZV9oaWRlv/AAAAAAAAACBwE=", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HARHAAAAAQABAA==", + "minecraft:equippable": "HARHAAAAAQABAACRCg==", "minecraft:item_model": "BxVtaW5lY3JhZnQ6em9tYmllX2hlYWQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC56b21iaWVfaGVhZAA=", "minecraft:lore": "CAA=", @@ -19209,13 +19513,13 @@ } }, { - "id": 1169, + "id": 1187, "key": "minecraft:creeper_head", "components": { - "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQEhJm1pbmVjcmFmdDp3YXlwb2ludF90cmFuc21pdF9yYW5nZV9oaWRlv/AAAAAAAAACBwE=", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HARHAAAAAQABAA==", + "minecraft:equippable": "HARHAAAAAQABAACRCg==", "minecraft:item_model": "BxZtaW5lY3JhZnQ6Y3JlZXBlcl9oZWFk", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5jcmVlcGVyX2hlYWQA", "minecraft:lore": "CAA=", @@ -19226,13 +19530,13 @@ } }, { - "id": 1170, + "id": 1188, "key": "minecraft:dragon_head", "components": { - "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQEhJm1pbmVjcmFmdDp3YXlwb2ludF90cmFuc21pdF9yYW5nZV9oaWRlv/AAAAAAAAACBwE=", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HARHAAAAAQABAA==", + "minecraft:equippable": "HARHAAAAAQABAACRCg==", "minecraft:item_model": "BxVtaW5lY3JhZnQ6ZHJhZ29uX2hlYWQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5kcmFnb25faGVhZAA=", "minecraft:lore": "CAA=", @@ -19243,13 +19547,13 @@ } }, { - "id": 1171, + "id": 1189, "key": "minecraft:piglin_head", "components": { - "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQEhJm1pbmVjcmFmdDp3YXlwb2ludF90cmFuc21pdF9yYW5nZV9oaWRlv/AAAAAAAAACBwE=", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HARHAAAAAQABAA==", + "minecraft:equippable": "HARHAAAAAQABAACRCg==", "minecraft:item_model": "BxVtaW5lY3JhZnQ6cGlnbGluX2hlYWQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5waWdsaW5faGVhZAA=", "minecraft:lore": "CAA=", @@ -19260,11 +19564,11 @@ } }, { - "id": 1172, + "id": 1190, "key": "minecraft:nether_star", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:damage_resistant": "GBZtaW5lY3JhZnQ6aXNfZXhwbG9zaW9u", "minecraft:enchantment_glint_override": "EgE=", "minecraft:enchantments": "CgA=", @@ -19278,12 +19582,12 @@ } }, { - "id": 1173, + "id": 1191, "key": "minecraft:pumpkin_pie", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAhAmZmaAA==", "minecraft:item_model": "BxVtaW5lY3JhZnQ6cHVtcGtpbl9waWU=", @@ -19296,11 +19600,11 @@ } }, { - "id": 1174, + "id": 1192, "key": "minecraft:firework_rocket", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:fireworks": "PAEA", "minecraft:item_model": "BxltaW5lY3JhZnQ6ZmlyZXdvcmtfcm9ja2V0", @@ -19313,11 +19617,11 @@ } }, { - "id": 1175, + "id": 1193, "key": "minecraft:firework_star", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6ZmlyZXdvcmtfc3Rhcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0LmZpcmV3b3JrX3N0YXIA", @@ -19329,11 +19633,11 @@ } }, { - "id": 1176, + "id": 1194, "key": "minecraft:enchanted_book", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantment_glint_override": "EgE=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6ZW5jaGFudGVkX2Jvb2s=", @@ -19347,11 +19651,11 @@ } }, { - "id": 1177, + "id": 1195, "key": "minecraft:nether_brick", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6bmV0aGVyX2JyaWNr", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2l0ZW0ubWluZWNyYWZ0Lm5ldGhlcl9icmljawA=", @@ -19363,11 +19667,11 @@ } }, { - "id": 1178, + "id": 1196, "key": "minecraft:resin_brick", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6cmVzaW5fYnJpY2s=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGml0ZW0ubWluZWNyYWZ0LnJlc2luX2JyaWNrAA==", @@ -19380,11 +19684,11 @@ } }, { - "id": 1179, + "id": 1197, "key": "minecraft:prismarine_shard", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6cHJpc21hcmluZV9zaGFyZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0LnByaXNtYXJpbmVfc2hhcmQA", @@ -19396,11 +19700,11 @@ } }, { - "id": 1180, + "id": 1198, "key": "minecraft:prismarine_crystals", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6cHJpc21hcmluZV9jcnlzdGFscw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIml0ZW0ubWluZWNyYWZ0LnByaXNtYXJpbmVfY3J5c3RhbHMA", @@ -19412,12 +19716,12 @@ } }, { - "id": 1181, + "id": 1199, "key": "minecraft:rabbit", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAM/5mZnAA==", "minecraft:item_model": "BxBtaW5lY3JhZnQ6cmFiYml0", @@ -19430,12 +19734,12 @@ } }, { - "id": 1182, + "id": 1200, "key": "minecraft:cooked_rabbit", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAVAwAAAAA==", "minecraft:item_model": "BxdtaW5lY3JhZnQ6Y29va2VkX3JhYmJpdA==", @@ -19448,12 +19752,12 @@ } }, { - "id": 1183, + "id": 1201, "key": "minecraft:rabbit_stew", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FApBQAAAAA==", "minecraft:item_model": "BxVtaW5lY3JhZnQ6cmFiYml0X3N0ZXc=", @@ -19463,15 +19767,15 @@ "minecraft:rarity": "CQA=", "minecraft:repair_cost": "EAA=", "minecraft:tooltip_display": "DwAA", - "minecraft:use_remainder": "FgHHBgAA" + "minecraft:use_remainder": "FgHYBgAA" } }, { - "id": 1184, + "id": 1202, "key": "minecraft:rabbit_foot", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6cmFiYml0X2Zvb3Q=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGml0ZW0ubWluZWNyYWZ0LnJhYmJpdF9mb290AA==", @@ -19483,11 +19787,11 @@ } }, { - "id": 1185, + "id": 1203, "key": "minecraft:rabbit_hide", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6cmFiYml0X2hpZGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGml0ZW0ubWluZWNyYWZ0LnJhYmJpdF9oaWRlAA==", @@ -19499,11 +19803,11 @@ } }, { - "id": 1186, + "id": 1204, "key": "minecraft:armor_stand", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6YXJtb3Jfc3RhbmQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGml0ZW0ubWluZWNyYWZ0LmFybW9yX3N0YW5kAA==", @@ -19515,13 +19819,13 @@ } }, { - "id": 1187, + "id": 1205, "key": "minecraft:iron_horse_armor", "components": { - "minecraft:attribute_modifiers": "DQIAFG1pbmVjcmFmdDphcm1vci5ib2R5QBQAAAAAAAAACQEUbWluZWNyYWZ0OmFybW9yLmJvZHkAAAAAAAAAAAAJ", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQIAFG1pbmVjcmFmdDphcm1vci5ib2R5QBQAAAAAAAAACQABFG1pbmVjcmFmdDphcm1vci5ib2R5AAAAAAAAAAAACQA=", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAbpBQEObWluZWNyYWZ0Omlyb24AAQAebWluZWNyYWZ0OmNhbl93ZWFyX2hvcnNlX2FybW9yAQEAAA==", + "minecraft:equippable": "HAb+BQEObWluZWNyYWZ0Omlyb24AAQAebWluZWNyYWZ0OmNhbl93ZWFyX2hvcnNlX2FybW9yAQEAAAH/BQ==", "minecraft:item_model": "BxptaW5lY3JhZnQ6aXJvbl9ob3JzZV9hcm1vcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0Lmlyb25faG9yc2VfYXJtb3IA", "minecraft:lore": "CAA=", @@ -19532,13 +19836,13 @@ } }, { - "id": 1188, + "id": 1206, "key": "minecraft:golden_horse_armor", "components": { - "minecraft:attribute_modifiers": "DQIAFG1pbmVjcmFmdDphcm1vci5ib2R5QBwAAAAAAAAACQEUbWluZWNyYWZ0OmFybW9yLmJvZHkAAAAAAAAAAAAJ", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQIAFG1pbmVjcmFmdDphcm1vci5ib2R5QBwAAAAAAAAACQABFG1pbmVjcmFmdDphcm1vci5ib2R5AAAAAAAAAAAACQA=", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAbpBQEObWluZWNyYWZ0OmdvbGQAAQAebWluZWNyYWZ0OmNhbl93ZWFyX2hvcnNlX2FybW9yAQEAAA==", + "minecraft:equippable": "HAb+BQEObWluZWNyYWZ0OmdvbGQAAQAebWluZWNyYWZ0OmNhbl93ZWFyX2hvcnNlX2FybW9yAQEAAAH/BQ==", "minecraft:item_model": "BxxtaW5lY3JhZnQ6Z29sZGVuX2hvcnNlX2FybW9y", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWl0ZW0ubWluZWNyYWZ0LmdvbGRlbl9ob3JzZV9hcm1vcgA=", "minecraft:lore": "CAA=", @@ -19549,13 +19853,13 @@ } }, { - "id": 1189, + "id": 1207, "key": "minecraft:diamond_horse_armor", "components": { - "minecraft:attribute_modifiers": "DQIAFG1pbmVjcmFmdDphcm1vci5ib2R5QCYAAAAAAAAACQEUbWluZWNyYWZ0OmFybW9yLmJvZHlAAAAAAAAAAAAJ", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQIAFG1pbmVjcmFmdDphcm1vci5ib2R5QCYAAAAAAAAACQABFG1pbmVjcmFmdDphcm1vci5ib2R5QAAAAAAAAAAACQA=", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAbpBQERbWluZWNyYWZ0OmRpYW1vbmQAAQAebWluZWNyYWZ0OmNhbl93ZWFyX2hvcnNlX2FybW9yAQEAAA==", + "minecraft:equippable": "HAb+BQERbWluZWNyYWZ0OmRpYW1vbmQAAQAebWluZWNyYWZ0OmNhbl93ZWFyX2hvcnNlX2FybW9yAQEAAAH/BQ==", "minecraft:item_model": "Bx1taW5lY3JhZnQ6ZGlhbW9uZF9ob3JzZV9hcm1vcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIml0ZW0ubWluZWNyYWZ0LmRpYW1vbmRfaG9yc2VfYXJtb3IA", "minecraft:lore": "CAA=", @@ -19566,13 +19870,13 @@ } }, { - "id": 1190, + "id": 1208, "key": "minecraft:leather_horse_armor", "components": { - "minecraft:attribute_modifiers": "DQIAFG1pbmVjcmFmdDphcm1vci5ib2R5QAgAAAAAAAAACQEUbWluZWNyYWZ0OmFybW9yLmJvZHkAAAAAAAAAAAAJ", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQIAFG1pbmVjcmFmdDphcm1vci5ib2R5QAgAAAAAAAAACQABFG1pbmVjcmFmdDphcm1vci5ib2R5AAAAAAAAAAAACQA=", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAbpBQERbWluZWNyYWZ0OmxlYXRoZXIAAQAebWluZWNyYWZ0OmNhbl93ZWFyX2hvcnNlX2FybW9yAQEAAA==", + "minecraft:equippable": "HAb+BQERbWluZWNyYWZ0OmxlYXRoZXIAAQAebWluZWNyYWZ0OmNhbl93ZWFyX2hvcnNlX2FybW9yAQEAAAH/BQ==", "minecraft:item_model": "Bx1taW5lY3JhZnQ6bGVhdGhlcl9ob3JzZV9hcm1vcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIml0ZW0ubWluZWNyYWZ0LmxlYXRoZXJfaG9yc2VfYXJtb3IA", "minecraft:lore": "CAA=", @@ -19583,11 +19887,11 @@ } }, { - "id": 1191, + "id": 1209, "key": "minecraft:lead", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw5taW5lY3JhZnQ6bGVhZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAE2l0ZW0ubWluZWNyYWZ0LmxlYWQA", @@ -19599,11 +19903,11 @@ } }, { - "id": 1192, + "id": 1210, "key": "minecraft:name_tag", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6bmFtZV90YWc=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2l0ZW0ubWluZWNyYWZ0Lm5hbWVfdGFnAA==", @@ -19615,11 +19919,11 @@ } }, { - "id": 1193, + "id": 1211, "key": "minecraft:command_block_minecart", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6Y29tbWFuZF9ibG9ja19taW5lY2FydA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWl0ZW0ubWluZWNyYWZ0LmNvbW1hbmRfYmxvY2tfbWluZWNhcnQA", @@ -19631,12 +19935,12 @@ } }, { - "id": 1194, + "id": 1212, "key": "minecraft:mutton", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAI/mZmaAA==", "minecraft:item_model": "BxBtaW5lY3JhZnQ6bXV0dG9u", @@ -19649,12 +19953,12 @@ } }, { - "id": 1195, + "id": 1213, "key": "minecraft:cooked_mutton", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAZBGZmaAA==", "minecraft:item_model": "BxdtaW5lY3JhZnQ6Y29va2VkX211dHRvbg==", @@ -19667,12 +19971,12 @@ } }, { - "id": 1196, + "id": 1214, "key": "minecraft:white_banner", "components": { "minecraft:attribute_modifiers": "DQA=", "minecraft:banner_patterns": "PwA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6d2hpdGVfYmFubmVy", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC53aGl0ZV9iYW5uZXIA", @@ -19684,12 +19988,12 @@ } }, { - "id": 1197, + "id": 1215, "key": "minecraft:orange_banner", "components": { "minecraft:attribute_modifiers": "DQA=", "minecraft:banner_patterns": "PwA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6b3JhbmdlX2Jhbm5lcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5vcmFuZ2VfYmFubmVyAA==", @@ -19701,12 +20005,12 @@ } }, { - "id": 1198, + "id": 1216, "key": "minecraft:magenta_banner", "components": { "minecraft:attribute_modifiers": "DQA=", "minecraft:banner_patterns": "PwA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6bWFnZW50YV9iYW5uZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5tYWdlbnRhX2Jhbm5lcgA=", @@ -19718,12 +20022,12 @@ } }, { - "id": 1199, + "id": 1217, "key": "minecraft:light_blue_banner", "components": { "minecraft:attribute_modifiers": "DQA=", "minecraft:banner_patterns": "PwA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6bGlnaHRfYmx1ZV9iYW5uZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5saWdodF9ibHVlX2Jhbm5lcgA=", @@ -19735,12 +20039,12 @@ } }, { - "id": 1200, + "id": 1218, "key": "minecraft:yellow_banner", "components": { "minecraft:attribute_modifiers": "DQA=", "minecraft:banner_patterns": "PwA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6eWVsbG93X2Jhbm5lcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC55ZWxsb3dfYmFubmVyAA==", @@ -19752,12 +20056,12 @@ } }, { - "id": 1201, + "id": 1219, "key": "minecraft:lime_banner", "components": { "minecraft:attribute_modifiers": "DQA=", "minecraft:banner_patterns": "PwA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6bGltZV9iYW5uZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5saW1lX2Jhbm5lcgA=", @@ -19769,12 +20073,12 @@ } }, { - "id": 1202, + "id": 1220, "key": "minecraft:pink_banner", "components": { "minecraft:attribute_modifiers": "DQA=", "minecraft:banner_patterns": "PwA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6cGlua19iYW5uZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5waW5rX2Jhbm5lcgA=", @@ -19786,12 +20090,12 @@ } }, { - "id": 1203, + "id": 1221, "key": "minecraft:gray_banner", "components": { "minecraft:attribute_modifiers": "DQA=", "minecraft:banner_patterns": "PwA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6Z3JheV9iYW5uZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5ncmF5X2Jhbm5lcgA=", @@ -19803,12 +20107,12 @@ } }, { - "id": 1204, + "id": 1222, "key": "minecraft:light_gray_banner", "components": { "minecraft:attribute_modifiers": "DQA=", "minecraft:banner_patterns": "PwA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6bGlnaHRfZ3JheV9iYW5uZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5saWdodF9ncmF5X2Jhbm5lcgA=", @@ -19820,12 +20124,12 @@ } }, { - "id": 1205, + "id": 1223, "key": "minecraft:cyan_banner", "components": { "minecraft:attribute_modifiers": "DQA=", "minecraft:banner_patterns": "PwA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6Y3lhbl9iYW5uZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5jeWFuX2Jhbm5lcgA=", @@ -19837,12 +20141,12 @@ } }, { - "id": 1206, + "id": 1224, "key": "minecraft:purple_banner", "components": { "minecraft:attribute_modifiers": "DQA=", "minecraft:banner_patterns": "PwA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6cHVycGxlX2Jhbm5lcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5wdXJwbGVfYmFubmVyAA==", @@ -19854,12 +20158,12 @@ } }, { - "id": 1207, + "id": 1225, "key": "minecraft:blue_banner", "components": { "minecraft:attribute_modifiers": "DQA=", "minecraft:banner_patterns": "PwA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6Ymx1ZV9iYW5uZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5ibHVlX2Jhbm5lcgA=", @@ -19871,12 +20175,12 @@ } }, { - "id": 1208, + "id": 1226, "key": "minecraft:brown_banner", "components": { "minecraft:attribute_modifiers": "DQA=", "minecraft:banner_patterns": "PwA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6YnJvd25fYmFubmVy", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5icm93bl9iYW5uZXIA", @@ -19888,12 +20192,12 @@ } }, { - "id": 1209, + "id": 1227, "key": "minecraft:green_banner", "components": { "minecraft:attribute_modifiers": "DQA=", "minecraft:banner_patterns": "PwA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6Z3JlZW5fYmFubmVy", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5ncmVlbl9iYW5uZXIA", @@ -19905,12 +20209,12 @@ } }, { - "id": 1210, + "id": 1228, "key": "minecraft:red_banner", "components": { "minecraft:attribute_modifiers": "DQA=", "minecraft:banner_patterns": "PwA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6cmVkX2Jhbm5lcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5yZWRfYmFubmVyAA==", @@ -19922,12 +20226,12 @@ } }, { - "id": 1211, + "id": 1229, "key": "minecraft:black_banner", "components": { "minecraft:attribute_modifiers": "DQA=", "minecraft:banner_patterns": "PwA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6YmxhY2tfYmFubmVy", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5ibGFja19iYW5uZXIA", @@ -19939,11 +20243,11 @@ } }, { - "id": 1212, + "id": 1230, "key": "minecraft:end_crystal", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantment_glint_override": "EgE=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6ZW5kX2NyeXN0YWw=", @@ -19956,12 +20260,12 @@ } }, { - "id": 1213, + "id": 1231, "key": "minecraft:chorus_fruit", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAQNBgAAA", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAQNBgAAA", "minecraft:enchantments": "CgA=", "minecraft:food": "FARAGZmaAQ==", "minecraft:item_model": "BxZtaW5lY3JhZnQ6Y2hvcnVzX2ZydWl0", @@ -19975,11 +20279,11 @@ } }, { - "id": 1214, + "id": 1232, "key": "minecraft:popped_chorus_fruit", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6cG9wcGVkX2Nob3J1c19mcnVpdA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIml0ZW0ubWluZWNyYWZ0LnBvcHBlZF9jaG9ydXNfZnJ1aXQA", @@ -19991,11 +20295,11 @@ } }, { - "id": 1215, + "id": 1233, "key": "minecraft:torchflower_seeds", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6dG9yY2hmbG93ZXJfc2VlZHM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGl0ZW0ubWluZWNyYWZ0LnRvcmNoZmxvd2VyX3NlZWRzAA==", @@ -20007,11 +20311,11 @@ } }, { - "id": 1216, + "id": 1234, "key": "minecraft:pitcher_pod", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6cGl0Y2hlcl9wb2Q=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGml0ZW0ubWluZWNyYWZ0LnBpdGNoZXJfcG9kAA==", @@ -20023,12 +20327,12 @@ } }, { - "id": 1217, + "id": 1235, "key": "minecraft:beetroot", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAE/mZmaAA==", "minecraft:item_model": "BxJtaW5lY3JhZnQ6YmVldHJvb3Q=", @@ -20041,11 +20345,11 @@ } }, { - "id": 1218, + "id": 1236, "key": "minecraft:beetroot_seeds", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6YmVldHJvb3Rfc2VlZHM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWl0ZW0ubWluZWNyYWZ0LmJlZXRyb290X3NlZWRzAA==", @@ -20057,12 +20361,12 @@ } }, { - "id": 1219, + "id": 1237, "key": "minecraft:beetroot_soup", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAZA5mZnAA==", "minecraft:item_model": "BxdtaW5lY3JhZnQ6YmVldHJvb3Rfc291cA==", @@ -20072,15 +20376,15 @@ "minecraft:rarity": "CQA=", "minecraft:repair_cost": "EAA=", "minecraft:tooltip_display": "DwAA", - "minecraft:use_remainder": "FgHHBgAA" + "minecraft:use_remainder": "FgHYBgAA" } }, { - "id": 1220, + "id": 1238, "key": "minecraft:dragon_breath", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6ZHJhZ29uX2JyZWF0aA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0LmRyYWdvbl9icmVhdGgA", @@ -20092,11 +20396,11 @@ } }, { - "id": 1221, + "id": 1239, "key": "minecraft:splash_potion", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6c3BsYXNoX3BvdGlvbg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0LnNwbGFzaF9wb3Rpb24A", @@ -20109,11 +20413,11 @@ } }, { - "id": 1222, + "id": 1240, "key": "minecraft:spectral_arrow", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6c3BlY3RyYWxfYXJyb3c=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWl0ZW0ubWluZWNyYWZ0LnNwZWN0cmFsX2Fycm93AA==", @@ -20125,11 +20429,11 @@ } }, { - "id": 1223, + "id": 1241, "key": "minecraft:tipped_arrow", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6dGlwcGVkX2Fycm93", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2l0ZW0ubWluZWNyYWZ0LnRpcHBlZF9hcnJvdwA=", @@ -20143,11 +20447,11 @@ } }, { - "id": 1224, + "id": 1242, "key": "minecraft:lingering_potion", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6bGluZ2VyaW5nX3BvdGlvbg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0LmxpbmdlcmluZ19wb3Rpb24A", @@ -20161,16 +20465,16 @@ } }, { - "id": 1225, + "id": 1243, "key": "minecraft:shield", "components": { "minecraft:attribute_modifiers": "DQA=", "minecraft:banner_patterns": "PwA=", - "minecraft:blocks_attacks": "IT6AAAA/gAAAAUK0AAAAAAAAAD+AAABAQAAAP4AAAD+AAAABGW1pbmVjcmFmdDpieXBhc3Nlc19zaGllbGQB+gkB+wk=", - "minecraft:break_sound": "R/sJ", + "minecraft:blocks_attacks": "IT6AAAA/gAAAAUK0AAAAAAAAAD+AAABAQAAAP4AAAD+AAAABGW1pbmVjcmFmdDpieXBhc3Nlc19zaGllbGQBkgoBkwo=", + "minecraft:break_sound": "R5MK", "minecraft:damage": "AwA=", "minecraft:enchantments": "CgA=", - "minecraft:equippable": "HAVHAAAAAQABAA==", + "minecraft:equippable": "HAVHAAAAAQABAACRCg==", "minecraft:item_model": "BxBtaW5lY3JhZnQ6c2hpZWxk", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFWl0ZW0ubWluZWNyYWZ0LnNoaWVsZAA=", "minecraft:lore": "CAA=", @@ -20183,11 +20487,11 @@ } }, { - "id": 1226, + "id": 1244, "key": "minecraft:totem_of_undying", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:death_protection": "IAICAAMJAYQHAAEBABUBZAABAQALAKAGAAEBAD+AAAA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6dG90ZW1fb2ZfdW5keWluZw==", @@ -20200,11 +20504,11 @@ } }, { - "id": 1227, + "id": 1245, "key": "minecraft:shulker_shell", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6c2h1bGtlcl9zaGVsbA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0LnNodWxrZXJfc2hlbGwA", @@ -20216,11 +20520,11 @@ } }, { - "id": 1228, + "id": 1246, "key": "minecraft:iron_nugget", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6aXJvbl9udWdnZXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGml0ZW0ubWluZWNyYWZ0Lmlyb25fbnVnZ2V0AA==", @@ -20232,11 +20536,11 @@ } }, { - "id": 1229, + "id": 1247, "key": "minecraft:knowledge_book", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6a25vd2xlZGdlX2Jvb2s=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWl0ZW0ubWluZWNyYWZ0Lmtub3dsZWRnZV9ib29rAA==", @@ -20249,11 +20553,11 @@ } }, { - "id": 1230, + "id": 1248, "key": "minecraft:debug_stick", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:debug_stick_state": "MAoA", "minecraft:enchantment_glint_override": "EgE=", "minecraft:enchantments": "CgA=", @@ -20267,11 +20571,11 @@ } }, { - "id": 1231, + "id": 1249, "key": "minecraft:music_disc_13", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6bXVzaWNfZGlzY18xMw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0Lm11c2ljX2Rpc2NfMTMA", @@ -20284,11 +20588,11 @@ } }, { - "id": 1232, + "id": 1250, "key": "minecraft:music_disc_cat", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6bXVzaWNfZGlzY19jYXQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWl0ZW0ubWluZWNyYWZ0Lm11c2ljX2Rpc2NfY2F0AA==", @@ -20301,11 +20605,11 @@ } }, { - "id": 1233, + "id": 1251, "key": "minecraft:music_disc_blocks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6bXVzaWNfZGlzY19ibG9ja3M=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGl0ZW0ubWluZWNyYWZ0Lm11c2ljX2Rpc2NfYmxvY2tzAA==", @@ -20318,11 +20622,11 @@ } }, { - "id": 1234, + "id": 1252, "key": "minecraft:music_disc_chirp", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6bXVzaWNfZGlzY19jaGlycA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0Lm11c2ljX2Rpc2NfY2hpcnAA", @@ -20335,11 +20639,11 @@ } }, { - "id": 1235, + "id": 1253, "key": "minecraft:music_disc_creator", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6bXVzaWNfZGlzY19jcmVhdG9y", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWl0ZW0ubWluZWNyYWZ0Lm11c2ljX2Rpc2NfY3JlYXRvcgA=", @@ -20352,11 +20656,11 @@ } }, { - "id": 1236, + "id": 1254, "key": "minecraft:music_disc_creator_music_box", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByZtaW5lY3JhZnQ6bXVzaWNfZGlzY19jcmVhdG9yX211c2ljX2JveA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAK2l0ZW0ubWluZWNyYWZ0Lm11c2ljX2Rpc2NfY3JlYXRvcl9tdXNpY19ib3gA", @@ -20369,11 +20673,11 @@ } }, { - "id": 1237, + "id": 1255, "key": "minecraft:music_disc_far", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6bXVzaWNfZGlzY19mYXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWl0ZW0ubWluZWNyYWZ0Lm11c2ljX2Rpc2NfZmFyAA==", @@ -20386,11 +20690,11 @@ } }, { - "id": 1238, + "id": 1256, "key": "minecraft:music_disc_mall", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6bXVzaWNfZGlzY19tYWxs", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHml0ZW0ubWluZWNyYWZ0Lm11c2ljX2Rpc2NfbWFsbAA=", @@ -20403,11 +20707,11 @@ } }, { - "id": 1239, + "id": 1257, "key": "minecraft:music_disc_mellohi", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6bXVzaWNfZGlzY19tZWxsb2hp", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWl0ZW0ubWluZWNyYWZ0Lm11c2ljX2Rpc2NfbWVsbG9oaQA=", @@ -20420,11 +20724,11 @@ } }, { - "id": 1240, + "id": 1258, "key": "minecraft:music_disc_stal", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6bXVzaWNfZGlzY19zdGFs", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHml0ZW0ubWluZWNyYWZ0Lm11c2ljX2Rpc2Nfc3RhbAA=", @@ -20437,11 +20741,11 @@ } }, { - "id": 1241, + "id": 1259, "key": "minecraft:music_disc_strad", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6bXVzaWNfZGlzY19zdHJhZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0Lm11c2ljX2Rpc2Nfc3RyYWQA", @@ -20454,11 +20758,11 @@ } }, { - "id": 1242, + "id": 1260, "key": "minecraft:music_disc_ward", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6bXVzaWNfZGlzY193YXJk", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHml0ZW0ubWluZWNyYWZ0Lm11c2ljX2Rpc2Nfd2FyZAA=", @@ -20471,11 +20775,11 @@ } }, { - "id": 1243, + "id": 1261, "key": "minecraft:music_disc_11", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6bXVzaWNfZGlzY18xMQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGl0ZW0ubWluZWNyYWZ0Lm11c2ljX2Rpc2NfMTEA", @@ -20488,11 +20792,11 @@ } }, { - "id": 1244, + "id": 1262, "key": "minecraft:music_disc_wait", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6bXVzaWNfZGlzY193YWl0", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHml0ZW0ubWluZWNyYWZ0Lm11c2ljX2Rpc2Nfd2FpdAA=", @@ -20505,11 +20809,11 @@ } }, { - "id": 1245, + "id": 1263, "key": "minecraft:music_disc_otherside", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6bXVzaWNfZGlzY19vdGhlcnNpZGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2l0ZW0ubWluZWNyYWZ0Lm11c2ljX2Rpc2Nfb3RoZXJzaWRlAA==", @@ -20522,11 +20826,11 @@ } }, { - "id": 1246, + "id": 1264, "key": "minecraft:music_disc_relic", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6bXVzaWNfZGlzY19yZWxpYw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0Lm11c2ljX2Rpc2NfcmVsaWMA", @@ -20539,11 +20843,11 @@ } }, { - "id": 1247, + "id": 1265, "key": "minecraft:music_disc_5", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6bXVzaWNfZGlzY181", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2l0ZW0ubWluZWNyYWZ0Lm11c2ljX2Rpc2NfNQA=", @@ -20556,11 +20860,11 @@ } }, { - "id": 1248, + "id": 1266, "key": "minecraft:music_disc_pigstep", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6bXVzaWNfZGlzY19waWdzdGVw", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWl0ZW0ubWluZWNyYWZ0Lm11c2ljX2Rpc2NfcGlnc3RlcAA=", @@ -20573,11 +20877,11 @@ } }, { - "id": 1249, + "id": 1267, "key": "minecraft:music_disc_precipice", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6bXVzaWNfZGlzY19wcmVjaXBpY2U=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2l0ZW0ubWluZWNyYWZ0Lm11c2ljX2Rpc2NfcHJlY2lwaWNlAA==", @@ -20590,11 +20894,28 @@ } }, { - "id": 1250, + "id": 1268, + "key": "minecraft:music_disc_tears", + "components": { + "minecraft:attribute_modifiers": "DQA=", + "minecraft:break_sound": "R7EG", + "minecraft:enchantments": "CgA=", + "minecraft:item_model": "BxptaW5lY3JhZnQ6bXVzaWNfZGlzY190ZWFycw==", + "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0Lm11c2ljX2Rpc2NfdGVhcnMA", + "minecraft:jukebox_playable": "NwAPbWluZWNyYWZ0OnRlYXJz", + "minecraft:lore": "CAA=", + "minecraft:max_stack_size": "AQE=", + "minecraft:rarity": "CQE=", + "minecraft:repair_cost": "EAA=", + "minecraft:tooltip_display": "DwAA" + } + }, + { + "id": 1269, "key": "minecraft:disc_fragment_5", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6ZGlzY19mcmFnbWVudF81", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHml0ZW0ubWluZWNyYWZ0LmRpc2NfZnJhZ21lbnRfNQA=", @@ -20606,11 +20927,11 @@ } }, { - "id": 1251, + "id": 1270, "key": "minecraft:trident", "components": { - "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAIAAAAAAAAAABBBttaW5lY3JhZnQ6YmFzZV9hdHRhY2tfc3BlZWTABzMzQAAAAAAB", - "minecraft:break_sound": "R5sG", + "minecraft:attribute_modifiers": "DQICHG1pbmVjcmFmdDpiYXNlX2F0dGFja19kYW1hZ2VAIAAAAAAAAAABAAQbbWluZWNyYWZ0OmJhc2VfYXR0YWNrX3NwZWVkwAczM0AAAAAAAQA=", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantable": "GwE=", "minecraft:enchantments": "CgA=", @@ -20627,11 +20948,11 @@ } }, { - "id": 1252, + "id": 1271, "key": "minecraft:nautilus_shell", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6bmF1dGlsdXNfc2hlbGw=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWl0ZW0ubWluZWNyYWZ0Lm5hdXRpbHVzX3NoZWxsAA==", @@ -20643,11 +20964,11 @@ } }, { - "id": 1253, + "id": 1272, "key": "minecraft:heart_of_the_sea", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6aGVhcnRfb2ZfdGhlX3NlYQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2l0ZW0ubWluZWNyYWZ0LmhlYXJ0X29mX3RoZV9zZWEA", @@ -20659,11 +20980,11 @@ } }, { - "id": 1254, + "id": 1273, "key": "minecraft:crossbow", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:charged_projectiles": "KAA=", "minecraft:damage": "AwA=", "minecraft:enchantable": "GwE=", @@ -20679,12 +21000,12 @@ } }, { - "id": 1255, + "id": 1274, "key": "minecraft:suspicious_stew", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAZA5mZnAQ==", "minecraft:item_model": "BxltaW5lY3JhZnQ6c3VzcGljaW91c19zdGV3", @@ -20695,15 +21016,15 @@ "minecraft:repair_cost": "EAA=", "minecraft:suspicious_stew_effects": "LAA=", "minecraft:tooltip_display": "DwAA", - "minecraft:use_remainder": "FgHHBgAA" + "minecraft:use_remainder": "FgHYBgAA" } }, { - "id": 1256, + "id": 1275, "key": "minecraft:loom", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw5taW5lY3JhZnQ6bG9vbQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFGJsb2NrLm1pbmVjcmFmdC5sb29tAA==", @@ -20715,11 +21036,11 @@ } }, { - "id": 1257, + "id": 1276, "key": "minecraft:flower_banner_pattern", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6Zmxvd2VyX2Jhbm5lcl9wYXR0ZXJu", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGl0ZW0ubWluZWNyYWZ0LmZsb3dlcl9iYW5uZXJfcGF0dGVybgA=", @@ -20732,11 +21053,11 @@ } }, { - "id": 1258, + "id": 1277, "key": "minecraft:creeper_banner_pattern", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6Y3JlZXBlcl9iYW5uZXJfcGF0dGVybg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWl0ZW0ubWluZWNyYWZ0LmNyZWVwZXJfYmFubmVyX3BhdHRlcm4A", @@ -20749,11 +21070,11 @@ } }, { - "id": 1259, + "id": 1278, "key": "minecraft:skull_banner_pattern", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6c2t1bGxfYmFubmVyX3BhdHRlcm4=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2l0ZW0ubWluZWNyYWZ0LnNrdWxsX2Jhbm5lcl9wYXR0ZXJuAA==", @@ -20766,11 +21087,11 @@ } }, { - "id": 1260, + "id": 1279, "key": "minecraft:mojang_banner_pattern", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6bW9qYW5nX2Jhbm5lcl9wYXR0ZXJu", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGl0ZW0ubWluZWNyYWZ0Lm1vamFuZ19iYW5uZXJfcGF0dGVybgA=", @@ -20783,11 +21104,11 @@ } }, { - "id": 1261, + "id": 1280, "key": "minecraft:globe_banner_pattern", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6Z2xvYmVfYmFubmVyX3BhdHRlcm4=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2l0ZW0ubWluZWNyYWZ0Lmdsb2JlX2Jhbm5lcl9wYXR0ZXJuAA==", @@ -20800,11 +21121,11 @@ } }, { - "id": 1262, + "id": 1281, "key": "minecraft:piglin_banner_pattern", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6cGlnbGluX2Jhbm5lcl9wYXR0ZXJu", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGl0ZW0ubWluZWNyYWZ0LnBpZ2xpbl9iYW5uZXJfcGF0dGVybgA=", @@ -20817,11 +21138,11 @@ } }, { - "id": 1263, + "id": 1282, "key": "minecraft:flow_banner_pattern", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6Zmxvd19iYW5uZXJfcGF0dGVybg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIml0ZW0ubWluZWNyYWZ0LmZsb3dfYmFubmVyX3BhdHRlcm4A", @@ -20834,11 +21155,11 @@ } }, { - "id": 1264, + "id": 1283, "key": "minecraft:guster_banner_pattern", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6Z3VzdGVyX2Jhbm5lcl9wYXR0ZXJu", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGl0ZW0ubWluZWNyYWZ0Lmd1c3Rlcl9iYW5uZXJfcGF0dGVybgA=", @@ -20851,11 +21172,11 @@ } }, { - "id": 1265, + "id": 1284, "key": "minecraft:field_masoned_banner_pattern", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByZtaW5lY3JhZnQ6ZmllbGRfbWFzb25lZF9iYW5uZXJfcGF0dGVybg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAK2l0ZW0ubWluZWNyYWZ0LmZpZWxkX21hc29uZWRfYmFubmVyX3BhdHRlcm4A", @@ -20868,11 +21189,11 @@ } }, { - "id": 1266, + "id": 1285, "key": "minecraft:bordure_indented_banner_pattern", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByltaW5lY3JhZnQ6Ym9yZHVyZV9pbmRlbnRlZF9iYW5uZXJfcGF0dGVybg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUALml0ZW0ubWluZWNyYWZ0LmJvcmR1cmVfaW5kZW50ZWRfYmFubmVyX3BhdHRlcm4A", @@ -20885,11 +21206,11 @@ } }, { - "id": 1267, + "id": 1286, "key": "minecraft:goat_horn", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:instrument": "NAAabWluZWNyYWZ0OnBvbmRlcl9nb2F0X2hvcm4=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6Z29hdF9ob3Ju", @@ -20902,11 +21223,11 @@ } }, { - "id": 1268, + "id": 1287, "key": "minecraft:composter", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6Y29tcG9zdGVy", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5jb21wb3N0ZXIA", @@ -20918,11 +21239,11 @@ } }, { - "id": 1269, + "id": 1288, "key": "minecraft:barrel", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxBtaW5lY3JhZnQ6YmFycmVs", @@ -20935,11 +21256,11 @@ } }, { - "id": 1270, + "id": 1289, "key": "minecraft:smoker", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxBtaW5lY3JhZnQ6c21va2Vy", @@ -20952,11 +21273,11 @@ } }, { - "id": 1271, + "id": 1290, "key": "minecraft:blast_furnace", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6Ymxhc3RfZnVybmFjZQ==", @@ -20969,11 +21290,11 @@ } }, { - "id": 1272, + "id": 1291, "key": "minecraft:cartography_table", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6Y2FydG9ncmFwaHlfdGFibGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5jYXJ0b2dyYXBoeV90YWJsZQA=", @@ -20985,11 +21306,11 @@ } }, { - "id": 1273, + "id": 1292, "key": "minecraft:fletching_table", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6ZmxldGNoaW5nX3RhYmxl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5mbGV0Y2hpbmdfdGFibGUA", @@ -21001,11 +21322,11 @@ } }, { - "id": 1274, + "id": 1293, "key": "minecraft:grindstone", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6Z3JpbmRzdG9uZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5ncmluZHN0b25lAA==", @@ -21017,11 +21338,11 @@ } }, { - "id": 1275, + "id": 1294, "key": "minecraft:smithing_table", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6c21pdGhpbmdfdGFibGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5zbWl0aGluZ190YWJsZQA=", @@ -21033,11 +21354,11 @@ } }, { - "id": 1276, + "id": 1295, "key": "minecraft:stonecutter", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6c3RvbmVjdXR0ZXI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5zdG9uZWN1dHRlcgA=", @@ -21049,11 +21370,11 @@ } }, { - "id": 1277, + "id": 1296, "key": "minecraft:bell", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw5taW5lY3JhZnQ6YmVsbA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFGJsb2NrLm1pbmVjcmFmdC5iZWxsAA==", @@ -21065,11 +21386,11 @@ } }, { - "id": 1278, + "id": 1297, "key": "minecraft:lantern", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxFtaW5lY3JhZnQ6bGFudGVybg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2Jsb2NrLm1pbmVjcmFmdC5sYW50ZXJuAA==", @@ -21081,11 +21402,11 @@ } }, { - "id": 1279, + "id": 1298, "key": "minecraft:soul_lantern", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6c291bF9sYW50ZXJu", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5zb3VsX2xhbnRlcm4A", @@ -21097,12 +21418,12 @@ } }, { - "id": 1280, + "id": 1299, "key": "minecraft:sweet_berries", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAI+zMzNAA==", "minecraft:item_model": "BxdtaW5lY3JhZnQ6c3dlZXRfYmVycmllcw==", @@ -21115,12 +21436,12 @@ } }, { - "id": 1281, + "id": 1300, "key": "minecraft:glow_berries", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0B3gQBAA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0B5wQBAA==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAI+zMzNAA==", "minecraft:item_model": "BxZtaW5lY3JhZnQ6Z2xvd19iZXJyaWVz", @@ -21133,11 +21454,11 @@ } }, { - "id": 1282, + "id": 1301, "key": "minecraft:campfire", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6Y2FtcGZpcmU=", @@ -21150,11 +21471,11 @@ } }, { - "id": 1283, + "id": 1302, "key": "minecraft:soul_campfire", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:container": "QgA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6c291bF9jYW1wZmlyZQ==", @@ -21167,11 +21488,11 @@ } }, { - "id": 1284, + "id": 1303, "key": "minecraft:shroomlight", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6c2hyb29tbGlnaHQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5zaHJvb21saWdodAA=", @@ -21183,11 +21504,11 @@ } }, { - "id": 1285, + "id": 1304, "key": "minecraft:honeycomb", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6aG9uZXljb21i", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGl0ZW0ubWluZWNyYWZ0LmhvbmV5Y29tYgA=", @@ -21199,13 +21520,13 @@ } }, { - "id": 1286, + "id": 1305, "key": "minecraft:bee_nest", "components": { "minecraft:attribute_modifiers": "DQA=", "minecraft:bees": "RAA=", "minecraft:block_state": "QwELaG9uZXlfbGV2ZWwBMA==", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxJtaW5lY3JhZnQ6YmVlX25lc3Q=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGJsb2NrLm1pbmVjcmFmdC5iZWVfbmVzdAA=", @@ -21217,13 +21538,13 @@ } }, { - "id": 1287, + "id": 1306, "key": "minecraft:beehive", "components": { "minecraft:attribute_modifiers": "DQA=", "minecraft:bees": "RAA=", "minecraft:block_state": "QwELaG9uZXlfbGV2ZWwBMA==", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxFtaW5lY3JhZnQ6YmVlaGl2ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAF2Jsb2NrLm1pbmVjcmFmdC5iZWVoaXZlAA==", @@ -21235,12 +21556,12 @@ } }, { - "id": 1288, + "id": 1307, "key": "minecraft:honey_bottle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FUAAAAAC3gUAAQECEg==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FUAAAAAC8wUAAQECEg==", "minecraft:enchantments": "CgA=", "minecraft:food": "FAY/mZmaAQ==", "minecraft:item_model": "BxZtaW5lY3JhZnQ6aG9uZXlfYm90dGxl", @@ -21250,15 +21571,15 @@ "minecraft:rarity": "CQA=", "minecraft:repair_cost": "EAA=", "minecraft:tooltip_display": "DwAA", - "minecraft:use_remainder": "FgGiCAAA" + "minecraft:use_remainder": "FgGzCAAA" } }, { - "id": 1289, + "id": 1308, "key": "minecraft:honeycomb_block", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6aG9uZXljb21iX2Jsb2Nr", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5ob25leWNvbWJfYmxvY2sA", @@ -21270,11 +21591,11 @@ } }, { - "id": 1290, + "id": 1309, "key": "minecraft:lodestone", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6bG9kZXN0b25l", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5sb2Rlc3RvbmUA", @@ -21286,11 +21607,11 @@ } }, { - "id": 1291, + "id": 1310, "key": "minecraft:crying_obsidian", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6Y3J5aW5nX29ic2lkaWFu", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5jcnlpbmdfb2JzaWRpYW4A", @@ -21302,11 +21623,11 @@ } }, { - "id": 1292, + "id": 1311, "key": "minecraft:blackstone", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6YmxhY2tzdG9uZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5ibGFja3N0b25lAA==", @@ -21318,11 +21639,11 @@ } }, { - "id": 1293, + "id": 1312, "key": "minecraft:blackstone_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6YmxhY2tzdG9uZV9zbGFi", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5ibGFja3N0b25lX3NsYWIA", @@ -21334,11 +21655,11 @@ } }, { - "id": 1294, + "id": 1313, "key": "minecraft:blackstone_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6YmxhY2tzdG9uZV9zdGFpcnM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5ibGFja3N0b25lX3N0YWlycwA=", @@ -21350,11 +21671,11 @@ } }, { - "id": 1295, + "id": 1314, "key": "minecraft:gilded_blackstone", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6Z2lsZGVkX2JsYWNrc3RvbmU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5naWxkZWRfYmxhY2tzdG9uZQA=", @@ -21366,11 +21687,11 @@ } }, { - "id": 1296, + "id": 1315, "key": "minecraft:polished_blackstone", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6cG9saXNoZWRfYmxhY2tzdG9uZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF9ibGFja3N0b25lAA==", @@ -21382,11 +21703,11 @@ } }, { - "id": 1297, + "id": 1316, "key": "minecraft:polished_blackstone_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByJtaW5lY3JhZnQ6cG9saXNoZWRfYmxhY2tzdG9uZV9zbGFi", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKGJsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF9ibGFja3N0b25lX3NsYWIA", @@ -21398,11 +21719,11 @@ } }, { - "id": 1298, + "id": 1317, "key": "minecraft:polished_blackstone_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByRtaW5lY3JhZnQ6cG9saXNoZWRfYmxhY2tzdG9uZV9zdGFpcnM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKmJsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF9ibGFja3N0b25lX3N0YWlycwA=", @@ -21414,11 +21735,11 @@ } }, { - "id": 1299, + "id": 1318, "key": "minecraft:chiseled_polished_blackstone", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByZtaW5lY3JhZnQ6Y2hpc2VsZWRfcG9saXNoZWRfYmxhY2tzdG9uZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUALGJsb2NrLm1pbmVjcmFmdC5jaGlzZWxlZF9wb2xpc2hlZF9ibGFja3N0b25lAA==", @@ -21430,11 +21751,11 @@ } }, { - "id": 1300, + "id": 1319, "key": "minecraft:polished_blackstone_bricks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByRtaW5lY3JhZnQ6cG9saXNoZWRfYmxhY2tzdG9uZV9icmlja3M=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKmJsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF9ibGFja3N0b25lX2JyaWNrcwA=", @@ -21446,11 +21767,11 @@ } }, { - "id": 1301, + "id": 1320, "key": "minecraft:polished_blackstone_brick_slab", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByhtaW5lY3JhZnQ6cG9saXNoZWRfYmxhY2tzdG9uZV9icmlja19zbGFi", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUALmJsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF9ibGFja3N0b25lX2JyaWNrX3NsYWIA", @@ -21462,11 +21783,11 @@ } }, { - "id": 1302, + "id": 1321, "key": "minecraft:polished_blackstone_brick_stairs", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByptaW5lY3JhZnQ6cG9saXNoZWRfYmxhY2tzdG9uZV9icmlja19zdGFpcnM=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAMGJsb2NrLm1pbmVjcmFmdC5wb2xpc2hlZF9ibGFja3N0b25lX2JyaWNrX3N0YWlycwA=", @@ -21478,11 +21799,11 @@ } }, { - "id": 1303, + "id": 1322, "key": "minecraft:cracked_polished_blackstone_bricks", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByxtaW5lY3JhZnQ6Y3JhY2tlZF9wb2xpc2hlZF9ibGFja3N0b25lX2JyaWNrcw==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAMmJsb2NrLm1pbmVjcmFmdC5jcmFja2VkX3BvbGlzaGVkX2JsYWNrc3RvbmVfYnJpY2tzAA==", @@ -21494,11 +21815,11 @@ } }, { - "id": 1304, + "id": 1323, "key": "minecraft:respawn_anchor", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6cmVzcGF3bl9hbmNob3I=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5yZXNwYXduX2FuY2hvcgA=", @@ -21510,11 +21831,11 @@ } }, { - "id": 1305, + "id": 1324, "key": "minecraft:candle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxBtaW5lY3JhZnQ6Y2FuZGxl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFmJsb2NrLm1pbmVjcmFmdC5jYW5kbGUA", @@ -21526,11 +21847,11 @@ } }, { - "id": 1306, + "id": 1325, "key": "minecraft:white_candle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6d2hpdGVfY2FuZGxl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC53aGl0ZV9jYW5kbGUA", @@ -21542,11 +21863,11 @@ } }, { - "id": 1307, + "id": 1326, "key": "minecraft:orange_candle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6b3JhbmdlX2NhbmRsZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5vcmFuZ2VfY2FuZGxlAA==", @@ -21558,11 +21879,11 @@ } }, { - "id": 1308, + "id": 1327, "key": "minecraft:magenta_candle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6bWFnZW50YV9jYW5kbGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHmJsb2NrLm1pbmVjcmFmdC5tYWdlbnRhX2NhbmRsZQA=", @@ -21574,11 +21895,11 @@ } }, { - "id": 1309, + "id": 1328, "key": "minecraft:light_blue_candle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6bGlnaHRfYmx1ZV9jYW5kbGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5saWdodF9ibHVlX2NhbmRsZQA=", @@ -21590,11 +21911,11 @@ } }, { - "id": 1310, + "id": 1329, "key": "minecraft:yellow_candle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6eWVsbG93X2NhbmRsZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC55ZWxsb3dfY2FuZGxlAA==", @@ -21606,11 +21927,11 @@ } }, { - "id": 1311, + "id": 1330, "key": "minecraft:lime_candle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6bGltZV9jYW5kbGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5saW1lX2NhbmRsZQA=", @@ -21622,11 +21943,11 @@ } }, { - "id": 1312, + "id": 1331, "key": "minecraft:pink_candle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6cGlua19jYW5kbGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5waW5rX2NhbmRsZQA=", @@ -21638,11 +21959,11 @@ } }, { - "id": 1313, + "id": 1332, "key": "minecraft:gray_candle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6Z3JheV9jYW5kbGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5ncmF5X2NhbmRsZQA=", @@ -21654,11 +21975,11 @@ } }, { - "id": 1314, + "id": 1333, "key": "minecraft:light_gray_candle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6bGlnaHRfZ3JheV9jYW5kbGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5saWdodF9ncmF5X2NhbmRsZQA=", @@ -21670,11 +21991,11 @@ } }, { - "id": 1315, + "id": 1334, "key": "minecraft:cyan_candle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6Y3lhbl9jYW5kbGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5jeWFuX2NhbmRsZQA=", @@ -21686,11 +22007,11 @@ } }, { - "id": 1316, + "id": 1335, "key": "minecraft:purple_candle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6cHVycGxlX2NhbmRsZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC5wdXJwbGVfY2FuZGxlAA==", @@ -21702,11 +22023,11 @@ } }, { - "id": 1317, + "id": 1336, "key": "minecraft:blue_candle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6Ymx1ZV9jYW5kbGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5ibHVlX2NhbmRsZQA=", @@ -21718,11 +22039,11 @@ } }, { - "id": 1318, + "id": 1337, "key": "minecraft:brown_candle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6YnJvd25fY2FuZGxl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5icm93bl9jYW5kbGUA", @@ -21734,11 +22055,11 @@ } }, { - "id": 1319, + "id": 1338, "key": "minecraft:green_candle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6Z3JlZW5fY2FuZGxl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5ncmVlbl9jYW5kbGUA", @@ -21750,11 +22071,11 @@ } }, { - "id": 1320, + "id": 1339, "key": "minecraft:red_candle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6cmVkX2NhbmRsZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGmJsb2NrLm1pbmVjcmFmdC5yZWRfY2FuZGxlAA==", @@ -21766,11 +22087,11 @@ } }, { - "id": 1321, + "id": 1340, "key": "minecraft:black_candle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6YmxhY2tfY2FuZGxl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5ibGFja19jYW5kbGUA", @@ -21782,11 +22103,11 @@ } }, { - "id": 1322, + "id": 1341, "key": "minecraft:small_amethyst_bud", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6c21hbGxfYW1ldGh5c3RfYnVk", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5zbWFsbF9hbWV0aHlzdF9idWQA", @@ -21798,11 +22119,11 @@ } }, { - "id": 1323, + "id": 1342, "key": "minecraft:medium_amethyst_bud", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6bWVkaXVtX2FtZXRoeXN0X2J1ZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5tZWRpdW1fYW1ldGh5c3RfYnVkAA==", @@ -21814,11 +22135,11 @@ } }, { - "id": 1324, + "id": 1343, "key": "minecraft:large_amethyst_bud", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6bGFyZ2VfYW1ldGh5c3RfYnVk", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC5sYXJnZV9hbWV0aHlzdF9idWQA", @@ -21830,11 +22151,11 @@ } }, { - "id": 1325, + "id": 1344, "key": "minecraft:amethyst_cluster", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxptaW5lY3JhZnQ6YW1ldGh5c3RfY2x1c3Rlcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGJsb2NrLm1pbmVjcmFmdC5hbWV0aHlzdF9jbHVzdGVyAA==", @@ -21846,11 +22167,11 @@ } }, { - "id": 1326, + "id": 1345, "key": "minecraft:pointed_dripstone", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6cG9pbnRlZF9kcmlwc3RvbmU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC5wb2ludGVkX2RyaXBzdG9uZQA=", @@ -21862,11 +22183,11 @@ } }, { - "id": 1327, + "id": 1346, "key": "minecraft:ochre_froglight", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxltaW5lY3JhZnQ6b2NocmVfZnJvZ2xpZ2h0", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAH2Jsb2NrLm1pbmVjcmFmdC5vY2hyZV9mcm9nbGlnaHQA", @@ -21878,11 +22199,11 @@ } }, { - "id": 1328, + "id": 1347, "key": "minecraft:verdant_froglight", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6dmVyZGFudF9mcm9nbGlnaHQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC52ZXJkYW50X2Zyb2dsaWdodAA=", @@ -21894,11 +22215,11 @@ } }, { - "id": 1329, + "id": 1348, "key": "minecraft:pearlescent_froglight", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6cGVhcmxlc2NlbnRfZnJvZ2xpZ2h0", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5wZWFybGVzY2VudF9mcm9nbGlnaHQA", @@ -21910,11 +22231,11 @@ } }, { - "id": 1330, + "id": 1349, "key": "minecraft:frogspawn", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6ZnJvZ3NwYXdu", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWJsb2NrLm1pbmVjcmFmdC5mcm9nc3Bhd24A", @@ -21926,11 +22247,11 @@ } }, { - "id": 1331, + "id": 1350, "key": "minecraft:echo_shard", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxRtaW5lY3JhZnQ6ZWNob19zaGFyZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGWl0ZW0ubWluZWNyYWZ0LmVjaG9fc2hhcmQA", @@ -21942,11 +22263,11 @@ } }, { - "id": 1332, + "id": 1351, "key": "minecraft:brush", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:damage": "AwA=", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw9taW5lY3JhZnQ6YnJ1c2g=", @@ -21960,11 +22281,11 @@ } }, { - "id": 1333, + "id": 1352, "key": "minecraft:netherite_upgrade_smithing_template", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "By1taW5lY3JhZnQ6bmV0aGVyaXRlX3VwZ3JhZGVfc21pdGhpbmdfdGVtcGxhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAMml0ZW0ubWluZWNyYWZ0Lm5ldGhlcml0ZV91cGdyYWRlX3NtaXRoaW5nX3RlbXBsYXRlAA==", @@ -21976,11 +22297,11 @@ } }, { - "id": 1334, + "id": 1353, "key": "minecraft:sentry_armor_trim_smithing_template", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "By1taW5lY3JhZnQ6c2VudHJ5X2FybW9yX3RyaW1fc21pdGhpbmdfdGVtcGxhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAMml0ZW0ubWluZWNyYWZ0LnNlbnRyeV9hcm1vcl90cmltX3NtaXRoaW5nX3RlbXBsYXRlAA==", @@ -21992,11 +22313,11 @@ } }, { - "id": 1335, + "id": 1354, "key": "minecraft:dune_armor_trim_smithing_template", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByttaW5lY3JhZnQ6ZHVuZV9hcm1vcl90cmltX3NtaXRoaW5nX3RlbXBsYXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAMGl0ZW0ubWluZWNyYWZ0LmR1bmVfYXJtb3JfdHJpbV9zbWl0aGluZ190ZW1wbGF0ZQA=", @@ -22008,11 +22329,11 @@ } }, { - "id": 1336, + "id": 1355, "key": "minecraft:coast_armor_trim_smithing_template", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByxtaW5lY3JhZnQ6Y29hc3RfYXJtb3JfdHJpbV9zbWl0aGluZ190ZW1wbGF0ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAMWl0ZW0ubWluZWNyYWZ0LmNvYXN0X2FybW9yX3RyaW1fc21pdGhpbmdfdGVtcGxhdGUA", @@ -22024,11 +22345,11 @@ } }, { - "id": 1337, + "id": 1356, "key": "minecraft:wild_armor_trim_smithing_template", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByttaW5lY3JhZnQ6d2lsZF9hcm1vcl90cmltX3NtaXRoaW5nX3RlbXBsYXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAMGl0ZW0ubWluZWNyYWZ0LndpbGRfYXJtb3JfdHJpbV9zbWl0aGluZ190ZW1wbGF0ZQA=", @@ -22040,11 +22361,11 @@ } }, { - "id": 1338, + "id": 1357, "key": "minecraft:ward_armor_trim_smithing_template", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByttaW5lY3JhZnQ6d2FyZF9hcm1vcl90cmltX3NtaXRoaW5nX3RlbXBsYXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAMGl0ZW0ubWluZWNyYWZ0LndhcmRfYXJtb3JfdHJpbV9zbWl0aGluZ190ZW1wbGF0ZQA=", @@ -22056,11 +22377,11 @@ } }, { - "id": 1339, + "id": 1358, "key": "minecraft:eye_armor_trim_smithing_template", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByptaW5lY3JhZnQ6ZXllX2FybW9yX3RyaW1fc21pdGhpbmdfdGVtcGxhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAL2l0ZW0ubWluZWNyYWZ0LmV5ZV9hcm1vcl90cmltX3NtaXRoaW5nX3RlbXBsYXRlAA==", @@ -22072,11 +22393,11 @@ } }, { - "id": 1340, + "id": 1359, "key": "minecraft:vex_armor_trim_smithing_template", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByptaW5lY3JhZnQ6dmV4X2FybW9yX3RyaW1fc21pdGhpbmdfdGVtcGxhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAL2l0ZW0ubWluZWNyYWZ0LnZleF9hcm1vcl90cmltX3NtaXRoaW5nX3RlbXBsYXRlAA==", @@ -22088,11 +22409,11 @@ } }, { - "id": 1341, + "id": 1360, "key": "minecraft:tide_armor_trim_smithing_template", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByttaW5lY3JhZnQ6dGlkZV9hcm1vcl90cmltX3NtaXRoaW5nX3RlbXBsYXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAMGl0ZW0ubWluZWNyYWZ0LnRpZGVfYXJtb3JfdHJpbV9zbWl0aGluZ190ZW1wbGF0ZQA=", @@ -22104,11 +22425,11 @@ } }, { - "id": 1342, + "id": 1361, "key": "minecraft:snout_armor_trim_smithing_template", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByxtaW5lY3JhZnQ6c25vdXRfYXJtb3JfdHJpbV9zbWl0aGluZ190ZW1wbGF0ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAMWl0ZW0ubWluZWNyYWZ0LnNub3V0X2FybW9yX3RyaW1fc21pdGhpbmdfdGVtcGxhdGUA", @@ -22120,11 +22441,11 @@ } }, { - "id": 1343, + "id": 1362, "key": "minecraft:rib_armor_trim_smithing_template", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByptaW5lY3JhZnQ6cmliX2FybW9yX3RyaW1fc21pdGhpbmdfdGVtcGxhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAL2l0ZW0ubWluZWNyYWZ0LnJpYl9hcm1vcl90cmltX3NtaXRoaW5nX3RlbXBsYXRlAA==", @@ -22136,11 +22457,11 @@ } }, { - "id": 1344, + "id": 1363, "key": "minecraft:spire_armor_trim_smithing_template", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByxtaW5lY3JhZnQ6c3BpcmVfYXJtb3JfdHJpbV9zbWl0aGluZ190ZW1wbGF0ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAMWl0ZW0ubWluZWNyYWZ0LnNwaXJlX2FybW9yX3RyaW1fc21pdGhpbmdfdGVtcGxhdGUA", @@ -22152,11 +22473,11 @@ } }, { - "id": 1345, + "id": 1364, "key": "minecraft:wayfinder_armor_trim_smithing_template", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BzBtaW5lY3JhZnQ6d2F5ZmluZGVyX2FybW9yX3RyaW1fc21pdGhpbmdfdGVtcGxhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUANWl0ZW0ubWluZWNyYWZ0LndheWZpbmRlcl9hcm1vcl90cmltX3NtaXRoaW5nX3RlbXBsYXRlAA==", @@ -22168,11 +22489,11 @@ } }, { - "id": 1346, + "id": 1365, "key": "minecraft:shaper_armor_trim_smithing_template", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "By1taW5lY3JhZnQ6c2hhcGVyX2FybW9yX3RyaW1fc21pdGhpbmdfdGVtcGxhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAMml0ZW0ubWluZWNyYWZ0LnNoYXBlcl9hcm1vcl90cmltX3NtaXRoaW5nX3RlbXBsYXRlAA==", @@ -22184,11 +22505,11 @@ } }, { - "id": 1347, + "id": 1366, "key": "minecraft:silence_armor_trim_smithing_template", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "By5taW5lY3JhZnQ6c2lsZW5jZV9hcm1vcl90cmltX3NtaXRoaW5nX3RlbXBsYXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAM2l0ZW0ubWluZWNyYWZ0LnNpbGVuY2VfYXJtb3JfdHJpbV9zbWl0aGluZ190ZW1wbGF0ZQA=", @@ -22200,11 +22521,11 @@ } }, { - "id": 1348, + "id": 1367, "key": "minecraft:raiser_armor_trim_smithing_template", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "By1taW5lY3JhZnQ6cmFpc2VyX2FybW9yX3RyaW1fc21pdGhpbmdfdGVtcGxhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAMml0ZW0ubWluZWNyYWZ0LnJhaXNlcl9hcm1vcl90cmltX3NtaXRoaW5nX3RlbXBsYXRlAA==", @@ -22216,11 +22537,11 @@ } }, { - "id": 1349, + "id": 1368, "key": "minecraft:host_armor_trim_smithing_template", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByttaW5lY3JhZnQ6aG9zdF9hcm1vcl90cmltX3NtaXRoaW5nX3RlbXBsYXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAMGl0ZW0ubWluZWNyYWZ0Lmhvc3RfYXJtb3JfdHJpbV9zbWl0aGluZ190ZW1wbGF0ZQA=", @@ -22232,11 +22553,11 @@ } }, { - "id": 1350, + "id": 1369, "key": "minecraft:flow_armor_trim_smithing_template", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByttaW5lY3JhZnQ6Zmxvd19hcm1vcl90cmltX3NtaXRoaW5nX3RlbXBsYXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAMGl0ZW0ubWluZWNyYWZ0LmZsb3dfYXJtb3JfdHJpbV9zbWl0aGluZ190ZW1wbGF0ZQA=", @@ -22248,11 +22569,11 @@ } }, { - "id": 1351, + "id": 1370, "key": "minecraft:bolt_armor_trim_smithing_template", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByttaW5lY3JhZnQ6Ym9sdF9hcm1vcl90cmltX3NtaXRoaW5nX3RlbXBsYXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAMGl0ZW0ubWluZWNyYWZ0LmJvbHRfYXJtb3JfdHJpbV9zbWl0aGluZ190ZW1wbGF0ZQA=", @@ -22264,11 +22585,11 @@ } }, { - "id": 1352, + "id": 1371, "key": "minecraft:angler_pottery_sherd", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6YW5nbGVyX3BvdHRlcnlfc2hlcmQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2l0ZW0ubWluZWNyYWZ0LmFuZ2xlcl9wb3R0ZXJ5X3NoZXJkAA==", @@ -22280,11 +22601,11 @@ } }, { - "id": 1353, + "id": 1372, "key": "minecraft:archer_pottery_sherd", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6YXJjaGVyX3BvdHRlcnlfc2hlcmQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2l0ZW0ubWluZWNyYWZ0LmFyY2hlcl9wb3R0ZXJ5X3NoZXJkAA==", @@ -22296,11 +22617,11 @@ } }, { - "id": 1354, + "id": 1373, "key": "minecraft:arms_up_pottery_sherd", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6YXJtc191cF9wb3R0ZXJ5X3NoZXJk", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGl0ZW0ubWluZWNyYWZ0LmFybXNfdXBfcG90dGVyeV9zaGVyZAA=", @@ -22312,11 +22633,11 @@ } }, { - "id": 1355, + "id": 1374, "key": "minecraft:blade_pottery_sherd", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6YmxhZGVfcG90dGVyeV9zaGVyZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIml0ZW0ubWluZWNyYWZ0LmJsYWRlX3BvdHRlcnlfc2hlcmQA", @@ -22328,11 +22649,11 @@ } }, { - "id": 1356, + "id": 1375, "key": "minecraft:brewer_pottery_sherd", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6YnJld2VyX3BvdHRlcnlfc2hlcmQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2l0ZW0ubWluZWNyYWZ0LmJyZXdlcl9wb3R0ZXJ5X3NoZXJkAA==", @@ -22344,11 +22665,11 @@ } }, { - "id": 1357, + "id": 1376, "key": "minecraft:burn_pottery_sherd", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6YnVybl9wb3R0ZXJ5X3NoZXJk", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWl0ZW0ubWluZWNyYWZ0LmJ1cm5fcG90dGVyeV9zaGVyZAA=", @@ -22360,11 +22681,11 @@ } }, { - "id": 1358, + "id": 1377, "key": "minecraft:danger_pottery_sherd", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6ZGFuZ2VyX3BvdHRlcnlfc2hlcmQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2l0ZW0ubWluZWNyYWZ0LmRhbmdlcl9wb3R0ZXJ5X3NoZXJkAA==", @@ -22376,11 +22697,11 @@ } }, { - "id": 1359, + "id": 1378, "key": "minecraft:explorer_pottery_sherd", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6ZXhwbG9yZXJfcG90dGVyeV9zaGVyZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWl0ZW0ubWluZWNyYWZ0LmV4cGxvcmVyX3BvdHRlcnlfc2hlcmQA", @@ -22392,11 +22713,11 @@ } }, { - "id": 1360, + "id": 1379, "key": "minecraft:flow_pottery_sherd", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6Zmxvd19wb3R0ZXJ5X3NoZXJk", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWl0ZW0ubWluZWNyYWZ0LmZsb3dfcG90dGVyeV9zaGVyZAA=", @@ -22408,11 +22729,11 @@ } }, { - "id": 1361, + "id": 1380, "key": "minecraft:friend_pottery_sherd", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6ZnJpZW5kX3BvdHRlcnlfc2hlcmQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2l0ZW0ubWluZWNyYWZ0LmZyaWVuZF9wb3R0ZXJ5X3NoZXJkAA==", @@ -22424,11 +22745,11 @@ } }, { - "id": 1362, + "id": 1381, "key": "minecraft:guster_pottery_sherd", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6Z3VzdGVyX3BvdHRlcnlfc2hlcmQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2l0ZW0ubWluZWNyYWZ0Lmd1c3Rlcl9wb3R0ZXJ5X3NoZXJkAA==", @@ -22440,11 +22761,11 @@ } }, { - "id": 1363, + "id": 1382, "key": "minecraft:heart_pottery_sherd", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6aGVhcnRfcG90dGVyeV9zaGVyZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIml0ZW0ubWluZWNyYWZ0LmhlYXJ0X3BvdHRlcnlfc2hlcmQA", @@ -22456,11 +22777,11 @@ } }, { - "id": 1364, + "id": 1383, "key": "minecraft:heartbreak_pottery_sherd", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByJtaW5lY3JhZnQ6aGVhcnRicmVha19wb3R0ZXJ5X3NoZXJk", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJ2l0ZW0ubWluZWNyYWZ0LmhlYXJ0YnJlYWtfcG90dGVyeV9zaGVyZAA=", @@ -22472,11 +22793,11 @@ } }, { - "id": 1365, + "id": 1384, "key": "minecraft:howl_pottery_sherd", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6aG93bF9wb3R0ZXJ5X3NoZXJk", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWl0ZW0ubWluZWNyYWZ0Lmhvd2xfcG90dGVyeV9zaGVyZAA=", @@ -22488,11 +22809,11 @@ } }, { - "id": 1366, + "id": 1385, "key": "minecraft:miner_pottery_sherd", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6bWluZXJfcG90dGVyeV9zaGVyZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIml0ZW0ubWluZWNyYWZ0Lm1pbmVyX3BvdHRlcnlfc2hlcmQA", @@ -22504,11 +22825,11 @@ } }, { - "id": 1367, + "id": 1386, "key": "minecraft:mourner_pottery_sherd", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6bW91cm5lcl9wb3R0ZXJ5X3NoZXJk", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGl0ZW0ubWluZWNyYWZ0Lm1vdXJuZXJfcG90dGVyeV9zaGVyZAA=", @@ -22520,11 +22841,11 @@ } }, { - "id": 1368, + "id": 1387, "key": "minecraft:plenty_pottery_sherd", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6cGxlbnR5X3BvdHRlcnlfc2hlcmQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2l0ZW0ubWluZWNyYWZ0LnBsZW50eV9wb3R0ZXJ5X3NoZXJkAA==", @@ -22536,11 +22857,11 @@ } }, { - "id": 1369, + "id": 1388, "key": "minecraft:prize_pottery_sherd", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6cHJpemVfcG90dGVyeV9zaGVyZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIml0ZW0ubWluZWNyYWZ0LnByaXplX3BvdHRlcnlfc2hlcmQA", @@ -22552,11 +22873,11 @@ } }, { - "id": 1370, + "id": 1389, "key": "minecraft:scrape_pottery_sherd", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6c2NyYXBlX3BvdHRlcnlfc2hlcmQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2l0ZW0ubWluZWNyYWZ0LnNjcmFwZV9wb3R0ZXJ5X3NoZXJkAA==", @@ -22568,11 +22889,11 @@ } }, { - "id": 1371, + "id": 1390, "key": "minecraft:sheaf_pottery_sherd", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6c2hlYWZfcG90dGVyeV9zaGVyZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIml0ZW0ubWluZWNyYWZ0LnNoZWFmX3BvdHRlcnlfc2hlcmQA", @@ -22584,11 +22905,11 @@ } }, { - "id": 1372, + "id": 1391, "key": "minecraft:shelter_pottery_sherd", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6c2hlbHRlcl9wb3R0ZXJ5X3NoZXJk", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGl0ZW0ubWluZWNyYWZ0LnNoZWx0ZXJfcG90dGVyeV9zaGVyZAA=", @@ -22600,11 +22921,11 @@ } }, { - "id": 1373, + "id": 1392, "key": "minecraft:skull_pottery_sherd", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6c2t1bGxfcG90dGVyeV9zaGVyZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIml0ZW0ubWluZWNyYWZ0LnNrdWxsX3BvdHRlcnlfc2hlcmQA", @@ -22616,11 +22937,11 @@ } }, { - "id": 1374, + "id": 1393, "key": "minecraft:snort_pottery_sherd", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6c25vcnRfcG90dGVyeV9zaGVyZA==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIml0ZW0ubWluZWNyYWZ0LnNub3J0X3BvdHRlcnlfc2hlcmQA", @@ -22632,11 +22953,11 @@ } }, { - "id": 1375, + "id": 1394, "key": "minecraft:copper_grate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxZtaW5lY3JhZnQ6Y29wcGVyX2dyYXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHGJsb2NrLm1pbmVjcmFmdC5jb3BwZXJfZ3JhdGUA", @@ -22648,11 +22969,11 @@ } }, { - "id": 1376, + "id": 1395, "key": "minecraft:exposed_copper_grate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6ZXhwb3NlZF9jb3BwZXJfZ3JhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5leHBvc2VkX2NvcHBlcl9ncmF0ZQA=", @@ -22664,11 +22985,11 @@ } }, { - "id": 1377, + "id": 1396, "key": "minecraft:weathered_copper_grate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByBtaW5lY3JhZnQ6d2VhdGhlcmVkX2NvcHBlcl9ncmF0ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJmJsb2NrLm1pbmVjcmFmdC53ZWF0aGVyZWRfY29wcGVyX2dyYXRlAA==", @@ -22680,11 +23001,11 @@ } }, { - "id": 1378, + "id": 1397, "key": "minecraft:oxidized_copper_grate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6b3hpZGl6ZWRfY29wcGVyX2dyYXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC5veGlkaXplZF9jb3BwZXJfZ3JhdGUA", @@ -22696,11 +23017,11 @@ } }, { - "id": 1379, + "id": 1398, "key": "minecraft:waxed_copper_grate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxxtaW5lY3JhZnQ6d2F4ZWRfY29wcGVyX2dyYXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAImJsb2NrLm1pbmVjcmFmdC53YXhlZF9jb3BwZXJfZ3JhdGUA", @@ -22712,11 +23033,11 @@ } }, { - "id": 1380, + "id": 1399, "key": "minecraft:waxed_exposed_copper_grate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByRtaW5lY3JhZnQ6d2F4ZWRfZXhwb3NlZF9jb3BwZXJfZ3JhdGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKmJsb2NrLm1pbmVjcmFmdC53YXhlZF9leHBvc2VkX2NvcHBlcl9ncmF0ZQA=", @@ -22728,11 +23049,11 @@ } }, { - "id": 1381, + "id": 1400, "key": "minecraft:waxed_weathered_copper_grate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByZtaW5lY3JhZnQ6d2F4ZWRfd2VhdGhlcmVkX2NvcHBlcl9ncmF0ZQ==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUALGJsb2NrLm1pbmVjcmFmdC53YXhlZF93ZWF0aGVyZWRfY29wcGVyX2dyYXRlAA==", @@ -22744,11 +23065,11 @@ } }, { - "id": 1382, + "id": 1401, "key": "minecraft:waxed_oxidized_copper_grate", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByVtaW5lY3JhZnQ6d2F4ZWRfb3hpZGl6ZWRfY29wcGVyX2dyYXRl", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAK2Jsb2NrLm1pbmVjcmFmdC53YXhlZF9veGlkaXplZF9jb3BwZXJfZ3JhdGUA", @@ -22760,11 +23081,11 @@ } }, { - "id": 1383, + "id": 1402, "key": "minecraft:copper_bulb", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxVtaW5lY3JhZnQ6Y29wcGVyX2J1bGI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAG2Jsb2NrLm1pbmVjcmFmdC5jb3BwZXJfYnVsYgA=", @@ -22776,11 +23097,11 @@ } }, { - "id": 1384, + "id": 1403, "key": "minecraft:exposed_copper_bulb", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx1taW5lY3JhZnQ6ZXhwb3NlZF9jb3BwZXJfYnVsYg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAI2Jsb2NrLm1pbmVjcmFmdC5leHBvc2VkX2NvcHBlcl9idWxiAA==", @@ -22792,11 +23113,11 @@ } }, { - "id": 1385, + "id": 1404, "key": "minecraft:weathered_copper_bulb", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx9taW5lY3JhZnQ6d2VhdGhlcmVkX2NvcHBlcl9idWxi", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJWJsb2NrLm1pbmVjcmFmdC53ZWF0aGVyZWRfY29wcGVyX2J1bGIA", @@ -22808,11 +23129,11 @@ } }, { - "id": 1386, + "id": 1405, "key": "minecraft:oxidized_copper_bulb", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bx5taW5lY3JhZnQ6b3hpZGl6ZWRfY29wcGVyX2J1bGI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAJGJsb2NrLm1pbmVjcmFmdC5veGlkaXplZF9jb3BwZXJfYnVsYgA=", @@ -22824,11 +23145,11 @@ } }, { - "id": 1387, + "id": 1406, "key": "minecraft:waxed_copper_bulb", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6d2F4ZWRfY29wcGVyX2J1bGI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIWJsb2NrLm1pbmVjcmFmdC53YXhlZF9jb3BwZXJfYnVsYgA=", @@ -22840,11 +23161,11 @@ } }, { - "id": 1388, + "id": 1407, "key": "minecraft:waxed_exposed_copper_bulb", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByNtaW5lY3JhZnQ6d2F4ZWRfZXhwb3NlZF9jb3BwZXJfYnVsYg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKWJsb2NrLm1pbmVjcmFmdC53YXhlZF9leHBvc2VkX2NvcHBlcl9idWxiAA==", @@ -22856,11 +23177,11 @@ } }, { - "id": 1389, + "id": 1408, "key": "minecraft:waxed_weathered_copper_bulb", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByVtaW5lY3JhZnQ6d2F4ZWRfd2VhdGhlcmVkX2NvcHBlcl9idWxi", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAK2Jsb2NrLm1pbmVjcmFmdC53YXhlZF93ZWF0aGVyZWRfY29wcGVyX2J1bGIA", @@ -22872,11 +23193,11 @@ } }, { - "id": 1390, + "id": 1409, "key": "minecraft:waxed_oxidized_copper_bulb", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "ByRtaW5lY3JhZnQ6d2F4ZWRfb3hpZGl6ZWRfY29wcGVyX2J1bGI=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAKmJsb2NrLm1pbmVjcmFmdC53YXhlZF9veGlkaXplZF9jb3BwZXJfYnVsYgA=", @@ -22888,11 +23209,11 @@ } }, { - "id": 1391, + "id": 1410, "key": "minecraft:trial_spawner", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxdtaW5lY3JhZnQ6dHJpYWxfc3Bhd25lcg==", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWJsb2NrLm1pbmVjcmFmdC50cmlhbF9zcGF3bmVyAA==", @@ -22904,11 +23225,11 @@ } }, { - "id": 1392, + "id": 1411, "key": "minecraft:trial_key", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxNtaW5lY3JhZnQ6dHJpYWxfa2V5", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAGGl0ZW0ubWluZWNyYWZ0LnRyaWFsX2tleQA=", @@ -22920,11 +23241,11 @@ } }, { - "id": 1393, + "id": 1412, "key": "minecraft:ominous_trial_key", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxttaW5lY3JhZnQ6b21pbm91c190cmlhbF9rZXk=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAIGl0ZW0ubWluZWNyYWZ0Lm9taW5vdXNfdHJpYWxfa2V5AA==", @@ -22936,11 +23257,11 @@ } }, { - "id": 1394, + "id": 1413, "key": "minecraft:vault", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", + "minecraft:break_sound": "R7EG", "minecraft:enchantments": "CgA=", "minecraft:item_model": "Bw9taW5lY3JhZnQ6dmF1bHQ=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAFWJsb2NrLm1pbmVjcmFmdC52YXVsdAA=", @@ -22952,12 +23273,12 @@ } }, { - "id": 1395, + "id": 1414, "key": "minecraft:ominous_bottle", "components": { "minecraft:attribute_modifiers": "DQA=", - "minecraft:break_sound": "R5sG", - "minecraft:consumable": "FT/MzM0C3QQAAQSaCA==", + "minecraft:break_sound": "R7EG", + "minecraft:consumable": "FT/MzM0C5gQAAQSzCA==", "minecraft:enchantments": "CgA=", "minecraft:item_model": "BxhtaW5lY3JhZnQ6b21pbm91c19ib3R0bGU=", "minecraft:item_name": "BgoIAAl0cmFuc2xhdGUAHWl0ZW0ubWluZWNyYWZ0Lm9taW5vdXNfYm90dGxlAA==", diff --git a/core/src/main/resources/mappings b/core/src/main/resources/mappings index f4be12330..1150907f6 160000 --- a/core/src/main/resources/mappings +++ b/core/src/main/resources/mappings @@ -1 +1 @@ -Subproject commit f4be1233040b977ddc1b40382c2cc778655a5f35 +Subproject commit 1150907f63c824030a432f05e0c5d6cb9a410fc1 From 6a6706ca1ecec41ae548f5d3e20a3889c45aefa6 Mon Sep 17 00:00:00 2001 From: Eclipse Date: Mon, 2 Jun 2025 07:27:36 +0000 Subject: [PATCH 03/62] Start working on dialog translation --- .../geyser/session/cache/RegistryCache.java | 8 +- .../cache/registry/JavaRegistries.java | 2 + .../cache/registry/JavaRegistryKey.java | 6 + .../geyser/session/dialog/Dialog.java | 135 ++++++++++++++++++ .../geyser/session/dialog/NoticeDialog.java | 40 ++++++ .../JavaShowDialogGameTranslator.java | 10 +- .../translator/text/MessageTranslator.java | 9 ++ 7 files changed, 208 insertions(+), 2 deletions(-) create mode 100644 core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java create mode 100644 core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/RegistryCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/RegistryCache.java index d96890749..c3dbb55fc 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/RegistryCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/RegistryCache.java @@ -53,6 +53,7 @@ import org.geysermc.geyser.session.cache.registry.RegistryEntryContext; import org.geysermc.geyser.session.cache.registry.RegistryEntryData; import org.geysermc.geyser.session.cache.registry.RegistryUnit; import org.geysermc.geyser.session.cache.registry.SimpleJavaRegistry; +import org.geysermc.geyser.session.dialog.Dialog; import org.geysermc.geyser.text.ChatDecoration; import org.geysermc.geyser.translator.level.BiomeTranslator; import org.geysermc.geyser.util.MinecraftKey; @@ -87,6 +88,7 @@ public final class RegistryCache { register(JavaRegistries.TRIM_MATERIAL, TrimRecipe::readTrimMaterial); register(JavaRegistries.TRIM_PATTERN, TrimRecipe::readTrimPattern); register(JavaRegistries.DAMAGE_TYPE, RegistryReader.UNIT); + register(JavaRegistries.DIALOG, Dialog::readDialog); register(JavaRegistries.CAT_VARIANT, VariantHolder.reader(CatEntity.BuiltInVariant.class, CatEntity.BuiltInVariant.BLACK)); register(JavaRegistries.FROG_VARIANT, VariantHolder.reader(FrogEntity.BuiltInVariant.class, FrogEntity.BuiltInVariant.TEMPERATE)); @@ -135,7 +137,11 @@ public final class RegistryCache { // Java generic mess - we're sure we're putting the current readers for the correct registry types in the READERS map, so we use raw objects here to let it compile RegistryLoader reader = READERS.get(registryKey); if (reader != null) { - reader.load(session, registries.get(registryKey), packet.getEntries()); + try { + reader.load(session, registries.get(registryKey), packet.getEntries()); + } catch (Exception exception) { + GeyserImpl.getInstance().getLogger().error("Failed parsing registry entries for " + registryKey + "!", exception); + } } else { throw new IllegalStateException("Expected reader for registry " + registryKey); } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistries.java b/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistries.java index ea6e14913..4808e56e7 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistries.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistries.java @@ -44,6 +44,7 @@ import org.geysermc.geyser.level.block.type.Block; import org.geysermc.geyser.registry.BlockRegistries; import org.geysermc.geyser.registry.ListRegistry; import org.geysermc.geyser.registry.Registries; +import org.geysermc.geyser.session.dialog.Dialog; import org.geysermc.geyser.util.MinecraftKey; import org.geysermc.mcprotocollib.protocol.data.game.chat.ChatType; @@ -70,6 +71,7 @@ public class JavaRegistries { public static final JavaRegistryKey TRIM_MATERIAL = create("trim_material"); public static final JavaRegistryKey TRIM_PATTERN = create("trim_pattern"); public static final JavaRegistryKey DAMAGE_TYPE = create("damage_type"); + public static final JavaRegistryKey DIALOG = create("dialog"); public static final JavaRegistryKey CAT_VARIANT = create("cat_variant"); public static final JavaRegistryKey FROG_VARIANT = create("frog_variant"); diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistryKey.java b/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistryKey.java index d98a3be4d..658d44d7e 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistryKey.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistryKey.java @@ -27,6 +27,7 @@ package org.geysermc.geyser.session.cache.registry; import net.kyori.adventure.key.Key; import org.geysermc.geyser.session.GeyserSession; +import org.jetbrains.annotations.NotNull; /** * Defines a Java registry, which can be hardcoded or data-driven. This class doesn't store registry contents itself, that is handled by {@link org.geysermc.geyser.session.cache.RegistryCache} in the case of @@ -81,4 +82,9 @@ public record JavaRegistryKey(Key registryKey, NetworkSerializer networkSe Key keyFromNetworkId(GeyserSession session, JavaRegistryKey registry, int networkId); } + + @Override + public @NotNull String toString() { + return "Java registry: " + registryKey; + } } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java new file mode 100644 index 000000000..f4842c01e --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.session.dialog; + +import net.kyori.adventure.key.Key; +import org.cloudburstmc.nbt.NbtMap; +import org.geysermc.cumulus.form.CustomForm; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.cache.registry.RegistryEntryContext; +import org.geysermc.geyser.translator.text.MessageTranslator; +import org.geysermc.geyser.util.MinecraftKey; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +public abstract class Dialog { + + private static final Key PLAIN_MESSAGE_BODY = MinecraftKey.key("plain_message"); + + private final String title; + private final String externalTitle; + private final AfterAction afterAction; + private final List labels; + private final List inputs; // TODO + + protected Dialog(GeyserSession session, NbtMap map) { + title = MessageTranslator.convertFromNullableNbtTag(session, map.get("title")); + externalTitle = MessageTranslator.convertFromNullableNbtTag(session, map.get("title")); + afterAction = AfterAction.fromString(map.getString("after_action")); + + Object bodyTag = map.get("body"); + if (bodyTag == null) { + labels = List.of(); + } else if (bodyTag instanceof NbtMap bodyMap) { + String body = readBody(session, bodyMap); + if (body != null) { + labels = List.of(body); + } else { + labels = List.of(); + } + } else if (bodyTag instanceof List bodyList) { + List bodies = new ArrayList<>(); + for (Object tag : bodyList) { + if (tag instanceof NbtMap bodyMap) { + String body = readBody(session, bodyMap); + if (body != null) { + bodies.add(body); + } + } else { + throw new IllegalStateException("Found non-NBT map in list of bodies, was: " + tag); + } + } + labels = List.copyOf(bodies); + } else { + throw new IllegalStateException("Expected body tag to either be a NBT map or list thereof, was: " + bodyTag); + } + + inputs = List.of(); + } + + public CustomForm buildForm() { + return createForm().build(); + } + + protected CustomForm.Builder createForm() { + CustomForm.Builder builder = CustomForm.builder() + .title(title); + for (String label : labels) { + builder.label(label); + } + return builder; + } + + private static String readBody(GeyserSession session, NbtMap tag) { + Key type = MinecraftKey.key(tag.getString("type")); + if (type.equals(PLAIN_MESSAGE_BODY)) { + return MessageTranslator.convertFromNullableNbtTag(session, tag.get("contents")); + } + // Other type is item, can't display that in forms + return null; + } + + public static Dialog readDialog(RegistryEntryContext context) { + return readDialog(context.session(), context.data()); + } + + public static Dialog readDialog(GeyserSession session, NbtMap map) { + // TYPES: notice, server_links, dialog_list, multi_action, confirmation + Key type = MinecraftKey.key(map.getString("type")); + if (type.equals(NoticeDialog.TYPE)) { + return new NoticeDialog(session, map); + } + return new Dialog(session, map) {}; + // throw new UnsupportedOperationException("Unable to read unknown dialog type " + type + "!"); // TODO put this here once all types are implemented + } + + public enum AfterAction { + CLOSE, + NONE, + WAIT_FOR_RESPONSE; + + public static AfterAction fromString(String string) { + for (AfterAction action : values()) { + if (action.name().toLowerCase(Locale.ROOT).equals(string)) { + return action; + } + } + return null; + } + } +} diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java new file mode 100644 index 000000000..2d4f16e8d --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.session.dialog; + +import net.kyori.adventure.key.Key; +import org.cloudburstmc.nbt.NbtMap; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.util.MinecraftKey; + +public class NoticeDialog extends Dialog { + + public static final Key TYPE = MinecraftKey.key("notice"); + + public NoticeDialog(GeyserSession session, NbtMap map) { + super(session, map); + } +} diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaShowDialogGameTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaShowDialogGameTranslator.java index 30431d221..1090832bf 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaShowDialogGameTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaShowDialogGameTranslator.java @@ -26,6 +26,8 @@ package org.geysermc.geyser.translator.protocol.java.dialogues; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.cache.registry.JavaRegistries; +import org.geysermc.geyser.session.dialog.Dialog; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.ClientboundShowDialogGamePacket; @@ -35,6 +37,12 @@ public class JavaShowDialogGameTranslator extends PacketTranslator Date: Mon, 2 Jun 2025 14:50:29 +0000 Subject: [PATCH 04/62] Work on dialog actions, small JavaRegistryKey refactor --- .../geyser/session/cache/RegistryCache.java | 2 +- .../cache/registry/JavaRegistries.java | 85 ++++++++++++-- .../session/cache/registry/JavaRegistry.java | 22 ++-- .../cache/registry/JavaRegistryKey.java | 59 ++++++---- .../cache/registry/RegistryEntryData.java | 2 +- .../cache/registry/SimpleJavaRegistry.java | 19 ++- .../geyser/session/dialog/Dialog.java | 84 +++++++++---- .../geyser/session/dialog/NoticeDialog.java | 18 ++- .../session/dialog/action/DialogAction.java | 111 ++++++++++++++++++ .../JavaShowDialogGameTranslator.java | 9 +- 10 files changed, 329 insertions(+), 82 deletions(-) create mode 100644 core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/RegistryCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/RegistryCache.java index c3dbb55fc..6e5509600 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/RegistryCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/RegistryCache.java @@ -193,7 +193,7 @@ public final class RegistryCache { // Registry readers should never return null, rather return a default value throw new IllegalStateException("Registry reader returned null for an entry!"); } - builder.add(i, new RegistryEntryData<>(entry.getId(), cacheEntry)); + builder.add(i, new RegistryEntryData<>(i, entry.getId(), cacheEntry)); } registry.reset(builder); }); diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistries.java b/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistries.java index 4808e56e7..0436d24ce 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistries.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistries.java @@ -44,12 +44,14 @@ import org.geysermc.geyser.level.block.type.Block; import org.geysermc.geyser.registry.BlockRegistries; import org.geysermc.geyser.registry.ListRegistry; import org.geysermc.geyser.registry.Registries; +import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.dialog.Dialog; import org.geysermc.geyser.util.MinecraftKey; import org.geysermc.mcprotocollib.protocol.data.game.chat.ChatType; import java.util.ArrayList; import java.util.List; +import java.util.Optional; /** * Stores {@link JavaRegistryKey} for Java registries that are used for loading of data-driven objects, tags, or both. Read {@link JavaRegistryKey} for more information on how to use one. @@ -57,8 +59,10 @@ import java.util.List; public class JavaRegistries { private static final List> VALUES = new ArrayList<>(); - public static final JavaRegistryKey BLOCK = createHardcoded("block", BlockRegistries.JAVA_BLOCKS, Block::javaId, Block::javaIdentifier); - public static final JavaRegistryKey ITEM = createHardcoded("item", Registries.JAVA_ITEMS, Item::javaId, Item::javaKey); + public static final JavaRegistryKey BLOCK = createHardcoded("block", BlockRegistries.JAVA_BLOCKS, + Block::javaId, Block::javaIdentifier, key -> Optional.ofNullable(BlockRegistries.JAVA_IDENTIFIER_TO_ID.get(key.asString())).orElse(-1)); + public static final JavaRegistryKey ITEM = createHardcoded("item", Registries.JAVA_ITEMS, + Item::javaId, Item::javaKey, key -> Optional.ofNullable(Registries.JAVA_ITEM_IDENTIFIERS.get(key.asString())).map(Item::javaId).orElse(-1)); public static final JavaRegistryKey CHAT_TYPE = create("chat_type"); public static final JavaRegistryKey DIMENSION_TYPE = create("dimension_type"); @@ -82,23 +86,19 @@ public class JavaRegistries { public static final JavaRegistryKey COW_VARIANT = create("cow_variant"); public static final JavaRegistryKey CHICKEN_VARIANT = create("chicken_variant"); - private static JavaRegistryKey create(String key, JavaRegistryKey.NetworkSerializer networkSerializer, JavaRegistryKey.NetworkDeserializer networkDeserializer, - JavaRegistryKey.NetworkIdentifier networkIdentifier) { - JavaRegistryKey registry = new JavaRegistryKey<>(MinecraftKey.key(key), networkSerializer, networkDeserializer, networkIdentifier); + private static JavaRegistryKey create(String key, JavaRegistryKey.RegistryLookup registryLookup) { + JavaRegistryKey registry = new JavaRegistryKey<>(MinecraftKey.key(key), registryLookup); VALUES.add(registry); return registry; } - private static JavaRegistryKey createHardcoded(String key, ListRegistry registry, RegistryNetworkMapper networkSerializer, RegistryIdentifierMapper identifierMapper) { - return create(key, (session, $, object) -> networkSerializer.get(object), - (session, $, id) -> registry.get(id), - (session, $, id) -> identifierMapper.get(registry.get(id))); + private static JavaRegistryKey createHardcoded(String key, ListRegistry registry, RegistryNetworkMapper networkSerializer, + RegistryIdentifierMapper identifierMapper, RegistryIdMapper idMapper) { + return create(key, new HardcodedLookup<>(registry, networkSerializer, identifierMapper, idMapper)); } private static JavaRegistryKey create(String key) { - return create(key, (session, registry, object) -> session.getRegistryCache().registry(registry).byValue(object), - (session, registry, id) -> session.getRegistryCache().registry(registry).byId(id), - (session, registry, id) -> session.getRegistryCache().registry(registry).entryById(id).key()); + return create(key, new RegistryCacheLookup<>()); } @Nullable @@ -122,4 +122,65 @@ public class JavaRegistries { Key get(T object); } + + @FunctionalInterface + interface RegistryIdMapper { + + int get(Key key); + } + + private record HardcodedLookup(ListRegistry registry, RegistryNetworkMapper networkMapper, RegistryIdentifierMapper identifierMapper, + RegistryIdMapper idMapper) implements JavaRegistryKey.RegistryLookup { + + @Override + public int toNetworkId(GeyserSession session, JavaRegistryKey registryKey, T object) { + return networkMapper.get(object); + } + + @Override + public @Nullable T fromNetworkId(GeyserSession session, JavaRegistryKey registryKey, int id) { + return registry.get(id); + } + + @Override + public int keyToNetworkId(GeyserSession session, JavaRegistryKey registryKey, Key key) { + return idMapper.get(key); + } + + @Override + public @Nullable Key keyFromNetworkId(GeyserSession session, JavaRegistryKey registryKey, int id) { + return identifierMapper.get(registry.get(id)); + } + } + + private static class RegistryCacheLookup implements JavaRegistryKey.RegistryLookup { + + @Override + public int toNetworkId(GeyserSession session, JavaRegistryKey registry, T object) { + return session.getRegistryCache().registry(registry).byValue(object); + } + + @Override + public @Nullable T fromNetworkId(GeyserSession session, JavaRegistryKey registry, int networkId) { + return session.getRegistryCache().registry(registry).byId(networkId); + } + + @Override + public int keyToNetworkId(GeyserSession session, JavaRegistryKey registry, Key key) { + RegistryEntryData entry = session.getRegistryCache().registry(registry).entryByKey(key); + if (entry != null) { + return entry.id(); + } + return -1; + } + + @Override + public @Nullable Key keyFromNetworkId(GeyserSession session, JavaRegistryKey registry, int networkId) { + RegistryEntryData entry = session.getRegistryCache().registry(registry).entryById(networkId); + if (entry != null) { + return entry.key(); + } + return null; + } + } } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistry.java b/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistry.java index e51dbf043..69f11a9fa 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistry.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistry.java @@ -27,6 +27,7 @@ package org.geysermc.geyser.session.cache.registry; import net.kyori.adventure.key.Key; import org.checkerframework.checker.index.qual.NonNegative; +import org.checkerframework.checker.nullness.qual.Nullable; import java.util.List; @@ -38,17 +39,22 @@ public interface JavaRegistry { /** * Looks up a registry entry by its ID. The object can be null, or not present. */ - T byId(@NonNegative int id); - - /** - * Looks up a registry entry by its key. The object can be null, or not present. - */ - T byKey(Key key); + @Nullable T byId(@NonNegative int id); /** * Looks up a registry entry by its ID, and returns it wrapped in {@link RegistryEntryData} so that its registered key is also known. The object can be null, or not present. */ - RegistryEntryData entryById(@NonNegative int id); + @Nullable RegistryEntryData entryById(@NonNegative int id); + + /** + * Looks up a registry entry by its key. The object can be null, or not present. + */ + @Nullable T byKey(Key key); + + /** + * Looks up a registry entry by its key, and returns it wrapped in {@link RegistryEntryData}. The object can be null, or not present. + */ + @Nullable RegistryEntryData entryByKey(Key key); /** * Reverse looks-up an object to return its network ID, or -1. @@ -58,7 +64,7 @@ public interface JavaRegistry { /** * Reverse looks-up an object to return it wrapped in {@link RegistryEntryData}, or null. */ - RegistryEntryData entryByValue(T value); + @Nullable RegistryEntryData entryByValue(T value); /** * Resets the objects by these IDs. diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistryKey.java b/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistryKey.java index 658d44d7e..9f416d4fd 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistryKey.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistryKey.java @@ -26,8 +26,9 @@ package org.geysermc.geyser.session.cache.registry; import net.kyori.adventure.key.Key; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.session.GeyserSession; -import org.jetbrains.annotations.NotNull; /** * Defines a Java registry, which can be hardcoded or data-driven. This class doesn't store registry contents itself, that is handled by {@link org.geysermc.geyser.session.cache.RegistryCache} in the case of @@ -37,54 +38,66 @@ import org.jetbrains.annotations.NotNull; * class are kept in {@link JavaRegistries}, which also has useful methods for creating instances of this class.

* * @param registryKey the registry key, as it appears on Java. - * @param networkSerializer a method that converts an object in this registry to its network ID. - * @param networkDeserializer a method that converts a network ID to an object in this registry. - * @param networkIdentifier a method that converts a network ID to its respective key in this registry. + * @param registryLookup an implementation of {@link RegistryLookup} that converts an object in this registry to its respective network ID or key, and back. * @param the object type this registry holds. */ -public record JavaRegistryKey(Key registryKey, NetworkSerializer networkSerializer, NetworkDeserializer networkDeserializer, NetworkIdentifier networkIdentifier) { +public record JavaRegistryKey(Key registryKey, RegistryLookup registryLookup) { /** - * Converts an object in this registry to its network ID. + * Converts an object in this registry to its network ID, or -1 if it is not registered. */ public int toNetworkId(GeyserSession session, T object) { - return networkSerializer.toNetworkId(session, this, object); + return registryLookup.toNetworkId(session, this, object); } /** - * Converts a network ID to an object in this registry. + * Converts a network ID to an object in this registry, or null if it is not registered. */ - public T fromNetworkId(GeyserSession session, int networkId) { - return networkDeserializer.fromNetworkId(session, this, networkId); + public @Nullable T fromNetworkId(GeyserSession session, int networkId) { + return registryLookup.fromNetworkId(session, this, networkId); } /** - * Converts a network ID to the key it's registered under in this registry. + * Converts a key registered under this registry to its network ID, or -1 if it is not registered. */ - public Key keyFromNetworkId(GeyserSession session, int networkId) { - return networkIdentifier.keyFromNetworkId(session, this, networkId); + public int keyToNetworkId(GeyserSession session, Key key) { + return registryLookup.keyToNetworkId(session, this, key); } - @FunctionalInterface - public interface NetworkSerializer { + /** + * Converts a network ID to the key it is registered under in this registry, or null if it is not registered. + */ + public @Nullable Key keyFromNetworkId(GeyserSession session, int networkId) { + return registryLookup.keyFromNetworkId(session, this, networkId); + } + public interface RegistryLookup { + + /** + * Implementations should return the network ID of the registered object, or -1 if it is not registered. + */ int toNetworkId(GeyserSession session, JavaRegistryKey registry, T object); - } - - @FunctionalInterface - public interface NetworkDeserializer { + /** + * Implementations should return the object that is registered under the given network ID, or null if it is not registered. + */ + @Nullable T fromNetworkId(GeyserSession session, JavaRegistryKey registry, int networkId); - } - @FunctionalInterface - public interface NetworkIdentifier { + /** + * Implementations should return the network ID that corresponds to the given registered key, or -1 if it is not registered. + */ + int keyToNetworkId(GeyserSession session, JavaRegistryKey registry, Key key); + /** + * Implementations should return the key that corresponds to the registered network ID, or null if it is not registered. + */ + @Nullable Key keyFromNetworkId(GeyserSession session, JavaRegistryKey registry, int networkId); } @Override - public @NotNull String toString() { + public @NonNull String toString() { return "Java registry: " + registryKey; } } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/registry/RegistryEntryData.java b/core/src/main/java/org/geysermc/geyser/session/cache/registry/RegistryEntryData.java index ed0b2fdec..178398574 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/registry/RegistryEntryData.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/registry/RegistryEntryData.java @@ -27,5 +27,5 @@ package org.geysermc.geyser.session.cache.registry; import net.kyori.adventure.key.Key; -public record RegistryEntryData(Key key, T data) { +public record RegistryEntryData(int id, Key key, T data) { } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/registry/SimpleJavaRegistry.java b/core/src/main/java/org/geysermc/geyser/session/cache/registry/SimpleJavaRegistry.java index 3e3d8ba6c..769eb8103 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/registry/SimpleJavaRegistry.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/registry/SimpleJavaRegistry.java @@ -28,6 +28,7 @@ package org.geysermc.geyser.session.cache.registry; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.kyori.adventure.key.Key; import org.checkerframework.checker.index.qual.NonNegative; +import org.checkerframework.checker.nullness.qual.Nullable; import java.util.List; @@ -42,6 +43,14 @@ public class SimpleJavaRegistry implements JavaRegistry { return this.values.get(id).data(); } + @Override + public RegistryEntryData entryById(@NonNegative int id) { + if (id < 0 || id >= this.values.size()) { + return null; + } + return this.values.get(id); + } + @Override public T byKey(Key key) { for (RegistryEntryData entry : values) { @@ -53,11 +62,13 @@ public class SimpleJavaRegistry implements JavaRegistry { } @Override - public RegistryEntryData entryById(@NonNegative int id) { - if (id < 0 || id >= this.values.size()) { - return null; + public @Nullable RegistryEntryData entryByKey(Key key) { + for (RegistryEntryData entry : values) { + if (entry.key().equals(key)) { + return entry; + } } - return this.values.get(id); + return null; } @Override diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java index f4842c01e..4ef4617ed 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java @@ -26,16 +26,25 @@ package org.geysermc.geyser.session.dialog; import net.kyori.adventure.key.Key; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.nbt.NbtMap; import org.geysermc.cumulus.form.CustomForm; +import org.geysermc.cumulus.response.CustomFormResponse; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.cache.registry.JavaRegistries; import org.geysermc.geyser.session.cache.registry.RegistryEntryContext; +import org.geysermc.geyser.session.dialog.action.DialogAction; import org.geysermc.geyser.translator.text.MessageTranslator; import org.geysermc.geyser.util.MinecraftKey; +import org.geysermc.mcprotocollib.protocol.data.game.Holder; import java.util.ArrayList; import java.util.List; import java.util.Locale; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Consumer; +import java.util.function.ToIntFunction; public abstract class Dialog { @@ -56,20 +65,12 @@ public abstract class Dialog { if (bodyTag == null) { labels = List.of(); } else if (bodyTag instanceof NbtMap bodyMap) { - String body = readBody(session, bodyMap); - if (body != null) { - labels = List.of(body); - } else { - labels = List.of(); - } + labels = readBody(session, bodyMap).map(List::of).orElse(List.of()); } else if (bodyTag instanceof List bodyList) { List bodies = new ArrayList<>(); for (Object tag : bodyList) { if (tag instanceof NbtMap bodyMap) { - String body = readBody(session, bodyMap); - if (body != null) { - bodies.add(body); - } + readBody(session, bodyMap).ifPresent(bodies::add); } else { throw new IllegalStateException("Found non-NBT map in list of bodies, was: " + tag); } @@ -82,42 +83,74 @@ public abstract class Dialog { inputs = List.of(); } - public CustomForm buildForm() { - return createForm().build(); + private static Optional readBody(GeyserSession session, NbtMap tag) { + Key type = MinecraftKey.key(tag.getString("type")); + if (type.equals(PLAIN_MESSAGE_BODY)) { + return Optional.of(MessageTranslator.convertFromNullableNbtTag(session, tag.get("contents"))); + } + // Other type is item, can't display that in forms + return Optional.empty(); } - protected CustomForm.Builder createForm() { + protected @Nullable abstract DialogAction onCancel(); + + public CustomForm buildForm(GeyserSession session) { + return createForm(session).build(); + } + + protected CustomForm.Builder createForm(GeyserSession session) { CustomForm.Builder builder = CustomForm.builder() .title(title); for (String label : labels) { builder.label(label); } + + builder.closedOrInvalidResultHandler(actionResult(session, onCancel())); return builder; } - private static String readBody(GeyserSession session, NbtMap tag) { - Key type = MinecraftKey.key(tag.getString("type")); - if (type.equals(PLAIN_MESSAGE_BODY)) { - return MessageTranslator.convertFromNullableNbtTag(session, tag.get("contents")); - } - // Other type is item, can't display that in forms - return null; + protected Consumer validResultAction(GeyserSession session, @Nullable DialogAction action) { + Runnable runnable = actionResult(session, action); + return response -> runnable.run(); } public static Dialog readDialog(RegistryEntryContext context) { - return readDialog(context.session(), context.data()); + return readDialog(context.session(), context.data(), context::getNetworkId); } - public static Dialog readDialog(GeyserSession session, NbtMap map) { + public static Dialog readDialog(GeyserSession session, NbtMap map, IdGetter idGetter) { // TYPES: notice, server_links, dialog_list, multi_action, confirmation Key type = MinecraftKey.key(map.getString("type")); if (type.equals(NoticeDialog.TYPE)) { - return new NoticeDialog(session, map); + return new NoticeDialog(session, map, idGetter); } - return new Dialog(session, map) {}; + return new Dialog(session, map) { + @Override + protected @Nullable DialogAction onCancel() { + return null; + } + }; // throw new UnsupportedOperationException("Unable to read unknown dialog type " + type + "!"); // TODO put this here once all types are implemented } + public static void showDialog(GeyserSession session, Holder holder) { + Dialog dialog; + if (holder.isId()) { + dialog = JavaRegistries.DIALOG.fromNetworkId(session, holder.id()); + } else { + dialog = Dialog.readDialog(session, holder.custom(), key -> JavaRegistries.DIALOG.keyToNetworkId(session, key)); + } + session.sendForm(Objects.requireNonNull(dialog).buildForm(session)); + } + + protected Runnable actionResult(GeyserSession session, @Nullable DialogAction action) { + return () -> { + if (action != null) { + action.run(session, afterAction); + } + }; + } + public enum AfterAction { CLOSE, NONE, @@ -132,4 +165,7 @@ public abstract class Dialog { return null; } } + + @FunctionalInterface + public interface IdGetter extends ToIntFunction {} } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java index 2d4f16e8d..ed777f88a 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java @@ -26,15 +26,31 @@ package org.geysermc.geyser.session.dialog; import net.kyori.adventure.key.Key; +import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.nbt.NbtMap; +import org.geysermc.cumulus.form.CustomForm; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.dialog.action.DialogAction; import org.geysermc.geyser.util.MinecraftKey; public class NoticeDialog extends Dialog { public static final Key TYPE = MinecraftKey.key("notice"); - public NoticeDialog(GeyserSession session, NbtMap map) { + private final DialogAction action; + + public NoticeDialog(GeyserSession session, NbtMap map, Dialog.IdGetter idGetter) { super(session, map); + action = DialogAction.read(map.getCompound("action", null), idGetter); + } + + @Override + protected @Nullable DialogAction onCancel() { + return action; + } + + @Override + protected CustomForm.Builder createForm(GeyserSession session) { + return super.createForm(session).validResultHandler(validResultAction(session, action)); } } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java b/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java new file mode 100644 index 000000000..338538b95 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.session.dialog.action; + +import net.kyori.adventure.key.Key; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.cloudburstmc.nbt.NbtMap; +import org.geysermc.cumulus.form.SimpleForm; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.dialog.Dialog; +import org.geysermc.geyser.util.MinecraftKey; +import org.geysermc.mcprotocollib.protocol.data.game.Holder; +import org.geysermc.mcprotocollib.protocol.packet.common.serverbound.ServerboundCustomClickActionPacket; + +public interface DialogAction { + + static DialogAction read(NbtMap map, Dialog.IdGetter idGetter) { + if (map == null) { + return null; + } + + Key type = MinecraftKey.key(map.getString("type")); + if (type.equals(OpenUrl.TYPE)) { + return new OpenUrl(map.getString("url")); + } else if (type.equals(RunCommand.TYPE)) { + return new RunCommand(map.getString("command")); + } else if (type.equals(ShowDialog.TYPE)) { + return ShowDialog.readDialog(map.get("dialog"), idGetter); + } else if (type.equals(Custom.TYPE)) { + return new Custom(MinecraftKey.key(map.getString("id")), map.getCompound("payload")); + } + // TODO the dynamic types + return null; + } + + void run(GeyserSession session, Dialog.AfterAction after); + + record OpenUrl(String url) implements DialogAction { + + public static final Key TYPE = MinecraftKey.key("open_url"); + + @Override + public void run(GeyserSession session, Dialog.AfterAction after) { + session.sendForm(SimpleForm.builder().title("Open URL").content(url)); + } + } + + record RunCommand(String command) implements DialogAction { + + public static final Key TYPE = MinecraftKey.key("run_command"); + + @Override + public void run(GeyserSession session, Dialog.AfterAction after) { + session.sendCommand(command); + } + } + + record ShowDialog(Holder dialog) implements DialogAction { + + public static final Key TYPE = MinecraftKey.key("show_dialog"); + + private static ShowDialog readDialog(Object dialog, Dialog.IdGetter idGetter) { + if (dialog instanceof NbtMap map) { + return new ShowDialog(Holder.ofCustom(map)); + } else if (dialog instanceof String string) { + return new ShowDialog(Holder.ofId(idGetter.applyAsInt(MinecraftKey.key(string)))); + } + throw new IllegalArgumentException("Expected dialog in show_dialog action to be a NBT map or a resource location"); + } + + @Override + public void run(GeyserSession session, Dialog.AfterAction after) { + // TODO figure out parent dialog + Dialog.showDialog(session, dialog); + } + } + + // TODO tag can be any kind of NBT tag, not just a map + record Custom(Key id, @Nullable NbtMap tag) implements DialogAction { + + public static final Key TYPE = MinecraftKey.key("custom"); + + @Override + public void run(GeyserSession session, Dialog.AfterAction after) { + session.sendDownstreamPacket(new ServerboundCustomClickActionPacket(id, tag)); + } + } +} diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaShowDialogGameTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaShowDialogGameTranslator.java index 1090832bf..9aea5fb89 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaShowDialogGameTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaShowDialogGameTranslator.java @@ -26,7 +26,6 @@ package org.geysermc.geyser.translator.protocol.java.dialogues; import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.session.cache.registry.JavaRegistries; import org.geysermc.geyser.session.dialog.Dialog; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; @@ -37,12 +36,6 @@ public class JavaShowDialogGameTranslator extends PacketTranslator Date: Mon, 2 Jun 2025 15:57:28 +0000 Subject: [PATCH 05/62] Dialogs with buttons and stuff --- .../session/dialog/ConfirmationDialog.java | 49 +++++++++++++ .../geyser/session/dialog/Dialog.java | 55 +++++++++------ .../geyser/session/dialog/DialogButton.java | 43 ++++++++++++ .../session/dialog/DialogWithButtons.java | 70 +++++++++++++++++++ .../geyser/session/dialog/NoticeDialog.java | 15 ++-- .../session/dialog/action/DialogAction.java | 18 ++--- .../translator/text/MessageTranslator.java | 3 +- 7 files changed, 214 insertions(+), 39 deletions(-) create mode 100644 core/src/main/java/org/geysermc/geyser/session/dialog/ConfirmationDialog.java create mode 100644 core/src/main/java/org/geysermc/geyser/session/dialog/DialogButton.java create mode 100644 core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/ConfirmationDialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/ConfirmationDialog.java new file mode 100644 index 000000000..ec43b9f4a --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/ConfirmationDialog.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.session.dialog; + +import net.kyori.adventure.key.Key; +import org.cloudburstmc.nbt.NbtMap; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.dialog.action.DialogAction; +import org.geysermc.geyser.util.MinecraftKey; + +import java.util.List; +import java.util.Optional; + +public class ConfirmationDialog extends DialogWithButtons { + + public static final Key TYPE = MinecraftKey.key("confirmation"); + + public ConfirmationDialog(GeyserSession session, NbtMap map, IdGetter idGetter) { + super(session, map, parseOptionalList(DialogButton.read(session, map.get("yes"), idGetter), DialogButton.read(session, map.get("no"), idGetter))); + } + + @Override + protected Optional onCancel() { + return buttons.get(1).action(); // "no" button + } +} diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java index 4ef4617ed..9c39c6ae1 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java @@ -26,7 +26,6 @@ package org.geysermc.geyser.session.dialog; import net.kyori.adventure.key.Key; -import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.nbt.NbtMap; import org.geysermc.cumulus.form.CustomForm; import org.geysermc.cumulus.response.CustomFormResponse; @@ -52,7 +51,7 @@ public abstract class Dialog { private final String title; private final String externalTitle; - private final AfterAction afterAction; + protected final AfterAction afterAction; private final List labels; private final List inputs; // TODO @@ -92,11 +91,7 @@ public abstract class Dialog { return Optional.empty(); } - protected @Nullable abstract DialogAction onCancel(); - - public CustomForm buildForm(GeyserSession session) { - return createForm(session).build(); - } + protected abstract Optional onCancel(); protected CustomForm.Builder createForm(GeyserSession session) { CustomForm.Builder builder = CustomForm.builder() @@ -105,29 +100,53 @@ public abstract class Dialog { builder.label(label); } - builder.closedOrInvalidResultHandler(actionResult(session, onCancel())); + builder.closedOrInvalidResultHandler(actionResult(session, onCancel())); // TODO parse input + addCustomComponents(session, builder); return builder; } - protected Consumer validResultAction(GeyserSession session, @Nullable DialogAction action) { + protected abstract void addCustomComponents(GeyserSession session, CustomForm.Builder builder); + + public CustomForm buildForm(GeyserSession session) { + return createForm(session).build(); + } + + protected Object parseInput(CustomFormResponse response) { + return 0; // TODO + } + + protected Runnable actionResult(GeyserSession session, Optional action) { + return () -> action.ifPresent(present -> present.run(session, afterAction)); + } + + protected Consumer validResultAction(GeyserSession session, Optional action) { Runnable runnable = actionResult(session, action); return response -> runnable.run(); } public static Dialog readDialog(RegistryEntryContext context) { - return readDialog(context.session(), context.data(), context::getNetworkId); + return readDialogFromNbt(context.session(), context.data(), context::getNetworkId); } - public static Dialog readDialog(GeyserSession session, NbtMap map, IdGetter idGetter) { + public static Dialog readDialogFromNbt(GeyserSession session, NbtMap map, IdGetter idGetter) { // TYPES: notice, server_links, dialog_list, multi_action, confirmation Key type = MinecraftKey.key(map.getString("type")); if (type.equals(NoticeDialog.TYPE)) { return new NoticeDialog(session, map, idGetter); + } else if (type.equals(ConfirmationDialog.TYPE)) { + return new ConfirmationDialog(session, map, idGetter); } + return new Dialog(session, map) { + @Override - protected @Nullable DialogAction onCancel() { - return null; + protected void addCustomComponents(GeyserSession session, CustomForm.Builder builder) { + + } + + @Override + protected Optional onCancel() { + return Optional.empty(); } }; // throw new UnsupportedOperationException("Unable to read unknown dialog type " + type + "!"); // TODO put this here once all types are implemented @@ -138,19 +157,11 @@ public abstract class Dialog { if (holder.isId()) { dialog = JavaRegistries.DIALOG.fromNetworkId(session, holder.id()); } else { - dialog = Dialog.readDialog(session, holder.custom(), key -> JavaRegistries.DIALOG.keyToNetworkId(session, key)); + dialog = Dialog.readDialogFromNbt(session, holder.custom(), key -> JavaRegistries.DIALOG.keyToNetworkId(session, key)); } session.sendForm(Objects.requireNonNull(dialog).buildForm(session)); } - protected Runnable actionResult(GeyserSession session, @Nullable DialogAction action) { - return () -> { - if (action != null) { - action.run(session, afterAction); - } - }; - } - public enum AfterAction { CLOSE, NONE, diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogButton.java b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogButton.java new file mode 100644 index 000000000..c2bb4f6f2 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogButton.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.session.dialog; + +import org.cloudburstmc.nbt.NbtMap; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.dialog.action.DialogAction; +import org.geysermc.geyser.translator.text.MessageTranslator; + +import java.util.Optional; + +public record DialogButton(String label, Optional action) { + + public static Optional read(GeyserSession session, Object tag, Dialog.IdGetter idGetter) { + if (!(tag instanceof NbtMap map)) { + return Optional.empty(); + } + return Optional.of(new DialogButton(MessageTranslator.convertFromNullableNbtTag(session, map.get("label")), DialogAction.read(map.get("action"), idGetter))); + } +} diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java new file mode 100644 index 000000000..cd594aaea --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.session.dialog; + +import org.cloudburstmc.nbt.NbtMap; +import org.geysermc.cumulus.component.DropdownComponent; +import org.geysermc.cumulus.form.CustomForm; +import org.geysermc.geyser.session.GeyserSession; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public abstract class DialogWithButtons extends Dialog { + + protected final List buttons; + + protected DialogWithButtons(GeyserSession session, NbtMap map, List buttons) { + super(session, map); + this.buttons = buttons; + } + + @Override + protected void addCustomComponents(GeyserSession session, CustomForm.Builder builder) { + DropdownComponent.Builder dropdown = DropdownComponent.builder(); + dropdown.text("Please select an option:"); + for (DialogButton button : buttons) { + dropdown.option(button.label()); + } + builder.dropdown(dropdown); + + builder.validResultHandler(response -> { + parseInput(response); // TODO + int selection = response.asDropdown(); + buttons.get(selection).action().ifPresent(action -> action.run(session, afterAction)); // TODO check size? + }); + } + + @SafeVarargs + protected static List parseOptionalList(Optional... buttons) { + List checked = new ArrayList<>(); + for (Optional button : buttons) { + checked.add(button.orElseThrow()); + } + return checked; + } +} diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java index ed777f88a..eca950fe1 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java @@ -26,31 +26,32 @@ package org.geysermc.geyser.session.dialog; import net.kyori.adventure.key.Key; -import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.nbt.NbtMap; import org.geysermc.cumulus.form.CustomForm; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.dialog.action.DialogAction; import org.geysermc.geyser.util.MinecraftKey; +import java.util.Optional; + public class NoticeDialog extends Dialog { public static final Key TYPE = MinecraftKey.key("notice"); - private final DialogAction action; + private final Optional button; public NoticeDialog(GeyserSession session, NbtMap map, Dialog.IdGetter idGetter) { super(session, map); - action = DialogAction.read(map.getCompound("action", null), idGetter); + button = DialogButton.read(session, map.getCompound("action"), idGetter); } @Override - protected @Nullable DialogAction onCancel() { - return action; + protected Optional onCancel() { + return button.flatMap(DialogButton::action); } @Override - protected CustomForm.Builder createForm(GeyserSession session) { - return super.createForm(session).validResultHandler(validResultAction(session, action)); + protected void addCustomComponents(GeyserSession session, CustomForm.Builder builder) { + builder.validResultHandler(validResultAction(session, button.flatMap(DialogButton::action))); // TODO parse input } } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java b/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java index 338538b95..25ed148a6 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java @@ -35,25 +35,27 @@ import org.geysermc.geyser.util.MinecraftKey; import org.geysermc.mcprotocollib.protocol.data.game.Holder; import org.geysermc.mcprotocollib.protocol.packet.common.serverbound.ServerboundCustomClickActionPacket; +import java.util.Optional; + public interface DialogAction { - static DialogAction read(NbtMap map, Dialog.IdGetter idGetter) { - if (map == null) { - return null; + static Optional read(Object tag, Dialog.IdGetter idGetter) { + if (!(tag instanceof NbtMap map)) { + return Optional.empty(); } Key type = MinecraftKey.key(map.getString("type")); if (type.equals(OpenUrl.TYPE)) { - return new OpenUrl(map.getString("url")); + return Optional.of(new OpenUrl(map.getString("url"))); } else if (type.equals(RunCommand.TYPE)) { - return new RunCommand(map.getString("command")); + return Optional.of(new RunCommand(map.getString("command"))); } else if (type.equals(ShowDialog.TYPE)) { - return ShowDialog.readDialog(map.get("dialog"), idGetter); + return Optional.of(ShowDialog.readDialog(map.get("dialog"), idGetter)); } else if (type.equals(Custom.TYPE)) { - return new Custom(MinecraftKey.key(map.getString("id")), map.getCompound("payload")); + return Optional.of(new Custom(MinecraftKey.key(map.getString("id")), map.getCompound("payload"))); } // TODO the dynamic types - return null; + return Optional.empty(); } void run(GeyserSession session, Dialog.AfterAction after); diff --git a/core/src/main/java/org/geysermc/geyser/translator/text/MessageTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/text/MessageTranslator.java index 5d8611f69..fe3e1912a 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/text/MessageTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/text/MessageTranslator.java @@ -475,8 +475,7 @@ public class MessageTranslator { return convertMessageForTooltip(parsed, session.locale()); } - @Nullable - public static String convertFromNullableNbtTag(GeyserSession session, @Nullable Object nbtTag) { + public static @Nullable String convertFromNullableNbtTag(GeyserSession session, @Nullable Object nbtTag) { if (nbtTag == null) { return null; } From b3d945dbf8e3f4ceb344c29592112fce0afe60b4 Mon Sep 17 00:00:00 2001 From: Eclipse Date: Mon, 2 Jun 2025 17:34:23 +0000 Subject: [PATCH 06/62] Multi action dialog --- .../geyser/session/dialog/Dialog.java | 2 + .../geyser/session/dialog/DialogButton.java | 13 +++++ .../session/dialog/MultiActionDialog.java | 52 +++++++++++++++++++ .../session/dialog/ServerLinksDialog.java | 45 ++++++++++++++++ 4 files changed, 112 insertions(+) create mode 100644 core/src/main/java/org/geysermc/geyser/session/dialog/MultiActionDialog.java create mode 100644 core/src/main/java/org/geysermc/geyser/session/dialog/ServerLinksDialog.java diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java index 9c39c6ae1..4365d7980 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java @@ -135,6 +135,8 @@ public abstract class Dialog { return new NoticeDialog(session, map, idGetter); } else if (type.equals(ConfirmationDialog.TYPE)) { return new ConfirmationDialog(session, map, idGetter); + } else if (type.equals(MultiActionDialog.TYPE)) { + return new MultiActionDialog(session, map, idGetter); } return new Dialog(session, map) { diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogButton.java b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogButton.java index c2bb4f6f2..ccf5d570a 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogButton.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogButton.java @@ -30,10 +30,23 @@ import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.dialog.action.DialogAction; import org.geysermc.geyser.translator.text.MessageTranslator; +import java.util.ArrayList; +import java.util.List; import java.util.Optional; public record DialogButton(String label, Optional action) { + public static List readList(GeyserSession session, List tag, Dialog.IdGetter idGetter) { + if (tag == null) { + return List.of(); + } + List buttons = new ArrayList<>(); + for (NbtMap map : tag) { + buttons.add(read(session, map, idGetter).orElseThrow()); // Should never throw + } + return buttons; + } + public static Optional read(GeyserSession session, Object tag, Dialog.IdGetter idGetter) { if (!(tag instanceof NbtMap map)) { return Optional.empty(); diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/MultiActionDialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/MultiActionDialog.java new file mode 100644 index 000000000..5e7c36c83 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/MultiActionDialog.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.session.dialog; + +import net.kyori.adventure.key.Key; +import org.cloudburstmc.nbt.NbtMap; +import org.cloudburstmc.nbt.NbtType; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.dialog.action.DialogAction; +import org.geysermc.geyser.util.MinecraftKey; + +import java.util.Optional; + +public class MultiActionDialog extends DialogWithButtons { + + public static final Key TYPE = MinecraftKey.key("multi_action"); + + private final Optional exit; + + protected MultiActionDialog(GeyserSession session, NbtMap map, IdGetter idGetter) { + super(session, map, DialogButton.readList(session, map.getList("actions", NbtType.COMPOUND), idGetter)); + exit = DialogButton.read(session, map.get("exit_action"), idGetter); + } + + @Override + protected Optional onCancel() { + return exit.flatMap(DialogButton::action); + } +} diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/ServerLinksDialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/ServerLinksDialog.java new file mode 100644 index 000000000..fc532b048 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/ServerLinksDialog.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.session.dialog; + +import org.cloudburstmc.nbt.NbtMap; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.dialog.action.DialogAction; + +import java.util.List; +import java.util.Optional; + +public class ServerLinksDialog extends DialogWithButtons { + + protected ServerLinksDialog(GeyserSession session, NbtMap map, List buttons) { + super(session, map, buttons); + } + + @Override + protected Optional onCancel() { + return Optional.empty(); + } +} From 50f7fbbc2e1b85d0116302b0eb02ec54f2b1ecd6 Mon Sep 17 00:00:00 2001 From: Eclipse Date: Mon, 2 Jun 2025 17:44:11 +0000 Subject: [PATCH 07/62] Use simple form when there are no inputs --- .../geyser/session/dialog/Dialog.java | 38 +++++++++++++------ .../session/dialog/DialogWithButtons.java | 12 ++++++ .../geyser/session/dialog/NoticeDialog.java | 6 +++ 3 files changed, 44 insertions(+), 12 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java index 4365d7980..65b990f4b 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java @@ -28,7 +28,11 @@ package org.geysermc.geyser.session.dialog; import net.kyori.adventure.key.Key; import org.cloudburstmc.nbt.NbtMap; import org.geysermc.cumulus.form.CustomForm; +import org.geysermc.cumulus.form.Form; +import org.geysermc.cumulus.form.SimpleForm; +import org.geysermc.cumulus.form.util.FormBuilder; import org.geysermc.cumulus.response.CustomFormResponse; +import org.geysermc.cumulus.response.FormResponse; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.cache.registry.JavaRegistries; import org.geysermc.geyser.session.cache.registry.RegistryEntryContext; @@ -93,21 +97,30 @@ public abstract class Dialog { protected abstract Optional onCancel(); - protected CustomForm.Builder createForm(GeyserSession session) { - CustomForm.Builder builder = CustomForm.builder() - .title(title); - for (String label : labels) { - builder.label(label); - } + protected FormBuilder, ? extends Form, ? extends FormResponse> createForm(GeyserSession session) { + if (inputs.isEmpty()) { + SimpleForm.Builder builder = SimpleForm.builder() + .title(title); + builder.content(String.join("\n", labels)); - builder.closedOrInvalidResultHandler(actionResult(session, onCancel())); // TODO parse input - addCustomComponents(session, builder); - return builder; + builder.closedOrInvalidResultHandler(actionResult(session, onCancel())); + addCustomComponents(session, builder); + return builder; + } else { + CustomForm.Builder builder = CustomForm.builder() + .title(title); + + builder.closedOrInvalidResultHandler(actionResult(session, onCancel())); // TODO parse input + addCustomComponents(session, builder); + return builder; + } } protected abstract void addCustomComponents(GeyserSession session, CustomForm.Builder builder); - public CustomForm buildForm(GeyserSession session) { + protected abstract void addCustomComponents(GeyserSession session, SimpleForm.Builder builder); + + public Form buildForm(GeyserSession session) { return createForm(session).build(); } @@ -142,9 +155,10 @@ public abstract class Dialog { return new Dialog(session, map) { @Override - protected void addCustomComponents(GeyserSession session, CustomForm.Builder builder) { + protected void addCustomComponents(GeyserSession session, CustomForm.Builder builder) {} - } + @Override + protected void addCustomComponents(GeyserSession session, SimpleForm.Builder builder) {} @Override protected Optional onCancel() { diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java index cd594aaea..78dc2bff7 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java @@ -28,6 +28,7 @@ package org.geysermc.geyser.session.dialog; import org.cloudburstmc.nbt.NbtMap; import org.geysermc.cumulus.component.DropdownComponent; import org.geysermc.cumulus.form.CustomForm; +import org.geysermc.cumulus.form.SimpleForm; import org.geysermc.geyser.session.GeyserSession; import java.util.ArrayList; @@ -59,6 +60,17 @@ public abstract class DialogWithButtons extends Dialog { }); } + @Override + protected void addCustomComponents(GeyserSession session, SimpleForm.Builder builder) { + for (DialogButton button : buttons) { + builder.button(button.label()); + } + + builder.validResultHandler(response -> { + buttons.get(response.clickedButtonId()).action().ifPresent(action -> action.run(session, afterAction)); // TODO maybe button press method + }); + } + @SafeVarargs protected static List parseOptionalList(Optional... buttons) { List checked = new ArrayList<>(); diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java index eca950fe1..20c3d750a 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java @@ -28,6 +28,7 @@ package org.geysermc.geyser.session.dialog; import net.kyori.adventure.key.Key; import org.cloudburstmc.nbt.NbtMap; import org.geysermc.cumulus.form.CustomForm; +import org.geysermc.cumulus.form.SimpleForm; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.dialog.action.DialogAction; import org.geysermc.geyser.util.MinecraftKey; @@ -54,4 +55,9 @@ public class NoticeDialog extends Dialog { protected void addCustomComponents(GeyserSession session, CustomForm.Builder builder) { builder.validResultHandler(validResultAction(session, button.flatMap(DialogButton::action))); // TODO parse input } + + @Override + protected void addCustomComponents(GeyserSession session, SimpleForm.Builder builder) { + builder.validResultHandler(response -> button.flatMap(DialogButton::action).ifPresent(action -> action.run(session, afterAction))); + } } From 779d54812b427739e37a319fb1b77c5c00823f38 Mon Sep 17 00:00:00 2001 From: Eclipse Date: Mon, 2 Jun 2025 19:06:35 +0000 Subject: [PATCH 08/62] Work on dialog inputs and dynamic actions --- .../session/dialog/ConfirmationDialog.java | 6 +- .../geyser/session/dialog/Dialog.java | 41 ++++--- .../session/dialog/DialogWithButtons.java | 9 +- .../session/dialog/MultiActionDialog.java | 5 +- .../geyser/session/dialog/NoticeDialog.java | 10 +- .../session/dialog/ServerLinksDialog.java | 3 +- .../session/dialog/action/DialogAction.java | 101 ++++++++++++++++-- .../session/dialog/input/BooleanInput.java | 77 +++++++++++++ .../session/dialog/input/DialogInput.java | 66 ++++++++++++ .../session/dialog/input/ParsedInputs.java | 78 ++++++++++++++ 10 files changed, 348 insertions(+), 48 deletions(-) create mode 100644 core/src/main/java/org/geysermc/geyser/session/dialog/input/BooleanInput.java create mode 100644 core/src/main/java/org/geysermc/geyser/session/dialog/input/DialogInput.java create mode 100644 core/src/main/java/org/geysermc/geyser/session/dialog/input/ParsedInputs.java diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/ConfirmationDialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/ConfirmationDialog.java index ec43b9f4a..5c522206a 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/ConfirmationDialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/ConfirmationDialog.java @@ -28,10 +28,8 @@ package org.geysermc.geyser.session.dialog; import net.kyori.adventure.key.Key; import org.cloudburstmc.nbt.NbtMap; import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.session.dialog.action.DialogAction; import org.geysermc.geyser.util.MinecraftKey; -import java.util.List; import java.util.Optional; public class ConfirmationDialog extends DialogWithButtons { @@ -43,7 +41,7 @@ public class ConfirmationDialog extends DialogWithButtons { } @Override - protected Optional onCancel() { - return buttons.get(1).action(); // "no" button + protected Optional onCancel() { + return buttons.size() > 1 ? Optional.of(buttons.get(1)) : Optional.empty(); // "no" button, there should always be 2 buttons but check just to be sure } } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java index 65b990f4b..8c8098258 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java @@ -27,6 +27,7 @@ package org.geysermc.geyser.session.dialog; import net.kyori.adventure.key.Key; import org.cloudburstmc.nbt.NbtMap; +import org.cloudburstmc.nbt.NbtType; import org.geysermc.cumulus.form.CustomForm; import org.geysermc.cumulus.form.Form; import org.geysermc.cumulus.form.SimpleForm; @@ -36,7 +37,8 @@ import org.geysermc.cumulus.response.FormResponse; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.cache.registry.JavaRegistries; import org.geysermc.geyser.session.cache.registry.RegistryEntryContext; -import org.geysermc.geyser.session.dialog.action.DialogAction; +import org.geysermc.geyser.session.dialog.input.DialogInput; +import org.geysermc.geyser.session.dialog.input.ParsedInputs; import org.geysermc.geyser.translator.text.MessageTranslator; import org.geysermc.geyser.util.MinecraftKey; import org.geysermc.mcprotocollib.protocol.data.game.Holder; @@ -46,7 +48,6 @@ import java.util.List; import java.util.Locale; import java.util.Objects; import java.util.Optional; -import java.util.function.Consumer; import java.util.function.ToIntFunction; public abstract class Dialog { @@ -55,9 +56,9 @@ public abstract class Dialog { private final String title; private final String externalTitle; - protected final AfterAction afterAction; + private final AfterAction afterAction; private final List labels; - private final List inputs; // TODO + private final List> inputs = new ArrayList<>(); protected Dialog(GeyserSession session, NbtMap map) { title = MessageTranslator.convertFromNullableNbtTag(session, map.get("title")); @@ -70,20 +71,22 @@ public abstract class Dialog { } else if (bodyTag instanceof NbtMap bodyMap) { labels = readBody(session, bodyMap).map(List::of).orElse(List.of()); } else if (bodyTag instanceof List bodyList) { - List bodies = new ArrayList<>(); + labels = new ArrayList<>(); for (Object tag : bodyList) { if (tag instanceof NbtMap bodyMap) { - readBody(session, bodyMap).ifPresent(bodies::add); + readBody(session, bodyMap).ifPresent(labels::add); } else { throw new IllegalStateException("Found non-NBT map in list of bodies, was: " + tag); } } - labels = List.copyOf(bodies); } else { throw new IllegalStateException("Expected body tag to either be a NBT map or list thereof, was: " + bodyTag); } - inputs = List.of(); + List inputTag = map.getList("inputs", NbtType.COMPOUND); + for (NbtMap input : inputTag) { + inputs.add(DialogInput.read(session, input)); + } } private static Optional readBody(GeyserSession session, NbtMap tag) { @@ -95,7 +98,7 @@ public abstract class Dialog { return Optional.empty(); } - protected abstract Optional onCancel(); + protected abstract Optional onCancel(); protected FormBuilder, ? extends Form, ? extends FormResponse> createForm(GeyserSession session) { if (inputs.isEmpty()) { @@ -103,14 +106,15 @@ public abstract class Dialog { .title(title); builder.content(String.join("\n", labels)); - builder.closedOrInvalidResultHandler(actionResult(session, onCancel())); + builder.closedOrInvalidResultHandler(() -> runButton(session, onCancel(), ParsedInputs.EMPTY)); addCustomComponents(session, builder); return builder; } else { CustomForm.Builder builder = CustomForm.builder() .title(title); - builder.closedOrInvalidResultHandler(actionResult(session, onCancel())); // TODO parse input + inputs.forEach(input -> input.addComponent(builder, Optional.empty())); + builder.closedOrInvalidResultHandler(response -> runButton(session, onCancel(), new ParsedInputs(inputs))); addCustomComponents(session, builder); return builder; } @@ -124,17 +128,12 @@ public abstract class Dialog { return createForm(session).build(); } - protected Object parseInput(CustomFormResponse response) { - return 0; // TODO + protected ParsedInputs parseInput(CustomFormResponse response) { + return new ParsedInputs(inputs, response); } - protected Runnable actionResult(GeyserSession session, Optional action) { - return () -> action.ifPresent(present -> present.run(session, afterAction)); - } - - protected Consumer validResultAction(GeyserSession session, Optional action) { - Runnable runnable = actionResult(session, action); - return response -> runnable.run(); + protected void runButton(GeyserSession session, Optional button, ParsedInputs inputs) { + button.flatMap(DialogButton::action).ifPresent(action -> action.run(session, inputs)); } public static Dialog readDialog(RegistryEntryContext context) { @@ -161,7 +160,7 @@ public abstract class Dialog { protected void addCustomComponents(GeyserSession session, SimpleForm.Builder builder) {} @Override - protected Optional onCancel() { + protected Optional onCancel() { return Optional.empty(); } }; diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java index 78dc2bff7..fdf6b47f4 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java @@ -30,6 +30,7 @@ import org.geysermc.cumulus.component.DropdownComponent; import org.geysermc.cumulus.form.CustomForm; import org.geysermc.cumulus.form.SimpleForm; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.dialog.input.ParsedInputs; import java.util.ArrayList; import java.util.List; @@ -54,9 +55,9 @@ public abstract class DialogWithButtons extends Dialog { builder.dropdown(dropdown); builder.validResultHandler(response -> { - parseInput(response); // TODO + ParsedInputs inputs = parseInput(response); int selection = response.asDropdown(); - buttons.get(selection).action().ifPresent(action -> action.run(session, afterAction)); // TODO check size? + runButton(session, Optional.of(buttons.get(selection)), inputs); }); } @@ -66,9 +67,7 @@ public abstract class DialogWithButtons extends Dialog { builder.button(button.label()); } - builder.validResultHandler(response -> { - buttons.get(response.clickedButtonId()).action().ifPresent(action -> action.run(session, afterAction)); // TODO maybe button press method - }); + builder.validResultHandler(response -> runButton(session, Optional.of(buttons.get(response.clickedButtonId())), ParsedInputs.EMPTY)); } @SafeVarargs diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/MultiActionDialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/MultiActionDialog.java index 5e7c36c83..c8a4d53fa 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/MultiActionDialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/MultiActionDialog.java @@ -29,7 +29,6 @@ import net.kyori.adventure.key.Key; import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.nbt.NbtType; import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.session.dialog.action.DialogAction; import org.geysermc.geyser.util.MinecraftKey; import java.util.Optional; @@ -46,7 +45,7 @@ public class MultiActionDialog extends DialogWithButtons { } @Override - protected Optional onCancel() { - return exit.flatMap(DialogButton::action); + protected Optional onCancel() { + return exit; } } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java index 20c3d750a..d9e32ca62 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java @@ -30,7 +30,7 @@ import org.cloudburstmc.nbt.NbtMap; import org.geysermc.cumulus.form.CustomForm; import org.geysermc.cumulus.form.SimpleForm; import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.session.dialog.action.DialogAction; +import org.geysermc.geyser.session.dialog.input.ParsedInputs; import org.geysermc.geyser.util.MinecraftKey; import java.util.Optional; @@ -47,17 +47,17 @@ public class NoticeDialog extends Dialog { } @Override - protected Optional onCancel() { - return button.flatMap(DialogButton::action); + protected Optional onCancel() { + return button; } @Override protected void addCustomComponents(GeyserSession session, CustomForm.Builder builder) { - builder.validResultHandler(validResultAction(session, button.flatMap(DialogButton::action))); // TODO parse input + builder.validResultHandler(response -> runButton(session, button, parseInput(response))); } @Override protected void addCustomComponents(GeyserSession session, SimpleForm.Builder builder) { - builder.validResultHandler(response -> button.flatMap(DialogButton::action).ifPresent(action -> action.run(session, afterAction))); + builder.validResultHandler(response -> runButton(session, button, ParsedInputs.EMPTY)); } } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/ServerLinksDialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/ServerLinksDialog.java index fc532b048..1c1666892 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/ServerLinksDialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/ServerLinksDialog.java @@ -27,7 +27,6 @@ package org.geysermc.geyser.session.dialog; import org.cloudburstmc.nbt.NbtMap; import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.session.dialog.action.DialogAction; import java.util.List; import java.util.Optional; @@ -39,7 +38,7 @@ public class ServerLinksDialog extends DialogWithButtons { } @Override - protected Optional onCancel() { + protected Optional onCancel() { return Optional.empty(); } } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java b/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java index 25ed148a6..6c75f71da 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java @@ -31,10 +31,13 @@ import org.cloudburstmc.nbt.NbtMap; import org.geysermc.cumulus.form.SimpleForm; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.dialog.Dialog; +import org.geysermc.geyser.session.dialog.input.ParsedInputs; import org.geysermc.geyser.util.MinecraftKey; import org.geysermc.mcprotocollib.protocol.data.game.Holder; import org.geysermc.mcprotocollib.protocol.packet.common.serverbound.ServerboundCustomClickActionPacket; +import java.util.ArrayList; +import java.util.List; import java.util.Optional; public interface DialogAction { @@ -50,22 +53,29 @@ public interface DialogAction { } else if (type.equals(RunCommand.TYPE)) { return Optional.of(new RunCommand(map.getString("command"))); } else if (type.equals(ShowDialog.TYPE)) { - return Optional.of(ShowDialog.readDialog(map.get("dialog"), idGetter)); + return Optional.of(ShowDialog.read(map.get("dialog"), idGetter)); } else if (type.equals(Custom.TYPE)) { return Optional.of(new Custom(MinecraftKey.key(map.getString("id")), map.getCompound("payload"))); + } else if (type.equals(DynamicRunCommand.TYPE)) { + return Optional.of(DynamicRunCommand.read(map.getString("template"))); + } else if (type.equals(DynamicCustom.TYPE)) { + return Optional.of(new DynamicCustom(MinecraftKey.key(map.getString("id")), map.getCompound("additions"))); } - // TODO the dynamic types + + // Unknown or unsupported type + // Currently unsupported types are: suggest_command, change_page, copy_to_clipboard + // open_file is not supported by Java in dialogs return Optional.empty(); } - void run(GeyserSession session, Dialog.AfterAction after); + void run(GeyserSession session, ParsedInputs inputs); record OpenUrl(String url) implements DialogAction { public static final Key TYPE = MinecraftKey.key("open_url"); @Override - public void run(GeyserSession session, Dialog.AfterAction after) { + public void run(GeyserSession session, ParsedInputs inputs) { session.sendForm(SimpleForm.builder().title("Open URL").content(url)); } } @@ -75,7 +85,7 @@ public interface DialogAction { public static final Key TYPE = MinecraftKey.key("run_command"); @Override - public void run(GeyserSession session, Dialog.AfterAction after) { + public void run(GeyserSession session, ParsedInputs inputs) { session.sendCommand(command); } } @@ -84,7 +94,7 @@ public interface DialogAction { public static final Key TYPE = MinecraftKey.key("show_dialog"); - private static ShowDialog readDialog(Object dialog, Dialog.IdGetter idGetter) { + private static ShowDialog read(Object dialog, Dialog.IdGetter idGetter) { if (dialog instanceof NbtMap map) { return new ShowDialog(Holder.ofCustom(map)); } else if (dialog instanceof String string) { @@ -94,7 +104,7 @@ public interface DialogAction { } @Override - public void run(GeyserSession session, Dialog.AfterAction after) { + public void run(GeyserSession session, ParsedInputs inputs) { // TODO figure out parent dialog Dialog.showDialog(session, dialog); } @@ -106,8 +116,83 @@ public interface DialogAction { public static final Key TYPE = MinecraftKey.key("custom"); @Override - public void run(GeyserSession session, Dialog.AfterAction after) { + public void run(GeyserSession session, ParsedInputs inputs) { session.sendDownstreamPacket(new ServerboundCustomClickActionPacket(id, tag)); } } + + record DynamicRunCommand(List segments, List variables) implements DialogAction { + + public static final Key TYPE = MinecraftKey.key("dynamic/run_command"); + + private static DynamicRunCommand read(String command) { + // Inspired by StringTemplate in mojmap + // Reads commands with 'macros', variables that are replaced with inputs, in a format like this: + // /say hey everyone, $(your_name) is super cool! + + int length = command.length(); + int lastVariable = 0; + int nextVariable = command.indexOf('$'); + + List segments = new ArrayList<>(); + List variables = new ArrayList<>(); + while (nextVariable != -1) { + if (nextVariable != length - 1 && command.charAt(nextVariable + 1) == '(') { + segments.add(command.substring(lastVariable, nextVariable)); + int variableEnd = command.indexOf(')', nextVariable + 1); + if (variableEnd == -1) { + throw new IllegalArgumentException("Command ended with an open variable"); + } + + variables.add(command.substring(nextVariable + 2, variableEnd)); + lastVariable = variableEnd + 1; + nextVariable = command.indexOf('$', lastVariable); + } else { + // If this $ was just an $ without a (, so no variable, which can occur in e.g. text components, just go to the next one + nextVariable = command.indexOf('$', nextVariable + 1); + } + } + + if (lastVariable == 0) { + throw new IllegalArgumentException("No variables in command template"); + } else { + // Append the remaining segment if there is one + if (lastVariable != length) { + segments.add(command.substring(lastVariable)); + } + + return new DynamicRunCommand(segments, variables); + } + } + + @Override + public void run(GeyserSession session, ParsedInputs inputs) { + StringBuilder command = new StringBuilder(); + + List parsedVariables = variables.stream().map(inputs::getSubstitution).toList(); + + for (int i = 0; i < variables.size(); i++) { + command.append(segments.get(i)).append(parsedVariables.get(i)); + } + + // Append the remaining segment if there is one + if (segments.size() > variables.size()) { + command.append(segments.get(segments.size() - 1)); + } + + session.sendCommand(command.toString()); + } + } + + record DynamicCustom(Key id, NbtMap additions) implements DialogAction { + + public static final Key TYPE = MinecraftKey.key("dynamic/custom"); + + @Override + public void run(GeyserSession session, ParsedInputs inputs) { + NbtMap map = inputs.asNbtMap(); + map.putAll(additions); // Can be optional on Java. We just read an empty map when it doesn't exist. + session.sendDownstreamPacket(new ServerboundCustomClickActionPacket(id, map)); + } + } } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/input/BooleanInput.java b/core/src/main/java/org/geysermc/geyser/session/dialog/input/BooleanInput.java new file mode 100644 index 000000000..170999ed0 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/input/BooleanInput.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.session.dialog.input; + +import net.kyori.adventure.key.Key; +import org.cloudburstmc.nbt.NbtMap; +import org.cloudburstmc.nbt.NbtMapBuilder; +import org.geysermc.cumulus.form.CustomForm; +import org.geysermc.cumulus.response.CustomFormResponse; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.util.MinecraftKey; + +import java.util.Optional; + +public class BooleanInput extends DialogInput { + + public static final Key TYPE = MinecraftKey.key("boolean"); + + private final boolean initial; + private final String onTrue; + private final String onFalse; + + public BooleanInput(GeyserSession session, NbtMap map) { + super(session, map); + initial = map.getBoolean("initial", false); + onTrue = map.getString("on_true", "true"); + onFalse = map.getString("on_false", "false"); + } + + @Override + public void addComponent(CustomForm.Builder builder, Optional restored) { + builder.toggle(label, restored.orElse(initial)); + } + + @Override + public Boolean read(CustomFormResponse response) { + return response.asToggle(); + } + + @Override + public String asSubstitution(Boolean value) { + return value ? onTrue : onFalse; + } + + @Override + public void addToMap(NbtMapBuilder builder, Boolean value) { + builder.put(key, value); + } + + @Override + public Boolean defaultValue() { + return initial; + } +} diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/input/DialogInput.java b/core/src/main/java/org/geysermc/geyser/session/dialog/input/DialogInput.java new file mode 100644 index 000000000..19310ab61 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/input/DialogInput.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.session.dialog.input; + +import net.kyori.adventure.key.Key; +import org.cloudburstmc.nbt.NbtMap; +import org.cloudburstmc.nbt.NbtMapBuilder; +import org.geysermc.cumulus.form.CustomForm; +import org.geysermc.cumulus.response.CustomFormResponse; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.text.MessageTranslator; +import org.geysermc.geyser.util.MinecraftKey; + +import java.util.Optional; + +public abstract class DialogInput { + protected final String key; + protected final String label; + + protected DialogInput(GeyserSession session, NbtMap map) { + this.key = map.getString("key"); + this.label = MessageTranslator.convertFromNullableNbtTag(session, map.get("label")); + } + + public abstract void addComponent(CustomForm.Builder builder, Optional restored); + + public abstract T read(CustomFormResponse response); + + public abstract String asSubstitution(T value); + + public abstract void addToMap(NbtMapBuilder builder, T value); + + public abstract T defaultValue(); + + public static DialogInput read(GeyserSession session, NbtMap tag) { + Key type = MinecraftKey.key(tag.getString("type")); + if (type.equals(BooleanInput.TYPE)) { + return new BooleanInput(session, tag); + } + + throw new UnsupportedOperationException("Unknown dialog input type " + type); + } +} diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/input/ParsedInputs.java b/core/src/main/java/org/geysermc/geyser/session/dialog/input/ParsedInputs.java new file mode 100644 index 000000000..a632c9249 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/input/ParsedInputs.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.session.dialog.input; + +import org.cloudburstmc.nbt.NbtMap; +import org.cloudburstmc.nbt.NbtMapBuilder; +import org.geysermc.cumulus.form.CustomForm; +import org.geysermc.cumulus.response.CustomFormResponse; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class ParsedInputs { + public static final ParsedInputs EMPTY = new ParsedInputs(List.of(), null); + + private final Map, Object> values = new LinkedHashMap<>(); + + public ParsedInputs(List> inputs, CustomFormResponse response) { + for (DialogInput input : inputs) { + values.put(input, input.read(response)); + } + } + + public ParsedInputs(List> inputs) { + for (DialogInput input : inputs) { + values.put(input, input.defaultValue()); + } + } + + public void restore(CustomForm.Builder builder) { + for (Map.Entry, Object> entry : values.entrySet()) { + // Can't be a Geyser update without eclipse dealing with generics + ((DialogInput) entry.getKey()).addComponent(builder, Optional.of(entry.getValue())); + } + } + + public String getSubstitution(String key) { + for (Map.Entry, Object> entry : values.entrySet()) { + if (entry.getKey().key.equals(key)) { + return ((DialogInput) entry.getKey()).asSubstitution(entry.getValue()); + } + } + return ""; // Java defaults to empty strings when a key was not in the inputs + } + + public NbtMap asNbtMap() { + NbtMapBuilder builder = NbtMap.builder(); + for (Map.Entry, Object> entry : values.entrySet()) { + ((DialogInput) entry.getKey()).addToMap(builder, entry.getValue()); + } + return builder.build(); + } +} From 71cf2ce254b9e92f93a2217695f81fb1d5b147e4 Mon Sep 17 00:00:00 2001 From: Eclipse Date: Mon, 2 Jun 2025 20:12:40 +0000 Subject: [PATCH 09/62] The other dialog inputs, too --- .../session/dialog/input/BooleanInput.java | 2 +- .../session/dialog/input/DialogInput.java | 6 + .../dialog/input/NumberRangeInput.java | 81 +++++++++++++ .../dialog/input/SingleOptionInput.java | 106 ++++++++++++++++++ .../session/dialog/input/TextInput.java | 80 +++++++++++++ 5 files changed, 274 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/org/geysermc/geyser/session/dialog/input/NumberRangeInput.java create mode 100644 core/src/main/java/org/geysermc/geyser/session/dialog/input/SingleOptionInput.java create mode 100644 core/src/main/java/org/geysermc/geyser/session/dialog/input/TextInput.java diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/input/BooleanInput.java b/core/src/main/java/org/geysermc/geyser/session/dialog/input/BooleanInput.java index 170999ed0..4051194ad 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/input/BooleanInput.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/input/BooleanInput.java @@ -67,7 +67,7 @@ public class BooleanInput extends DialogInput { @Override public void addToMap(NbtMapBuilder builder, Boolean value) { - builder.put(key, value); + builder.putBoolean(key, value); } @Override diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/input/DialogInput.java b/core/src/main/java/org/geysermc/geyser/session/dialog/input/DialogInput.java index 19310ab61..ad0f92984 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/input/DialogInput.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/input/DialogInput.java @@ -59,6 +59,12 @@ public abstract class DialogInput { Key type = MinecraftKey.key(tag.getString("type")); if (type.equals(BooleanInput.TYPE)) { return new BooleanInput(session, tag); + } else if (type.equals(NumberRangeInput.TYPE)) { + return new NumberRangeInput(session, tag); + } else if (type.equals(SingleOptionInput.TYPE)) { + return new SingleOptionInput(session, tag); + } else if (type.equals(TextInput.TYPE)) { + return new TextInput(session, tag); } throw new UnsupportedOperationException("Unknown dialog input type " + type); diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/input/NumberRangeInput.java b/core/src/main/java/org/geysermc/geyser/session/dialog/input/NumberRangeInput.java new file mode 100644 index 000000000..dd08c72a2 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/input/NumberRangeInput.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.session.dialog.input; + +import net.kyori.adventure.key.Key; +import org.cloudburstmc.nbt.NbtMap; +import org.cloudburstmc.nbt.NbtMapBuilder; +import org.geysermc.cumulus.form.CustomForm; +import org.geysermc.cumulus.response.CustomFormResponse; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.util.MinecraftKey; + +import java.util.Optional; + +public class NumberRangeInput extends DialogInput { + + public static final Key TYPE = MinecraftKey.key("number_range"); + + private final float start; + private final float end; + private final float initial; + private final float step; + + public NumberRangeInput(GeyserSession session, NbtMap map) { + super(session, map); + start = map.getFloat("start"); + end = map.getFloat("end"); + initial = map.getFloat("initial", start + (end - start) / 2.0F); + step = map.getFloat("step", 1.0F); + } + + @Override + public void addComponent(CustomForm.Builder builder, Optional restored) { + // Note: Java uses live labels which change as you change the slider, showing the value. This is what the "label_format" key is for. This is not supported on bedrock. + builder.slider(label, start, end, step, restored.orElse(initial)); + } + + @Override + public Float read(CustomFormResponse response) { + return response.asSlider(); + } + + @Override + public String asSubstitution(Float value) { + int rounded = value.intValue(); + return (float) rounded == value ? Integer.toString(rounded) : Float.toString(value); + } + + @Override + public void addToMap(NbtMapBuilder builder, Float value) { + builder.putFloat(key, value); + } + + @Override + public Float defaultValue() { + return initial; + } +} diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/input/SingleOptionInput.java b/core/src/main/java/org/geysermc/geyser/session/dialog/input/SingleOptionInput.java new file mode 100644 index 000000000..f65217edd --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/input/SingleOptionInput.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.session.dialog.input; + +import net.kyori.adventure.key.Key; +import org.cloudburstmc.nbt.NbtMap; +import org.cloudburstmc.nbt.NbtMapBuilder; +import org.cloudburstmc.nbt.NbtType; +import org.geysermc.cumulus.form.CustomForm; +import org.geysermc.cumulus.response.CustomFormResponse; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.text.MessageTranslator; +import org.geysermc.geyser.util.MinecraftKey; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class SingleOptionInput extends DialogInput { + + public static final Key TYPE = MinecraftKey.key("single_option"); + + private final boolean labelVisible; + private final List entries = new ArrayList<>(); + private final int initial; + + public SingleOptionInput(GeyserSession session, NbtMap map) { + super(session, map); + labelVisible = map.getBoolean("label_visible", true); + List entriesTag = map.getList("options", NbtType.COMPOUND); + + int temp = 0; + for (int i = 0; i < entriesTag.size(); i++) { + NbtMap entry = entriesTag.get(i); + entries.add(new Entry(entry.getString("id"), Optional.ofNullable(MessageTranslator.convertFromNullableNbtTag(session, entry.get("display"))))); + if (entry.getBoolean("initial")) { + temp = i; + } + } + initial = temp; + } + + @Override + public void addComponent(CustomForm.Builder builder, Optional restored) { + int defaultOption = initial; + if (restored.isPresent()) { + for (int i = 0; i < entries.size(); i++) { + if (entries.get(i).id().equals(restored.get())) { + defaultOption = i; + break; + } + } + } + builder.dropdown(labelVisible ? label : "", entries.stream().map(Entry::label).toList(), defaultOption); + } + + @Override + public String read(CustomFormResponse response) { + return entries.get(response.asDropdown()).id(); + } + + @Override + public String asSubstitution(String value) { + return value; + } + + @Override + public void addToMap(NbtMapBuilder builder, String value) { + builder.putString(key, value); + } + + @Override + public String defaultValue() { + return entries.get(initial).id(); + } + + private record Entry(String id, Optional fancyLabel) { + + public String label() { + return fancyLabel.orElse(id); + } + } +} diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/input/TextInput.java b/core/src/main/java/org/geysermc/geyser/session/dialog/input/TextInput.java new file mode 100644 index 000000000..f9cb983b7 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/input/TextInput.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.session.dialog.input; + +import net.kyori.adventure.key.Key; +import org.cloudburstmc.nbt.NbtMap; +import org.cloudburstmc.nbt.NbtMapBuilder; +import org.geysermc.cumulus.form.CustomForm; +import org.geysermc.cumulus.response.CustomFormResponse; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.util.MinecraftKey; + +import java.util.Optional; + +public class TextInput extends DialogInput { + + public static final Key TYPE = MinecraftKey.key("text"); + + private final boolean labelVisible; + private final String initial; + private final int maxLength; + + public TextInput(GeyserSession session, NbtMap map) { + super(session, map); + labelVisible = map.getBoolean("label_visible", true); + initial = map.getString("initial", ""); + maxLength = map.getInt("max_length", 32); + } + + @Override + public void addComponent(CustomForm.Builder builder, Optional restored) { + builder.input(labelVisible ? label : "", "", restored.orElse(initial)); + } + + @Override + public String read(CustomFormResponse response) { + String raw = response.asInput(); + assert raw != null; + // Bedrock doesn't support setting a max length, so we just cut it off to not have the server complain + return raw.substring(0, Math.min(raw.length(), maxLength)); + } + + @Override + public String asSubstitution(String value) { + return value; + } + + @Override + public void addToMap(NbtMapBuilder builder, String value) { + builder.putString(key, value); + } + + @Override + public String defaultValue() { + return initial; + } +} From 2bb9cf664d8140143acbc42e62fde7676380de4b Mon Sep 17 00:00:00 2001 From: Eclipse Date: Wed, 4 Jun 2025 16:49:21 +0000 Subject: [PATCH 10/62] Fix various things relating to closing and switching of dialogs; implement 2 after-actions; implement exit button on button list dialogs; some cleanup --- .../geyser/session/GeyserSession.java | 17 +++ .../session/dialog/ConfirmationDialog.java | 7 +- .../geyser/session/dialog/Dialog.java | 52 ++++---- .../geyser/session/dialog/DialogHolder.java | 112 ++++++++++++++++++ .../geyser/session/dialog/DialogManager.java | 72 +++++++++++ .../session/dialog/DialogWithButtons.java | 30 ++++- .../session/dialog/MultiActionDialog.java | 12 +- .../geyser/session/dialog/NoticeDialog.java | 8 +- .../session/dialog/ServerLinksDialog.java | 7 +- .../session/dialog/action/DialogAction.java | 7 +- .../session/dialog/input/DialogInput.java | 4 + .../JavaShowDialogGameTranslator.java | 3 +- 12 files changed, 270 insertions(+), 61 deletions(-) create mode 100644 core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java create mode 100644 core/src/main/java/org/geysermc/geyser/session/dialog/DialogManager.java diff --git a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java index 59b309659..041dc68e0 100644 --- a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java +++ b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java @@ -176,6 +176,7 @@ import org.geysermc.geyser.session.cache.TeleportCache; import org.geysermc.geyser.session.cache.WorldBorder; import org.geysermc.geyser.session.cache.WorldCache; import org.geysermc.geyser.session.cache.registry.JavaRegistries; +import org.geysermc.geyser.session.dialog.DialogManager; import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.translator.inventory.InventoryTranslator; import org.geysermc.geyser.translator.text.MessageTranslator; @@ -307,6 +308,9 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { @Setter private @Nullable InventoryHolder inventoryHolder; + @Getter + private final DialogManager dialogManager = new DialogManager(this); + /** * Whether the client is currently closing an inventory. * Used to open new inventories while another one is currently open. @@ -1515,6 +1519,19 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { @Override public boolean sendForm(@NonNull Form form) { + // First close any dialogs that are open. This won't execute the dialog's closing action. + dialogManager.close(); + return doSendForm(form); + } + + /** + * Sends a form without first closing any open dialog. This should only be used by {@link org.geysermc.geyser.session.dialog.Dialog}s. + */ + public boolean sendDialogForm(@NonNull Form form) { + return doSendForm(form); + } + + private boolean doSendForm(@NonNull Form form) { formCache.showForm(form); return true; } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/ConfirmationDialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/ConfirmationDialog.java index 5c522206a..9ec9be3b3 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/ConfirmationDialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/ConfirmationDialog.java @@ -37,11 +37,6 @@ public class ConfirmationDialog extends DialogWithButtons { public static final Key TYPE = MinecraftKey.key("confirmation"); public ConfirmationDialog(GeyserSession session, NbtMap map, IdGetter idGetter) { - super(session, map, parseOptionalList(DialogButton.read(session, map.get("yes"), idGetter), DialogButton.read(session, map.get("no"), idGetter))); - } - - @Override - protected Optional onCancel() { - return buttons.size() > 1 ? Optional.of(buttons.get(1)) : Optional.empty(); // "no" button, there should always be 2 buttons but check just to be sure + super(session, map, parseOptionalList(DialogButton.read(session, map.get("yes"), idGetter), DialogButton.read(session, map.get("no"), idGetter)), Optional.empty()); } } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java index 8c8098258..00011c523 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java @@ -25,7 +25,10 @@ package org.geysermc.geyser.session.dialog; +import lombok.Getter; +import lombok.experimental.Accessors; import net.kyori.adventure.key.Key; +import org.checkerframework.checker.nullness.qual.NonNull; import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.nbt.NbtType; import org.geysermc.cumulus.form.CustomForm; @@ -50,12 +53,16 @@ import java.util.Objects; import java.util.Optional; import java.util.function.ToIntFunction; +@Accessors(fluent = true) public abstract class Dialog { private static final Key PLAIN_MESSAGE_BODY = MinecraftKey.key("plain_message"); private final String title; private final String externalTitle; + @Getter + private final boolean canCloseWithEscape; + @Getter private final AfterAction afterAction; private final List labels; private final List> inputs = new ArrayList<>(); @@ -63,6 +70,7 @@ public abstract class Dialog { protected Dialog(GeyserSession session, NbtMap map) { title = MessageTranslator.convertFromNullableNbtTag(session, map.get("title")); externalTitle = MessageTranslator.convertFromNullableNbtTag(session, map.get("title")); + canCloseWithEscape = map.getBoolean("can_close_with_escape", true); afterAction = AfterAction.fromString(map.getString("after_action")); Object bodyTag = map.get("body"); @@ -100,42 +108,42 @@ public abstract class Dialog { protected abstract Optional onCancel(); - protected FormBuilder, ? extends Form, ? extends FormResponse> createForm(GeyserSession session) { + protected FormBuilder, ? extends Form, ? extends FormResponse> createForm(GeyserSession session, Optional restored, DialogHolder holder) { if (inputs.isEmpty()) { SimpleForm.Builder builder = SimpleForm.builder() .title(title); - builder.content(String.join("\n", labels)); + builder.content(String.join("\n\n", labels)); - builder.closedOrInvalidResultHandler(() -> runButton(session, onCancel(), ParsedInputs.EMPTY)); - addCustomComponents(session, builder); + builder.closedOrInvalidResultHandler(() -> holder.closeDialog(onCancel())); + addCustomComponents(session, builder, holder); return builder; } else { CustomForm.Builder builder = CustomForm.builder() .title(title); - inputs.forEach(input -> input.addComponent(builder, Optional.empty())); - builder.closedOrInvalidResultHandler(response -> runButton(session, onCancel(), new ParsedInputs(inputs))); - addCustomComponents(session, builder); + restored.ifPresentOrElse(last -> last.restore(builder), () -> inputs.forEach(input -> input.addComponent(builder))); + builder.closedOrInvalidResultHandler(response -> holder.closeDialog(onCancel())); + addCustomComponents(session, builder, holder); return builder; } } - protected abstract void addCustomComponents(GeyserSession session, CustomForm.Builder builder); + protected abstract void addCustomComponents(GeyserSession session, CustomForm.Builder builder, DialogHolder holder); - protected abstract void addCustomComponents(GeyserSession session, SimpleForm.Builder builder); + protected abstract void addCustomComponents(GeyserSession session, SimpleForm.Builder builder, DialogHolder holder); - public Form buildForm(GeyserSession session) { - return createForm(session).build(); + public void sendForm(GeyserSession session, DialogHolder holder) { + session.sendDialogForm(createForm(session, Optional.empty(), holder).build()); + } + + public void restoreForm(GeyserSession session, @NonNull ParsedInputs inputs, DialogHolder holder) { + session.sendDialogForm(createForm(session, Optional.of(inputs), holder).build()); } protected ParsedInputs parseInput(CustomFormResponse response) { return new ParsedInputs(inputs, response); } - protected void runButton(GeyserSession session, Optional button, ParsedInputs inputs) { - button.flatMap(DialogButton::action).ifPresent(action -> action.run(session, inputs)); - } - public static Dialog readDialog(RegistryEntryContext context) { return readDialogFromNbt(context.session(), context.data(), context::getNetworkId); } @@ -154,10 +162,10 @@ public abstract class Dialog { return new Dialog(session, map) { @Override - protected void addCustomComponents(GeyserSession session, CustomForm.Builder builder) {} + protected void addCustomComponents(GeyserSession session, CustomForm.Builder builder, DialogHolder holder) {} @Override - protected void addCustomComponents(GeyserSession session, SimpleForm.Builder builder) {} + protected void addCustomComponents(GeyserSession session, SimpleForm.Builder builder, DialogHolder holder) {} @Override protected Optional onCancel() { @@ -167,14 +175,12 @@ public abstract class Dialog { // throw new UnsupportedOperationException("Unable to read unknown dialog type " + type + "!"); // TODO put this here once all types are implemented } - public static void showDialog(GeyserSession session, Holder holder) { - Dialog dialog; + public static Dialog getDialogFromHolder(GeyserSession session, Holder holder) { if (holder.isId()) { - dialog = JavaRegistries.DIALOG.fromNetworkId(session, holder.id()); + return Objects.requireNonNull(JavaRegistries.DIALOG.fromNetworkId(session, holder.id())); } else { - dialog = Dialog.readDialogFromNbt(session, holder.custom(), key -> JavaRegistries.DIALOG.keyToNetworkId(session, key)); + return Dialog.readDialogFromNbt(session, holder.custom(), key -> JavaRegistries.DIALOG.keyToNetworkId(session, key)); } - session.sendForm(Objects.requireNonNull(dialog).buildForm(session)); } public enum AfterAction { @@ -188,7 +194,7 @@ public abstract class Dialog { return action; } } - return null; + return CLOSE; } } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java new file mode 100644 index 000000000..b24cbfd98 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.session.dialog; + +import org.checkerframework.checker.nullness.qual.NonNull; +import org.geysermc.geyser.session.dialog.action.DialogAction; +import org.geysermc.geyser.session.dialog.input.ParsedInputs; + +import java.util.Optional; + +public class DialogHolder { + private final DialogManager manager; + private final Dialog dialog; + private ParsedInputs lastInputs; + + public DialogHolder(DialogManager manager, Dialog dialog) { + this.manager = manager; + this.dialog = dialog; + } + + + // Dialog action behaviour: + // When running an action, if the action: + // - opens a new dialog: the new dialog is opened, the old one is closed, its closing action not executed. [ ] + // - executes with "none" as after action: the dialog is kept open. The dialog can only be closed by pressing "escape" (when allowed by the dialog), or on bedrock, the X in the corner of the form. [ ] (TODO note about multi action exit) + // - executes with "close" as after action: the dialog is closed, its closing action not executed. + // A dialogs closing action (onCancel()) is only executed when the dialog is closed by pressing "escape" (when allowed by the dialog). [ ] + // If a new dialog is opened by the server when a dialog is already open, that dialog is closed, its closing action not executed. [ ] + + public void runButton(Optional button, @NonNull ParsedInputs inputs) { + lastInputs = inputs; + + boolean stillValid = runAction(button, lastInputs); + switch (dialog.afterAction()) { + case NONE -> { + // If no new dialog was opened, reopen this one + if (stillValid) { + dialog.restoreForm(manager.session(), lastInputs, this); + } + } + case CLOSE -> { + // If no new dialog was opened, tell the manager this one is now closed + if (stillValid) { + manager.close(); + } + } + case WAIT_FOR_RESPONSE -> {} // TODO + } + } + + // Called when clicking the X in the corner on a form, which we interpret as clicking escape + // Note that this method is called from the "closedOrInvalidResultHandler", + // meaning it can also be called when e.g. the bedrock client opens another form or is unable to open the form sent to it + public void closeDialog(Optional onCancel) { + if (dialog.canCloseWithEscape()) { + if (runAction(onCancel, lastInputs == null ? ParsedInputs.EMPTY : lastInputs)) { + manager.close(); + } + } else if (manager.open() == this) { // Check if this is still the currently open dialog + // If player should not have been able to close the dialog, reopen it with the last inputs + + // lastInputs might be null here since it's possible none were sent yet, and bedrock doesn't send them when just closing the form + if (lastInputs == null) { + dialog.sendForm(manager.session(), this); + } else { + dialog.restoreForm(manager.session(), lastInputs, this); + } + } + } + + // Returns true if this dialog is still regarded open by the DialogManager + // When returning false, that means a new dialog has been opened, possibly by the action, which takes this dialog's place + private boolean runAction(Optional button, ParsedInputs inputs) { + // Don't run any action if a new dialog has already been opened + if (manager.open() != this) { + return false; + } + + DialogAction action = button.flatMap(DialogButton::action).orElse(null); + if (action != null) { + action.run(manager.session(), inputs); + if (action instanceof DialogAction.ShowDialog) { + return false; + } + // TODO command warning screen + } + return true; + } +} diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogManager.java b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogManager.java new file mode 100644 index 000000000..b0e50c190 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogManager.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.session.dialog; + +import lombok.Getter; +import lombok.experimental.Accessors; +import org.cloudburstmc.nbt.NbtMap; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.mcprotocollib.protocol.data.game.Holder; + +/** + * Small class to manage the currently open dialog. + */ +@Accessors(fluent = true) +public class DialogManager { + @Getter + private final GeyserSession session; + @Getter + private DialogHolder open; + + public DialogManager(GeyserSession session) { + this.session = session; + } + + public void openDialog(Holder dialog) { + openDialog(Dialog.getDialogFromHolder(session, dialog)); + } + + /** + * Opens a new dialog. If a dialog was already open, this one will be closed. Its closing action will not be executed. This matches Java behaviour. + */ + public void openDialog(Dialog dialog) { + open = new DialogHolder(this, dialog); + session.closeForm(); + dialog.sendForm(session, open); + } + + /** + * Closes the currently open dialog, if any. The dialog's closing action will not be executed. + */ + public void close() { + if (open != null) { + open = null; + // The form could already have been closed by now, but in the case it wasn't, close it anyway + // This won't run a closing dialog action, because the manager already regards the dialog as closed + session.closeForm(); + } + } +} diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java index fdf6b47f4..4ac0add5b 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java @@ -39,35 +39,55 @@ import java.util.Optional; public abstract class DialogWithButtons extends Dialog { protected final List buttons; + protected final Optional exitAction; - protected DialogWithButtons(GeyserSession session, NbtMap map, List buttons) { + protected DialogWithButtons(GeyserSession session, NbtMap map, List buttons, Optional exitAction) { super(session, map); this.buttons = buttons; + this.exitAction = exitAction; } @Override - protected void addCustomComponents(GeyserSession session, CustomForm.Builder builder) { + protected void addCustomComponents(GeyserSession session, CustomForm.Builder builder, DialogHolder holder) { DropdownComponent.Builder dropdown = DropdownComponent.builder(); dropdown.text("Please select an option:"); for (DialogButton button : buttons) { dropdown.option(button.label()); } + exitAction.ifPresent(button -> dropdown.option(button.label())); builder.dropdown(dropdown); builder.validResultHandler(response -> { ParsedInputs inputs = parseInput(response); int selection = response.asDropdown(); - runButton(session, Optional.of(buttons.get(selection)), inputs); + if (selection == buttons.size()) { + holder.runButton(exitAction, inputs); + } else { + holder.runButton(Optional.of(buttons.get(selection)), inputs); + } }); } @Override - protected void addCustomComponents(GeyserSession session, SimpleForm.Builder builder) { + protected void addCustomComponents(GeyserSession session, SimpleForm.Builder builder, DialogHolder holder) { for (DialogButton button : buttons) { builder.button(button.label()); } + exitAction.ifPresent(button -> builder.button(button.label())); - builder.validResultHandler(response -> runButton(session, Optional.of(buttons.get(response.clickedButtonId())), ParsedInputs.EMPTY)); + builder.validResultHandler(response -> { + if (response.clickedButtonId() == buttons.size()) { + holder.runButton(exitAction, ParsedInputs.EMPTY); + } else { + + holder.runButton(Optional.of(buttons.get(response.clickedButtonId())), ParsedInputs.EMPTY); + } + }); + } + + @Override + protected Optional onCancel() { + return exitAction; } @SafeVarargs diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/MultiActionDialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/MultiActionDialog.java index c8a4d53fa..c8c2e1f50 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/MultiActionDialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/MultiActionDialog.java @@ -31,21 +31,11 @@ import org.cloudburstmc.nbt.NbtType; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.MinecraftKey; -import java.util.Optional; - public class MultiActionDialog extends DialogWithButtons { public static final Key TYPE = MinecraftKey.key("multi_action"); - private final Optional exit; - protected MultiActionDialog(GeyserSession session, NbtMap map, IdGetter idGetter) { - super(session, map, DialogButton.readList(session, map.getList("actions", NbtType.COMPOUND), idGetter)); - exit = DialogButton.read(session, map.get("exit_action"), idGetter); - } - - @Override - protected Optional onCancel() { - return exit; + super(session, map, DialogButton.readList(session, map.getList("actions", NbtType.COMPOUND), idGetter), DialogButton.read(session, map.get("exit_action"), idGetter)); } } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java index d9e32ca62..10fc1942c 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java @@ -52,12 +52,12 @@ public class NoticeDialog extends Dialog { } @Override - protected void addCustomComponents(GeyserSession session, CustomForm.Builder builder) { - builder.validResultHandler(response -> runButton(session, button, parseInput(response))); + protected void addCustomComponents(GeyserSession session, CustomForm.Builder builder, DialogHolder holder) { + builder.validResultHandler(response -> holder.runButton(onCancel(), parseInput(response))); } @Override - protected void addCustomComponents(GeyserSession session, SimpleForm.Builder builder) { - builder.validResultHandler(response -> runButton(session, button, ParsedInputs.EMPTY)); + protected void addCustomComponents(GeyserSession session, SimpleForm.Builder builder, DialogHolder holder) { + builder.validResultHandler(response -> holder.runButton(onCancel(), ParsedInputs.EMPTY)); } } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/ServerLinksDialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/ServerLinksDialog.java index 1c1666892..c33c81941 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/ServerLinksDialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/ServerLinksDialog.java @@ -34,11 +34,6 @@ import java.util.Optional; public class ServerLinksDialog extends DialogWithButtons { protected ServerLinksDialog(GeyserSession session, NbtMap map, List buttons) { - super(session, map, buttons); - } - - @Override - protected Optional onCancel() { - return Optional.empty(); + super(session, map, buttons, Optional.empty()); } } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java b/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java index 6c75f71da..8f834b012 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java @@ -28,7 +28,6 @@ package org.geysermc.geyser.session.dialog.action; import net.kyori.adventure.key.Key; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.nbt.NbtMap; -import org.geysermc.cumulus.form.SimpleForm; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.dialog.Dialog; import org.geysermc.geyser.session.dialog.input.ParsedInputs; @@ -76,7 +75,8 @@ public interface DialogAction { @Override public void run(GeyserSession session, ParsedInputs inputs) { - session.sendForm(SimpleForm.builder().title("Open URL").content(url)); + //session.sendForm(SimpleForm.builder().title("Open URL").content(url)); + // TODO if we use form here we need a connection in dialog stack } } @@ -105,8 +105,7 @@ public interface DialogAction { @Override public void run(GeyserSession session, ParsedInputs inputs) { - // TODO figure out parent dialog - Dialog.showDialog(session, dialog); + session.getDialogManager().openDialog(dialog); } } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/input/DialogInput.java b/core/src/main/java/org/geysermc/geyser/session/dialog/input/DialogInput.java index ad0f92984..9b3817e79 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/input/DialogInput.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/input/DialogInput.java @@ -45,6 +45,10 @@ public abstract class DialogInput { this.label = MessageTranslator.convertFromNullableNbtTag(session, map.get("label")); } + public void addComponent(CustomForm.Builder builder) { + addComponent(builder, Optional.empty()); + } + public abstract void addComponent(CustomForm.Builder builder, Optional restored); public abstract T read(CustomFormResponse response); diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaShowDialogGameTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaShowDialogGameTranslator.java index 9aea5fb89..1d0c911fd 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaShowDialogGameTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaShowDialogGameTranslator.java @@ -26,7 +26,6 @@ package org.geysermc.geyser.translator.protocol.java.dialogues; import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.session.dialog.Dialog; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.ClientboundShowDialogGamePacket; @@ -36,6 +35,6 @@ public class JavaShowDialogGameTranslator extends PacketTranslator Date: Wed, 4 Jun 2025 17:41:14 +0000 Subject: [PATCH 11/62] Implement "waiting for response" screen --- .../geyser/session/GeyserSession.java | 2 + .../geyser/session/dialog/Dialog.java | 3 + .../geyser/session/dialog/DialogHolder.java | 64 ++++++++++++++++--- .../geyser/session/dialog/DialogManager.java | 6 ++ .../geyser/session/dialog/NoticeDialog.java | 5 +- 5 files changed, 70 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java index 041dc68e0..a703544f9 100644 --- a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java +++ b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java @@ -1240,6 +1240,8 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { // but this will work once we implement matching Java custom tick cycles sendDownstreamGamePacket(ServerboundClientTickEndPacket.INSTANCE); } + + dialogManager.tick(); } catch (Throwable throwable) { throwable.printStackTrace(); } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java index 00011c523..93d30f641 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java @@ -42,6 +42,7 @@ import org.geysermc.geyser.session.cache.registry.JavaRegistries; import org.geysermc.geyser.session.cache.registry.RegistryEntryContext; import org.geysermc.geyser.session.dialog.input.DialogInput; import org.geysermc.geyser.session.dialog.input.ParsedInputs; +import org.geysermc.geyser.text.MinecraftLocale; import org.geysermc.geyser.translator.text.MessageTranslator; import org.geysermc.geyser.util.MinecraftKey; import org.geysermc.mcprotocollib.protocol.data.game.Holder; @@ -111,6 +112,7 @@ public abstract class Dialog { protected FormBuilder, ? extends Form, ? extends FormResponse> createForm(GeyserSession session, Optional restored, DialogHolder holder) { if (inputs.isEmpty()) { SimpleForm.Builder builder = SimpleForm.builder() + .translator(MinecraftLocale::getLocaleString, session.locale()) .title(title); builder.content(String.join("\n\n", labels)); @@ -119,6 +121,7 @@ public abstract class Dialog { return builder; } else { CustomForm.Builder builder = CustomForm.builder() + .translator(MinecraftLocale::getLocaleString, session.locale()) .title(title); restored.ifPresentOrElse(last -> last.restore(builder), () -> inputs.forEach(input -> input.addComponent(builder))); diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java index b24cbfd98..a044f4277 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java @@ -26,14 +26,18 @@ package org.geysermc.geyser.session.dialog; import org.checkerframework.checker.nullness.qual.NonNull; +import org.geysermc.cumulus.form.SimpleForm; import org.geysermc.geyser.session.dialog.action.DialogAction; import org.geysermc.geyser.session.dialog.input.ParsedInputs; +import org.geysermc.geyser.text.MinecraftLocale; import java.util.Optional; public class DialogHolder { private final DialogManager manager; private final Dialog dialog; + private long responseWaitTime = 0; + private boolean sendBackButton = false; private ParsedInputs lastInputs; public DialogHolder(DialogManager manager, Dialog dialog) { @@ -67,7 +71,23 @@ public class DialogHolder { manager.close(); } } - case WAIT_FOR_RESPONSE -> {} // TODO + case WAIT_FOR_RESPONSE -> { + // If no new dialog was opened, open a form telling the user we're waiting on a response from the server + // This dialog is replaced with a similar form with a "back" button after 5 seconds, matching Java behaviour + if (stillValid) { + responseWaitTime = System.currentTimeMillis(); + sendBackButton = false; + waitForResponse(); + } + } + } + } + + public void tick() { + // Replace wait form with one with a back button if no replacement dialog was given + if (responseWaitTime > 0 && !sendBackButton && System.currentTimeMillis() - responseWaitTime > 5000) { + sendBackButton = true; + manager.session().closeForm(); // Automatically reopens with a back button } } @@ -81,16 +101,44 @@ public class DialogHolder { } } else if (manager.open() == this) { // Check if this is still the currently open dialog // If player should not have been able to close the dialog, reopen it with the last inputs - - // lastInputs might be null here since it's possible none were sent yet, and bedrock doesn't send them when just closing the form - if (lastInputs == null) { - dialog.sendForm(manager.session(), this); - } else { - dialog.restoreForm(manager.session(), lastInputs, this); - } + reopenDialog(); } } + private void reopenDialog() { + responseWaitTime = 0; + + // lastInputs might be null here since it's possible none were sent yet + // Bedrock doesn't send them when just closing the form + if (lastInputs == null) { + dialog.sendForm(manager.session(), this); + } else { + dialog.restoreForm(manager.session(), lastInputs, this); + } + } + + private void waitForResponse() { + String content = "Geyser is waiting for the server to respond with a new dialog."; + if (sendBackButton) { + content += " The server is taking a while to respond. You can press the button below to go back to the game."; + } else { + content += " If no new dialog is shown within 5 seconds, a button will appear to go back to the game."; + } + + manager.session().sendDialogForm(SimpleForm.builder() + .translator(MinecraftLocale::getLocaleString, manager.session().locale()) + .title("gui.waitingForResponse.title") + .content(content) + .optionalButton("Back", sendBackButton) + .closedOrInvalidResultHandler(() -> { + if (manager.open() == this) { // If still waiting on a new dialog + waitForResponse(); + } + }) + .validResultHandler(response -> manager.close()) // Back button was pressed, meaning no new dialog was sent + .build()); + } + // Returns true if this dialog is still regarded open by the DialogManager // When returning false, that means a new dialog has been opened, possibly by the action, which takes this dialog's place private boolean runAction(Optional button, ParsedInputs inputs) { diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogManager.java b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogManager.java index b0e50c190..c7d70bac5 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogManager.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogManager.java @@ -58,6 +58,12 @@ public class DialogManager { dialog.sendForm(session, open); } + public void tick() { + if (open != null) { + open.tick(); + } + } + /** * Closes the currently open dialog, if any. The dialog's closing action will not be executed. */ diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java index 10fc1942c..54c226b80 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java @@ -53,11 +53,12 @@ public class NoticeDialog extends Dialog { @Override protected void addCustomComponents(GeyserSession session, CustomForm.Builder builder, DialogHolder holder) { - builder.validResultHandler(response -> holder.runButton(onCancel(), parseInput(response))); + builder.validResultHandler(response -> holder.runButton(button, parseInput(response))); } @Override protected void addCustomComponents(GeyserSession session, SimpleForm.Builder builder, DialogHolder holder) { - builder.validResultHandler(response -> holder.runButton(onCancel(), ParsedInputs.EMPTY)); + builder.button(button.map(DialogButton::label).orElse("gui.ok")) + .validResultHandler(response -> holder.runButton(button, ParsedInputs.EMPTY)); } } From b5d1f701860b75c9a8ddd256593ab1110b5b991c Mon Sep 17 00:00:00 2001 From: Eclipse Date: Wed, 4 Jun 2025 20:17:48 +0000 Subject: [PATCH 12/62] More refactors and write some documentation; implement "confirm command execution" screen --- .../geyser/session/GeyserSession.java | 5 + .../geyser/session/dialog/DialogHolder.java | 256 ++++++++++++++---- .../session/dialog/action/DialogAction.java | 30 +- .../protocol/java/JavaCommandsTranslator.java | 11 + 4 files changed, 241 insertions(+), 61 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java index a703544f9..bc612d7af 100644 --- a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java +++ b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java @@ -311,6 +311,11 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { @Getter private final DialogManager dialogManager = new DialogManager(this); + @Setter + private List knownCommands = List.of(); + @Setter + private List restrictedCommands = List.of(); + /** * Whether the client is currently closing an inventory. * Used to open new inventories while another one is currently open. diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java index a044f4277..330079815 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java @@ -25,19 +25,79 @@ package org.geysermc.geyser.session.dialog; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import org.checkerframework.checker.nullness.qual.NonNull; +import org.geysermc.cumulus.form.ModalForm; import org.geysermc.cumulus.form.SimpleForm; import org.geysermc.geyser.session.dialog.action.DialogAction; import org.geysermc.geyser.session.dialog.input.ParsedInputs; import org.geysermc.geyser.text.MinecraftLocale; +import org.geysermc.geyser.translator.text.MessageTranslator; import java.util.Optional; +/** + * Used to manage an open dialog. Handles dialog input, transferring to other dialogs, and dialog "submenus" for e.g. waiting on a new dialog or confirming a command. + * + *

This is passed to a {@link Dialog} when using it to send a form to the client, it uses the {@link DialogHolder#runButton(Optional, ParsedInputs)} and {@link DialogHolder#closeDialog(Optional)} methods.

+ * + *

+ * To make it easier to understand what this class does and why it does it, here is the summed up behaviour of dialogs on Java. + * Java dialogs consist of inputs and buttons that run actions. Dialogs also have an "on cancel"/closing action, which is usually executed when the user presses ESC, or presses an "exit" button, defined by the dialog + * (note: not all dialog types can have an exit button). Dialogs can disallow closing by pressing ESC. Geyser translates clicking the "X" in the corner of a form as pressing ESC.

+ * + *

+ * Dialog inputs are quite simple. The user can enter what they want, and the inputs will clear once the dialog has been closed (note: only once the dialog has been closed. This becomes important later!). + *

+ * + *

+ * Dialog actions are more complicated. Dialogs can define what to do after an action has been executed (so-called "after action" behaviour). When executing an action, if the action: + *

+ *
    + *
  • Opens a new dialog: the new dialog is opened, the old one is closed, its closing action not executed.
  • + *
  • Executes with "NONE" set as after action: the dialog is kept open, its current input kept. This means the dialog can only be closed by pressing ESC (when allowed), or by an exit button, if it exists.
  • + *
  • Executes with "CLOSE" as after action: the dialog is closed, its closing action not executed.
  • + *
  • Executes with "WAIT_FOR_RESPONSE" as after action: the dialog is closed, its closing action not executed. A new, temporary screen is opened telling the user Minecraft is waiting on a response from the server.
    + * The server must then send a new dialog within 5 seconds. After this period, a "back" button will appear, allowing the user to go back into the game if no new dialog appears. + *
  • + *
+ * + *

If a new dialog is opened whilst another dialog is open, the old dialog is closed and the new dialog takes its place. The closing action of the dialog is not executed.

+ * + *

+ * All of this behaviour must be emulated by Geyser. That said, here are some of the things that this class must handle: + *

+ * + *
    + *
  • Executing actions with after actions properly. Actions that run commands or the "WAIT_FOR_RESPONSE" after action make this especially complicated.
    + * In the case of commands that require operator permissions or the previously mentioned after action, Geyser must open a temporary form asking the user for confirmation or telling the user to wait. + *
  • + *
  • Remember form input and restore it after returning to this dialog, e.g. by cancelling a command execution or by the "NONE" after action.
  • + *
  • + * Properly close this dialog and open other dialogs - for example, bedrock/Cumulus likes to call "close" handlers a lot, including when the client closes a currently open form + * to open a new one. As such, every time we do something, we must make sure this dialog is still considered open. + *
  • + *
+ * + *

Final note: when reading through this code, a dialog is "valid" when it is still considered open.

+ */ public class DialogHolder { private final DialogManager manager; private final Dialog dialog; + + /** + * The time at which the "wait for response" screen was sent. Used to track when to show the "back" button. + */ private long responseWaitTime = 0; + /** + * If the "wait for response" screen is currently open and the "back" button should be shown. + */ private boolean sendBackButton = false; + /** + * If the dialog should be closed as soon as possible (likely after a "confirm running command" screen). + */ + private boolean shouldClose = false; private ParsedInputs lastInputs; public DialogHolder(DialogManager manager, Dialog dialog) { @@ -45,44 +105,22 @@ public class DialogHolder { this.dialog = dialog; } - - // Dialog action behaviour: - // When running an action, if the action: - // - opens a new dialog: the new dialog is opened, the old one is closed, its closing action not executed. [ ] - // - executes with "none" as after action: the dialog is kept open. The dialog can only be closed by pressing "escape" (when allowed by the dialog), or on bedrock, the X in the corner of the form. [ ] (TODO note about multi action exit) - // - executes with "close" as after action: the dialog is closed, its closing action not executed. - // A dialogs closing action (onCancel()) is only executed when the dialog is closed by pressing "escape" (when allowed by the dialog). [ ] - // If a new dialog is opened by the server when a dialog is already open, that dialog is closed, its closing action not executed. [ ] - + /** + * Checks if this dialog is still valid, and if so, runs the given button (if present) with the given inputs. + * These inputs can be {@link ParsedInputs#EMPTY} when the dialog has no inputs, but can never be {@code null}. This method also runs the dialog's after action. + */ public void runButton(Optional button, @NonNull ParsedInputs inputs) { lastInputs = inputs; - - boolean stillValid = runAction(button, lastInputs); - switch (dialog.afterAction()) { - case NONE -> { - // If no new dialog was opened, reopen this one - if (stillValid) { - dialog.restoreForm(manager.session(), lastInputs, this); - } - } - case CLOSE -> { - // If no new dialog was opened, tell the manager this one is now closed - if (stillValid) { - manager.close(); - } - } - case WAIT_FOR_RESPONSE -> { - // If no new dialog was opened, open a form telling the user we're waiting on a response from the server - // This dialog is replaced with a similar form with a "back" button after 5 seconds, matching Java behaviour - if (stillValid) { - responseWaitTime = System.currentTimeMillis(); - sendBackButton = false; - waitForResponse(); - } + if (stillValid()) { + if (runAction(button, lastInputs)) { + runAfterAction(); } } } + /** + * Ticks this dialog. Ticks are only used to check when to show the "back" button on the "waiting for response" screen. + */ public void tick() { // Replace wait form with one with a back button if no replacement dialog was given if (responseWaitTime > 0 && !sendBackButton && System.currentTimeMillis() - responseWaitTime > 5000) { @@ -94,29 +132,78 @@ public class DialogHolder { // Called when clicking the X in the corner on a form, which we interpret as clicking escape // Note that this method is called from the "closedOrInvalidResultHandler", // meaning it can also be called when e.g. the bedrock client opens another form or is unable to open the form sent to it + /** + * Should be called when pressing "ESC", i.e., clicking the X in the corner of the form. This method checks if the dialog is still valid, and if so, + * closes it if the dialog allows closing by pressing ESC. If not, the dialog is reopened. + * + *

If the dialog was closed successfully, the given close action is also executed, if present.

+ */ public void closeDialog(Optional onCancel) { + if (!stillValid()) { + return; + } + + // Don't run close functionality if we're asking for command confirmation if (dialog.canCloseWithEscape()) { + shouldClose = true; if (runAction(onCancel, lastInputs == null ? ParsedInputs.EMPTY : lastInputs)) { manager.close(); } - } else if (manager.open() == this) { // Check if this is still the currently open dialog - // If player should not have been able to close the dialog, reopen it with the last inputs - reopenDialog(); + return; } + + // If player should not have been able to close the dialog, reopen it with the last inputs + reopenDialog(); } + /** + * Tries to reopen the dialog. First checks if the dialog is still valid. If it is, it checks if the dialog should close, + * and if so, closes the dialog. If not, the dialog is reopened, with its inputs restored if possible. + */ private void reopenDialog() { - responseWaitTime = 0; + if (stillValid()) { + if (shouldClose) { + manager.close(); + } else { + responseWaitTime = 0; - // lastInputs might be null here since it's possible none were sent yet - // Bedrock doesn't send them when just closing the form - if (lastInputs == null) { - dialog.sendForm(manager.session(), this); - } else { - dialog.restoreForm(manager.session(), lastInputs, this); + // lastInputs might be null here since it's possible none were sent yet + // Bedrock doesn't send them when just closing the form + if (lastInputs == null) { + dialog.sendForm(manager.session(), this); + } else { + dialog.restoreForm(manager.session(), lastInputs, this); + } + } } } + /** + * Runs the dialog's after action. This method assumes the dialog is still valid! + */ + private void runAfterAction() { + switch (dialog.afterAction()) { + case NONE -> { + // If no new dialog was opened, reopen this one + dialog.restoreForm(manager.session(), lastInputs, this); + } + case CLOSE -> { + // If no new dialog was opened, tell the manager this one is now closed + manager.close(); + } + case WAIT_FOR_RESPONSE -> { + // If no new dialog was opened, open a form telling the user we're waiting on a response from the server + // This dialog is replaced with a similar form with a "back" button after 5 seconds, matching Java behaviour + responseWaitTime = System.currentTimeMillis(); + sendBackButton = false; + waitForResponse(); + } + } + } + + /** + * Opens a "waiting for response" form. This method assumes the dialog is still valid! + */ private void waitForResponse() { String content = "Geyser is waiting for the server to respond with a new dialog."; if (sendBackButton) { @@ -131,7 +218,7 @@ public class DialogHolder { .content(content) .optionalButton("Back", sendBackButton) .closedOrInvalidResultHandler(() -> { - if (manager.open() == this) { // If still waiting on a new dialog + if (stillValid()) { // If still waiting on a new dialog waitForResponse(); } }) @@ -139,22 +226,81 @@ public class DialogHolder { .build()); } - // Returns true if this dialog is still regarded open by the DialogManager - // When returning false, that means a new dialog has been opened, possibly by the action, which takes this dialog's place - private boolean runAction(Optional button, ParsedInputs inputs) { - // Don't run any action if a new dialog has already been opened - if (manager.open() != this) { - return false; - } - + /** + * This method runs the given action, if present, with the given inputs. + * + *

These inputs can be {@link ParsedInputs#EMPTY} when the dialog has no inputs, or the dialog was closed without entering anything, but can never be {@code null}. + * The method returns {@code true} if the dialog's after action can be executed, and {@code false} if not. The latter is the case when the action opened a new + * dialog or screen, in which case the after action will not be handled or be handled by the screen, respectively.

+ * + *

This method assumes the dialog is still valid!

+ */ + private boolean runAction(Optional button, @NonNull ParsedInputs inputs) { DialogAction action = button.flatMap(DialogButton::action).orElse(null); if (action != null) { - action.run(manager.session(), inputs); - if (action instanceof DialogAction.ShowDialog) { - return false; + // Ask the user for confirmation if the dialog wants to run an unknown command or a command that requires operator permissions + if (action instanceof DialogAction.CommandAction runCommand) { + String command = runCommand.trimmedCommand(manager.session(), inputs); + String root = command.split(" ")[0]; + + // This check is not perfect. Ideally we'd check the entire command and see if any of its arguments require operator permissions, but, that's complicated + if (manager.session().getRestrictedCommands().contains(root)) { + showCommandConfirmation(command, false); + return false; + } else if (!manager.session().getKnownCommands().contains(root)) { + showCommandConfirmation(command, true); + return false; + } + + manager.session().sendCommand(command); + return true; + } else { + action.run(manager.session(), inputs); + return !(action instanceof DialogAction.ShowDialog); } - // TODO command warning screen } return true; } + + /** + * Opens an "are you sure you want to do this?" form. This method assumes the dialog is still valid! + */ + private void showCommandConfirmation(String trimmedCommand, boolean unknown) { + Component content = Component.translatable(unknown ? "multiplayer.confirm_command.parse_errors" : "multiplayer.confirm_command.permissions_required", + Component.text(trimmedCommand).color(NamedTextColor.YELLOW)); + + manager.session().sendDialogForm(ModalForm.builder() + .translator(MinecraftLocale::getLocaleString, manager.session().locale()) + .title("multiplayer.confirm_command.title") + .content(MessageTranslator.convertMessage(manager.session(), content)) + .button1("gui.yes") + .button2("gui.no") + .closedOrInvalidResultHandler(() -> { + // Upon pressing "no" (or closing the form), we should return back to the dialog, even if it was supposed to close + shouldClose = false; + reopenDialog(); + }) + .validResultHandler(response -> { + if (response.clickedFirst()) { + manager.session().sendCommand(trimmedCommand); + if (shouldClose) { + manager.close(); + } else { + runAfterAction(); + } + } else { + // Pressed no, go back to dialog + shouldClose = false; + reopenDialog(); + } + }) + .build()); + } + + /** + * @return true if the dialog currently open is this dialog. + */ + private boolean stillValid() { + return manager.open() == this; + } } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java b/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java index 8f834b012..7b40e6ca7 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java @@ -67,6 +67,24 @@ public interface DialogAction { return Optional.empty(); } + interface CommandAction extends DialogAction { + + String command(GeyserSession session, ParsedInputs inputs); + + default String trimmedCommand(GeyserSession session, ParsedInputs inputs) { + String command = command(session, inputs); + if (command.startsWith("/")) { + return command.substring(1); + } + return command; + } + + @Override + default void run(GeyserSession session, ParsedInputs inputs) { + throw new IllegalCallerException("Should be implemented elsewhere to run with a confirmation form"); + } + } + void run(GeyserSession session, ParsedInputs inputs); record OpenUrl(String url) implements DialogAction { @@ -80,13 +98,13 @@ public interface DialogAction { } } - record RunCommand(String command) implements DialogAction { + record RunCommand(String command) implements CommandAction { public static final Key TYPE = MinecraftKey.key("run_command"); @Override - public void run(GeyserSession session, ParsedInputs inputs) { - session.sendCommand(command); + public String command(GeyserSession session, ParsedInputs inputs) { + return command; } } @@ -120,7 +138,7 @@ public interface DialogAction { } } - record DynamicRunCommand(List segments, List variables) implements DialogAction { + record DynamicRunCommand(List segments, List variables) implements CommandAction { public static final Key TYPE = MinecraftKey.key("dynamic/run_command"); @@ -165,7 +183,7 @@ public interface DialogAction { } @Override - public void run(GeyserSession session, ParsedInputs inputs) { + public String command(GeyserSession session, ParsedInputs inputs) { StringBuilder command = new StringBuilder(); List parsedVariables = variables.stream().map(inputs::getSubstitution).toList(); @@ -179,7 +197,7 @@ public interface DialogAction { command.append(segments.get(segments.size() - 1)); } - session.sendCommand(command.toString()); + return command.toString(); } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaCommandsTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaCommandsTranslator.java index 7ff82b21b..b9447dcd1 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaCommandsTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaCommandsTranslator.java @@ -145,6 +145,8 @@ public class JavaCommandsTranslator extends PacketTranslator knownCommands = new ArrayList<>(); + List restrictedCommands = new ArrayList<>(); // Loop through the root nodes to get all commands for (int nodeIndex : rootNode.getChildIndices()) { CommandNode node = nodes[nodeIndex]; @@ -167,8 +169,17 @@ public class JavaCommandsTranslator extends PacketTranslator new HashSet<>()).add(name); + + // Add the command to the command lists + knownCommands.add(name); + if (node.isAllowsRestricted()) { // Name is a bit confusing - this is what we want + restrictedCommands.add(name); + } } + session.setKnownCommands(knownCommands); + session.setRestrictedCommands(restrictedCommands); + var eventBus = session.getGeyser().eventBus(); var event = new ServerDefineCommandsEvent(session, commands.keySet()); From a71eb5e086da4524d8c1bff004f042c2bb0b1d90 Mon Sep 17 00:00:00 2001 From: Eclipse Date: Thu, 5 Jun 2025 12:24:14 +0000 Subject: [PATCH 13/62] Add input validation, fix forms with inputs not having labels --- .../geyser/session/dialog/Dialog.java | 15 ++++++- .../geyser/session/dialog/DialogHolder.java | 6 +-- .../session/dialog/DialogWithButtons.java | 16 ++++---- .../geyser/session/dialog/NoticeDialog.java | 2 +- .../session/dialog/input/BooleanInput.java | 2 +- .../session/dialog/input/DialogInput.java | 2 +- .../input/DialogInputParseException.java | 40 +++++++++++++++++++ .../dialog/input/NumberRangeInput.java | 2 +- .../session/dialog/input/ParsedInputs.java | 20 +++++++++- .../dialog/input/SingleOptionInput.java | 2 +- .../session/dialog/input/TextInput.java | 12 +++--- 11 files changed, 94 insertions(+), 25 deletions(-) create mode 100644 core/src/main/java/org/geysermc/geyser/session/dialog/input/DialogInputParseException.java diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java index 93d30f641..394478e0d 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java @@ -67,6 +67,8 @@ public abstract class Dialog { private final AfterAction afterAction; private final List labels; private final List> inputs = new ArrayList<>(); + @Getter + private final ParsedInputs defaultInputs; protected Dialog(GeyserSession session, NbtMap map) { title = MessageTranslator.convertFromNullableNbtTag(session, map.get("title")); @@ -96,6 +98,7 @@ public abstract class Dialog { for (NbtMap input : inputTag) { inputs.add(DialogInput.read(session, input)); } + defaultInputs = inputs.isEmpty() ? ParsedInputs.EMPTY : new ParsedInputs(inputs); } private static Optional readBody(GeyserSession session, NbtMap tag) { @@ -123,6 +126,9 @@ public abstract class Dialog { CustomForm.Builder builder = CustomForm.builder() .translator(MinecraftLocale::getLocaleString, session.locale()) .title(title); + for (String label : labels) { + builder.label(label); + } restored.ifPresentOrElse(last -> last.restore(builder), () -> inputs.forEach(input -> input.addComponent(builder))); builder.closedOrInvalidResultHandler(response -> holder.closeDialog(onCancel())); @@ -143,8 +149,13 @@ public abstract class Dialog { session.sendDialogForm(createForm(session, Optional.of(inputs), holder).build()); } - protected ParsedInputs parseInput(CustomFormResponse response) { - return new ParsedInputs(inputs, response); + protected Optional parseInput(GeyserSession session, CustomFormResponse response, DialogHolder holder) { + ParsedInputs parsed = new ParsedInputs(inputs, response); + if (parsed.hasErrors()) { + restoreForm(session, parsed, holder); + return Optional.empty(); + } + return Optional.of(parsed); } public static Dialog readDialog(RegistryEntryContext context) { diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java index 330079815..b12a761e6 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java @@ -146,7 +146,7 @@ public class DialogHolder { // Don't run close functionality if we're asking for command confirmation if (dialog.canCloseWithEscape()) { shouldClose = true; - if (runAction(onCancel, lastInputs == null ? ParsedInputs.EMPTY : lastInputs)) { + if (runAction(onCancel, lastInputs == null ? dialog.defaultInputs() : lastInputs)) { manager.close(); } return; @@ -216,7 +216,7 @@ public class DialogHolder { .translator(MinecraftLocale::getLocaleString, manager.session().locale()) .title("gui.waitingForResponse.title") .content(content) - .optionalButton("Back", sendBackButton) + .optionalButton("gui.back", sendBackButton) .closedOrInvalidResultHandler(() -> { if (stillValid()) { // If still waiting on a new dialog waitForResponse(); @@ -229,7 +229,7 @@ public class DialogHolder { /** * This method runs the given action, if present, with the given inputs. * - *

These inputs can be {@link ParsedInputs#EMPTY} when the dialog has no inputs, or the dialog was closed without entering anything, but can never be {@code null}. + *

These inputs can be {@link ParsedInputs#EMPTY} when the dialog has no inputs, but can never be {@code null}. * The method returns {@code true} if the dialog's after action can be executed, and {@code false} if not. The latter is the case when the action opened a new * dialog or screen, in which case the after action will not be handled or be handled by the screen, respectively.

* diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java index 4ac0add5b..789dbfceb 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java @@ -58,13 +58,14 @@ public abstract class DialogWithButtons extends Dialog { builder.dropdown(dropdown); builder.validResultHandler(response -> { - ParsedInputs inputs = parseInput(response); - int selection = response.asDropdown(); - if (selection == buttons.size()) { - holder.runButton(exitAction, inputs); - } else { - holder.runButton(Optional.of(buttons.get(selection)), inputs); - } + parseInput(session, response, holder).ifPresent(inputs -> { + int selection = response.asDropdown(); + if (selection == buttons.size()) { + holder.runButton(exitAction, inputs); + } else { + holder.runButton(Optional.of(buttons.get(selection)), inputs); + } + }); }); } @@ -79,7 +80,6 @@ public abstract class DialogWithButtons extends Dialog { if (response.clickedButtonId() == buttons.size()) { holder.runButton(exitAction, ParsedInputs.EMPTY); } else { - holder.runButton(Optional.of(buttons.get(response.clickedButtonId())), ParsedInputs.EMPTY); } }); diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java index 54c226b80..2c0804133 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java @@ -53,7 +53,7 @@ public class NoticeDialog extends Dialog { @Override protected void addCustomComponents(GeyserSession session, CustomForm.Builder builder, DialogHolder holder) { - builder.validResultHandler(response -> holder.runButton(button, parseInput(response))); + builder.validResultHandler(response -> parseInput(session, response, holder).ifPresent(inputs -> holder.runButton(button, inputs))); } @Override diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/input/BooleanInput.java b/core/src/main/java/org/geysermc/geyser/session/dialog/input/BooleanInput.java index 4051194ad..e2388b970 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/input/BooleanInput.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/input/BooleanInput.java @@ -56,7 +56,7 @@ public class BooleanInput extends DialogInput { } @Override - public Boolean read(CustomFormResponse response) { + public Boolean read(CustomFormResponse response) throws DialogInputParseException { return response.asToggle(); } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/input/DialogInput.java b/core/src/main/java/org/geysermc/geyser/session/dialog/input/DialogInput.java index 9b3817e79..805df0751 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/input/DialogInput.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/input/DialogInput.java @@ -51,7 +51,7 @@ public abstract class DialogInput { public abstract void addComponent(CustomForm.Builder builder, Optional restored); - public abstract T read(CustomFormResponse response); + public abstract T read(CustomFormResponse response) throws DialogInputParseException; public abstract String asSubstitution(T value); diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/input/DialogInputParseException.java b/core/src/main/java/org/geysermc/geyser/session/dialog/input/DialogInputParseException.java new file mode 100644 index 000000000..9542a4c8b --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/input/DialogInputParseException.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.session.dialog.input; + +import lombok.Getter; + +public class DialogInputParseException extends Exception { + + // Exceptions don't work with generics, so we have to do a bit of unsafe casting and assume the object is of the input type :( + @Getter + private final Object partial; + + public DialogInputParseException(String message, Object partial) { + super(message); + this.partial = partial; + } +} diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/input/NumberRangeInput.java b/core/src/main/java/org/geysermc/geyser/session/dialog/input/NumberRangeInput.java index dd08c72a2..a6a2fd41e 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/input/NumberRangeInput.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/input/NumberRangeInput.java @@ -59,7 +59,7 @@ public class NumberRangeInput extends DialogInput { } @Override - public Float read(CustomFormResponse response) { + public Float read(CustomFormResponse response) throws DialogInputParseException { return response.asSlider(); } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/input/ParsedInputs.java b/core/src/main/java/org/geysermc/geyser/session/dialog/input/ParsedInputs.java index a632c9249..c52380ee9 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/input/ParsedInputs.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/input/ParsedInputs.java @@ -30,19 +30,26 @@ import org.cloudburstmc.nbt.NbtMapBuilder; import org.geysermc.cumulus.form.CustomForm; import org.geysermc.cumulus.response.CustomFormResponse; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Optional; public class ParsedInputs { - public static final ParsedInputs EMPTY = new ParsedInputs(List.of(), null); + public static final ParsedInputs EMPTY = new ParsedInputs(List.of()); private final Map, Object> values = new LinkedHashMap<>(); + private final Map, String> errors = new HashMap<>(); public ParsedInputs(List> inputs, CustomFormResponse response) { for (DialogInput input : inputs) { - values.put(input, input.read(response)); + try { + values.put(input, input.read(response)); + } catch (DialogInputParseException exception) { + values.put(input, exception.getPartial()); + errors.put(input, exception.getMessage()); + } } } @@ -54,6 +61,11 @@ public class ParsedInputs { public void restore(CustomForm.Builder builder) { for (Map.Entry, Object> entry : values.entrySet()) { + String error = errors.get(entry.getKey()); + if (error != null) { + builder.label("§cError parsing input data: " + error + "."); + builder.label("§cPlease adjust!"); + } // Can't be a Geyser update without eclipse dealing with generics ((DialogInput) entry.getKey()).addComponent(builder, Optional.of(entry.getValue())); } @@ -75,4 +87,8 @@ public class ParsedInputs { } return builder.build(); } + + public boolean hasErrors() { + return !errors.isEmpty(); + } } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/input/SingleOptionInput.java b/core/src/main/java/org/geysermc/geyser/session/dialog/input/SingleOptionInput.java index f65217edd..f996f3da0 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/input/SingleOptionInput.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/input/SingleOptionInput.java @@ -78,7 +78,7 @@ public class SingleOptionInput extends DialogInput { } @Override - public String read(CustomFormResponse response) { + public String read(CustomFormResponse response) throws DialogInputParseException { return entries.get(response.asDropdown()).id(); } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/input/TextInput.java b/core/src/main/java/org/geysermc/geyser/session/dialog/input/TextInput.java index f9cb983b7..df3ce1029 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/input/TextInput.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/input/TextInput.java @@ -56,11 +56,13 @@ public class TextInput extends DialogInput { } @Override - public String read(CustomFormResponse response) { - String raw = response.asInput(); - assert raw != null; - // Bedrock doesn't support setting a max length, so we just cut it off to not have the server complain - return raw.substring(0, Math.min(raw.length(), maxLength)); + public String read(CustomFormResponse response) throws DialogInputParseException { + String text = response.asInput(); + assert text != null; + if (text.length() > maxLength) { + throw new DialogInputParseException("length of text cannot be above " + maxLength, text); + } + return text; } @Override From 40a922f3b56e9912f03a41fa6d5967405bf03aa1 Mon Sep 17 00:00:00 2001 From: Eclipse Date: Thu, 5 Jun 2025 12:34:45 +0000 Subject: [PATCH 14/62] Small refactor --- .../geyser/session/dialog/Dialog.java | 30 +++++++------- .../geyser/session/dialog/DialogHolder.java | 39 +++++++++++-------- .../geyser/session/dialog/DialogManager.java | 5 +-- .../session/dialog/DialogWithButtons.java | 22 +++++------ .../geyser/session/dialog/NoticeDialog.java | 6 +-- .../session/dialog/action/DialogAction.java | 4 +- 6 files changed, 55 insertions(+), 51 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java index 394478e0d..9f19996b3 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java @@ -112,19 +112,19 @@ public abstract class Dialog { protected abstract Optional onCancel(); - protected FormBuilder, ? extends Form, ? extends FormResponse> createForm(GeyserSession session, Optional restored, DialogHolder holder) { + protected FormBuilder, ? extends Form, ? extends FormResponse> createForm(DialogHolder holder, Optional restored) { if (inputs.isEmpty()) { SimpleForm.Builder builder = SimpleForm.builder() - .translator(MinecraftLocale::getLocaleString, session.locale()) + .translator(MinecraftLocale::getLocaleString, holder.session().locale()) .title(title); builder.content(String.join("\n\n", labels)); builder.closedOrInvalidResultHandler(() -> holder.closeDialog(onCancel())); - addCustomComponents(session, builder, holder); + addCustomComponents(holder, builder); return builder; } else { CustomForm.Builder builder = CustomForm.builder() - .translator(MinecraftLocale::getLocaleString, session.locale()) + .translator(MinecraftLocale::getLocaleString, holder.session().locale()) .title(title); for (String label : labels) { builder.label(label); @@ -132,27 +132,27 @@ public abstract class Dialog { restored.ifPresentOrElse(last -> last.restore(builder), () -> inputs.forEach(input -> input.addComponent(builder))); builder.closedOrInvalidResultHandler(response -> holder.closeDialog(onCancel())); - addCustomComponents(session, builder, holder); + addCustomComponents(holder, builder); return builder; } } - protected abstract void addCustomComponents(GeyserSession session, CustomForm.Builder builder, DialogHolder holder); + protected abstract void addCustomComponents(DialogHolder holder, CustomForm.Builder builder); - protected abstract void addCustomComponents(GeyserSession session, SimpleForm.Builder builder, DialogHolder holder); + protected abstract void addCustomComponents(DialogHolder holder, SimpleForm.Builder builder); - public void sendForm(GeyserSession session, DialogHolder holder) { - session.sendDialogForm(createForm(session, Optional.empty(), holder).build()); + public void sendForm(DialogHolder holder) { + holder.session().sendDialogForm(createForm(holder, Optional.empty()).build()); } - public void restoreForm(GeyserSession session, @NonNull ParsedInputs inputs, DialogHolder holder) { - session.sendDialogForm(createForm(session, Optional.of(inputs), holder).build()); + public void restoreForm(DialogHolder holder, @NonNull ParsedInputs inputs) { + holder.session().sendDialogForm(createForm(holder, Optional.of(inputs)).build()); } - protected Optional parseInput(GeyserSession session, CustomFormResponse response, DialogHolder holder) { + protected Optional parseInput(DialogHolder holder, CustomFormResponse response) { ParsedInputs parsed = new ParsedInputs(inputs, response); if (parsed.hasErrors()) { - restoreForm(session, parsed, holder); + restoreForm(holder, parsed); return Optional.empty(); } return Optional.of(parsed); @@ -176,10 +176,10 @@ public abstract class Dialog { return new Dialog(session, map) { @Override - protected void addCustomComponents(GeyserSession session, CustomForm.Builder builder, DialogHolder holder) {} + protected void addCustomComponents(DialogHolder holder, CustomForm.Builder builder) {} @Override - protected void addCustomComponents(GeyserSession session, SimpleForm.Builder builder, DialogHolder holder) {} + protected void addCustomComponents(DialogHolder holder, SimpleForm.Builder builder) {} @Override protected Optional onCancel() { diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java index b12a761e6..ff617b150 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java @@ -25,11 +25,14 @@ package org.geysermc.geyser.session.dialog; +import lombok.Getter; +import lombok.experimental.Accessors; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.cumulus.form.ModalForm; import org.geysermc.cumulus.form.SimpleForm; +import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.dialog.action.DialogAction; import org.geysermc.geyser.session.dialog.input.ParsedInputs; import org.geysermc.geyser.text.MinecraftLocale; @@ -82,7 +85,10 @@ import java.util.Optional; * *

Final note: when reading through this code, a dialog is "valid" when it is still considered open.

*/ +@Accessors(fluent = true) public class DialogHolder { + @Getter + private final GeyserSession session; private final DialogManager manager; private final Dialog dialog; @@ -100,7 +106,8 @@ public class DialogHolder { private boolean shouldClose = false; private ParsedInputs lastInputs; - public DialogHolder(DialogManager manager, Dialog dialog) { + public DialogHolder(GeyserSession session, DialogManager manager, Dialog dialog) { + this.session = session; this.manager = manager; this.dialog = dialog; } @@ -125,7 +132,7 @@ public class DialogHolder { // Replace wait form with one with a back button if no replacement dialog was given if (responseWaitTime > 0 && !sendBackButton && System.currentTimeMillis() - responseWaitTime > 5000) { sendBackButton = true; - manager.session().closeForm(); // Automatically reopens with a back button + session.closeForm(); // Automatically reopens with a back button } } @@ -170,9 +177,9 @@ public class DialogHolder { // lastInputs might be null here since it's possible none were sent yet // Bedrock doesn't send them when just closing the form if (lastInputs == null) { - dialog.sendForm(manager.session(), this); + dialog.sendForm(this); } else { - dialog.restoreForm(manager.session(), lastInputs, this); + dialog.restoreForm(this, lastInputs); } } } @@ -185,7 +192,7 @@ public class DialogHolder { switch (dialog.afterAction()) { case NONE -> { // If no new dialog was opened, reopen this one - dialog.restoreForm(manager.session(), lastInputs, this); + dialog.restoreForm(this, lastInputs); } case CLOSE -> { // If no new dialog was opened, tell the manager this one is now closed @@ -212,8 +219,8 @@ public class DialogHolder { content += " If no new dialog is shown within 5 seconds, a button will appear to go back to the game."; } - manager.session().sendDialogForm(SimpleForm.builder() - .translator(MinecraftLocale::getLocaleString, manager.session().locale()) + session.sendDialogForm(SimpleForm.builder() + .translator(MinecraftLocale::getLocaleString, session.locale()) .title("gui.waitingForResponse.title") .content(content) .optionalButton("gui.back", sendBackButton) @@ -240,22 +247,22 @@ public class DialogHolder { if (action != null) { // Ask the user for confirmation if the dialog wants to run an unknown command or a command that requires operator permissions if (action instanceof DialogAction.CommandAction runCommand) { - String command = runCommand.trimmedCommand(manager.session(), inputs); + String command = runCommand.trimmedCommand(session, inputs); String root = command.split(" ")[0]; // This check is not perfect. Ideally we'd check the entire command and see if any of its arguments require operator permissions, but, that's complicated - if (manager.session().getRestrictedCommands().contains(root)) { + if (session.getRestrictedCommands().contains(root)) { showCommandConfirmation(command, false); return false; - } else if (!manager.session().getKnownCommands().contains(root)) { + } else if (!session.getKnownCommands().contains(root)) { showCommandConfirmation(command, true); return false; } - manager.session().sendCommand(command); + session.sendCommand(command); return true; } else { - action.run(manager.session(), inputs); + action.run(session, inputs); return !(action instanceof DialogAction.ShowDialog); } } @@ -269,10 +276,10 @@ public class DialogHolder { Component content = Component.translatable(unknown ? "multiplayer.confirm_command.parse_errors" : "multiplayer.confirm_command.permissions_required", Component.text(trimmedCommand).color(NamedTextColor.YELLOW)); - manager.session().sendDialogForm(ModalForm.builder() - .translator(MinecraftLocale::getLocaleString, manager.session().locale()) + session.sendDialogForm(ModalForm.builder() + .translator(MinecraftLocale::getLocaleString, session.locale()) .title("multiplayer.confirm_command.title") - .content(MessageTranslator.convertMessage(manager.session(), content)) + .content(MessageTranslator.convertMessage(session, content)) .button1("gui.yes") .button2("gui.no") .closedOrInvalidResultHandler(() -> { @@ -282,7 +289,7 @@ public class DialogHolder { }) .validResultHandler(response -> { if (response.clickedFirst()) { - manager.session().sendCommand(trimmedCommand); + session.sendCommand(trimmedCommand); if (shouldClose) { manager.close(); } else { diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogManager.java b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogManager.java index c7d70bac5..a3ed4064f 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogManager.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogManager.java @@ -36,7 +36,6 @@ import org.geysermc.mcprotocollib.protocol.data.game.Holder; */ @Accessors(fluent = true) public class DialogManager { - @Getter private final GeyserSession session; @Getter private DialogHolder open; @@ -53,9 +52,9 @@ public class DialogManager { * Opens a new dialog. If a dialog was already open, this one will be closed. Its closing action will not be executed. This matches Java behaviour. */ public void openDialog(Dialog dialog) { - open = new DialogHolder(this, dialog); + open = new DialogHolder(session, this, dialog); session.closeForm(); - dialog.sendForm(session, open); + dialog.sendForm(open); } public void tick() { diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java index 789dbfceb..b676ea43b 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java @@ -48,7 +48,7 @@ public abstract class DialogWithButtons extends Dialog { } @Override - protected void addCustomComponents(GeyserSession session, CustomForm.Builder builder, DialogHolder holder) { + protected void addCustomComponents(DialogHolder holder, CustomForm.Builder builder) { DropdownComponent.Builder dropdown = DropdownComponent.builder(); dropdown.text("Please select an option:"); for (DialogButton button : buttons) { @@ -57,20 +57,18 @@ public abstract class DialogWithButtons extends Dialog { exitAction.ifPresent(button -> dropdown.option(button.label())); builder.dropdown(dropdown); - builder.validResultHandler(response -> { - parseInput(session, response, holder).ifPresent(inputs -> { - int selection = response.asDropdown(); - if (selection == buttons.size()) { - holder.runButton(exitAction, inputs); - } else { - holder.runButton(Optional.of(buttons.get(selection)), inputs); - } - }); - }); + builder.validResultHandler(response -> parseInput(holder, response).ifPresent(inputs -> { + int selection = response.asDropdown(); + if (selection == buttons.size()) { + holder.runButton(exitAction, inputs); + } else { + holder.runButton(Optional.of(buttons.get(selection)), inputs); + } + })); } @Override - protected void addCustomComponents(GeyserSession session, SimpleForm.Builder builder, DialogHolder holder) { + protected void addCustomComponents(DialogHolder holder, SimpleForm.Builder builder) { for (DialogButton button : buttons) { builder.button(button.label()); } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java index 2c0804133..589f24ac4 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/NoticeDialog.java @@ -52,12 +52,12 @@ public class NoticeDialog extends Dialog { } @Override - protected void addCustomComponents(GeyserSession session, CustomForm.Builder builder, DialogHolder holder) { - builder.validResultHandler(response -> parseInput(session, response, holder).ifPresent(inputs -> holder.runButton(button, inputs))); + protected void addCustomComponents(DialogHolder holder, CustomForm.Builder builder) { + builder.validResultHandler(response -> parseInput(holder, response).ifPresent(inputs -> holder.runButton(button, inputs))); } @Override - protected void addCustomComponents(GeyserSession session, SimpleForm.Builder builder, DialogHolder holder) { + protected void addCustomComponents(DialogHolder holder, SimpleForm.Builder builder) { builder.button(button.map(DialogButton::label).orElse("gui.ok")) .validResultHandler(response -> holder.runButton(button, ParsedInputs.EMPTY)); } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java b/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java index 7b40e6ca7..6487bd363 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java @@ -67,6 +67,8 @@ public interface DialogAction { return Optional.empty(); } + void run(GeyserSession session, ParsedInputs inputs); + interface CommandAction extends DialogAction { String command(GeyserSession session, ParsedInputs inputs); @@ -85,8 +87,6 @@ public interface DialogAction { } } - void run(GeyserSession session, ParsedInputs inputs); - record OpenUrl(String url) implements DialogAction { public static final Key TYPE = MinecraftKey.key("open_url"); From 9fbc1d3ab1b41b0b70bc19b8e3bc70d5e3255fcf Mon Sep 17 00:00:00 2001 From: Eclipse Date: Thu, 5 Jun 2025 12:35:47 +0000 Subject: [PATCH 15/62] Implement clear dialog packet --- .../protocol/java/dialogues/JavaClearDialogTranslator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaClearDialogTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaClearDialogTranslator.java index 9b2411a13..306b1bbad 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaClearDialogTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaClearDialogTranslator.java @@ -35,6 +35,6 @@ public class JavaClearDialogTranslator extends PacketTranslator Date: Thu, 5 Jun 2025 13:58:43 +0000 Subject: [PATCH 16/62] Add support for inline elements to GeyserHolderSet --- .../geyser/item/enchantment/Enchantment.java | 6 +- .../cache/registry/RegistryEntryContext.java | 5 +- .../session/cache/tags/GeyserHolderSet.java | 112 ++++++++++++++---- 3 files changed, 92 insertions(+), 31 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/item/enchantment/Enchantment.java b/core/src/main/java/org/geysermc/geyser/item/enchantment/Enchantment.java index e0b4f6e0f..c69c5b2f9 100644 --- a/core/src/main/java/org/geysermc/geyser/item/enchantment/Enchantment.java +++ b/core/src/main/java/org/geysermc/geyser/item/enchantment/Enchantment.java @@ -28,9 +28,7 @@ package org.geysermc.geyser.item.enchantment; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.nbt.NbtMap; import org.geysermc.geyser.inventory.item.BedrockEnchantment; -import org.geysermc.geyser.item.Items; import org.geysermc.geyser.item.type.Item; -import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.session.cache.registry.JavaRegistries; import org.geysermc.geyser.session.cache.registry.RegistryEntryContext; import org.geysermc.geyser.session.cache.tags.GeyserHolderSet; @@ -57,12 +55,12 @@ public record Enchantment(String identifier, NbtMap data = context.data(); Set effects = readEnchantmentComponents(data.getCompound("effects")); - GeyserHolderSet supportedItems = GeyserHolderSet.readHolderSet(context.session(), JavaRegistries.ITEM, data.get("supported_items"), itemId -> Registries.JAVA_ITEM_IDENTIFIERS.getOrDefault(itemId.asString(), Items.AIR).javaId()); + GeyserHolderSet supportedItems = GeyserHolderSet.readHolderSet(context.session(), JavaRegistries.ITEM, data.get("supported_items")); int maxLevel = data.getInt("max_level"); int anvilCost = data.getInt("anvil_cost"); - GeyserHolderSet exclusiveSet = GeyserHolderSet.readHolderSet(context.session(), JavaRegistries.ENCHANTMENT, data.get("exclusive_set"), context::getNetworkId); + GeyserHolderSet exclusiveSet = GeyserHolderSet.readHolderSet(JavaRegistries.ENCHANTMENT, data.get("exclusive_set"), context::getNetworkId); BedrockEnchantment bedrockEnchantment = BedrockEnchantment.getByJavaIdentifier(context.id().asString()); diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/registry/RegistryEntryContext.java b/core/src/main/java/org/geysermc/geyser/session/cache/registry/RegistryEntryContext.java index 415890d95..8b4d21f43 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/registry/RegistryEntryContext.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/registry/RegistryEntryContext.java @@ -41,8 +41,11 @@ import org.geysermc.mcprotocollib.protocol.data.game.RegistryEntry; */ public record RegistryEntryContext(RegistryEntry entry, Object2IntMap keyIdMap, GeyserSession session) { + // TODO: not a fan of this. With JavaRegistryKey#keyToNetworkId now being a thing, I'd rather have that always used, so that registry readers won't have to worry + // about using the right method. This would require pre-populating all data-driven registries with default (probably null) values before actually decoding the data from the registy packet. + // This could also be helpful in the feature when a data-driven registry reader needs to use an element from another data-driven registry public int getNetworkId(Key registryKey) { - return keyIdMap.getOrDefault(registryKey, 0); + return keyIdMap.getOrDefault(registryKey, -1); } public Key id() { diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/GeyserHolderSet.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/GeyserHolderSet.java index 227436efc..283d1b357 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/GeyserHolderSet.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/GeyserHolderSet.java @@ -30,22 +30,30 @@ import lombok.Data; import net.kyori.adventure.key.Key; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; +import org.cloudburstmc.nbt.NbtMap; +import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.cache.TagCache; import org.geysermc.geyser.session.cache.registry.JavaRegistryKey; +import org.geysermc.geyser.util.MinecraftKey; import org.geysermc.mcprotocollib.protocol.data.game.item.component.HolderSet; import java.util.List; import java.util.Objects; +import java.util.function.Function; import java.util.function.ToIntFunction; /** - * Similar to vanilla Minecraft's HolderSets, stores either a tag or a list of IDs (this list can also be represented as a single ID in vanilla HolderSets). + * Similar to vanilla Minecraft's HolderSets, stores either a tag, a list of IDs (this list can also be represented as a single ID in vanilla HolderSets), + * or a list of inline elements (only supported by some HolderSets, and can also be represented as a single inline element in vanilla HolderSets). * - *

Because HolderSets utilise tags, when loading a HolderSet, Geyser must store tags for the registry the HolderSet is for (see {@link JavaRegistryKey}).

+ *

Because HolderSets utilise tags, when loading a HolderSet, Geyser must store tags for the registry the HolderSet is for. This is done for all registries registered in + * {@link org.geysermc.geyser.session.cache.registry.JavaRegistries}.

* *

Use the {@link GeyserHolderSet#readHolderSet} method to easily read a HolderSet from NBT sent by a server. To turn the HolderSet into a list of network IDs, use the {@link GeyserHolderSet#resolveRaw} method. * To turn the HolderSet into a list of objects, use the {@link GeyserHolderSet#resolve} method.

+ * + *

Note that the {@link GeyserHolderSet#resolveRaw(TagCache)} method will fail for inline HolderSets, since inline elements are not registered and as such have no network ID.

*/ @Data public final class GeyserHolderSet { @@ -53,44 +61,64 @@ public final class GeyserHolderSet { private final JavaRegistryKey registry; private final @Nullable Tag tag; private final int @Nullable [] holders; + private final @Nullable List inline; + + private GeyserHolderSet(JavaRegistryKey registry) { + this(registry, IntArrays.EMPTY_ARRAY); + } public GeyserHolderSet(JavaRegistryKey registry, int @NonNull [] holders) { - this(registry, null, holders); + this(registry, null, holders, null); } public GeyserHolderSet(JavaRegistryKey registry, @NonNull Tag tagId) { - this(registry, tagId, null); + this(registry, tagId, null, null); } - private GeyserHolderSet(JavaRegistryKey registry, @Nullable Tag tag, int @Nullable [] holders) { + public GeyserHolderSet(JavaRegistryKey registry, @NonNull List inline) { + this(registry, null, null, inline); + } + + private GeyserHolderSet(JavaRegistryKey registry, @Nullable Tag tag, int @Nullable [] holders, @Nullable List inline) { this.registry = registry; this.tag = tag; this.holders = holders; + this.inline = inline; } /** * Constructs a {@link GeyserHolderSet} from a MCPL HolderSet. */ public static GeyserHolderSet fromHolderSet(JavaRegistryKey registry, @NonNull HolderSet holderSet) { - return new GeyserHolderSet<>(registry, new Tag<>(registry, holderSet.getLocation()), holderSet.getHolders()); + // MCPL HolderSets don't have to support inline elements... for now (TODO CHECK ME) + return new GeyserHolderSet<>(registry, new Tag<>(registry, holderSet.getLocation()), holderSet.getHolders(), null); } /** - * Resolves the HolderSet, and automatically maps the network IDs to their respective object types. If the HolderSet is a list of IDs, this will be returned. If it is a tag, the tag will be resolved from the tag cache. + * Resolves the HolderSet, and automatically maps the network IDs to their respective object types. + * If the HolderSet is a list of IDs, this will be returned. If it is a tag, the tag will be resolved from the tag cache. If it is an inline HolderSet, the list of inline elements will be returned. * * @return the HolderSet turned into a list of objects. */ public List resolve(GeyserSession session) { + if (inline != null) { + return inline; + } return TagCache.mapRawArray(session, resolveRaw(session.getTagCache()), registry); } /** - * Resolves the HolderSet. If the HolderSet is a list of IDs, this will be returned. If it is a tag, the tag will be resolved from the tag cache. + * Resolves the HolderSet into a list of network IDs. If the HolderSet is a list of IDs, this will be returned. If it is a tag, the tag will be resolved from the tag cache. * - * @return the HolderSet turned into a list of objects. + *

If the HolderSet is a list of inline elements, this method will throw! Inline elements are not registered and as such do not have a network ID.

+ * + * @return the HolderSet turned into a list of network IDs. + * @throws IllegalStateException when the HolderSet is a list of inline elements. */ public int[] resolveRaw(TagCache tagCache) { - if (holders != null) { + if (inline != null) { + throw new IllegalStateException("Tried to resolve network IDs of a GeyserHolderSet(registry=" + registry + ") with inline elements!"); + } else if (holders != null) { return holders; } @@ -98,31 +126,63 @@ public final class GeyserHolderSet { } /** - * Reads a HolderSet from an object from NBT. + * Reads a HolderSet from a NBT object. Does not support reading HolderSets that can hold inline values. * - * @param session session, only used for logging purposes. + * @param session the Geyser session. * @param registry the registry the HolderSet contains IDs from. - * @param holderSet the HolderSet as an object from NBT. - * @param keyIdMapping a function that maps resource location IDs in the HolderSet's registry to their network IDs. + * @param holderSet the HolderSet as a NBT object. */ - public static GeyserHolderSet readHolderSet(GeyserSession session, JavaRegistryKey registry, @Nullable Object holderSet, ToIntFunction keyIdMapping) { + public static GeyserHolderSet readHolderSet(GeyserSession session, JavaRegistryKey registry, @Nullable Object holderSet) { + return readHolderSet(registry, holderSet, key -> registry.keyToNetworkId(session, key)); + } + + public static GeyserHolderSet readHolderSet(JavaRegistryKey registry, @Nullable Object holderSet, ToIntFunction idMapper) { + return readHolderSet(registry, holderSet, idMapper, null); + } + + /** + * Reads a HolderSet from a NBT object. When {@code reader} is not null, this method can read HolderSets with inline registry elements as well, using the passed reader to decode + * registry elements. + * + * @param registry the registry the HolderSet contains IDs from. + * @param holderSet the HolderSet as a NBT object. + * @param idMapper a function that maps a key in this registry to its respective network ID. + * @param reader a function that reads an object in the HolderSet's registry, serialised as NBT. When {@code null}, this method doesn't support reading inline HolderSets. + */ + public static GeyserHolderSet readHolderSet(JavaRegistryKey registry, @Nullable Object holderSet, + ToIntFunction idMapper, @Nullable Function reader) { if (holderSet == null) { - return new GeyserHolderSet<>(registry, IntArrays.EMPTY_ARRAY); + return new GeyserHolderSet<>(registry); } - if (holderSet instanceof String stringTag) { - if (stringTag.startsWith("#")) { + // This is technically wrong, some registries might not serialise their elements as a map. However, right now this is only used for dialogs, + // so it works. If this ever changes, we'll have to accommodate for that here + if (holderSet instanceof NbtMap singleInlineElement && reader != null) { + return new GeyserHolderSet<>(registry, List.of(reader.apply(singleInlineElement))); + } if (holderSet instanceof String elementOrTag) { + if (elementOrTag.startsWith("#")) { // Tag - return new GeyserHolderSet<>(registry, new Tag<>(registry, Key.key(stringTag.substring(1)))); // Remove '#' at beginning that indicates tag - } else if (stringTag.isEmpty()) { - return new GeyserHolderSet<>(registry, IntArrays.EMPTY_ARRAY); + return new GeyserHolderSet<>(registry, new Tag<>(registry, MinecraftKey.key(elementOrTag.substring(1)))); // Remove '#' at beginning that indicates a tag + } else if (elementOrTag.isEmpty()) { + return new GeyserHolderSet<>(registry); } - return new GeyserHolderSet<>(registry, new int[]{keyIdMapping.applyAsInt(Key.key(stringTag))}); + return new GeyserHolderSet<>(registry, new int[]{idMapper.applyAsInt(MinecraftKey.key(elementOrTag))}); } else if (holderSet instanceof List list) { - // Assume the list is a list of strings - return new GeyserHolderSet<>(registry, list.stream().map(o -> (String) o).map(Key::key).mapToInt(keyIdMapping).toArray()); + if (list.isEmpty()) { + return new GeyserHolderSet<>(registry); + } else if (list.get(0) instanceof NbtMap) { + if (reader != null) { + return new GeyserHolderSet<>(registry, list.stream().map(o -> (NbtMap) o).map(reader).toList()); + } + } else { + // Assume the list is a list of strings (resource locations) + return new GeyserHolderSet<>(registry, list.stream().map(o -> (String) o).map(Key::key).mapToInt(idMapper).toArray()); + } } - session.getGeyser().getLogger().warning("Failed parsing HolderSet for registry + " + registry + "! Expected either a tag, a string ID or a list of string IDs, found " + holderSet); - return new GeyserHolderSet<>(registry, IntArrays.EMPTY_ARRAY); + + String expected = reader == null ? "either a tag, a string ID, or a list of string IDs" + : "either a tag, a string ID, an inline registry element, a list of string IDs, or a list of inline registry elements"; + GeyserImpl.getInstance().getLogger().warning("Failed parsing HolderSet for registry + " + registry + "! Expected " + expected + ", found " + holderSet); + return new GeyserHolderSet<>(registry); } } From 2e699f4ceed343c85394c5defdeb1e201cd76801 Mon Sep 17 00:00:00 2001 From: Eclipse Date: Thu, 5 Jun 2025 14:29:10 +0000 Subject: [PATCH 17/62] Implement dialog_list type, small refactors with button dialogs --- .../session/cache/tags/GeyserHolderSet.java | 9 +++ .../session/dialog/ConfirmationDialog.java | 18 +++++- .../geyser/session/dialog/Dialog.java | 8 ++- .../geyser/session/dialog/DialogButton.java | 2 +- .../session/dialog/DialogListDialog.java | 57 +++++++++++++++++++ .../session/dialog/DialogWithButtons.java | 19 +++---- .../session/dialog/MultiActionDialog.java | 12 +++- .../session/dialog/ServerLinksDialog.java | 7 ++- .../session/dialog/action/DialogAction.java | 12 ++-- 9 files changed, 123 insertions(+), 21 deletions(-) create mode 100644 core/src/main/java/org/geysermc/geyser/session/dialog/DialogListDialog.java diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/GeyserHolderSet.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/GeyserHolderSet.java index 283d1b357..27fe7a75a 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/GeyserHolderSet.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/GeyserHolderSet.java @@ -128,6 +128,8 @@ public final class GeyserHolderSet { /** * Reads a HolderSet from a NBT object. Does not support reading HolderSets that can hold inline values. * + *

Uses {@link JavaRegistryKey#keyToNetworkId(GeyserSession, Key)} to resolve registry keys to network IDs.

+ * * @param session the Geyser session. * @param registry the registry the HolderSet contains IDs from. * @param holderSet the HolderSet as a NBT object. @@ -136,6 +138,13 @@ public final class GeyserHolderSet { return readHolderSet(registry, holderSet, key -> registry.keyToNetworkId(session, key)); } + /** + * Reads a HolderSet from a NBT object. Does not support reading HolderSets that can hold inline values. + * + * @param registry the registry the HolderSet contains IDs from. + * @param holderSet the HolderSet as a NBT object. + * @param idMapper a function that maps a key in this registry to its respective network ID. + */ public static GeyserHolderSet readHolderSet(JavaRegistryKey registry, @Nullable Object holderSet, ToIntFunction idMapper) { return readHolderSet(registry, holderSet, idMapper, null); } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/ConfirmationDialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/ConfirmationDialog.java index 9ec9be3b3..c8af7f564 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/ConfirmationDialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/ConfirmationDialog.java @@ -30,13 +30,29 @@ import org.cloudburstmc.nbt.NbtMap; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.MinecraftKey; +import java.util.List; import java.util.Optional; public class ConfirmationDialog extends DialogWithButtons { public static final Key TYPE = MinecraftKey.key("confirmation"); + private final DialogButton yes; + private final DialogButton no; + public ConfirmationDialog(GeyserSession session, NbtMap map, IdGetter idGetter) { - super(session, map, parseOptionalList(DialogButton.read(session, map.get("yes"), idGetter), DialogButton.read(session, map.get("no"), idGetter)), Optional.empty()); + super(session, map, Optional.empty()); + yes = DialogButton.read(session, map.get("yes"), idGetter).orElseThrow(); + no = DialogButton.read(session, map.get("no"), idGetter).orElseThrow(); + } + + @Override + protected List buttons(DialogHolder holder) { + return List.of(yes, no); + } + + @Override + protected Optional onCancel() { + return Optional.of(no); } } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java index 9f19996b3..ec2609942 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java @@ -59,8 +59,10 @@ public abstract class Dialog { private static final Key PLAIN_MESSAGE_BODY = MinecraftKey.key("plain_message"); + @Getter private final String title; - private final String externalTitle; + @Getter + private final Optional externalTitle; @Getter private final boolean canCloseWithEscape; @Getter @@ -72,7 +74,7 @@ public abstract class Dialog { protected Dialog(GeyserSession session, NbtMap map) { title = MessageTranslator.convertFromNullableNbtTag(session, map.get("title")); - externalTitle = MessageTranslator.convertFromNullableNbtTag(session, map.get("title")); + externalTitle = Optional.ofNullable(MessageTranslator.convertFromNullableNbtTag(session, map.get("external_title"))); canCloseWithEscape = map.getBoolean("can_close_with_escape", true); afterAction = AfterAction.fromString(map.getString("after_action")); @@ -167,6 +169,8 @@ public abstract class Dialog { Key type = MinecraftKey.key(map.getString("type")); if (type.equals(NoticeDialog.TYPE)) { return new NoticeDialog(session, map, idGetter); + } else if (type.equals(DialogListDialog.TYPE)) { + return new DialogListDialog(session, map, idGetter); } else if (type.equals(ConfirmationDialog.TYPE)) { return new ConfirmationDialog(session, map, idGetter); } else if (type.equals(MultiActionDialog.TYPE)) { diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogButton.java b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogButton.java index ccf5d570a..cab427f29 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogButton.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogButton.java @@ -42,7 +42,7 @@ public record DialogButton(String label, Optional action) { } List buttons = new ArrayList<>(); for (NbtMap map : tag) { - buttons.add(read(session, map, idGetter).orElseThrow()); // Should never throw + buttons.add(read(session, map, idGetter).orElseThrow()); // Should never throw because we know map is a NbtMap } return buttons; } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogListDialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogListDialog.java new file mode 100644 index 000000000..a9ff1fc54 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogListDialog.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.session.dialog; + +import net.kyori.adventure.key.Key; +import org.cloudburstmc.nbt.NbtMap; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.cache.registry.JavaRegistries; +import org.geysermc.geyser.session.cache.tags.GeyserHolderSet; +import org.geysermc.geyser.session.dialog.action.DialogAction; +import org.geysermc.geyser.util.MinecraftKey; + +import java.util.List; +import java.util.Optional; + +public class DialogListDialog extends DialogWithButtons { + + public static final Key TYPE = MinecraftKey.key("dialog_list"); + + private final GeyserHolderSet dialogs; + + public DialogListDialog(GeyserSession session, NbtMap map, IdGetter idGetter) { + super(session, map, readDefaultExitAction(session, map, idGetter)); + dialogs = GeyserHolderSet.readHolderSet(JavaRegistries.DIALOG, map.get("dialogs"), idGetter, dialog -> Dialog.readDialogFromNbt(session, dialog, idGetter)); + } + + @Override + protected List buttons(DialogHolder holder) { + return dialogs.resolve(holder.session()).stream() + .map(dialog -> new DialogButton(dialog.externalTitle().orElseGet(dialog::title), + Optional.of(new DialogAction.ShowDialog(dialog)))) + .toList(); + } +} diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java index b676ea43b..188b10a6b 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java @@ -32,23 +32,24 @@ import org.geysermc.cumulus.form.SimpleForm; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.dialog.input.ParsedInputs; -import java.util.ArrayList; import java.util.List; import java.util.Optional; public abstract class DialogWithButtons extends Dialog { - protected final List buttons; protected final Optional exitAction; - protected DialogWithButtons(GeyserSession session, NbtMap map, List buttons, Optional exitAction) { + protected DialogWithButtons(GeyserSession session, NbtMap map, Optional exitAction) { super(session, map); - this.buttons = buttons; this.exitAction = exitAction; } + protected abstract List buttons(DialogHolder holder); + @Override protected void addCustomComponents(DialogHolder holder, CustomForm.Builder builder) { + List buttons = buttons(holder); + DropdownComponent.Builder dropdown = DropdownComponent.builder(); dropdown.text("Please select an option:"); for (DialogButton button : buttons) { @@ -69,6 +70,7 @@ public abstract class DialogWithButtons extends Dialog { @Override protected void addCustomComponents(DialogHolder holder, SimpleForm.Builder builder) { + List buttons = buttons(holder); for (DialogButton button : buttons) { builder.button(button.label()); } @@ -88,12 +90,7 @@ public abstract class DialogWithButtons extends Dialog { return exitAction; } - @SafeVarargs - protected static List parseOptionalList(Optional... buttons) { - List checked = new ArrayList<>(); - for (Optional button : buttons) { - checked.add(button.orElseThrow()); - } - return checked; + protected static Optional readDefaultExitAction(GeyserSession session, NbtMap map, IdGetter idGetter) { + return DialogButton.read(session, map.get("exit_action"), idGetter); } } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/MultiActionDialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/MultiActionDialog.java index c8c2e1f50..522a6c7b9 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/MultiActionDialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/MultiActionDialog.java @@ -31,11 +31,21 @@ import org.cloudburstmc.nbt.NbtType; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.MinecraftKey; +import java.util.List; + public class MultiActionDialog extends DialogWithButtons { public static final Key TYPE = MinecraftKey.key("multi_action"); + private final List buttons; + protected MultiActionDialog(GeyserSession session, NbtMap map, IdGetter idGetter) { - super(session, map, DialogButton.readList(session, map.getList("actions", NbtType.COMPOUND), idGetter), DialogButton.read(session, map.get("exit_action"), idGetter)); + super(session, map, readDefaultExitAction(session, map, idGetter)); + buttons = DialogButton.readList(session, map.getList("actions", NbtType.COMPOUND), idGetter); + } + + @Override + protected List buttons(DialogHolder holder) { + return buttons; } } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/ServerLinksDialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/ServerLinksDialog.java index c33c81941..8c6a23ef3 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/ServerLinksDialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/ServerLinksDialog.java @@ -34,6 +34,11 @@ import java.util.Optional; public class ServerLinksDialog extends DialogWithButtons { protected ServerLinksDialog(GeyserSession session, NbtMap map, List buttons) { - super(session, map, buttons, Optional.empty()); + super(session, map, Optional.empty()); + } + + @Override + protected List buttons(DialogHolder holder) { + return List.of(); } } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java b/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java index 6487bd363..0cefdd7ea 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java @@ -108,22 +108,26 @@ public interface DialogAction { } } - record ShowDialog(Holder dialog) implements DialogAction { + record ShowDialog(Optional dialog, Holder holder) implements DialogAction { public static final Key TYPE = MinecraftKey.key("show_dialog"); + public ShowDialog(Dialog dialog) { + this(Optional.of(dialog), null); + } + private static ShowDialog read(Object dialog, Dialog.IdGetter idGetter) { if (dialog instanceof NbtMap map) { - return new ShowDialog(Holder.ofCustom(map)); + return new ShowDialog(Optional.empty(), Holder.ofCustom(map)); } else if (dialog instanceof String string) { - return new ShowDialog(Holder.ofId(idGetter.applyAsInt(MinecraftKey.key(string)))); + return new ShowDialog(Optional.empty(), Holder.ofId(idGetter.applyAsInt(MinecraftKey.key(string)))); } throw new IllegalArgumentException("Expected dialog in show_dialog action to be a NBT map or a resource location"); } @Override public void run(GeyserSession session, ParsedInputs inputs) { - session.getDialogManager().openDialog(dialog); + dialog.ifPresentOrElse(normal -> session.getDialogManager().openDialog(normal), () -> session.getDialogManager().openDialog(holder)); } } From 68e3667f5fc09fc7f988c44526a1234a61e9a3c9 Mon Sep 17 00:00:00 2001 From: Eclipse Date: Thu, 5 Jun 2025 15:05:38 +0000 Subject: [PATCH 18/62] Implement server_links type --- .../geyser/session/GeyserSession.java | 13 ++++++ .../geyser/session/dialog/Dialog.java | 22 +++------- .../session/dialog/ServerLinksDialog.java | 25 ++++++++++-- .../java/JavaServerLinksTranslator.java | 40 +++++++++++++++++++ 4 files changed, 80 insertions(+), 20 deletions(-) create mode 100644 core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaServerLinksTranslator.java diff --git a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java index bc612d7af..a6b32a1db 100644 --- a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java +++ b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java @@ -195,6 +195,7 @@ import org.geysermc.mcprotocollib.protocol.ClientListener; import org.geysermc.mcprotocollib.protocol.MinecraftConstants; import org.geysermc.mcprotocollib.protocol.MinecraftProtocol; import org.geysermc.mcprotocollib.protocol.data.ProtocolState; +import org.geysermc.mcprotocollib.protocol.data.game.ServerLink; import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.Pose; import org.geysermc.mcprotocollib.protocol.data.game.entity.object.Direction; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.GameMode; @@ -311,8 +312,20 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { @Getter private final DialogManager dialogManager = new DialogManager(this); + /** + * A list of links sent to us by the server in the server links packet. + */ + @Setter + private List serverLinks = List.of(); + + /** + * A list of commands known to the client. These are all the commands that have been sent to us by the server. + */ @Setter private List knownCommands = List.of(); + /** + * A list of "restricted" commands known to the client. These are all the commands that have been sent to us by the server, and require some sort of elevated permissions. + */ @Setter private List restrictedCommands = List.of(); diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java index ec2609942..06f986486 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java @@ -165,32 +165,20 @@ public abstract class Dialog { } public static Dialog readDialogFromNbt(GeyserSession session, NbtMap map, IdGetter idGetter) { - // TYPES: notice, server_links, dialog_list, multi_action, confirmation Key type = MinecraftKey.key(map.getString("type")); if (type.equals(NoticeDialog.TYPE)) { return new NoticeDialog(session, map, idGetter); + } else if (type.equals(ServerLinksDialog.TYPE)) { + return new ServerLinksDialog(session, map, idGetter); } else if (type.equals(DialogListDialog.TYPE)) { return new DialogListDialog(session, map, idGetter); - } else if (type.equals(ConfirmationDialog.TYPE)) { - return new ConfirmationDialog(session, map, idGetter); } else if (type.equals(MultiActionDialog.TYPE)) { return new MultiActionDialog(session, map, idGetter); + } else if (type.equals(ConfirmationDialog.TYPE)) { + return new ConfirmationDialog(session, map, idGetter); } - return new Dialog(session, map) { - - @Override - protected void addCustomComponents(DialogHolder holder, CustomForm.Builder builder) {} - - @Override - protected void addCustomComponents(DialogHolder holder, SimpleForm.Builder builder) {} - - @Override - protected Optional onCancel() { - return Optional.empty(); - } - }; - // throw new UnsupportedOperationException("Unable to read unknown dialog type " + type + "!"); // TODO put this here once all types are implemented + throw new UnsupportedOperationException("Unable to read unknown dialog type " + type + "!"); } public static Dialog getDialogFromHolder(GeyserSession session, Holder holder) { diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/ServerLinksDialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/ServerLinksDialog.java index 8c6a23ef3..c98d7b6e8 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/ServerLinksDialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/ServerLinksDialog.java @@ -25,20 +25,39 @@ package org.geysermc.geyser.session.dialog; +import net.kyori.adventure.key.Key; import org.cloudburstmc.nbt.NbtMap; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.dialog.action.DialogAction; +import org.geysermc.geyser.translator.text.MessageTranslator; +import org.geysermc.geyser.util.MinecraftKey; +import org.geysermc.mcprotocollib.protocol.data.game.ServerLink; +import org.geysermc.mcprotocollib.protocol.data.game.ServerLinkType; import java.util.List; +import java.util.Locale; import java.util.Optional; public class ServerLinksDialog extends DialogWithButtons { - protected ServerLinksDialog(GeyserSession session, NbtMap map, List buttons) { - super(session, map, Optional.empty()); + public static final Key TYPE = MinecraftKey.key("server_links"); + + protected ServerLinksDialog(GeyserSession session, NbtMap map, IdGetter idGetter) { + super(session, map, readDefaultExitAction(session, map, idGetter)); } @Override protected List buttons(DialogHolder holder) { - return List.of(); + return holder.session().getServerLinks().stream() + .map(link -> new DialogButton(linkDisplayName(holder, link), Optional.of(new DialogAction.OpenUrl(link.link())))) + .toList(); + } + + private static String linkDisplayName(DialogHolder holder, ServerLink link) { + if (link.knownType() != null) { + String linkName = link.knownType() == ServerLinkType.BUG_REPORT ? "report_bug" : link.knownType().name().toLowerCase(Locale.ROOT); + return "known_server_link." + linkName; + } + return MessageTranslator.convertMessage(holder.session(), link.unknownType()); } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaServerLinksTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaServerLinksTranslator.java new file mode 100644 index 000000000..e6606f826 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaServerLinksTranslator.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.translator.protocol.java; + +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.translator.protocol.PacketTranslator; +import org.geysermc.geyser.translator.protocol.Translator; +import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ClientboundServerLinksPacket; + +@Translator(packet = ClientboundServerLinksPacket.class) +public class JavaServerLinksTranslator extends PacketTranslator { + + @Override + public void translate(GeyserSession session, ClientboundServerLinksPacket packet) { + session.setServerLinks(packet.getLinks()); + } +} From ff65d9040b7a9e97aa1355ae0a9b7b6d8f8ddf11 Mon Sep 17 00:00:00 2001 From: Eclipse Date: Thu, 5 Jun 2025 15:20:16 +0000 Subject: [PATCH 19/62] Proper URL form --- .../geyser/session/dialog/DialogHolder.java | 36 ++++++++++++++++++- .../session/dialog/action/DialogAction.java | 3 +- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java index ff617b150..88a9543a1 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java @@ -261,6 +261,9 @@ public class DialogHolder { session.sendCommand(command); return true; + } else if (action instanceof DialogAction.OpenUrl openUrl) { + showUrl(openUrl.url()); + return false; } else { action.run(session, inputs); return !(action instanceof DialogAction.ShowDialog); @@ -270,7 +273,8 @@ public class DialogHolder { } /** - * Opens an "are you sure you want to do this?" form. This method assumes the dialog is still valid! + * Opens an "are you sure you want to do this?" form. After confirmation, runs the command and the after action, or closes + * the dialog if it should be closed. When cancelled, returns back to the dialog, matching Java behaviour. This method assumes the dialog is still valid! */ private void showCommandConfirmation(String trimmedCommand, boolean unknown) { Component content = Component.translatable(unknown ? "multiplayer.confirm_command.parse_errors" : "multiplayer.confirm_command.permissions_required", @@ -285,9 +289,11 @@ public class DialogHolder { .closedOrInvalidResultHandler(() -> { // Upon pressing "no" (or closing the form), we should return back to the dialog, even if it was supposed to close shouldClose = false; + // Checks stillValid reopenDialog(); }) .validResultHandler(response -> { + // stillValid check not needed here - valid result means the button was pressed, meaning no new dialog took over and closed this form if (response.clickedFirst()) { session.sendCommand(trimmedCommand); if (shouldClose) { @@ -304,6 +310,34 @@ public class DialogHolder { .build()); } + /** + * Opens a form to let the user know they should open a URL. Runs the after action when closed, or closes the dialog if it should be + * closed. This method assumes the dialog is still valid! + */ + private void showUrl(String url) { + String content = MessageTranslator.convertMessage(session, + Component.text("The server is asking you to open the following URL:\n\n") + .append(Component.text(url)) + .append(Component.text("\n\n")) + .append(Component.translatable("chat.link.warning").color(NamedTextColor.RED))); + + session.sendDialogForm(SimpleForm.builder() + .translator(MinecraftLocale::getLocaleString, session.locale()) + .title("Open URL") + .content(content) + .button("gui.ok") + .resultHandler((form, result) -> { + if (stillValid()) { + if (shouldClose) { + manager.close(); + } else { + runAfterAction(); + } + } + }) + .build()); + } + /** * @return true if the dialog currently open is this dialog. */ diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java b/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java index 0cefdd7ea..2b9a4d44d 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/action/DialogAction.java @@ -93,8 +93,7 @@ public interface DialogAction { @Override public void run(GeyserSession session, ParsedInputs inputs) { - //session.sendForm(SimpleForm.builder().title("Open URL").content(url)); - // TODO if we use form here we need a connection in dialog stack + throw new IllegalCallerException("Should be implemented elsewhere to open a form"); } } From c92c7065580b95be3c3745008ab34ea4b6e90b4b Mon Sep 17 00:00:00 2001 From: Eclipse Date: Fri, 6 Jun 2025 10:32:23 +0000 Subject: [PATCH 20/62] Implement dialog configuration packet --- .../dialogues/JavaShowDialogueConfigurationTranslator.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaShowDialogueConfigurationTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaShowDialogueConfigurationTranslator.java index 1cd2de17d..c3663f033 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaShowDialogueConfigurationTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/dialogues/JavaShowDialogueConfigurationTranslator.java @@ -28,6 +28,7 @@ package org.geysermc.geyser.translator.protocol.java.dialogues; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; +import org.geysermc.mcprotocollib.protocol.data.game.Holder; import org.geysermc.mcprotocollib.protocol.packet.configuration.clientbound.ClientboundShowDialogConfigurationPacket; @Translator(packet = ClientboundShowDialogConfigurationPacket.class) @@ -35,6 +36,9 @@ public class JavaShowDialogueConfigurationTranslator extends PacketTranslator Date: Fri, 6 Jun 2025 11:53:01 +0000 Subject: [PATCH 21/62] Turn daylight cycle off when showing configuration dialog, send empty chunks when starting configuration --- .../main/java/org/geysermc/geyser/session/GeyserSession.java | 2 +- .../protocol/java/JavaStartConfigurationTranslator.java | 3 +++ .../dialogues/JavaShowDialogueConfigurationTranslator.java | 4 ++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java index a6b32a1db..009d3841d 100644 --- a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java +++ b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java @@ -1823,7 +1823,7 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { /** * Changes the daylight cycle gamerule on the client - * This is used in the login screen along-side normal usage + * This is used in login and configuration screens along-side normal usage * * @param doCycle If the cycle should continue */ diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaStartConfigurationTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaStartConfigurationTranslator.java index 08d147a26..ca0c2d047 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaStartConfigurationTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaStartConfigurationTranslator.java @@ -29,6 +29,7 @@ import org.geysermc.geyser.erosion.GeyserboundHandshakePacketHandler; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.protocol.PacketTranslator; import org.geysermc.geyser.translator.protocol.Translator; +import org.geysermc.geyser.util.ChunkUtils; import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.ClientboundStartConfigurationPacket; @Translator(packet = ClientboundStartConfigurationPacket.class) @@ -42,5 +43,7 @@ public class JavaStartConfigurationTranslator extends PacketTranslator Date: Fri, 6 Jun 2025 11:55:51 +0000 Subject: [PATCH 22/62] JavaRegistryKey refactor, add command to open custom options dialog --- .../geyser/command/CommandRegistry.java | 3 + .../defaults/CustomOptionsCommand.java | 63 ++++++++++++++ .../entity/type/ThrowableEggEntity.java | 2 +- .../type/living/animal/VariantHolder.java | 2 +- .../item/hashing/DataComponentHashers.java | 2 +- .../geyser/item/hashing/RegistryHasher.java | 4 +- .../geyser/registry/ListRegistry.java | 2 +- .../geyser/session/cache/TagCache.java | 6 +- .../cache/registry/JavaRegistries.java | 53 +++++------- .../cache/registry/JavaRegistryKey.java | 85 +++++++++++-------- .../cache/registry/RegistryEntryContext.java | 2 +- .../geyser/session/cache/tags/DialogTag.java | 41 +++++++++ .../session/cache/tags/GeyserHolderSet.java | 4 +- .../geyser/session/dialog/BuiltInDialog.java | 42 +++++++++ .../geyser/session/dialog/Dialog.java | 8 +- .../geyser/session/dialog/DialogManager.java | 5 ++ 16 files changed, 245 insertions(+), 79 deletions(-) create mode 100644 core/src/main/java/org/geysermc/geyser/command/defaults/CustomOptionsCommand.java create mode 100644 core/src/main/java/org/geysermc/geyser/session/cache/tags/DialogTag.java create mode 100644 core/src/main/java/org/geysermc/geyser/session/dialog/BuiltInDialog.java diff --git a/core/src/main/java/org/geysermc/geyser/command/CommandRegistry.java b/core/src/main/java/org/geysermc/geyser/command/CommandRegistry.java index 838ab71b1..dec837f55 100644 --- a/core/src/main/java/org/geysermc/geyser/command/CommandRegistry.java +++ b/core/src/main/java/org/geysermc/geyser/command/CommandRegistry.java @@ -45,6 +45,7 @@ import org.geysermc.geyser.api.util.TriState; import org.geysermc.geyser.command.defaults.AdvancedTooltipsCommand; import org.geysermc.geyser.command.defaults.AdvancementsCommand; import org.geysermc.geyser.command.defaults.ConnectionTestCommand; +import org.geysermc.geyser.command.defaults.CustomOptionsCommand; import org.geysermc.geyser.command.defaults.DumpCommand; import org.geysermc.geyser.command.defaults.ExtensionsCommand; import org.geysermc.geyser.command.defaults.HelpCommand; @@ -163,6 +164,8 @@ public class CommandRegistry implements EventRegistrar { registerBuiltInCommand(new AdvancedTooltipsCommand("tooltips", "geyser.commands.advancedtooltips.desc", "geyser.command.tooltips")); registerBuiltInCommand(new ConnectionTestCommand(geyser, "connectiontest", "geyser.commands.connectiontest.desc", "geyser.command.connectiontest")); registerBuiltInCommand(new PingCommand("ping", "geyser.commands.ping.desc", "geyser.command.ping")); + registerBuiltInCommand(new CustomOptionsCommand("options", "Opens the custom options dialog provided by the server, if any", "geyser.command.options")); + if (this.geyser.getPlatformType() == PlatformType.STANDALONE) { registerBuiltInCommand(new StopCommand(geyser, "stop", "geyser.commands.stop.desc", "geyser.command.stop")); } diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/CustomOptionsCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/CustomOptionsCommand.java new file mode 100644 index 000000000..c434ac5c4 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/CustomOptionsCommand.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.command.defaults; + +import net.kyori.adventure.text.Component; +import org.geysermc.geyser.api.util.TriState; +import org.geysermc.geyser.command.GeyserCommand; +import org.geysermc.geyser.command.GeyserCommandSource; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.cache.tags.DialogTag; +import org.geysermc.geyser.session.dialog.BuiltInDialog; +import org.geysermc.geyser.session.dialog.Dialog; +import org.incendo.cloud.context.CommandContext; + +import java.util.List; +import java.util.Objects; + +public class CustomOptionsCommand extends GeyserCommand { + + public CustomOptionsCommand(String name, String description, String permission) { + super(name, description, permission, TriState.TRUE, true, true); + } + + @Override + public void execute(CommandContext context) { + GeyserSession session = Objects.requireNonNull(context.sender().connection()); + List additions = session.getTagCache().get(DialogTag.PAUSE_SCREEN_ADDITIONS); + if (additions.isEmpty()) { + if (session.getServerLinks().isEmpty()) { + context.sender().sendMessage(Component.text("The server has not provided any custom options")); + } else { + session.getDialogManager().openDialog(BuiltInDialog.SERVER_LINKS); + } + } else if (additions.size() == 1) { + session.getDialogManager().openDialog(additions.get(0)); + } else { + session.getDialogManager().openDialog(BuiltInDialog.CUSTOM_OPTIONS); + } + } +} diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/ThrowableEggEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/ThrowableEggEntity.java index e86265ded..d083b7432 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/ThrowableEggEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/ThrowableEggEntity.java @@ -63,7 +63,7 @@ public class ThrowableEggEntity extends ThrowableItemEntity { private static String getVariantOrFallback(GeyserSession session, GeyserItemStack stack) { Holder holder = stack.getComponent(DataComponentTypes.CHICKEN_VARIANT); if (holder != null) { - Key chickenVariant = holder.getOrCompute(id -> JavaRegistries.CHICKEN_VARIANT.keyFromNetworkId(session, id)); + Key chickenVariant = holder.getOrCompute(id -> JavaRegistries.CHICKEN_VARIANT.key(session, id)); for (var variant : TemperatureVariantAnimal.BuiltInVariant.values()) { if (chickenVariant.asMinimalString().equalsIgnoreCase(variant.name())) { return chickenVariant.asMinimalString().toLowerCase(Locale.ROOT); diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/VariantHolder.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/VariantHolder.java index 3936ca81a..c47480563 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/VariantHolder.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/VariantHolder.java @@ -55,7 +55,7 @@ public interface VariantHolder { * Sets the variant of the entity. */ default void setVariantFromJavaId(int variant) { - setBedrockVariant(variantRegistry().fromNetworkId(getSession(), variant)); + setBedrockVariant(variantRegistry().value(getSession(), variant)); } GeyserSession getSession(); diff --git a/core/src/main/java/org/geysermc/geyser/item/hashing/DataComponentHashers.java b/core/src/main/java/org/geysermc/geyser/item/hashing/DataComponentHashers.java index b1ee34ee9..dc03532db 100644 --- a/core/src/main/java/org/geysermc/geyser/item/hashing/DataComponentHashers.java +++ b/core/src/main/java/org/geysermc/geyser/item/hashing/DataComponentHashers.java @@ -255,7 +255,7 @@ public class DataComponentHashers { register(DataComponentTypes.PIG_VARIANT, RegistryHasher.PIG_VARIANT); register(DataComponentTypes.COW_VARIANT, RegistryHasher.COW_VARIANT); register(DataComponentTypes.CHICKEN_VARIANT, MinecraftHasher.KEY - .sessionCast((session, holder) -> holder.getOrCompute(id -> JavaRegistries.CHICKEN_VARIANT.keyFromNetworkId(session, id)))); // Why, Mojang? + .sessionCast((session, holder) -> holder.getOrCompute(id -> JavaRegistries.CHICKEN_VARIANT.key(session, id)))); // Why, Mojang? register(DataComponentTypes.FROG_VARIANT, RegistryHasher.FROG_VARIANT); register(DataComponentTypes.HORSE_VARIANT, RegistryHasher.HORSE_VARIANT); register(DataComponentTypes.PAINTING_VARIANT, RegistryHasher.PAINTING_VARIANT.holder()); diff --git a/core/src/main/java/org/geysermc/geyser/item/hashing/RegistryHasher.java b/core/src/main/java/org/geysermc/geyser/item/hashing/RegistryHasher.java index b56bc9e67..9b4022cb3 100644 --- a/core/src/main/java/org/geysermc/geyser/item/hashing/RegistryHasher.java +++ b/core/src/main/java/org/geysermc/geyser/item/hashing/RegistryHasher.java @@ -349,12 +349,12 @@ public interface RegistryHasher extends MinecraftHasher { .accept("min_ticks_in_hive", INT, BeehiveOccupant::getMinTicksInHive)); /** - * Creates a hasher that uses the {@link JavaRegistryKey#keyFromNetworkId(GeyserSession, int)} method to turn a network ID into a {@link Key}, and then encodes this key. + * Creates a hasher that uses the {@link JavaRegistryKey#key(GeyserSession, int)} method to turn a network ID into a {@link Key}, and then encodes this key. * * @param registry the registry to create a hasher for. */ static RegistryHasher registry(JavaRegistryKey registry) { - MinecraftHasher hasher = KEY.sessionCast(registry::keyFromNetworkId); + MinecraftHasher hasher = KEY.sessionCast(registry::key); return hasher::hash; } diff --git a/core/src/main/java/org/geysermc/geyser/registry/ListRegistry.java b/core/src/main/java/org/geysermc/geyser/registry/ListRegistry.java index d1d3d7af0..084835c2e 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/ListRegistry.java +++ b/core/src/main/java/org/geysermc/geyser/registry/ListRegistry.java @@ -56,7 +56,7 @@ public class ListRegistry extends Registry> { */ @Nullable public M get(int index) { - if (index >= this.mappings.size()) { + if (index < 0 || index >= this.mappings.size()) { return null; } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java index bb4ec226c..ab501cc68 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java @@ -110,7 +110,7 @@ public final class TagCache { } public boolean is(Tag tag, T object) { - return contains(getRaw(tag), tag.registry().toNetworkId(session, object)); + return contains(getRaw(tag), tag.registry().networkId(session, object)); } /** @@ -127,7 +127,7 @@ public final class TagCache { if (holderSet == null || object == null) { return false; } - return contains(holderSet.resolveRaw(this), holderSet.getRegistry().toNetworkId(session, object)); + return contains(holderSet.resolveRaw(this), holderSet.getRegistry().networkId(session, object)); } /** @@ -173,7 +173,7 @@ public final class TagCache { * Maps a raw array of network IDs to their respective objects. */ public static List mapRawArray(GeyserSession session, int[] array, JavaRegistryKey registry) { - return Arrays.stream(array).mapToObj(i -> registry.fromNetworkId(session, i)).toList(); + return Arrays.stream(array).mapToObj(i -> registry.value(session, i)).toList(); } private static boolean contains(int[] array, int i) { diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistries.java b/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistries.java index 0436d24ce..722c65ac0 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistries.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistries.java @@ -51,6 +51,7 @@ import org.geysermc.mcprotocollib.protocol.data.game.chat.ChatType; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.Optional; /** @@ -93,7 +94,7 @@ public class JavaRegistries { } private static JavaRegistryKey createHardcoded(String key, ListRegistry registry, RegistryNetworkMapper networkSerializer, - RegistryIdentifierMapper identifierMapper, RegistryIdMapper idMapper) { + RegistryIdentifierMapper identifierMapper, RegistryIdMapper idMapper) { return create(key, new HardcodedLookup<>(registry, networkSerializer, identifierMapper, idMapper)); } @@ -124,63 +125,53 @@ public class JavaRegistries { } @FunctionalInterface - interface RegistryIdMapper { + interface RegistryIdMapper { int get(Key key); } private record HardcodedLookup(ListRegistry registry, RegistryNetworkMapper networkMapper, RegistryIdentifierMapper identifierMapper, - RegistryIdMapper idMapper) implements JavaRegistryKey.RegistryLookup { + RegistryIdMapper idMapper) implements JavaRegistryKey.RegistryLookup { @Override - public int toNetworkId(GeyserSession session, JavaRegistryKey registryKey, T object) { - return networkMapper.get(object); + public Optional> entry(GeyserSession session, JavaRegistryKey registryKey, int networkId) { + return Optional.ofNullable(registry.get(networkId)) + .map(value -> new RegistryEntryData<>(networkId, Objects.requireNonNull(identifierMapper.get(value)), value)); } @Override - public @Nullable T fromNetworkId(GeyserSession session, JavaRegistryKey registryKey, int id) { - return registry.get(id); + public Optional> entry(GeyserSession session, JavaRegistryKey registryKey, Key key) { + int id = idMapper.get(key); + return Optional.ofNullable(registry.get(id)).map(value -> new RegistryEntryData<>(id, key, value)); } @Override - public int keyToNetworkId(GeyserSession session, JavaRegistryKey registryKey, Key key) { - return idMapper.get(key); - } - - @Override - public @Nullable Key keyFromNetworkId(GeyserSession session, JavaRegistryKey registryKey, int id) { - return identifierMapper.get(registry.get(id)); + public Optional> entry(GeyserSession session, JavaRegistryKey registryKey, T object) { + int id = networkMapper.get(object); + return Optional.ofNullable(registry.get(id)) + .map(value -> new RegistryEntryData<>(id, Objects.requireNonNull(identifierMapper.get(value)), value)); } } private static class RegistryCacheLookup implements JavaRegistryKey.RegistryLookup { @Override - public int toNetworkId(GeyserSession session, JavaRegistryKey registry, T object) { - return session.getRegistryCache().registry(registry).byValue(object); + public Optional> entry(GeyserSession session, JavaRegistryKey registryKey, int networkId) { + return Optional.ofNullable(registry(session, registryKey).entryById(networkId)); } @Override - public @Nullable T fromNetworkId(GeyserSession session, JavaRegistryKey registry, int networkId) { - return session.getRegistryCache().registry(registry).byId(networkId); + public Optional> entry(GeyserSession session, JavaRegistryKey registryKey, Key key) { + return Optional.ofNullable(registry(session, registryKey).entryByKey(key)); } @Override - public int keyToNetworkId(GeyserSession session, JavaRegistryKey registry, Key key) { - RegistryEntryData entry = session.getRegistryCache().registry(registry).entryByKey(key); - if (entry != null) { - return entry.id(); - } - return -1; + public Optional> entry(GeyserSession session, JavaRegistryKey registryKey, T object) { + return Optional.ofNullable(registry(session, registryKey).entryByValue(object)); } - @Override - public @Nullable Key keyFromNetworkId(GeyserSession session, JavaRegistryKey registry, int networkId) { - RegistryEntryData entry = session.getRegistryCache().registry(registry).entryById(networkId); - if (entry != null) { - return entry.key(); - } - return null; + private JavaRegistry registry(GeyserSession session, JavaRegistryKey key) { + return session.getRegistryCache().registry(key); } } } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistryKey.java b/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistryKey.java index 9f416d4fd..47d532603 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistryKey.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/registry/JavaRegistryKey.java @@ -30,6 +30,8 @@ import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.session.GeyserSession; +import java.util.Optional; + /** * Defines a Java registry, which can be hardcoded or data-driven. This class doesn't store registry contents itself, that is handled by {@link org.geysermc.geyser.session.cache.RegistryCache} in the case of * data-driven registries and other classes in the case of hardcoded registries. @@ -37,63 +39,78 @@ import org.geysermc.geyser.session.GeyserSession; *

This class is used when, for a Java registry, data-driven objects and/or tags need to be loaded. Only one instance of this class should be created for each Java registry. Instances of this * class are kept in {@link JavaRegistries}, which also has useful methods for creating instances of this class.

* + *

This class has a few handy utility methods to convert between the various representations of an object in a registry (network ID, resource location/key, value).

+ * * @param registryKey the registry key, as it appears on Java. - * @param registryLookup an implementation of {@link RegistryLookup} that converts an object in this registry to its respective network ID or key, and back. + * @param lookup an implementation of {@link RegistryLookup} that converts an object in this registry to its respective network ID or key, and back. * @param the object type this registry holds. */ -public record JavaRegistryKey(Key registryKey, RegistryLookup registryLookup) { +public record JavaRegistryKey(Key registryKey, RegistryLookup lookup) { /** - * Converts an object in this registry to its network ID, or -1 if it is not registered. + * Converts an object to its network ID, or -1 if it is not registered. */ - public int toNetworkId(GeyserSession session, T object) { - return registryLookup.toNetworkId(session, this, object); + public int networkId(GeyserSession session, T object) { + return entry(session, object).map(RegistryEntryData::id).orElse(-1); + } + + /** + * Converts a registered key to its network ID, or -1 if it is not registered. + */ + public int networkId(GeyserSession session, Key key) { + return entry(session, key).map(RegistryEntryData::id).orElse(-1); + } + + /** + * Converts an object to its registered key, or null if it is not registered. + */ + public @Nullable Key key(GeyserSession session, T object) { + return entry(session, object).map(RegistryEntryData::key).orElse(null); + } + + /** + * Converts a network ID to its registered key, or null if it is not registered. + */ + public @Nullable Key key(GeyserSession session, int networkId) { + return entry(session, networkId).map(RegistryEntryData::key).orElse(null); } /** * Converts a network ID to an object in this registry, or null if it is not registered. */ - public @Nullable T fromNetworkId(GeyserSession session, int networkId) { - return registryLookup.fromNetworkId(session, this, networkId); + public @Nullable T value(GeyserSession session, int networkId) { + return entry(session, networkId).map(RegistryEntryData::data).orElse(null); } /** - * Converts a key registered under this registry to its network ID, or -1 if it is not registered. + * Converts a key to an object in this registry, or null if it is not registered. */ - public int keyToNetworkId(GeyserSession session, Key key) { - return registryLookup.keyToNetworkId(session, this, key); + public @Nullable T value(GeyserSession session, Key key) { + return entry(session, key).map(RegistryEntryData::data).orElse(null); + } + + private Optional> entry(GeyserSession session, T object) { + return lookup.entry(session, this, object); + } + + private Optional> entry(GeyserSession session, int networkId) { + return lookup.entry(session, this, networkId); + } + + private Optional> entry(GeyserSession session, Key key) { + return lookup.entry(session, this, key); } /** - * Converts a network ID to the key it is registered under in this registry, or null if it is not registered. + * Implementations should look up an element in the given registry by its value, network ID, or registered key. Return an empty optional if it does not exist. */ - public @Nullable Key keyFromNetworkId(GeyserSession session, int networkId) { - return registryLookup.keyFromNetworkId(session, this, networkId); - } - public interface RegistryLookup { - /** - * Implementations should return the network ID of the registered object, or -1 if it is not registered. - */ - int toNetworkId(GeyserSession session, JavaRegistryKey registry, T object); + Optional> entry(GeyserSession session, JavaRegistryKey registry, int networkId); - /** - * Implementations should return the object that is registered under the given network ID, or null if it is not registered. - */ - @Nullable - T fromNetworkId(GeyserSession session, JavaRegistryKey registry, int networkId); + Optional> entry(GeyserSession session, JavaRegistryKey registry, Key key); - /** - * Implementations should return the network ID that corresponds to the given registered key, or -1 if it is not registered. - */ - int keyToNetworkId(GeyserSession session, JavaRegistryKey registry, Key key); - - /** - * Implementations should return the key that corresponds to the registered network ID, or null if it is not registered. - */ - @Nullable - Key keyFromNetworkId(GeyserSession session, JavaRegistryKey registry, int networkId); + Optional> entry(GeyserSession session, JavaRegistryKey registry, T object); } @Override diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/registry/RegistryEntryContext.java b/core/src/main/java/org/geysermc/geyser/session/cache/registry/RegistryEntryContext.java index 8b4d21f43..3c5818c88 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/registry/RegistryEntryContext.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/registry/RegistryEntryContext.java @@ -41,7 +41,7 @@ import org.geysermc.mcprotocollib.protocol.data.game.RegistryEntry; */ public record RegistryEntryContext(RegistryEntry entry, Object2IntMap keyIdMap, GeyserSession session) { - // TODO: not a fan of this. With JavaRegistryKey#keyToNetworkId now being a thing, I'd rather have that always used, so that registry readers won't have to worry + // TODO: not a fan of this. With JavaRegistryKey#key now being a thing, I'd rather have that always used, so that registry readers won't have to worry // about using the right method. This would require pre-populating all data-driven registries with default (probably null) values before actually decoding the data from the registy packet. // This could also be helpful in the feature when a data-driven registry reader needs to use an element from another data-driven registry public int getNetworkId(Key registryKey) { diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/DialogTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/DialogTag.java new file mode 100644 index 000000000..b69822177 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/DialogTag.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.session.cache.tags; + +import org.geysermc.geyser.session.cache.registry.JavaRegistries; +import org.geysermc.geyser.session.dialog.Dialog; +import org.geysermc.geyser.util.MinecraftKey; + +public final class DialogTag { + public static final Tag PAUSE_SCREEN_ADDITIONS = create("pause_screen_additions"); + public static final Tag QUICK_ACTIONS = create("quick_actions"); + + private DialogTag() {} + + private static Tag create(String name) { + return new Tag<>(JavaRegistries.DIALOG, MinecraftKey.key(name)); + } +} diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/GeyserHolderSet.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/GeyserHolderSet.java index 27fe7a75a..886e70061 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/GeyserHolderSet.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/GeyserHolderSet.java @@ -128,14 +128,14 @@ public final class GeyserHolderSet { /** * Reads a HolderSet from a NBT object. Does not support reading HolderSets that can hold inline values. * - *

Uses {@link JavaRegistryKey#keyToNetworkId(GeyserSession, Key)} to resolve registry keys to network IDs.

+ *

Uses {@link JavaRegistryKey#networkId(GeyserSession, Key)} to resolve registry keys to network IDs.

* * @param session the Geyser session. * @param registry the registry the HolderSet contains IDs from. * @param holderSet the HolderSet as a NBT object. */ public static GeyserHolderSet readHolderSet(GeyserSession session, JavaRegistryKey registry, @Nullable Object holderSet) { - return readHolderSet(registry, holderSet, key -> registry.keyToNetworkId(session, key)); + return readHolderSet(registry, holderSet, key -> registry.networkId(session, key)); } /** diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/BuiltInDialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/BuiltInDialog.java new file mode 100644 index 000000000..731aa03e0 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/BuiltInDialog.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.session.dialog; + +import net.kyori.adventure.key.Key; +import org.geysermc.geyser.util.MinecraftKey; + +public final class BuiltInDialog { + + public static final Key SERVER_LINKS = create("server_links"); + public static final Key CUSTOM_OPTIONS = create("custom_options"); + public static final Key QUICK_ACTIONS = create("quick_actions"); + + private BuiltInDialog() {} + + private static Key create(String name) { + return MinecraftKey.key(name); + } +} diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java index 06f986486..3c61a44e2 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java @@ -183,12 +183,16 @@ public abstract class Dialog { public static Dialog getDialogFromHolder(GeyserSession session, Holder holder) { if (holder.isId()) { - return Objects.requireNonNull(JavaRegistries.DIALOG.fromNetworkId(session, holder.id())); + return Objects.requireNonNull(JavaRegistries.DIALOG.value(session, holder.id())); } else { - return Dialog.readDialogFromNbt(session, holder.custom(), key -> JavaRegistries.DIALOG.keyToNetworkId(session, key)); + return Dialog.readDialogFromNbt(session, holder.custom(), key -> JavaRegistries.DIALOG.networkId(session, key)); } } + public static Dialog getDialogFromKey(GeyserSession session, Key key) { + return Objects.requireNonNull(JavaRegistries.DIALOG.value(session, key)); + } + public enum AfterAction { CLOSE, NONE, diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogManager.java b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogManager.java index a3ed4064f..e61ef53a5 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogManager.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogManager.java @@ -27,6 +27,7 @@ package org.geysermc.geyser.session.dialog; import lombok.Getter; import lombok.experimental.Accessors; +import net.kyori.adventure.key.Key; import org.cloudburstmc.nbt.NbtMap; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.mcprotocollib.protocol.data.game.Holder; @@ -44,6 +45,10 @@ public class DialogManager { this.session = session; } + public void openDialog(Key dialog) { + openDialog(Dialog.getDialogFromKey(session, dialog)); + } + public void openDialog(Holder dialog) { openDialog(Dialog.getDialogFromHolder(session, dialog)); } From 05f1bf2135afd67026db8defdfeab49c221381a7 Mon Sep 17 00:00:00 2001 From: Eclipse Date: Fri, 6 Jun 2025 14:24:26 +0000 Subject: [PATCH 23/62] Add methods to open quick actions and pause screen additions dialog tags and add command to open quick actions dialog tag --- .../api/connection/GeyserConnection.java | 27 +++++++++++ .../geyser/command/CommandRegistry.java | 2 + .../defaults/CustomOptionsCommand.java | 19 +------- .../command/defaults/QuickActionsCommand.java | 48 +++++++++++++++++++ .../geyser/session/GeyserSession.java | 33 +++++++++++++ 5 files changed, 112 insertions(+), 17 deletions(-) create mode 100644 core/src/main/java/org/geysermc/geyser/command/defaults/QuickActionsCommand.java diff --git a/api/src/main/java/org/geysermc/geyser/api/connection/GeyserConnection.java b/api/src/main/java/org/geysermc/geyser/api/connection/GeyserConnection.java index ede4c1bc4..437b776a9 100644 --- a/api/src/main/java/org/geysermc/geyser/api/connection/GeyserConnection.java +++ b/api/src/main/java/org/geysermc/geyser/api/connection/GeyserConnection.java @@ -75,6 +75,33 @@ public interface GeyserConnection extends Connection, CommandSource { */ int protocolVersion(); + /** + * Tries to open the {@code minecraft:pause_screen_additions} dialog tag. This method opens this tag the same way Java does, that is: + * + *
    + *
  • If there are multiple dialogs in the additions tag, the {@code minecraft:custom_options} dialog is opened to select a dialog.
  • + *
  • If there is one dialog in the additions tag, that dialog is opened.
  • + *
  • If there are no dialogs in the tag, but there are server links sent to the client, the {@code minecraft:server_links} dialog is opened.
  • + *
  • If all of the above fails, no dialog is opened.
  • + *
+ * + *

This method returns {@code true} if a dialog was opened, and {@code false} otherwise.

+ */ + boolean openPauseScreenAdditions(); + + /** + * Tries to open the {@code minecraft:quick_actions} dialog tag. This method opens this tag the same way Java does, that is: + * + *
    + *
  • If there are multiple dialogs in the actions tag, the {@code minecraft:quick_actions} dialog is opened to select a dialog.
  • + *
  • If there is one dialog in the actions tag, that dialog is opened.
  • + *
  • If there are no dialogs in the tag, no dialog is opened.
  • + *
+ * + *

This method returns {@code true} if a dialog was opened, and {@code false} otherwise.

+ */ + boolean openQuickActions(); + /** * @param javaId the Java entity ID to look up. * @return a {@link GeyserEntity} if present in this connection's entity tracker. diff --git a/core/src/main/java/org/geysermc/geyser/command/CommandRegistry.java b/core/src/main/java/org/geysermc/geyser/command/CommandRegistry.java index dec837f55..057266ede 100644 --- a/core/src/main/java/org/geysermc/geyser/command/CommandRegistry.java +++ b/core/src/main/java/org/geysermc/geyser/command/CommandRegistry.java @@ -52,6 +52,7 @@ import org.geysermc.geyser.command.defaults.HelpCommand; import org.geysermc.geyser.command.defaults.ListCommand; import org.geysermc.geyser.command.defaults.OffhandCommand; import org.geysermc.geyser.command.defaults.PingCommand; +import org.geysermc.geyser.command.defaults.QuickActionsCommand; import org.geysermc.geyser.command.defaults.ReloadCommand; import org.geysermc.geyser.command.defaults.SettingsCommand; import org.geysermc.geyser.command.defaults.StatisticsCommand; @@ -165,6 +166,7 @@ public class CommandRegistry implements EventRegistrar { registerBuiltInCommand(new ConnectionTestCommand(geyser, "connectiontest", "geyser.commands.connectiontest.desc", "geyser.command.connectiontest")); registerBuiltInCommand(new PingCommand("ping", "geyser.commands.ping.desc", "geyser.command.ping")); registerBuiltInCommand(new CustomOptionsCommand("options", "Opens the custom options dialog provided by the server, if any", "geyser.command.options")); + registerBuiltInCommand(new QuickActionsCommand("quickactions", "Opens the quick actions dialog provided by the server, if any", "geyser.command.options")); if (this.geyser.getPlatformType() == PlatformType.STANDALONE) { registerBuiltInCommand(new StopCommand(geyser, "stop", "geyser.commands.stop.desc", "geyser.command.stop")); diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/CustomOptionsCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/CustomOptionsCommand.java index c434ac5c4..49fdd3898 100644 --- a/core/src/main/java/org/geysermc/geyser/command/defaults/CustomOptionsCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/CustomOptionsCommand.java @@ -29,13 +29,8 @@ import net.kyori.adventure.text.Component; import org.geysermc.geyser.api.util.TriState; import org.geysermc.geyser.command.GeyserCommand; import org.geysermc.geyser.command.GeyserCommandSource; -import org.geysermc.geyser.session.GeyserSession; -import org.geysermc.geyser.session.cache.tags.DialogTag; -import org.geysermc.geyser.session.dialog.BuiltInDialog; -import org.geysermc.geyser.session.dialog.Dialog; import org.incendo.cloud.context.CommandContext; -import java.util.List; import java.util.Objects; public class CustomOptionsCommand extends GeyserCommand { @@ -46,18 +41,8 @@ public class CustomOptionsCommand extends GeyserCommand { @Override public void execute(CommandContext context) { - GeyserSession session = Objects.requireNonNull(context.sender().connection()); - List additions = session.getTagCache().get(DialogTag.PAUSE_SCREEN_ADDITIONS); - if (additions.isEmpty()) { - if (session.getServerLinks().isEmpty()) { - context.sender().sendMessage(Component.text("The server has not provided any custom options")); - } else { - session.getDialogManager().openDialog(BuiltInDialog.SERVER_LINKS); - } - } else if (additions.size() == 1) { - session.getDialogManager().openDialog(additions.get(0)); - } else { - session.getDialogManager().openDialog(BuiltInDialog.CUSTOM_OPTIONS); + if (!Objects.requireNonNull(context.sender().connection()).openPauseScreenAdditions()) { + context.sender().sendMessage(Component.text("The server has not provided any custom options")); } } } diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/QuickActionsCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/QuickActionsCommand.java new file mode 100644 index 000000000..2fbaf7c0e --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/QuickActionsCommand.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.command.defaults; + +import net.kyori.adventure.text.Component; +import org.geysermc.geyser.api.util.TriState; +import org.geysermc.geyser.command.GeyserCommand; +import org.geysermc.geyser.command.GeyserCommandSource; +import org.incendo.cloud.context.CommandContext; + +import java.util.Objects; + +public class QuickActionsCommand extends GeyserCommand { + + public QuickActionsCommand(String name, String description, String permission) { + super(name, description, permission, TriState.TRUE, true, true); + } + + @Override + public void execute(CommandContext context) { + if (!Objects.requireNonNull(context.sender().connection()).openQuickActions()) { + context.sender().sendMessage(Component.text("The server has not provided any quick actions")); + } + } +} diff --git a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java index 009d3841d..722be5d9f 100644 --- a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java +++ b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java @@ -176,6 +176,9 @@ import org.geysermc.geyser.session.cache.TeleportCache; import org.geysermc.geyser.session.cache.WorldBorder; import org.geysermc.geyser.session.cache.WorldCache; import org.geysermc.geyser.session.cache.registry.JavaRegistries; +import org.geysermc.geyser.session.cache.tags.DialogTag; +import org.geysermc.geyser.session.dialog.BuiltInDialog; +import org.geysermc.geyser.session.dialog.Dialog; import org.geysermc.geyser.session.dialog.DialogManager; import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.translator.inventory.InventoryTranslator; @@ -1503,6 +1506,36 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { sendDownstreamGamePacket(new ServerboundChatCommandSignedPacket(command, Instant.now().toEpochMilli(), 0L, Collections.emptyList(), 0, new BitSet(), (byte) 0)); } + @Override + public boolean openPauseScreenAdditions() { + List additions = tagCache.get(DialogTag.PAUSE_SCREEN_ADDITIONS); + if (additions.isEmpty()) { + if (serverLinks.isEmpty()) { + return false; + } else { + dialogManager.openDialog(BuiltInDialog.SERVER_LINKS); + } + } else if (additions.size() == 1) { + dialogManager.openDialog(additions.get(0)); + } else { + dialogManager.openDialog(BuiltInDialog.CUSTOM_OPTIONS); + } + return true; + } + + @Override + public boolean openQuickActions() { + List quickActions = tagCache.get(DialogTag.QUICK_ACTIONS); + if (quickActions.isEmpty()) { + return false; + } else if (quickActions.size() == 1) { + dialogManager.openDialog(quickActions.get(0)); + } else { + dialogManager.openDialog(BuiltInDialog.QUICK_ACTIONS); + } + return true; + } + public void setClientRenderDistance(int clientRenderDistance) { boolean oldSquareToCircle = this.clientRenderDistance < this.serverRenderDistance; this.clientRenderDistance = clientRenderDistance; From 44d229a4aa590f11d0f43b560812efe29a35ddc9 Mon Sep 17 00:00:00 2001 From: Eclipse Date: Fri, 6 Jun 2025 14:57:29 +0000 Subject: [PATCH 24/62] Use translation strings for everything that should be translated --- .../geyser/command/CommandRegistry.java | 4 ++-- .../defaults/CustomOptionsCommand.java | 3 +-- .../command/defaults/QuickActionsCommand.java | 2 +- .../geyser/session/dialog/Dialog.java | 2 +- .../geyser/session/dialog/DialogHolder.java | 12 +++++++----- .../session/dialog/DialogWithButtons.java | 3 ++- .../input/DialogInputParseException.java | 5 ++++- .../session/dialog/input/ParsedInputs.java | 19 ++++++++++++------- .../session/dialog/input/TextInput.java | 2 +- 9 files changed, 31 insertions(+), 21 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/command/CommandRegistry.java b/core/src/main/java/org/geysermc/geyser/command/CommandRegistry.java index 057266ede..bb970029f 100644 --- a/core/src/main/java/org/geysermc/geyser/command/CommandRegistry.java +++ b/core/src/main/java/org/geysermc/geyser/command/CommandRegistry.java @@ -165,8 +165,8 @@ public class CommandRegistry implements EventRegistrar { registerBuiltInCommand(new AdvancedTooltipsCommand("tooltips", "geyser.commands.advancedtooltips.desc", "geyser.command.tooltips")); registerBuiltInCommand(new ConnectionTestCommand(geyser, "connectiontest", "geyser.commands.connectiontest.desc", "geyser.command.connectiontest")); registerBuiltInCommand(new PingCommand("ping", "geyser.commands.ping.desc", "geyser.command.ping")); - registerBuiltInCommand(new CustomOptionsCommand("options", "Opens the custom options dialog provided by the server, if any", "geyser.command.options")); - registerBuiltInCommand(new QuickActionsCommand("quickactions", "Opens the quick actions dialog provided by the server, if any", "geyser.command.options")); + registerBuiltInCommand(new CustomOptionsCommand("options", "geyser.commands.options.desc", "geyser.command.options")); + registerBuiltInCommand(new QuickActionsCommand("quickactions", "geyser.commands.quickactions.desc", "geyser.command.options")); if (this.geyser.getPlatformType() == PlatformType.STANDALONE) { registerBuiltInCommand(new StopCommand(geyser, "stop", "geyser.commands.stop.desc", "geyser.command.stop")); diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/CustomOptionsCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/CustomOptionsCommand.java index 49fdd3898..ba9d093b1 100644 --- a/core/src/main/java/org/geysermc/geyser/command/defaults/CustomOptionsCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/CustomOptionsCommand.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.command.defaults; -import net.kyori.adventure.text.Component; import org.geysermc.geyser.api.util.TriState; import org.geysermc.geyser.command.GeyserCommand; import org.geysermc.geyser.command.GeyserCommandSource; @@ -42,7 +41,7 @@ public class CustomOptionsCommand extends GeyserCommand { @Override public void execute(CommandContext context) { if (!Objects.requireNonNull(context.sender().connection()).openPauseScreenAdditions()) { - context.sender().sendMessage(Component.text("The server has not provided any custom options")); + context.sender().sendMessage("geyser.commands.options.fail"); } } } diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/QuickActionsCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/QuickActionsCommand.java index 2fbaf7c0e..4205afcdc 100644 --- a/core/src/main/java/org/geysermc/geyser/command/defaults/QuickActionsCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/QuickActionsCommand.java @@ -42,7 +42,7 @@ public class QuickActionsCommand extends GeyserCommand { @Override public void execute(CommandContext context) { if (!Objects.requireNonNull(context.sender().connection()).openQuickActions()) { - context.sender().sendMessage(Component.text("The server has not provided any quick actions")); + context.sender().sendMessage(Component.text("geyser.commands.quickactions.fail")); } } } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java index 3c61a44e2..e7eb7d82f 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/Dialog.java @@ -132,7 +132,7 @@ public abstract class Dialog { builder.label(label); } - restored.ifPresentOrElse(last -> last.restore(builder), () -> inputs.forEach(input -> input.addComponent(builder))); + restored.ifPresentOrElse(last -> last.restore(holder, builder), () -> inputs.forEach(input -> input.addComponent(builder))); builder.closedOrInvalidResultHandler(response -> holder.closeDialog(onCancel())); addCustomComponents(holder, builder); return builder; diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java index 88a9543a1..a279eda9d 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogHolder.java @@ -35,6 +35,7 @@ import org.geysermc.cumulus.form.SimpleForm; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.dialog.action.DialogAction; import org.geysermc.geyser.session.dialog.input.ParsedInputs; +import org.geysermc.geyser.text.GeyserLocale; import org.geysermc.geyser.text.MinecraftLocale; import org.geysermc.geyser.translator.text.MessageTranslator; @@ -212,11 +213,11 @@ public class DialogHolder { * Opens a "waiting for response" form. This method assumes the dialog is still valid! */ private void waitForResponse() { - String content = "Geyser is waiting for the server to respond with a new dialog."; + String content; if (sendBackButton) { - content += " The server is taking a while to respond. You can press the button below to go back to the game."; + content = GeyserLocale.getPlayerLocaleString("geyser.dialogs.waiting_for_a_while", session.locale()); } else { - content += " If no new dialog is shown within 5 seconds, a button will appear to go back to the game."; + content = GeyserLocale.getPlayerLocaleString("geyser.dialogs.waiting_for_response", session.locale()); } session.sendDialogForm(SimpleForm.builder() @@ -316,14 +317,15 @@ public class DialogHolder { */ private void showUrl(String url) { String content = MessageTranslator.convertMessage(session, - Component.text("The server is asking you to open the following URL:\n\n") + Component.text(GeyserLocale.getPlayerLocaleString("geyser.dialogs.open_url", session.locale())) + .append(Component.text("\n\n")) .append(Component.text(url)) .append(Component.text("\n\n")) .append(Component.translatable("chat.link.warning").color(NamedTextColor.RED))); session.sendDialogForm(SimpleForm.builder() .translator(MinecraftLocale::getLocaleString, session.locale()) - .title("Open URL") + .title("chat.link.open") .content(content) .button("gui.ok") .resultHandler((form, result) -> { diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java index 188b10a6b..b4a83dac5 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/DialogWithButtons.java @@ -31,6 +31,7 @@ import org.geysermc.cumulus.form.CustomForm; import org.geysermc.cumulus.form.SimpleForm; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.dialog.input.ParsedInputs; +import org.geysermc.geyser.text.GeyserLocale; import java.util.List; import java.util.Optional; @@ -51,7 +52,7 @@ public abstract class DialogWithButtons extends Dialog { List buttons = buttons(holder); DropdownComponent.Builder dropdown = DropdownComponent.builder(); - dropdown.text("Please select an option:"); + dropdown.text(GeyserLocale.getPlayerLocaleString("geyser.dialogs.select_action", holder.session().locale())); for (DialogButton button : buttons) { dropdown.option(button.label()); } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/input/DialogInputParseException.java b/core/src/main/java/org/geysermc/geyser/session/dialog/input/DialogInputParseException.java index 9542a4c8b..d04fe3990 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/input/DialogInputParseException.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/input/DialogInputParseException.java @@ -32,9 +32,12 @@ public class DialogInputParseException extends Exception { // Exceptions don't work with generics, so we have to do a bit of unsafe casting and assume the object is of the input type :( @Getter private final Object partial; + @Getter + private final Object[] values; - public DialogInputParseException(String message, Object partial) { + public DialogInputParseException(String message, Object partial, Object... values) { super(message); this.partial = partial; + this.values = values; } } diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/input/ParsedInputs.java b/core/src/main/java/org/geysermc/geyser/session/dialog/input/ParsedInputs.java index c52380ee9..f25e42ae4 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/input/ParsedInputs.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/input/ParsedInputs.java @@ -29,6 +29,8 @@ import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.nbt.NbtMapBuilder; import org.geysermc.cumulus.form.CustomForm; import org.geysermc.cumulus.response.CustomFormResponse; +import org.geysermc.geyser.session.dialog.DialogHolder; +import org.geysermc.geyser.text.GeyserLocale; import java.util.HashMap; import java.util.LinkedHashMap; @@ -40,7 +42,7 @@ public class ParsedInputs { public static final ParsedInputs EMPTY = new ParsedInputs(List.of()); private final Map, Object> values = new LinkedHashMap<>(); - private final Map, String> errors = new HashMap<>(); + private final Map, DialogInputParseException> errors = new HashMap<>(); public ParsedInputs(List> inputs, CustomFormResponse response) { for (DialogInput input : inputs) { @@ -48,7 +50,7 @@ public class ParsedInputs { values.put(input, input.read(response)); } catch (DialogInputParseException exception) { values.put(input, exception.getPartial()); - errors.put(input, exception.getMessage()); + errors.put(input, exception); } } } @@ -59,12 +61,15 @@ public class ParsedInputs { } } - public void restore(CustomForm.Builder builder) { + public void restore(DialogHolder holder, CustomForm.Builder builder) { for (Map.Entry, Object> entry : values.entrySet()) { - String error = errors.get(entry.getKey()); - if (error != null) { - builder.label("§cError parsing input data: " + error + "."); - builder.label("§cPlease adjust!"); + DialogInputParseException exception = errors.get(entry.getKey()); + if (exception != null) { + String formattedException = GeyserLocale.getPlayerLocaleString(exception.getMessage(), holder.session().locale(), exception.getValues()); + String error = GeyserLocale.getPlayerLocaleString("geyser.dialogs.input_validation_error", holder.session().locale(), formattedException); + + builder.label("§c" + error); + builder.label("§c" + GeyserLocale.getPlayerLocaleString("geyser.dialogs.input_adjust", holder.session().locale())); } // Can't be a Geyser update without eclipse dealing with generics ((DialogInput) entry.getKey()).addComponent(builder, Optional.of(entry.getValue())); diff --git a/core/src/main/java/org/geysermc/geyser/session/dialog/input/TextInput.java b/core/src/main/java/org/geysermc/geyser/session/dialog/input/TextInput.java index df3ce1029..35ba4cfe4 100644 --- a/core/src/main/java/org/geysermc/geyser/session/dialog/input/TextInput.java +++ b/core/src/main/java/org/geysermc/geyser/session/dialog/input/TextInput.java @@ -60,7 +60,7 @@ public class TextInput extends DialogInput { String text = response.asInput(); assert text != null; if (text.length() > maxLength) { - throw new DialogInputParseException("length of text cannot be above " + maxLength, text); + throw new DialogInputParseException("geyser.dialogs.text_input_limit", text, maxLength); } return text; } From d7127d48eda0d8efecd743218afd62857c9c2ff5 Mon Sep 17 00:00:00 2001 From: Eclipse Date: Fri, 6 Jun 2025 15:13:55 +0000 Subject: [PATCH 25/62] Correctly translate messages in new commands --- .../geyser/command/defaults/CustomOptionsCommand.java | 7 +++++-- .../geyser/command/defaults/QuickActionsCommand.java | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/CustomOptionsCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/CustomOptionsCommand.java index ba9d093b1..eb09c7b2a 100644 --- a/core/src/main/java/org/geysermc/geyser/command/defaults/CustomOptionsCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/CustomOptionsCommand.java @@ -28,6 +28,8 @@ package org.geysermc.geyser.command.defaults; import org.geysermc.geyser.api.util.TriState; import org.geysermc.geyser.command.GeyserCommand; import org.geysermc.geyser.command.GeyserCommandSource; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.text.GeyserLocale; import org.incendo.cloud.context.CommandContext; import java.util.Objects; @@ -40,8 +42,9 @@ public class CustomOptionsCommand extends GeyserCommand { @Override public void execute(CommandContext context) { - if (!Objects.requireNonNull(context.sender().connection()).openPauseScreenAdditions()) { - context.sender().sendMessage("geyser.commands.options.fail"); + GeyserSession session = Objects.requireNonNull(context.sender().connection()); + if (!session.openPauseScreenAdditions()) { + context.sender().sendMessage(GeyserLocale.getPlayerLocaleString("geyser.commands.options.fail", session.locale())); } } } diff --git a/core/src/main/java/org/geysermc/geyser/command/defaults/QuickActionsCommand.java b/core/src/main/java/org/geysermc/geyser/command/defaults/QuickActionsCommand.java index 4205afcdc..d4abc8a5b 100644 --- a/core/src/main/java/org/geysermc/geyser/command/defaults/QuickActionsCommand.java +++ b/core/src/main/java/org/geysermc/geyser/command/defaults/QuickActionsCommand.java @@ -29,6 +29,8 @@ import net.kyori.adventure.text.Component; import org.geysermc.geyser.api.util.TriState; import org.geysermc.geyser.command.GeyserCommand; import org.geysermc.geyser.command.GeyserCommandSource; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.text.GeyserLocale; import org.incendo.cloud.context.CommandContext; import java.util.Objects; @@ -41,8 +43,9 @@ public class QuickActionsCommand extends GeyserCommand { @Override public void execute(CommandContext context) { - if (!Objects.requireNonNull(context.sender().connection()).openQuickActions()) { - context.sender().sendMessage(Component.text("geyser.commands.quickactions.fail")); + GeyserSession session = Objects.requireNonNull(context.sender().connection()); + if (!session.openQuickActions()) { + context.sender().sendMessage(GeyserLocale.getPlayerLocaleString("geyser.commands.quickactions.fail", session.locale())); } } } From 35ef08e5bb86a87008d1cc6035f619e4d66a44d3 Mon Sep 17 00:00:00 2001 From: basaigh <53559772+basaigh@users.noreply.github.com> Date: Thu, 12 Jun 2025 23:31:54 +0100 Subject: [PATCH 26/62] Initial happy ghast implementation --- .../geyser/entity/EntityDefinitions.java | 9 ++ .../properties/VanillaEntityProperties.java | 4 + .../type/living/animal/HappyGhastEntity.java | 126 ++++++++++++++++++ .../geyser/network/UpstreamPacketHandler.java | 2 + .../geyser/session/GeyserSession.java | 2 + .../geysermc/geyser/util/InteractiveTag.java | 3 +- .../resources/bedrock/entity_identifiers.dat | Bin 8378 -> 8445 bytes 7 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/org/geysermc/geyser/entity/type/living/animal/HappyGhastEntity.java diff --git a/core/src/main/java/org/geysermc/geyser/entity/EntityDefinitions.java b/core/src/main/java/org/geysermc/geyser/entity/EntityDefinitions.java index 77030306c..09966f24a 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/EntityDefinitions.java +++ b/core/src/main/java/org/geysermc/geyser/entity/EntityDefinitions.java @@ -81,6 +81,7 @@ import org.geysermc.geyser.entity.type.living.TadpoleEntity; import org.geysermc.geyser.entity.type.living.animal.ArmadilloEntity; import org.geysermc.geyser.entity.type.living.animal.AxolotlEntity; import org.geysermc.geyser.entity.type.living.animal.BeeEntity; +import org.geysermc.geyser.entity.type.living.animal.HappyGhastEntity; import org.geysermc.geyser.entity.type.living.animal.farm.ChickenEntity; import org.geysermc.geyser.entity.type.living.animal.farm.CowEntity; import org.geysermc.geyser.entity.type.living.animal.FoxEntity; @@ -215,6 +216,7 @@ public final class EntityDefinitions { public static final EntityDefinition GLOW_SQUID; public static final EntityDefinition GOAT; public static final EntityDefinition GUARDIAN; + public static final EntityDefinition HAPPY_GHAST; public static final EntityDefinition HOGLIN; public static final EntityDefinition HOPPER_MINECART; public static final EntityDefinition HORSE; @@ -989,6 +991,13 @@ public final class EntityDefinitions { .addTranslator(MetadataTypes.FROG_VARIANT, FrogEntity::setVariant) .addTranslator(MetadataTypes.OPTIONAL_UNSIGNED_INT, FrogEntity::setTongueTarget) .build(); + HAPPY_GHAST = EntityDefinition.inherited(HappyGhastEntity::new, ageableEntityBase) + .type(EntityType.HAPPY_GHAST) + .heightAndWidth(4f) + .properties(VanillaEntityProperties.HAPPY_GHAST) + .addTranslator(null) // Is leash holder + .addTranslator(MetadataTypes.BOOLEAN, HappyGhastEntity::setStaysStill) + .build(); HOGLIN = EntityDefinition.inherited(HoglinEntity::new, ageableEntityBase) .type(EntityType.HOGLIN) .height(1.4f).width(1.3965f) diff --git a/core/src/main/java/org/geysermc/geyser/entity/properties/VanillaEntityProperties.java b/core/src/main/java/org/geysermc/geyser/entity/properties/VanillaEntityProperties.java index 305dbf22e..06a715f18 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/properties/VanillaEntityProperties.java +++ b/core/src/main/java/org/geysermc/geyser/entity/properties/VanillaEntityProperties.java @@ -61,6 +61,10 @@ public class VanillaEntityProperties { .addInt(CreakingEntity.CREAKING_SWAYING_TICKS, 0, 6) .build(); + public static final GeyserEntityProperties HAPPY_GHAST = new GeyserEntityProperties.Builder() + .addBoolean("minecraft:can_move") + .build(); + public static final GeyserEntityProperties WOLF_SOUND_VARIANT = new GeyserEntityProperties.Builder() .addEnum("minecraft:sound_variant", "default", diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/HappyGhastEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/HappyGhastEntity.java new file mode 100644 index 000000000..e5cec753f --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/HappyGhastEntity.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2025 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.entity.type.living.animal; + +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.cloudburstmc.math.vector.Vector3f; +import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; +import org.geysermc.geyser.entity.EntityDefinition; +import org.geysermc.geyser.inventory.GeyserItemStack; +import org.geysermc.geyser.item.type.Item; +import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.cache.tags.ItemTag; +import org.geysermc.geyser.session.cache.tags.Tag; +import org.geysermc.geyser.util.InteractionResult; +import org.geysermc.geyser.util.InteractiveTag; +import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.BooleanEntityMetadata; +import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand; + +import java.util.UUID; + +public class HappyGhastEntity extends AnimalEntity { + public HappyGhastEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { + super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw); + + setFlag(EntityFlag.CAN_FLY, true); + setFlag(EntityFlag.TAMED, true); + setFlag(EntityFlag.CAN_WALK, true); + + setFlag(EntityFlag.WASD_AIR_CONTROLLED, true); + setFlag(EntityFlag.DOES_SERVER_AUTH_ONLY_DISMOUNT, true); + + // TODO: verify which flags are necessary + + setAirSupply(100); + } + + @Override + @Nullable + protected Tag getFoodTag() { + return ItemTag.HAPPY_GHAST_FOOD; + } + + @Override + protected float getBabySize() { + return 0.2375f; + } + + public void setStaysStill(BooleanEntityMetadata entityMetadata) { + propertyManager.add("minecraft:can_move", !entityMetadata.getPrimitiveValue()); + updateBedrockEntityProperties(); + } + + @NonNull + @Override + protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { + if (this.isBaby()) { + return super.testMobInteraction(hand, itemInHand); + } else { + if (!itemInHand.isEmpty()) { + if (session.getTagCache().is(ItemTag.HARNESSES, itemInHand)) { + if (!this.body.isValid()) { + // Harnesses the ghast + return InteractiveTag.HARNESS_HAPPY_GHAST; + } + } + // TODO: Handle shearing the harness off + } + + if (this.body.isValid() && !session.isSneaking()) { + // Rides happy ghast + return InteractiveTag.RIDE_HORSE; + } else { + return super.testMobInteraction(hand, itemInHand); + } + } + } + + @NonNull + @Override + protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { + if (this.isBaby()) { + return super.mobInteract(hand, itemInHand); + } else { + if (!itemInHand.isEmpty()) { + if (session.getTagCache().is(ItemTag.HARNESSES, itemInHand)) { + if (!this.body.isValid()) { + // Harnesses the ghast + return InteractionResult.SUCCESS; + } + } + // TODO: Handle shearing the harness off + } + + if (this.body.isValid() && !session.isSneaking()) { + // Rides happy ghast + return InteractionResult.SUCCESS; + } else { + return super.mobInteract(hand, itemInHand); + } + } + } +} diff --git a/core/src/main/java/org/geysermc/geyser/network/UpstreamPacketHandler.java b/core/src/main/java/org/geysermc/geyser/network/UpstreamPacketHandler.java index c2b47bfcb..55ca4ebe5 100644 --- a/core/src/main/java/org/geysermc/geyser/network/UpstreamPacketHandler.java +++ b/core/src/main/java/org/geysermc/geyser/network/UpstreamPacketHandler.java @@ -242,6 +242,8 @@ public class UpstreamPacketHandler extends LoggingPacketHandler { stackPacket.getResourcePacks().addAll(this.resourcePackLoadEvent.orderedPacks()); // Allows Vibrant Visuals to be toggled in the settings stackPacket.getExperiments().add(new ExperimentData("experimental_graphics", true)); + // Enables 2025 Content Drop 2 features + stackPacket.getExperiments().add(new ExperimentData("y_2025_drop_2", true)); session.sendUpstreamPacket(stackPacket); } diff --git a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java index 722be5d9f..e60d9c2fb 100644 --- a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java +++ b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java @@ -1691,6 +1691,8 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { startGamePacket.getExperiments().add(new ExperimentData("experimental_molang_features", true)); // Allows Vibrant Visuals to appear in the settings menu startGamePacket.getExperiments().add(new ExperimentData("experimental_graphics", true)); + // Enables 2025 Content Drop 2 features + startGamePacket.getExperiments().add(new ExperimentData("y_2025_drop_2", true)); startGamePacket.setVanillaVersion("*"); startGamePacket.setInventoriesServerAuthoritative(true); diff --git a/core/src/main/java/org/geysermc/geyser/util/InteractiveTag.java b/core/src/main/java/org/geysermc/geyser/util/InteractiveTag.java index 168c861f5..872bc94b4 100644 --- a/core/src/main/java/org/geysermc/geyser/util/InteractiveTag.java +++ b/core/src/main/java/org/geysermc/geyser/util/InteractiveTag.java @@ -73,7 +73,8 @@ public enum InteractiveTag { GIVE_ITEM_TO_ALLAY("allay"), EQUIP_WOLF_ARMOR("equipwolfarmor"), REMOVE_WOLF_ARMOR("removewolfarmor"), - REPAIR_WOLF_ARMOR("repairwolfarmor"); + REPAIR_WOLF_ARMOR("repairwolfarmor"), + HARNESS_HAPPY_GHAST("equipharness"); /** * The full string that should be passed on to the client. diff --git a/core/src/main/resources/bedrock/entity_identifiers.dat b/core/src/main/resources/bedrock/entity_identifiers.dat index 2dd5602491f79aaa74aa73fcbeace6cd434ab6ae..6c40d13a6a58edd84cf6e9036d6b243d911f21c9 100644 GIT binary patch delta 63 zcmdnx_}7t_i-D6ZGbJapxP+^PX|f}u#N;#F+#3zt6edm(1~COQ5(^3{y^0@Y=TmY8F3AF$K From ef2cdd0e7487c44bb28f66cac1eb0ea49c78bffd Mon Sep 17 00:00:00 2001 From: Eclipse Date: Fri, 13 Jun 2025 17:09:39 +0000 Subject: [PATCH 27/62] Update data component hashers for 1.21.6's changes --- .../geyser/item/hashing/ComponentHasher.java | 3 +- .../item/hashing/DataComponentHashers.java | 93 ++++++++++++++++--- .../geyser/item/hashing/MapBuilder.java | 2 +- .../geyser/item/hashing/MapHasher.java | 23 +++-- .../geyser/item/hashing/MinecraftHasher.java | 9 +- .../geyser/item/hashing/RegistryHasher.java | 22 +++-- .../item/hashing/data/ConsumeEffectType.java | 2 +- gradle/libs.versions.toml | 2 +- 8 files changed, 121 insertions(+), 35 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/item/hashing/ComponentHasher.java b/core/src/main/java/org/geysermc/geyser/item/hashing/ComponentHasher.java index f8abb46ab..d8a20140d 100644 --- a/core/src/main/java/org/geysermc/geyser/item/hashing/ComponentHasher.java +++ b/core/src/main/java/org/geysermc/geyser/item/hashing/ComponentHasher.java @@ -35,6 +35,7 @@ import net.kyori.adventure.text.TranslatableComponent; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.event.HoverEvent; import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.ShadowColor; import net.kyori.adventure.text.format.Style; import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.format.TextDecoration; @@ -96,9 +97,9 @@ public interface ComponentHasher { .optionalNullable("name", COMPONENT, event -> ((HoverEvent.ShowEntity) event.value()).name()); }); - // TODO shadow colours - needs kyori bump MapBuilder