From 741b4f726d68a292e99e5f178f0aac8e10b9cd49 Mon Sep 17 00:00:00 2001 From: ErrorCraft Date: Mon, 19 Jan 2026 22:59:32 +0100 Subject: [PATCH 01/11] Port to 24w18a (#59) --- build.gradle | 4 +- gradle.properties | 8 +- .../mixin/client/MinecraftClientExtender.java | 35 +- .../recipebook/RecipeBookWidgetExtender.java | 2 +- .../ClientPlayNetworkHandlerExtender.java | 2 +- .../network/ClientTagLoaderExtender.java | 4 +- .../entity/PlayerEntityRendererExtender.java | 11 +- .../render/item/HeldItemRendererExtender.java | 139 +- .../itematic/data/ItematicData.java | 1 - .../server/tag/EnchantmentTagProvider.java | 139 -- .../data/server/tag/ItemTagProvider.java | 97 +- .../errorcraft/itematic/gametest/Assert.java | 26 +- .../itematic/gametest/TestUtil.java | 65 +- .../gametest/block/AnvilBlockTestSuite.java | 101 ++ .../block/DispenserBehaviorTestSuite.java | 6 +- .../block/EnchantingTableTestSuite.java | 105 ++ .../gametest/block/GrindstoneTestSuite.java | 82 + .../block/WaterCauldronBlockTestSuite.java | 2 +- .../passive/MooshroomEntityTestSuite.java | 2 +- .../itematic/gametest/item/BowTestSuite.java | 44 + .../gametest/item/BundleTestSuite.java | 6 +- .../gametest/item/CrossbowTestSuite.java | 44 + .../gametest/item/HoneyBottleTestSuite.java | 2 +- .../ConsumableItemComponentTestSuite.java | 2 +- .../component/FoodItemComponentTestSuite.java | 4 +- .../ItemHolderItemComponentTestSuite.java | 8 +- .../MappableItemComponentTestSuite.java | 2 +- .../PotionItemComponentTestSuite.java | 2 +- .../ShooterItemComponentTestSuite.java | 19 +- .../gametest/structures/block.anvil.snbt | 39 + .../structures/block.enchanting_table.snbt | 39 + .../gametest/structures/block.grindstone.snbt | 39 + .../structures/item.bow.platform.snbt | 38 + src/gametest/resources/fabric.mod.json | 7 +- .../generated/data/minecraft/item/arrow.json | 1 - .../data/minecraft/item/bogged_spawn_egg.json | 28 + .../bolt_armor_trim_smithing_template.json | 11 + .../generated/data/minecraft/item/bow.json | 13 +- .../data/minecraft/item/breeze_rod.json | 8 + .../data/minecraft/item/breeze_spawn_egg.json | 28 + .../generated/data/minecraft/item/brush.json | 3 - .../minecraft/item/carrot_on_a_stick.json | 3 - .../data/minecraft/item/chainmail_boots.json | 6 +- .../minecraft/item/chainmail_chestplate.json | 6 +- .../data/minecraft/item/chainmail_helmet.json | 6 +- .../minecraft/item/chainmail_leggings.json | 6 +- .../data/minecraft/item/chiseled_copper.json | 11 + .../data/minecraft/item/chiseled_tuff.json | 11 + .../minecraft/item/chiseled_tuff_bricks.json | 11 + .../data/minecraft/item/copper_bulb.json | 11 + .../data/minecraft/item/copper_door.json | 11 + .../data/minecraft/item/copper_grate.json | 11 + .../data/minecraft/item/copper_trapdoor.json | 11 + .../data/minecraft/item/crafter.json | 11 + .../data/minecraft/item/crossbow.json | 39 +- .../data/minecraft/item/diamond_axe.json | 6 +- .../data/minecraft/item/diamond_boots.json | 6 +- .../minecraft/item/diamond_chestplate.json | 6 +- .../data/minecraft/item/diamond_helmet.json | 6 +- .../data/minecraft/item/diamond_hoe.json | 6 +- .../data/minecraft/item/diamond_leggings.json | 6 +- .../data/minecraft/item/diamond_pickaxe.json | 6 +- .../data/minecraft/item/diamond_shovel.json | 6 +- .../data/minecraft/item/diamond_sword.json | 6 +- .../data/minecraft/item/ender_eye.json | 5 +- .../item/exposed_chiseled_copper.json | 11 + .../minecraft/item/exposed_copper_bulb.json | 11 + .../minecraft/item/exposed_copper_door.json | 11 + .../minecraft/item/exposed_copper_grate.json | 11 + .../item/exposed_copper_trapdoor.json | 11 + .../data/minecraft/item/firework_rocket.json | 2 - .../flow_armor_trim_smithing_template.json | 11 + .../minecraft/item/flow_banner_pattern.json | 17 + .../minecraft/item/flow_pottery_sherd.json | 11 + .../data/minecraft/item/golden_axe.json | 6 +- .../data/minecraft/item/golden_boots.json | 6 +- .../minecraft/item/golden_chestplate.json | 6 +- .../data/minecraft/item/golden_helmet.json | 6 +- .../data/minecraft/item/golden_hoe.json | 6 +- .../data/minecraft/item/golden_leggings.json | 6 +- .../data/minecraft/item/golden_pickaxe.json | 6 +- .../data/minecraft/item/golden_shovel.json | 6 +- .../data/minecraft/item/golden_sword.json | 6 +- .../minecraft/item/guster_banner_pattern.json | 17 + .../minecraft/item/guster_pottery_sherd.json | 11 + .../data/minecraft/item/heavy_core.json | 11 + .../data/minecraft/item/honey_bottle.json | 4 +- .../data/minecraft/item/iron_axe.json | 6 +- .../data/minecraft/item/iron_boots.json | 6 +- .../data/minecraft/item/iron_chestplate.json | 6 +- .../data/minecraft/item/iron_helmet.json | 6 +- .../data/minecraft/item/iron_hoe.json | 6 +- .../data/minecraft/item/iron_leggings.json | 6 +- .../data/minecraft/item/iron_pickaxe.json | 6 +- .../data/minecraft/item/iron_shovel.json | 6 +- .../data/minecraft/item/iron_sword.json | 6 +- .../data/minecraft/item/leather_boots.json | 6 +- .../minecraft/item/leather_chestplate.json | 6 +- .../data/minecraft/item/leather_helmet.json | 6 +- .../data/minecraft/item/leather_leggings.json | 6 +- .../generated/data/minecraft/item/mace.json | 29 + .../data/minecraft/item/milk_bucket.json | 4 +- .../minecraft/item/music_disc_creator.json | 15 + .../item/music_disc_creator_music_box.json | 15 + .../minecraft/item/music_disc_precipice.json | 15 + .../data/minecraft/item/netherite_axe.json | 6 +- .../data/minecraft/item/netherite_boots.json | 6 +- .../minecraft/item/netherite_chestplate.json | 6 +- .../data/minecraft/item/netherite_helmet.json | 6 +- .../data/minecraft/item/netherite_hoe.json | 6 +- .../minecraft/item/netherite_leggings.json | 6 +- .../minecraft/item/netherite_pickaxe.json | 6 +- .../data/minecraft/item/netherite_shovel.json | 6 +- .../data/minecraft/item/netherite_sword.json | 6 +- .../data/minecraft/item/ominous_bottle.json | 32 + .../minecraft/item/ominous_trial_key.json | 8 + .../item/oxidized_chiseled_copper.json | 11 + .../minecraft/item/oxidized_copper_bulb.json | 11 + .../minecraft/item/oxidized_copper_door.json | 11 + .../minecraft/item/oxidized_copper_grate.json | 11 + .../item/oxidized_copper_trapdoor.json | 11 + .../data/minecraft/item/polished_tuff.json | 11 + .../minecraft/item/polished_tuff_slab.json | 11 + .../minecraft/item/polished_tuff_stairs.json | 11 + .../minecraft/item/polished_tuff_wall.json | 11 + .../generated/data/minecraft/item/potion.json | 4 +- .../minecraft/item/scrape_pottery_sherd.json | 11 + .../data/minecraft/item/spectral_arrow.json | 1 - .../data/minecraft/item/stone_axe.json | 6 +- .../data/minecraft/item/stone_hoe.json | 6 +- .../data/minecraft/item/stone_pickaxe.json | 6 +- .../data/minecraft/item/stone_shovel.json | 6 +- .../data/minecraft/item/stone_sword.json | 6 +- .../data/minecraft/item/tipped_arrow.json | 1 - .../data/minecraft/item/trial_key.json | 8 + .../data/minecraft/item/trial_spawner.json | 11 + .../data/minecraft/item/trident.json | 9 +- .../data/minecraft/item/tuff_brick_slab.json | 11 + .../minecraft/item/tuff_brick_stairs.json | 11 + .../data/minecraft/item/tuff_brick_wall.json | 11 + .../data/minecraft/item/tuff_bricks.json | 11 + .../data/minecraft/item/tuff_slab.json | 11 + .../data/minecraft/item/tuff_stairs.json | 11 + .../data/minecraft/item/tuff_wall.json | 11 + .../data/minecraft/item/turtle_helmet.json | 6 +- .../generated/data/minecraft/item/vault.json | 11 + .../item/warped_fungus_on_a_stick.json | 3 - .../minecraft/item/waxed_chiseled_copper.json | 11 + .../minecraft/item/waxed_copper_bulb.json | 11 + .../minecraft/item/waxed_copper_door.json | 11 + .../minecraft/item/waxed_copper_grate.json | 11 + .../minecraft/item/waxed_copper_trapdoor.json | 11 + .../item/waxed_exposed_chiseled_copper.json | 11 + .../item/waxed_exposed_copper_bulb.json | 11 + .../item/waxed_exposed_copper_door.json | 11 + .../item/waxed_exposed_copper_grate.json | 11 + .../item/waxed_exposed_copper_trapdoor.json | 11 + .../item/waxed_oxidized_chiseled_copper.json | 11 + .../item/waxed_oxidized_copper_bulb.json | 11 + .../item/waxed_oxidized_copper_door.json | 11 + .../item/waxed_oxidized_copper_grate.json | 11 + .../item/waxed_oxidized_copper_trapdoor.json | 11 + .../item/waxed_weathered_chiseled_copper.json | 11 + .../item/waxed_weathered_copper_bulb.json | 11 + .../item/waxed_weathered_copper_door.json | 11 + .../item/waxed_weathered_copper_grate.json | 11 + .../item/waxed_weathered_copper_trapdoor.json | 11 + .../item/weathered_chiseled_copper.json | 11 + .../minecraft/item/weathered_copper_bulb.json | 11 + .../minecraft/item/weathered_copper_door.json | 11 + .../item/weathered_copper_grate.json | 11 + .../item/weathered_copper_trapdoor.json | 11 + .../data/minecraft/item/wind_charge.json | 23 + .../data/minecraft/item/wooden_axe.json | 6 +- .../data/minecraft/item/wooden_hoe.json | 6 +- .../data/minecraft/item/wooden_pickaxe.json | 6 +- .../data/minecraft/item/wooden_shovel.json | 6 +- .../data/minecraft/item/wooden_sword.json | 6 +- .../item_group_entry_provider/combat.json | 2 + .../food_and_drinks.json | 35 + .../functional_blocks.json | 1 + .../ingredients.json | 1319 +---------------- .../redstone_blocks.json | 5 + .../item_group_entry_provider/spawn_eggs.json | 2 + .../tools_and_utilities.json | 1 + .../smithing_template/bolt_pattern.json | 4 + .../smithing_template/flow_pattern.json | 4 + .../tags/enchantment/armor_enchanting.json | 9 - .../tags/enchantment/armor_forging.json | 5 - .../tags/enchantment/axe_enchanting.json | 5 - .../tags/enchantment/axe_forging.json | 9 - .../tags/enchantment/boots_enchanting.json | 7 - .../tags/enchantment/boots_forging.json | 8 - .../tags/enchantment/bow_enchanting.json | 9 - .../tags/enchantment/bow_forging.json | 6 - .../tags/enchantment/brush_forging.json | 7 - .../enchantment/chestplate_enchanting.json | 6 - .../tags/enchantment/chestplate_forging.json | 5 - .../tags/enchantment/crossbow_enchanting.json | 8 - .../tags/enchantment/crossbow_forging.json | 6 - .../minecraft/tags/enchantment/cursed.json | 6 - .../tags/enchantment/enchanting.json | 5 - .../minecraft/tags/enchantment/forging.json | 6 - .../tags/enchantment/helmet_enchanting.json | 7 - .../tags/enchantment/helmet_forging.json | 6 - .../tags/enchantment/hoe_enchanting.json | 5 - .../tags/enchantment/hoe_forging.json | 6 - .../tags/enchantment/leggings_enchanting.json | 5 - .../tags/enchantment/leggings_forging.json | 7 - .../tags/enchantment/pickaxe_enchanting.json | 5 - .../tags/enchantment/pickaxe_forging.json | 6 - .../tags/enchantment/shovel_enchanting.json | 5 - .../tags/enchantment/shovel_forging.json | 6 - .../tags/enchantment/steering_forging.json | 7 - .../tags/enchantment/sword_enchanting.json | 12 - .../tags/enchantment/sword_forging.json | 6 - .../tags/enchantment/tool_enchanting.json | 8 - .../tags/enchantment/tool_forging.json | 5 - .../minecraft/tags/enchantment/tradeable.json | 43 - .../tags/enchantment/trident_enchanting.json | 8 - .../tags/enchantment/trident_forging.json | 6 - .../items/item_group/banner_patterns.json | 4 +- .../item_group/copper_building_blocks.json | 7 +- .../exposed_copper_building_blocks.json | 7 +- .../item_group/light_emitting_blocks.json | 8 + .../tags/items/item_group/music_discs.json | 5 +- .../oxidized_copper_building_blocks.json | 7 +- .../items/item_group/smithing_templates.json | 4 +- .../tags/items/item_group/spawners.json | 3 +- .../item_group/tuff_building_blocks.json | 15 +- .../waxed_copper_building_blocks.json | 7 +- .../waxed_exposed_copper_building_blocks.json | 7 +- ...waxed_oxidized_copper_building_blocks.json | 7 +- ...axed_weathered_copper_building_blocks.json | 7 +- .../weathered_copper_building_blocks.json | 7 +- .../minecraft/tags/items/repairs_mace.json | 5 + .../data/minecraft/tags/potion/tradeable.json | 6 +- .../net/errorcraft/itematic/Itematic.java | 2 + .../ChargedProjectilesComponentAccess.java | 3 - .../itematic/access/item/ItemStackAccess.java | 4 - .../item/ItemPredicateBuilderAccess.java | 4 +- .../errorcraft/itematic/block/BlockKeys.java | 63 +- .../component/ItematicDataComponentTypes.java | 39 +- .../type/ItemDamageRulesDataComponent.java | 58 + .../itematic/enchantment/EnchantmentKeys.java | 54 - .../itematic/enchantment/EnchantmentTags.java | 52 - .../itematic/entity/EntityTypeKeys.java | 3 + .../EyeOfEnderEntityInitializer.java | 5 - ...PersistentProjectileEntityInitializer.java | 22 +- .../TridentEntityInitializer.java | 16 +- .../WindChargeEntityInitializer.java | 60 + .../errorcraft/itematic/item/ItemKeys.java | 75 + .../errorcraft/itematic/item/ItemUtil.java | 843 ++++++++--- .../itematic/item/ItematicItemTags.java | 1 + .../item/component/ItemComponentTypes.java | 2 +- .../components/CastableItemComponent.java | 6 +- .../components/ConsumableItemComponent.java | 82 +- .../components/DamageableItemComponent.java | 18 +- .../DecoratedPotPatternItemComponent.java | 11 +- .../components/EnchantableItemComponent.java | 33 +- .../components/EntityItemComponent.java | 14 +- .../components/FoodItemComponent.java | 27 +- .../components/ForgeableItemComponent.java | 32 - .../OminousEffectProviderItemComponent.java | 59 + .../components/ProjectileItemComponent.java | 43 +- .../components/ShooterItemComponent.java | 243 +-- .../SmithingTemplateItemComponent.java | 11 +- .../components/WeaponItemComponent.java | 24 +- .../item/group/entry/ItemGroupEntry.java | 59 +- .../item/group/entry/ItemGroupEntryType.java | 3 +- .../entry/PossiblyHiddenItemGroupEntry.java | 58 + .../entries/EnchantmentItemGroupEntry.java | 61 + .../entries/InstrumentItemGroupEntry.java | 26 +- .../PaintingVariantItemGroupEntry.java | 37 +- .../entry/entries/PotionItemGroupEntry.java | 20 +- .../entry/entries/StackItemGroupEntry.java | 46 +- ...piciousEffectIngredientItemGroupEntry.java | 20 +- .../entry/entries/TagItemGroupEntry.java | 33 +- .../provider/ItemGroupEntryProviders.java | 103 +- .../overrides/ChargedModelOverride.java | 9 +- .../override/overrides/PullModelOverride.java | 4 +- .../overrides/PullingModelOverride.java | 12 +- .../item/shooter/ChargingSoundsUtil.java | 21 + .../item/shooter/method/ShooterMethod.java | 32 + .../shooter/method/ShooterMethodType.java | 6 + .../shooter/method/ShooterMethodTypeKeys.java | 16 + .../shooter/method/ShooterMethodTypes.java | 20 + .../methods/ChargeableShooterMethod.java | 228 +++ .../method/methods/DirectShooterMethod.java | 108 ++ .../smithing/template/SmithingTemplates.java | 4 + .../providers/ShooterIntegerProvider.java | 15 +- .../providers/TridentIntegerProvider.java | 7 +- .../block/ChiseledBookshelfBlockExtender.java | 5 +- .../block/DecoratedPotPatternsAccessor.java | 18 + .../block/vault/VaultConfigExtender.java | 22 + .../component/DataComponentTypesAccessor.java | 4 +- .../component/DataComponentTypesExtender.java | 14 +- .../ChargedProjectilesComponentExtender.java | 19 - .../enchantment/EnchantmentExtender.java | 26 - .../EnchantmentHelperExtender.java | 37 +- .../mixin/entity/CrossbowUserExtender.java | 12 +- .../mixin/entity/EntityTypeExtender.java | 22 + .../mixin/entity/LivingEntityExtender.java | 66 +- .../decoration/LeashKnotEntityExtender.java | 6 +- .../entity/mob/GuardianEntityExtender.java | 18 - .../entity/mob/HostileEntityExtender.java | 1 + .../mixin/entity/mob/WitchEntityExtender.java | 11 - .../entity/passive/AxolotlEntityExtender.java | 13 - .../entity/passive/CatEntityExtender.java | 15 - .../entity/passive/DolphinEntityExtender.java | 15 - .../entity/passive/OcelotEntityExtender.java | 15 - .../passive/PolarBearEntityExtender.java | 15 - .../entity/passive/SheepEntityExtender.java | 109 +- .../entity/passive/WolfEntityExtender.java | 13 - .../projectile/ArrowEntityExtender.java | 9 +- .../projectile/ProjectileUtilExtender.java | 16 +- .../SpectralArrowEntityExtender.java | 4 +- .../mixin/item/CrossbowItemAccessor.java | 24 +- .../mixin/item/CrossbowItemExtender.java | 79 +- .../mixin/item/HoneyBottleItemAccessor.java | 2 +- .../itematic/mixin/item/ItemExtender.java | 44 +- .../mixin/item/ItemGroupsAccessor.java | 5 - .../mixin/item/ItemStackExtender.java | 86 +- .../mixin/item/OminousBottleItemAccessor.java | 13 + .../mixin/item/RangedWeaponItemAccessor.java | 22 + .../mixin/item/RangedWeaponItemExtender.java | 60 - .../mixin/item/WindChargeItemAccessor.java | 13 + .../EnchantRandomlyLootFunctionExtender.java | 35 +- .../SetEnchantmentsLootFunctionExtender.java | 10 +- .../SetPotionLootFunctionExtender.java | 33 +- .../predicate/item/ItemPredicateExtender.java | 6 +- .../mixin/recipe/ArmorDyeRecipeExtender.java | 14 +- .../recipe/BannerDuplicateRecipeExtender.java | 8 +- .../recipe/BookCloningRecipeExtender.java | 14 +- .../recipe/BrewingRecipeRegistryExtender.java | 8 + .../CraftingDecoratedPotRecipeExtender.java | 17 +- .../recipe/FireworkRocketRecipeExtender.java | 14 +- .../FireworkStarFadeRecipeExtender.java | 13 +- .../recipe/FireworkStarRecipeExtender.java | 31 +- .../mixin/recipe/InputSlotFillerExtender.java | 12 +- .../recipe/MapCloningRecipeExtender.java | 17 +- .../recipe/MapExtendingRecipeExtender.java | 14 +- .../recipe/RepairItemRecipeExtender.java | 2 +- .../ShieldDecorationRecipeExtender.java | 16 +- .../recipe/SuspiciousStewRecipeExtender.java | 22 +- .../recipe/TippedArrowRecipeExtender.java | 9 +- .../registry/RegistryLoaderAccessor.java | 18 + .../registry/RegistryLoaderExtender.java | 37 +- .../screen/AnvilScreenHandlerExtender.java | 2 +- .../EnchantmentScreenHandlerExtender.java | 6 +- .../GrindstoneScreenHandlerExtender.java | 11 +- ...erverPlayerInteractionManagerExtender.java | 12 - .../mixin/village/TradeOffersExtender.java | 31 +- .../packet/s2c/play/TwirlS2CPacket.java | 4 +- .../item/ItemPredicateExtraFields.java | 10 +- .../itematic/recipe/ItemColoringRecipe.java | 22 +- .../itematic/registry/ItematicRegistries.java | 3 + .../registry/ItematicRegistryKeys.java | 2 + .../itematic/sound/SoundEventKeys.java | 10 +- .../itematic/village/trade/Trades.java | 2 +- .../EnchantWithLevelsTradeModifier.java | 10 +- .../SingleEnchantmentTradeModifier.java | 16 +- .../world/action/ActionRequirements.java | 3 +- .../world/action/actions/PlaySoundAction.java | 48 +- .../action/actions/TwirlPlayerAction.java | 36 +- .../world/action/context/ActionContext.java | 8 +- src/main/resources/fabric.mod.json | 6 +- ...ic.accesswidener => itematic.classtweaker} | 4 +- src/main/resources/itematic.mixins.json | 8 +- 369 files changed, 4771 insertions(+), 3755 deletions(-) delete mode 100644 src/datagen/java/net/errorcraft/itematic/data/server/tag/EnchantmentTagProvider.java create mode 100644 src/gametest/java/net/errorcraft/itematic/gametest/block/AnvilBlockTestSuite.java create mode 100644 src/gametest/java/net/errorcraft/itematic/gametest/block/EnchantingTableTestSuite.java create mode 100644 src/gametest/java/net/errorcraft/itematic/gametest/block/GrindstoneTestSuite.java create mode 100644 src/gametest/java/net/errorcraft/itematic/gametest/item/BowTestSuite.java create mode 100644 src/gametest/java/net/errorcraft/itematic/gametest/item/CrossbowTestSuite.java create mode 100644 src/gametest/resources/data/itematic/gametest/structures/block.anvil.snbt create mode 100644 src/gametest/resources/data/itematic/gametest/structures/block.enchanting_table.snbt create mode 100644 src/gametest/resources/data/itematic/gametest/structures/block.grindstone.snbt create mode 100644 src/gametest/resources/data/itematic/gametest/structures/item.bow.platform.snbt create mode 100644 src/main/generated/data/minecraft/item/bogged_spawn_egg.json create mode 100644 src/main/generated/data/minecraft/item/bolt_armor_trim_smithing_template.json create mode 100644 src/main/generated/data/minecraft/item/breeze_rod.json create mode 100644 src/main/generated/data/minecraft/item/breeze_spawn_egg.json create mode 100644 src/main/generated/data/minecraft/item/chiseled_copper.json create mode 100644 src/main/generated/data/minecraft/item/chiseled_tuff.json create mode 100644 src/main/generated/data/minecraft/item/chiseled_tuff_bricks.json create mode 100644 src/main/generated/data/minecraft/item/copper_bulb.json create mode 100644 src/main/generated/data/minecraft/item/copper_door.json create mode 100644 src/main/generated/data/minecraft/item/copper_grate.json create mode 100644 src/main/generated/data/minecraft/item/copper_trapdoor.json create mode 100644 src/main/generated/data/minecraft/item/crafter.json create mode 100644 src/main/generated/data/minecraft/item/exposed_chiseled_copper.json create mode 100644 src/main/generated/data/minecraft/item/exposed_copper_bulb.json create mode 100644 src/main/generated/data/minecraft/item/exposed_copper_door.json create mode 100644 src/main/generated/data/minecraft/item/exposed_copper_grate.json create mode 100644 src/main/generated/data/minecraft/item/exposed_copper_trapdoor.json create mode 100644 src/main/generated/data/minecraft/item/flow_armor_trim_smithing_template.json create mode 100644 src/main/generated/data/minecraft/item/flow_banner_pattern.json create mode 100644 src/main/generated/data/minecraft/item/flow_pottery_sherd.json create mode 100644 src/main/generated/data/minecraft/item/guster_banner_pattern.json create mode 100644 src/main/generated/data/minecraft/item/guster_pottery_sherd.json create mode 100644 src/main/generated/data/minecraft/item/heavy_core.json create mode 100644 src/main/generated/data/minecraft/item/mace.json create mode 100644 src/main/generated/data/minecraft/item/music_disc_creator.json create mode 100644 src/main/generated/data/minecraft/item/music_disc_creator_music_box.json create mode 100644 src/main/generated/data/minecraft/item/music_disc_precipice.json create mode 100644 src/main/generated/data/minecraft/item/ominous_bottle.json create mode 100644 src/main/generated/data/minecraft/item/ominous_trial_key.json create mode 100644 src/main/generated/data/minecraft/item/oxidized_chiseled_copper.json create mode 100644 src/main/generated/data/minecraft/item/oxidized_copper_bulb.json create mode 100644 src/main/generated/data/minecraft/item/oxidized_copper_door.json create mode 100644 src/main/generated/data/minecraft/item/oxidized_copper_grate.json create mode 100644 src/main/generated/data/minecraft/item/oxidized_copper_trapdoor.json create mode 100644 src/main/generated/data/minecraft/item/polished_tuff.json create mode 100644 src/main/generated/data/minecraft/item/polished_tuff_slab.json create mode 100644 src/main/generated/data/minecraft/item/polished_tuff_stairs.json create mode 100644 src/main/generated/data/minecraft/item/polished_tuff_wall.json create mode 100644 src/main/generated/data/minecraft/item/scrape_pottery_sherd.json create mode 100644 src/main/generated/data/minecraft/item/trial_key.json create mode 100644 src/main/generated/data/minecraft/item/trial_spawner.json create mode 100644 src/main/generated/data/minecraft/item/tuff_brick_slab.json create mode 100644 src/main/generated/data/minecraft/item/tuff_brick_stairs.json create mode 100644 src/main/generated/data/minecraft/item/tuff_brick_wall.json create mode 100644 src/main/generated/data/minecraft/item/tuff_bricks.json create mode 100644 src/main/generated/data/minecraft/item/tuff_slab.json create mode 100644 src/main/generated/data/minecraft/item/tuff_stairs.json create mode 100644 src/main/generated/data/minecraft/item/tuff_wall.json create mode 100644 src/main/generated/data/minecraft/item/vault.json create mode 100644 src/main/generated/data/minecraft/item/waxed_chiseled_copper.json create mode 100644 src/main/generated/data/minecraft/item/waxed_copper_bulb.json create mode 100644 src/main/generated/data/minecraft/item/waxed_copper_door.json create mode 100644 src/main/generated/data/minecraft/item/waxed_copper_grate.json create mode 100644 src/main/generated/data/minecraft/item/waxed_copper_trapdoor.json create mode 100644 src/main/generated/data/minecraft/item/waxed_exposed_chiseled_copper.json create mode 100644 src/main/generated/data/minecraft/item/waxed_exposed_copper_bulb.json create mode 100644 src/main/generated/data/minecraft/item/waxed_exposed_copper_door.json create mode 100644 src/main/generated/data/minecraft/item/waxed_exposed_copper_grate.json create mode 100644 src/main/generated/data/minecraft/item/waxed_exposed_copper_trapdoor.json create mode 100644 src/main/generated/data/minecraft/item/waxed_oxidized_chiseled_copper.json create mode 100644 src/main/generated/data/minecraft/item/waxed_oxidized_copper_bulb.json create mode 100644 src/main/generated/data/minecraft/item/waxed_oxidized_copper_door.json create mode 100644 src/main/generated/data/minecraft/item/waxed_oxidized_copper_grate.json create mode 100644 src/main/generated/data/minecraft/item/waxed_oxidized_copper_trapdoor.json create mode 100644 src/main/generated/data/minecraft/item/waxed_weathered_chiseled_copper.json create mode 100644 src/main/generated/data/minecraft/item/waxed_weathered_copper_bulb.json create mode 100644 src/main/generated/data/minecraft/item/waxed_weathered_copper_door.json create mode 100644 src/main/generated/data/minecraft/item/waxed_weathered_copper_grate.json create mode 100644 src/main/generated/data/minecraft/item/waxed_weathered_copper_trapdoor.json create mode 100644 src/main/generated/data/minecraft/item/weathered_chiseled_copper.json create mode 100644 src/main/generated/data/minecraft/item/weathered_copper_bulb.json create mode 100644 src/main/generated/data/minecraft/item/weathered_copper_door.json create mode 100644 src/main/generated/data/minecraft/item/weathered_copper_grate.json create mode 100644 src/main/generated/data/minecraft/item/weathered_copper_trapdoor.json create mode 100644 src/main/generated/data/minecraft/item/wind_charge.json create mode 100644 src/main/generated/data/minecraft/smithing_template/bolt_pattern.json create mode 100644 src/main/generated/data/minecraft/smithing_template/flow_pattern.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/armor_enchanting.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/armor_forging.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/axe_enchanting.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/axe_forging.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/boots_enchanting.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/boots_forging.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/bow_enchanting.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/bow_forging.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/brush_forging.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/chestplate_enchanting.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/chestplate_forging.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/crossbow_enchanting.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/crossbow_forging.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/cursed.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/enchanting.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/forging.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/helmet_enchanting.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/helmet_forging.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/hoe_enchanting.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/hoe_forging.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/leggings_enchanting.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/leggings_forging.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/pickaxe_enchanting.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/pickaxe_forging.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/shovel_enchanting.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/shovel_forging.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/steering_forging.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/sword_enchanting.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/sword_forging.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/tool_enchanting.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/tool_forging.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/tradeable.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/trident_enchanting.json delete mode 100644 src/main/generated/data/minecraft/tags/enchantment/trident_forging.json create mode 100644 src/main/generated/data/minecraft/tags/items/repairs_mace.json create mode 100644 src/main/java/net/errorcraft/itematic/component/type/ItemDamageRulesDataComponent.java delete mode 100644 src/main/java/net/errorcraft/itematic/enchantment/EnchantmentKeys.java delete mode 100644 src/main/java/net/errorcraft/itematic/enchantment/EnchantmentTags.java create mode 100644 src/main/java/net/errorcraft/itematic/entity/initializer/initializers/WindChargeEntityInitializer.java delete mode 100644 src/main/java/net/errorcraft/itematic/item/component/components/ForgeableItemComponent.java create mode 100644 src/main/java/net/errorcraft/itematic/item/component/components/OminousEffectProviderItemComponent.java create mode 100644 src/main/java/net/errorcraft/itematic/item/group/entry/PossiblyHiddenItemGroupEntry.java create mode 100644 src/main/java/net/errorcraft/itematic/item/group/entry/entries/EnchantmentItemGroupEntry.java create mode 100644 src/main/java/net/errorcraft/itematic/item/shooter/ChargingSoundsUtil.java create mode 100644 src/main/java/net/errorcraft/itematic/item/shooter/method/ShooterMethod.java create mode 100644 src/main/java/net/errorcraft/itematic/item/shooter/method/ShooterMethodType.java create mode 100644 src/main/java/net/errorcraft/itematic/item/shooter/method/ShooterMethodTypeKeys.java create mode 100644 src/main/java/net/errorcraft/itematic/item/shooter/method/ShooterMethodTypes.java create mode 100644 src/main/java/net/errorcraft/itematic/item/shooter/method/methods/ChargeableShooterMethod.java create mode 100644 src/main/java/net/errorcraft/itematic/item/shooter/method/methods/DirectShooterMethod.java create mode 100644 src/main/java/net/errorcraft/itematic/mixin/block/vault/VaultConfigExtender.java delete mode 100644 src/main/java/net/errorcraft/itematic/mixin/enchantment/EnchantmentExtender.java create mode 100644 src/main/java/net/errorcraft/itematic/mixin/item/OminousBottleItemAccessor.java create mode 100644 src/main/java/net/errorcraft/itematic/mixin/item/RangedWeaponItemAccessor.java delete mode 100644 src/main/java/net/errorcraft/itematic/mixin/item/RangedWeaponItemExtender.java create mode 100644 src/main/java/net/errorcraft/itematic/mixin/item/WindChargeItemAccessor.java create mode 100644 src/main/java/net/errorcraft/itematic/mixin/registry/RegistryLoaderAccessor.java rename src/main/resources/{itematic.accesswidener => itematic.classtweaker} (82%) diff --git a/build.gradle b/build.gradle index 4ebaae1e..295d0f1b 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'fabric-loom' version '1.12-SNAPSHOT' + id 'fabric-loom' version '1.14-SNAPSHOT' id 'maven-publish' } @@ -108,7 +108,7 @@ loom { source sourceSets.gametest } } - accessWidenerPath = file("src/main/resources/itematic.accesswidener") + accessWidenerPath = file("src/main/resources/itematic.classtweaker") } java { diff --git a/gradle.properties b/gradle.properties index cd14946c..58ceabfa 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,9 +3,9 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://fabricmc.net/develop - minecraft_version=1.20.6 - yarn_mappings=1.20.6+build.3 - loader_version=0.17.3 + minecraft_version=24w18a + yarn_mappings=24w18a+build.4 + loader_version=0.18.4 # Mod Properties mod_version = 0.3.0 @@ -13,4 +13,4 @@ org.gradle.jvmargs=-Xmx1G archives_base_name = itematic # Dependencies - fabric_version=0.100.8+1.20.6 + fabric_version=0.98.0+1.21 diff --git a/src/client/java/net/errorcraft/itematic/mixin/client/MinecraftClientExtender.java b/src/client/java/net/errorcraft/itematic/mixin/client/MinecraftClientExtender.java index ee3f376f..02435e85 100644 --- a/src/client/java/net/errorcraft/itematic/mixin/client/MinecraftClientExtender.java +++ b/src/client/java/net/errorcraft/itematic/mixin/client/MinecraftClientExtender.java @@ -4,18 +4,13 @@ import net.errorcraft.itematic.client.item.bar.ItemBarStyleLoader; import net.minecraft.client.MinecraftClient; import net.minecraft.client.RunArgs; -import net.minecraft.client.gui.screen.recipebook.RecipeResultCollection; -import net.minecraft.item.ItemStack; -import net.minecraft.recipe.RecipeEntry; -import net.minecraft.registry.DefaultedRegistry; -import net.minecraft.registry.DynamicRegistryManager; import net.minecraft.resource.ReloadableResourceManagerImpl; -import net.minecraft.util.Identifier; -import org.jetbrains.annotations.NotNull; -import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(MinecraftClient.class) @@ -38,28 +33,6 @@ private void addCustomLoaders(RunArgs args, CallbackInfo info) { this.resourceManager.registerReloader(this.itemBarStyles); } - @Redirect( - method = "method_1502", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/registry/DefaultedRegistry;getId(Ljava/lang/Object;)Lnet/minecraft/util/Identifier;" - ) - ) - @NotNull - private static Identifier initializeItemTooltipSearchProviderUseRegistryEntry(DefaultedRegistry instance, T t, ItemStack stack) { - return stack.itematic$key().getValue(); - } - - /** - * @author ErrorCraft - * @reason Uses a registry entry for data-driven items. - */ - @Overwrite - private static Identifier method_53861(RecipeResultCollection resultCollection, RecipeEntry entry) { - DynamicRegistryManager registryManager = resultCollection.getRegistryManager(); - return entry.value().getResult(registryManager).itematic$key().getValue(); - } - @Override public ItemBarStyleLoader itematic$itemBarStyles() { return this.itemBarStyles; diff --git a/src/client/java/net/errorcraft/itematic/mixin/client/gui/screen/recipebook/RecipeBookWidgetExtender.java b/src/client/java/net/errorcraft/itematic/mixin/client/gui/screen/recipebook/RecipeBookWidgetExtender.java index 5642d5db..0aec395b 100644 --- a/src/client/java/net/errorcraft/itematic/mixin/client/gui/screen/recipebook/RecipeBookWidgetExtender.java +++ b/src/client/java/net/errorcraft/itematic/mixin/client/gui/screen/recipebook/RecipeBookWidgetExtender.java @@ -15,7 +15,7 @@ public class RecipeBookWidgetExtender implements RecipeBookWidgetAccess { method = "initialize", at = @At("TAIL") ) - private void initializeAllowRecipeSpecificInitialization(int parentWidth, int parentHeight, MinecraftClient client, boolean narrow, AbstractRecipeScreenHandler craftingScreenHandler, CallbackInfo info) { + private void initializeAllowRecipeSpecificInitialization(int parentWidth, int parentHeight, MinecraftClient client, boolean narrow, AbstractRecipeScreenHandler craftingScreenHandler, CallbackInfo info) { this.itematic$initializeRecipeSpecific(client.world); } } diff --git a/src/client/java/net/errorcraft/itematic/mixin/client/network/ClientPlayNetworkHandlerExtender.java b/src/client/java/net/errorcraft/itematic/mixin/client/network/ClientPlayNetworkHandlerExtender.java index b76d13a9..ab028ced 100644 --- a/src/client/java/net/errorcraft/itematic/mixin/client/network/ClientPlayNetworkHandlerExtender.java +++ b/src/client/java/net/errorcraft/itematic/mixin/client/network/ClientPlayNetworkHandlerExtender.java @@ -54,6 +54,6 @@ private static ItemStack newItemStackForTotemOfUndyingUseCreateStack(ItemConvert @Override @SuppressWarnings("DataFlowIssue") public void itematic$onTwirl(TwirlS2CPacket packet) { - TwirlPlayerAction.execute(packet.riptideLevel(), this.client.player, this.world); + TwirlPlayerAction.execute(packet.spinAttackStrength(), this.client.player, this.world, this.client.player.getActiveItem()); } } diff --git a/src/client/java/net/errorcraft/itematic/mixin/client/network/ClientTagLoaderExtender.java b/src/client/java/net/errorcraft/itematic/mixin/client/network/ClientTagLoaderExtender.java index 311a933c..23f533cf 100644 --- a/src/client/java/net/errorcraft/itematic/mixin/client/network/ClientTagLoaderExtender.java +++ b/src/client/java/net/errorcraft/itematic/mixin/client/network/ClientTagLoaderExtender.java @@ -10,8 +10,8 @@ @Mixin(ClientTagLoader.class) public class ClientTagLoaderExtender { @Inject( - method = "onDynamicTagsLoaded", - at = @At("HEAD") + method = "load(Lnet/minecraft/registry/DynamicRegistryManager;Z)V", + at = @At("RETURN") ) private static void resetItemGroupDisplayContext(CallbackInfo info) { ItemGroupsAccessor.setDisplayContext(null); diff --git a/src/client/java/net/errorcraft/itematic/mixin/client/render/entity/PlayerEntityRendererExtender.java b/src/client/java/net/errorcraft/itematic/mixin/client/render/entity/PlayerEntityRendererExtender.java index 2f5d6131..6c453d77 100644 --- a/src/client/java/net/errorcraft/itematic/mixin/client/render/entity/PlayerEntityRendererExtender.java +++ b/src/client/java/net/errorcraft/itematic/mixin/client/render/entity/PlayerEntityRendererExtender.java @@ -1,6 +1,8 @@ package net.errorcraft.itematic.mixin.client.render.entity; -import net.errorcraft.itematic.item.ItemKeys; +import net.errorcraft.itematic.item.component.ItemComponentTypes; +import net.errorcraft.itematic.item.component.components.ShooterItemComponent; +import net.errorcraft.itematic.item.shooter.method.ShooterMethodTypes; import net.minecraft.client.render.entity.PlayerEntityRenderer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -17,7 +19,10 @@ public class PlayerEntityRendererExtender { target = "Lnet/minecraft/item/ItemStack;isOf(Lnet/minecraft/item/Item;)Z" ) ) - private static boolean isOfForCrossbowUseRegistryKeyCheck(ItemStack instance, Item item) { - return instance.itematic$isOf(ItemKeys.CROSSBOW); + private static boolean isOfForCrossbowUseItemComponent(ItemStack instance, Item item) { + return instance.itematic$getComponent(ItemComponentTypes.SHOOTER) + .map(ShooterItemComponent::method) + .filter(method -> method.type() == ShooterMethodTypes.CHARGEABLE) + .isPresent(); } } diff --git a/src/client/java/net/errorcraft/itematic/mixin/client/render/item/HeldItemRendererExtender.java b/src/client/java/net/errorcraft/itematic/mixin/client/render/item/HeldItemRendererExtender.java index ed0b0f5e..a876a2bf 100644 --- a/src/client/java/net/errorcraft/itematic/mixin/client/render/item/HeldItemRendererExtender.java +++ b/src/client/java/net/errorcraft/itematic/mixin/client/render/item/HeldItemRendererExtender.java @@ -1,34 +1,31 @@ package net.errorcraft.itematic.mixin.client.render.item; -import com.llamalad7.mixinextras.sugar.Local; import com.llamalad7.mixinextras.sugar.Share; -import com.llamalad7.mixinextras.sugar.ref.LocalRef; -import net.errorcraft.itematic.item.ItemKeys; +import com.llamalad7.mixinextras.sugar.ref.LocalIntRef; import net.errorcraft.itematic.item.component.ItemComponentTypes; import net.errorcraft.itematic.item.component.components.ShooterItemComponent; -import net.minecraft.client.MinecraftClient; +import net.errorcraft.itematic.item.shooter.method.ShooterMethodTypes; import net.minecraft.client.network.AbstractClientPlayerEntity; -import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.render.item.HeldItemRenderer; +import net.minecraft.entity.LivingEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import org.spongepowered.asm.mixin.Final; +import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.Slice; import java.util.Optional; +import java.util.OptionalInt; @Mixin(HeldItemRenderer.class) public class HeldItemRendererExtender { - @Shadow - @Final - private MinecraftClient client; - @Redirect( - method = { "getHandRenderType", "getUsingItemHandRenderType" }, + method = { + "getHandRenderType", + "getUsingItemHandRenderType" + }, at = @At( value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;isOf(Lnet/minecraft/item/Item;)Z" @@ -36,16 +33,21 @@ public class HeldItemRendererExtender { slice = @Slice( from = @At( value = "FIELD", - target = "Lnet/minecraft/item/Items;BOW:Lnet/minecraft/item/Item;" + target = "Lnet/minecraft/item/Items;BOW:Lnet/minecraft/item/Item;", + opcode = Opcodes.GETSTATIC ), to = @At( value = "FIELD", - target = "Lnet/minecraft/item/Items;CROSSBOW:Lnet/minecraft/item/Item;" + target = "Lnet/minecraft/item/Items;CROSSBOW:Lnet/minecraft/item/Item;", + opcode = Opcodes.GETSTATIC ) ) ) - private static boolean isOfForBowUseRegistryKeyCheck(ItemStack instance, Item item) { - return instance.itematic$isOf(ItemKeys.BOW); + private static boolean isOfForBowUseItemComponent(ItemStack instance, Item item) { + return instance.itematic$getComponent(ItemComponentTypes.SHOOTER) + .map(ShooterItemComponent::method) + .filter(method -> method.type() == ShooterMethodTypes.DIRECT) + .isPresent(); } @Redirect( @@ -58,15 +60,28 @@ private static boolean isOfForBowUseRegistryKeyCheck(ItemStack instance, Item it slice = @Slice( from = @At( value = "FIELD", - target = "Lnet/minecraft/item/Items;CROSSBOW:Lnet/minecraft/item/Item;" + target = "Lnet/minecraft/item/Items;CROSSBOW:Lnet/minecraft/item/Item;", + opcode = Opcodes.GETSTATIC ) ) ) - private boolean isOfForCrossbowUseItemComponent(ItemStack instance, Item item, @Share("shooterItemComponent") LocalRef shooterItemComponent) { - Optional optionalComponent = instance.itematic$getComponent(ItemComponentTypes.SHOOTER); - optionalComponent.ifPresent(shooterItemComponent::set); - return optionalComponent.map(ShooterItemComponent::isChargeable) - .orElse(false); + private boolean isOfForCrossbowUseItemComponent(ItemStack instance, Item item, AbstractClientPlayerEntity player, @Share("useDuration") LocalIntRef useDuration) { + Optional optionalShooter = instance.itematic$getComponent(ItemComponentTypes.SHOOTER); + if (optionalShooter.isEmpty()) { + return false; + } + + if (optionalShooter.get().method().type() != ShooterMethodTypes.CHARGEABLE) { + return false; + } + + OptionalInt optionalUseDuration = optionalShooter.get().useDuration(instance, player); + if (optionalUseDuration.orElse(0) <= 0) { + return false; + } + + useDuration.set(optionalUseDuration.getAsInt()); + return true; } @Redirect( @@ -77,56 +92,82 @@ private boolean isOfForCrossbowUseItemComponent(ItemStack instance, Item item, @ ordinal = 0 ) ) - private int useDifference(AbstractClientPlayerEntity instance, @Local(argsOnly = true) ItemStack stack, @Share("shooterItemComponent") LocalRef shooterItemComponent) { - return ShooterItemComponent.useDuration(stack) - instance.itematic$itemUsedTicks(); + private int useDifferenceForCrossbow(AbstractClientPlayerEntity instance, @Share("useDuration") LocalIntRef useDuration) { + return useDuration.get() - instance.itematic$itemUsedTicks(); } @Redirect( method = "renderFirstPersonItem", at = @At( value = "INVOKE", - target = "Lnet/minecraft/item/CrossbowItem;isCharged(Lnet/minecraft/item/ItemStack;)Z" + target = "Lnet/minecraft/item/ItemStack;getMaxUseTime(Lnet/minecraft/entity/LivingEntity;)I" ) ) - private boolean isChargedUseItemComponent(ItemStack stack, @Share("shooterItemComponent") LocalRef shooterItemComponent) { - return shooterItemComponent.get().isCharged(stack); + private int getMaxUseTimeReturnZero(ItemStack instance, LivingEntity livingEntity) { + return 0; } @Redirect( method = "renderFirstPersonItem", at = @At( value = "INVOKE", - target = "Lnet/minecraft/item/ItemStack;getMaxUseTime()I" + target = "Lnet/minecraft/client/network/AbstractClientPlayerEntity;getItemUseTimeLeft()I", + ordinal = 0 + ), + slice = @Slice( + from = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/render/item/HeldItemRenderer;applyEquipOffset(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/util/Arm;F)V", + ordinal = 0 + ) ) ) - private int getMaxUseTimeReturnZero(ItemStack stack, AbstractClientPlayerEntity player) { - return 0; + private int getUseTimeLeftForCrossbowUseNegatedUsedTicks(AbstractClientPlayerEntity instance) { + return -instance.itematic$itemUsedTicks(); } @Redirect( method = "renderFirstPersonItem", at = @At( value = "INVOKE", - target = "Lnet/minecraft/client/network/ClientPlayerEntity;getItemUseTimeLeft()I" + target = "Lnet/minecraft/client/network/AbstractClientPlayerEntity;getItemUseTimeLeft()I", + ordinal = 0 + ), + slice = @Slice( + from = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/render/item/HeldItemRenderer;renderItem(Lnet/minecraft/entity/LivingEntity;Lnet/minecraft/item/ItemStack;Lnet/minecraft/client/render/model/json/ModelTransformationMode;ZLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", + ordinal = 0 + ) ) ) - private int getUseTimeLeftUseUsedTicks(ClientPlayerEntity instance) { - return -instance.itematic$itemUsedTicks(); + private int getUseTimeLeftForUseAnimationCheckUseUsedTicks(AbstractClientPlayerEntity instance) { + return instance.itematic$itemUsedTicks(); } @Redirect( method = "renderFirstPersonItem", at = @At( value = "INVOKE", - target = "Lnet/minecraft/item/CrossbowItem;getPullTime(Lnet/minecraft/item/ItemStack;)I" + target = "Lnet/minecraft/client/network/AbstractClientPlayerEntity;getItemUseTimeLeft()I" + ), + slice = @Slice( + from = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/render/item/HeldItemRenderer;applyEatOrDrinkTransformation(Lnet/minecraft/client/util/math/MatrixStack;FLnet/minecraft/util/Arm;Lnet/minecraft/item/ItemStack;Lnet/minecraft/entity/player/PlayerEntity;)V" + ) ) ) - private int getPullTimeUseItemComponent(ItemStack stack) { - return ShooterItemComponent.getPullTime(stack); + private int getUseTimeLeftForBowAndSpearUseNegatedUsedTicks(AbstractClientPlayerEntity instance) { + return -instance.itematic$itemUsedTicks(); } @Redirect( - method = { "getHandRenderType", "getUsingItemHandRenderType", "isChargedCrossbow" }, + method = { + "getHandRenderType", + "getUsingItemHandRenderType", + "isChargedCrossbow" + }, at = @At( value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;isOf(Lnet/minecraft/item/Item;)Z" @@ -134,12 +175,16 @@ private int getPullTimeUseItemComponent(ItemStack stack) { slice = @Slice( from = @At( value = "FIELD", - target = "Lnet/minecraft/item/Items;CROSSBOW:Lnet/minecraft/item/Item;" + target = "Lnet/minecraft/item/Items;CROSSBOW:Lnet/minecraft/item/Item;", + opcode = Opcodes.GETSTATIC ) ) ) - private static boolean isOfForCrossbowUseRegistryKeyCheckStatic(ItemStack instance, Item item) { - return instance.itematic$isOf(ItemKeys.CROSSBOW); + private static boolean isOfForCrossbowUseItemComponentStatic(ItemStack instance, Item item) { + return instance.itematic$getComponent(ItemComponentTypes.SHOOTER) + .map(ShooterItemComponent::method) + .filter(method -> method.type() == ShooterMethodTypes.CHARGEABLE) + .isPresent(); } @Redirect( @@ -152,22 +197,12 @@ private static boolean isOfForCrossbowUseRegistryKeyCheckStatic(ItemStack instan slice = @Slice( from = @At( value = "FIELD", - target = "Lnet/minecraft/item/Items;FILLED_MAP:Lnet/minecraft/item/Item;" + target = "Lnet/minecraft/item/Items;FILLED_MAP:Lnet/minecraft/item/Item;", + opcode = Opcodes.GETSTATIC ) ) ) private boolean isOfForFilledMapUseItemComponentCheck(ItemStack instance, Item item) { return instance.itematic$hasComponent(ItemComponentTypes.MAP_HOLDER); } - - @Redirect( - method = "applyEatOrDrinkTransformation", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/item/ItemStack;getMaxUseTime()I" - ) - ) - private int getMaxUseTimeUseCustomImplementation(ItemStack instance) { - return instance.itematic$useDuration(this.client.player); - } } diff --git a/src/datagen/java/net/errorcraft/itematic/data/ItematicData.java b/src/datagen/java/net/errorcraft/itematic/data/ItematicData.java index 240733fc..fff195ba 100644 --- a/src/datagen/java/net/errorcraft/itematic/data/ItematicData.java +++ b/src/datagen/java/net/errorcraft/itematic/data/ItematicData.java @@ -23,7 +23,6 @@ public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) { pack.addProvider(ItemProvider::new); pack.addProvider(ArmorMaterialProvider::new); pack.addProvider(AtlasProvider::new); - pack.addProvider(EnchantmentTagProvider::new); pack.addProvider(ItemTagProvider::new); pack.addProvider(BlockTagProvider::new); pack.addProvider(ItemGroupEntryProviderProvider::new); diff --git a/src/datagen/java/net/errorcraft/itematic/data/server/tag/EnchantmentTagProvider.java b/src/datagen/java/net/errorcraft/itematic/data/server/tag/EnchantmentTagProvider.java deleted file mode 100644 index dde8623e..00000000 --- a/src/datagen/java/net/errorcraft/itematic/data/server/tag/EnchantmentTagProvider.java +++ /dev/null @@ -1,139 +0,0 @@ -package net.errorcraft.itematic.data.server.tag; - -import net.errorcraft.itematic.enchantment.EnchantmentKeys; -import net.errorcraft.itematic.enchantment.EnchantmentTags; -import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; -import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagProvider; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.registry.RegistryWrapper; -import net.minecraft.registry.entry.RegistryEntry; -import net.minecraft.util.Identifier; - -import java.util.concurrent.CompletableFuture; -import java.util.function.Predicate; - -public class EnchantmentTagProvider extends FabricTagProvider { - public EnchantmentTagProvider(FabricDataOutput output, CompletableFuture registriesFuture) { - super(output, RegistryKeys.ENCHANTMENT, registriesFuture); - } - - @Override - protected void configure(RegistryWrapper.WrapperLookup arg) { - RegistryWrapper.Impl registry = arg.getWrapperOrThrow(RegistryKeys.ENCHANTMENT); - - this.getOrCreateTagBuilder(EnchantmentTags.CURSED) - .add(getAll(registry, Enchantment::isCursed)); - this.getOrCreateTagBuilder(EnchantmentTags.ENCHANTING) - .add(EnchantmentKeys.UNBREAKING); - this.getOrCreateTagBuilder(EnchantmentTags.FORGING) - .addTag(EnchantmentTags.CURSED) - .add(EnchantmentKeys.MENDING); - - this.getOrCreateTagBuilder(EnchantmentTags.ARMOR_ENCHANTING) - .addTag(EnchantmentTags.ENCHANTING) - .add(EnchantmentKeys.PROTECTION, EnchantmentKeys.FIRE_PROTECTION, EnchantmentKeys.BLAST_PROTECTION, EnchantmentKeys.PROJECTILE_PROTECTION); - this.getOrCreateTagBuilder(EnchantmentTags.BOOTS_ENCHANTING) - .addTag(EnchantmentTags.ARMOR_ENCHANTING) - .add(EnchantmentKeys.FEATHER_FALLING, EnchantmentKeys.DEPTH_STRIDER); - this.getOrCreateTagBuilder(EnchantmentTags.LEGGINGS_ENCHANTING) - .addTag(EnchantmentTags.ARMOR_ENCHANTING); - this.getOrCreateTagBuilder(EnchantmentTags.CHESTPLATE_ENCHANTING) - .addTag(EnchantmentTags.ARMOR_ENCHANTING) - .add(EnchantmentKeys.THORNS); - this.getOrCreateTagBuilder(EnchantmentTags.HELMET_ENCHANTING) - .addTag(EnchantmentTags.ARMOR_ENCHANTING) - .add(EnchantmentKeys.RESPIRATION, EnchantmentKeys.AQUA_AFFINITY); - - this.getOrCreateTagBuilder(EnchantmentTags.ARMOR_FORGING) - .addTag(EnchantmentTags.FORGING); - this.getOrCreateTagBuilder(EnchantmentTags.BOOTS_FORGING) - .addTag(EnchantmentTags.ARMOR_FORGING) - .add(EnchantmentKeys.THORNS, EnchantmentKeys.FROST_WALKER, EnchantmentKeys.SOUL_SPEED); - this.getOrCreateTagBuilder(EnchantmentTags.LEGGINGS_FORGING) - .addTag(EnchantmentTags.ARMOR_FORGING) - .add(EnchantmentKeys.THORNS, EnchantmentKeys.SWIFT_SNEAK); - this.getOrCreateTagBuilder(EnchantmentTags.CHESTPLATE_FORGING) - .addTag(EnchantmentTags.ARMOR_FORGING); - this.getOrCreateTagBuilder(EnchantmentTags.HELMET_FORGING) - .addTag(EnchantmentTags.ARMOR_FORGING) - .add(EnchantmentKeys.THORNS); - - this.getOrCreateTagBuilder(EnchantmentTags.TOOL_ENCHANTING) - .addTag(EnchantmentTags.ENCHANTING) - .add(EnchantmentKeys.EFFICIENCY, EnchantmentKeys.SILK_TOUCH, EnchantmentKeys.FORTUNE); - this.getOrCreateTagBuilder(EnchantmentTags.SHOVEL_ENCHANTING) - .addTag(EnchantmentTags.TOOL_ENCHANTING); - this.getOrCreateTagBuilder(EnchantmentTags.PICKAXE_ENCHANTING) - .addTag(EnchantmentTags.TOOL_ENCHANTING); - this.getOrCreateTagBuilder(EnchantmentTags.AXE_ENCHANTING) - .addTag(EnchantmentTags.TOOL_ENCHANTING); - this.getOrCreateTagBuilder(EnchantmentTags.HOE_ENCHANTING) - .addTag(EnchantmentTags.TOOL_ENCHANTING); - - this.getOrCreateTagBuilder(EnchantmentTags.TOOL_FORGING) - .addTag(EnchantmentTags.FORGING); - this.getOrCreateTagBuilder(EnchantmentTags.SHOVEL_FORGING) - .addTag(EnchantmentTags.TOOL_FORGING) - .addTag(EnchantmentTags.SHOVEL_ENCHANTING); - this.getOrCreateTagBuilder(EnchantmentTags.PICKAXE_FORGING) - .addTag(EnchantmentTags.TOOL_FORGING) - .addTag(EnchantmentTags.PICKAXE_ENCHANTING); - this.getOrCreateTagBuilder(EnchantmentTags.AXE_FORGING) - .addTag(EnchantmentTags.TOOL_FORGING) - .addTag(EnchantmentTags.AXE_ENCHANTING) - .add(EnchantmentKeys.BANE_OF_ARTHROPODS, EnchantmentKeys.SHARPNESS, EnchantmentKeys.SMITE); - this.getOrCreateTagBuilder(EnchantmentTags.HOE_FORGING) - .addTag(EnchantmentTags.TOOL_FORGING) - .addTag(EnchantmentTags.HOE_ENCHANTING); - - this.getOrCreateTagBuilder(EnchantmentTags.SWORD_ENCHANTING) - .addTag(EnchantmentTags.ENCHANTING) - .add(EnchantmentKeys.SHARPNESS, EnchantmentKeys.SMITE, EnchantmentKeys.BANE_OF_ARTHROPODS, EnchantmentKeys.KNOCKBACK, EnchantmentKeys.FIRE_ASPECT, EnchantmentKeys.LOOTING, EnchantmentKeys.SWEEPING_EDGE); - - this.getOrCreateTagBuilder(EnchantmentTags.SWORD_FORGING) - .addTag(EnchantmentTags.FORGING) - .addTag(EnchantmentTags.SWORD_ENCHANTING); - - this.getOrCreateTagBuilder(EnchantmentTags.BOW_ENCHANTING) - .addTag(EnchantmentTags.ENCHANTING) - .add(EnchantmentKeys.POWER, EnchantmentKeys.PUNCH, EnchantmentKeys.FLAME, EnchantmentKeys.INFINITY); - this.getOrCreateTagBuilder(EnchantmentTags.CROSSBOW_ENCHANTING) - .addTag(EnchantmentTags.ENCHANTING) - .add(EnchantmentKeys.MULTISHOT, EnchantmentKeys.QUICK_CHARGE, EnchantmentKeys.PIERCING); - this.getOrCreateTagBuilder(EnchantmentTags.TRIDENT_ENCHANTING) - .addTag(EnchantmentTags.ENCHANTING) - .add(EnchantmentKeys.CHANNELING, EnchantmentKeys.RIPTIDE, EnchantmentKeys.LOYALTY); - - this.getOrCreateTagBuilder(EnchantmentTags.BOW_FORGING) - .addTag(EnchantmentTags.BOW_ENCHANTING) - .addTag(EnchantmentTags.FORGING); - this.getOrCreateTagBuilder(EnchantmentTags.CROSSBOW_FORGING) - .addTag(EnchantmentTags.CROSSBOW_ENCHANTING) - .addTag(EnchantmentTags.FORGING); - this.getOrCreateTagBuilder(EnchantmentTags.TRIDENT_FORGING) - .addTag(EnchantmentTags.TRIDENT_ENCHANTING) - .addTag(EnchantmentTags.FORGING); - - this.getOrCreateTagBuilder(EnchantmentTags.STEERING_FORGING) - .add(EnchantmentKeys.VANISHING_CURSE) - .add(EnchantmentKeys.MENDING) - .add(EnchantmentKeys.UNBREAKING); - this.getOrCreateTagBuilder(EnchantmentTags.BRUSH_FORGING) - .add(EnchantmentKeys.VANISHING_CURSE) - .add(EnchantmentKeys.MENDING) - .add(EnchantmentKeys.UNBREAKING); - - this.getOrCreateTagBuilder(EnchantmentTags.TRADEABLE) - .add(getAll(registry, Enchantment::isAvailableForEnchantedBookOffer)); - } - - private static Identifier[] getAll(RegistryWrapper.Impl registry, Predicate predicate) { - return registry.streamEntries() - .filter(entry -> predicate.test(entry.value())) - .map(RegistryEntry.Reference::registryKey) - .map(RegistryKey::getValue) - .toArray(Identifier[]::new); - } -} diff --git a/src/datagen/java/net/errorcraft/itematic/data/server/tag/ItemTagProvider.java b/src/datagen/java/net/errorcraft/itematic/data/server/tag/ItemTagProvider.java index 3bf58511..ff998a9e 100644 --- a/src/datagen/java/net/errorcraft/itematic/data/server/tag/ItemTagProvider.java +++ b/src/datagen/java/net/errorcraft/itematic/data/server/tag/ItemTagProvider.java @@ -46,6 +46,8 @@ protected void configure(RegistryWrapper.WrapperLookup arg) { .add(ItemKeys.DIAMOND); this.getOrCreateTagBuilder(ItematicItemTags.REPAIRS_NETHERITE_TOOL) .add(ItemKeys.NETHERITE_INGOT); + this.getOrCreateTagBuilder(ItematicItemTags.REPAIRS_MACE) + .add(ItemKeys.BREEZE_ROD); this.getOrCreateTagBuilder(ItematicItemTags.REPAIRS_SHIELD) .forceAddTag(ItemTags.PLANKS); this.getOrCreateTagBuilder(ItematicItemTags.FURNACE_MINECART_FUEL) @@ -321,7 +323,20 @@ protected void configure(RegistryWrapper.WrapperLookup arg) { .add(ItemKeys.DEEPSLATE_TILE_SLAB) .add(ItemKeys.DEEPSLATE_TILE_WALL); this.getOrCreateTagBuilder(ItematicItemTags.TUFF_BUILDING_BLOCKS) - .add(ItemKeys.TUFF); + .add(ItemKeys.TUFF) + .add(ItemKeys.TUFF_STAIRS) + .add(ItemKeys.TUFF_SLAB) + .add(ItemKeys.TUFF_WALL) + .add(ItemKeys.CHISELED_TUFF) + .add(ItemKeys.POLISHED_TUFF) + .add(ItemKeys.POLISHED_TUFF_STAIRS) + .add(ItemKeys.POLISHED_TUFF_SLAB) + .add(ItemKeys.POLISHED_TUFF_WALL) + .add(ItemKeys.TUFF_BRICKS) + .add(ItemKeys.TUFF_BRICK_STAIRS) + .add(ItemKeys.TUFF_BRICK_SLAB) + .add(ItemKeys.TUFF_BRICK_WALL) + .add(ItemKeys.CHISELED_TUFF_BRICKS); this.getOrCreateTagBuilder(ItematicItemTags.BRICK_BUILDING_BLOCKS) .add(ItemKeys.BRICKS) .add(ItemKeys.BRICK_STAIRS) @@ -485,44 +500,84 @@ protected void configure(RegistryWrapper.WrapperLookup arg) { .add(ItemKeys.SMOOTH_QUARTZ_SLAB); this.getOrCreateTagBuilder(ItematicItemTags.COPPER_BUILDING_BLOCKS) .add(ItemKeys.COPPER_BLOCK) + .add(ItemKeys.CHISELED_COPPER) + .add(ItemKeys.COPPER_GRATE) .add(ItemKeys.CUT_COPPER) .add(ItemKeys.CUT_COPPER_STAIRS) - .add(ItemKeys.CUT_COPPER_SLAB); + .add(ItemKeys.CUT_COPPER_SLAB) + .add(ItemKeys.COPPER_DOOR) + .add(ItemKeys.COPPER_TRAPDOOR) + .add(ItemKeys.COPPER_BULB); this.getOrCreateTagBuilder(ItematicItemTags.EXPOSED_COPPER_BUILDING_BLOCKS) .add(ItemKeys.EXPOSED_COPPER) + .add(ItemKeys.EXPOSED_CHISELED_COPPER) + .add(ItemKeys.EXPOSED_COPPER_GRATE) .add(ItemKeys.EXPOSED_CUT_COPPER) .add(ItemKeys.EXPOSED_CUT_COPPER_STAIRS) - .add(ItemKeys.EXPOSED_CUT_COPPER_SLAB); + .add(ItemKeys.EXPOSED_CUT_COPPER_SLAB) + .add(ItemKeys.EXPOSED_COPPER_DOOR) + .add(ItemKeys.EXPOSED_COPPER_TRAPDOOR) + .add(ItemKeys.EXPOSED_COPPER_BULB); this.getOrCreateTagBuilder(ItematicItemTags.WEATHERED_COPPER_BUILDING_BLOCKS) .add(ItemKeys.WEATHERED_COPPER) + .add(ItemKeys.WEATHERED_CHISELED_COPPER) + .add(ItemKeys.WEATHERED_COPPER_GRATE) .add(ItemKeys.WEATHERED_CUT_COPPER) .add(ItemKeys.WEATHERED_CUT_COPPER_STAIRS) - .add(ItemKeys.WEATHERED_CUT_COPPER_SLAB); + .add(ItemKeys.WEATHERED_CUT_COPPER_SLAB) + .add(ItemKeys.WEATHERED_COPPER_DOOR) + .add(ItemKeys.WEATHERED_COPPER_TRAPDOOR) + .add(ItemKeys.WEATHERED_COPPER_BULB); this.getOrCreateTagBuilder(ItematicItemTags.OXIDIZED_COPPER_BUILDING_BLOCKS) .add(ItemKeys.OXIDIZED_COPPER) + .add(ItemKeys.OXIDIZED_CHISELED_COPPER) + .add(ItemKeys.OXIDIZED_COPPER_GRATE) .add(ItemKeys.OXIDIZED_CUT_COPPER) .add(ItemKeys.OXIDIZED_CUT_COPPER_STAIRS) - .add(ItemKeys.OXIDIZED_CUT_COPPER_SLAB); + .add(ItemKeys.OXIDIZED_CUT_COPPER_SLAB) + .add(ItemKeys.OXIDIZED_COPPER_DOOR) + .add(ItemKeys.OXIDIZED_COPPER_TRAPDOOR) + .add(ItemKeys.OXIDIZED_COPPER_BULB); this.getOrCreateTagBuilder(ItematicItemTags.WAXED_COPPER_BUILDING_BLOCKS) .add(ItemKeys.WAXED_COPPER_BLOCK) + .add(ItemKeys.WAXED_CHISELED_COPPER) + .add(ItemKeys.WAXED_COPPER_GRATE) .add(ItemKeys.WAXED_CUT_COPPER) .add(ItemKeys.WAXED_CUT_COPPER_STAIRS) - .add(ItemKeys.WAXED_CUT_COPPER_SLAB); + .add(ItemKeys.WAXED_CUT_COPPER_SLAB) + .add(ItemKeys.WAXED_COPPER_DOOR) + .add(ItemKeys.WAXED_COPPER_TRAPDOOR) + .add(ItemKeys.WAXED_COPPER_BULB); this.getOrCreateTagBuilder(ItematicItemTags.WAXED_EXPOSED_COPPER_BUILDING_BLOCKS) .add(ItemKeys.WAXED_EXPOSED_COPPER) + .add(ItemKeys.WAXED_EXPOSED_CHISELED_COPPER) + .add(ItemKeys.WAXED_EXPOSED_COPPER_GRATE) .add(ItemKeys.WAXED_EXPOSED_CUT_COPPER) .add(ItemKeys.WAXED_EXPOSED_CUT_COPPER_STAIRS) - .add(ItemKeys.WAXED_EXPOSED_CUT_COPPER_SLAB); + .add(ItemKeys.WAXED_EXPOSED_CUT_COPPER_SLAB) + .add(ItemKeys.WAXED_EXPOSED_COPPER_DOOR) + .add(ItemKeys.WAXED_EXPOSED_COPPER_TRAPDOOR) + .add(ItemKeys.WAXED_EXPOSED_COPPER_BULB); this.getOrCreateTagBuilder(ItematicItemTags.WAXED_WEATHERED_COPPER_BUILDING_BLOCKS) .add(ItemKeys.WAXED_WEATHERED_COPPER) + .add(ItemKeys.WAXED_WEATHERED_CHISELED_COPPER) + .add(ItemKeys.WAXED_WEATHERED_COPPER_GRATE) .add(ItemKeys.WAXED_WEATHERED_CUT_COPPER) .add(ItemKeys.WAXED_WEATHERED_CUT_COPPER_STAIRS) - .add(ItemKeys.WAXED_WEATHERED_CUT_COPPER_SLAB); + .add(ItemKeys.WAXED_WEATHERED_CUT_COPPER_SLAB) + .add(ItemKeys.WAXED_WEATHERED_COPPER_DOOR) + .add(ItemKeys.WAXED_WEATHERED_COPPER_TRAPDOOR) + .add(ItemKeys.WAXED_WEATHERED_COPPER_BULB); this.getOrCreateTagBuilder(ItematicItemTags.WAXED_OXIDIZED_COPPER_BUILDING_BLOCKS) .add(ItemKeys.WAXED_OXIDIZED_COPPER) + .add(ItemKeys.WAXED_OXIDIZED_CHISELED_COPPER) + .add(ItemKeys.WAXED_OXIDIZED_COPPER_GRATE) .add(ItemKeys.WAXED_OXIDIZED_CUT_COPPER) .add(ItemKeys.WAXED_OXIDIZED_CUT_COPPER_STAIRS) - .add(ItemKeys.WAXED_OXIDIZED_CUT_COPPER_SLAB); + .add(ItemKeys.WAXED_OXIDIZED_CUT_COPPER_SLAB) + .add(ItemKeys.WAXED_OXIDIZED_COPPER_DOOR) + .add(ItemKeys.WAXED_OXIDIZED_COPPER_TRAPDOOR) + .add(ItemKeys.WAXED_OXIDIZED_COPPER_BULB); this.getOrCreateTagBuilder(ItematicItemTags.COPPER_LIKE_BUILDING_BLOCKS) .addTag(ItematicItemTags.COPPER_BUILDING_BLOCKS) .addTag(ItematicItemTags.EXPOSED_COPPER_BUILDING_BLOCKS) @@ -988,6 +1043,14 @@ protected void configure(RegistryWrapper.WrapperLookup arg) { .add(ItemKeys.END_ROD) .add(ItemKeys.SEA_LANTERN) .add(ItemKeys.REDSTONE_LAMP) + .add(ItemKeys.COPPER_BULB) + .add(ItemKeys.EXPOSED_COPPER_BULB) + .add(ItemKeys.WEATHERED_COPPER_BULB) + .add(ItemKeys.OXIDIZED_COPPER_BULB) + .add(ItemKeys.WAXED_COPPER_BULB) + .add(ItemKeys.WAXED_EXPOSED_COPPER_BULB) + .add(ItemKeys.WAXED_WEATHERED_COPPER_BULB) + .add(ItemKeys.WAXED_OXIDIZED_COPPER_BULB) .add(ItemKeys.GLOWSTONE) .add(ItemKeys.SHROOMLIGHT) .addTag(ItematicItemTags.FROGLIGHTS) @@ -1105,6 +1168,8 @@ protected void configure(RegistryWrapper.WrapperLookup arg) { .add(ItemKeys.MUSIC_DISC_CAT) .add(ItemKeys.MUSIC_DISC_BLOCKS) .add(ItemKeys.MUSIC_DISC_CHIRP) + .add(ItemKeys.MUSIC_DISC_CREATOR) + .add(ItemKeys.MUSIC_DISC_CREATOR_MUSIC_BOX) .add(ItemKeys.MUSIC_DISC_FAR) .add(ItemKeys.MUSIC_DISC_MALL) .add(ItemKeys.MUSIC_DISC_MELLOHI) @@ -1116,7 +1181,8 @@ protected void configure(RegistryWrapper.WrapperLookup arg) { .add(ItemKeys.MUSIC_DISC_OTHERSIDE) .add(ItemKeys.MUSIC_DISC_RELIC) .add(ItemKeys.MUSIC_DISC_5) - .add(ItemKeys.MUSIC_DISC_PIGSTEP); + .add(ItemKeys.MUSIC_DISC_PIGSTEP) + .add(ItemKeys.MUSIC_DISC_PRECIPICE); this.getOrCreateTagBuilder(ItematicItemTags.SWORDS) .add(ItemKeys.WOODEN_SWORD) .add(ItemKeys.STONE_SWORD) @@ -1244,7 +1310,9 @@ protected void configure(RegistryWrapper.WrapperLookup arg) { .add(ItemKeys.SKULL_BANNER_PATTERN) .add(ItemKeys.MOJANG_BANNER_PATTERN) .add(ItemKeys.GLOBE_BANNER_PATTERN) - .add(ItemKeys.PIGLIN_BANNER_PATTERN); + .add(ItemKeys.PIGLIN_BANNER_PATTERN) + .add(ItemKeys.FLOW_BANNER_PATTERN) + .add(ItemKeys.GUSTER_BANNER_PATTERN); this.getOrCreateTagBuilder(ItematicItemTags.SMITHING_TEMPLATES) .add(ItemKeys.NETHERITE_UPGRADE_SMITHING_TEMPLATE) .add(ItemKeys.SENTRY_ARMOR_TRIM_SMITHING_TEMPLATE) @@ -1262,9 +1330,12 @@ protected void configure(RegistryWrapper.WrapperLookup arg) { .add(ItemKeys.SNOUT_ARMOR_TRIM_SMITHING_TEMPLATE) .add(ItemKeys.RIB_ARMOR_TRIM_SMITHING_TEMPLATE) .add(ItemKeys.EYE_ARMOR_TRIM_SMITHING_TEMPLATE) - .add(ItemKeys.SPIRE_ARMOR_TRIM_SMITHING_TEMPLATE); + .add(ItemKeys.SPIRE_ARMOR_TRIM_SMITHING_TEMPLATE) + .add(ItemKeys.FLOW_ARMOR_TRIM_SMITHING_TEMPLATE) + .add(ItemKeys.BOLT_ARMOR_TRIM_SMITHING_TEMPLATE); this.getOrCreateTagBuilder(ItematicItemTags.SPAWNERS) - .add(ItemKeys.SPAWNER); + .add(ItemKeys.SPAWNER) + .add(ItemKeys.TRIAL_SPAWNER); this.getOrCreateTagBuilder(ItematicItemTags.BANNED_BUNDLE_ITEMS) .addTag(ItematicItemTags.SHULKER_BOXES); this.getOrCreateTagBuilder(ItematicItemTags.SHULKER_BOXES) diff --git a/src/gametest/java/net/errorcraft/itematic/gametest/Assert.java b/src/gametest/java/net/errorcraft/itematic/gametest/Assert.java index 8c5ef069..73178ad2 100644 --- a/src/gametest/java/net/errorcraft/itematic/gametest/Assert.java +++ b/src/gametest/java/net/errorcraft/itematic/gametest/Assert.java @@ -2,8 +2,10 @@ import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.component.DataComponentType; +import net.minecraft.component.ComponentType; import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.ItemEnchantmentsComponent; +import net.minecraft.enchantment.Enchantment; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.effect.StatusEffect; import net.minecraft.fluid.Fluid; @@ -59,25 +61,25 @@ public static void itemStackIsNotEmpty(ItemStack value) { } } - public static void itemStackHasComponent(ItemStack value, DataComponentType type) { + public static void itemStackHasDataComponent(ItemStack value, ComponentType type) { if (value.get(type) == null) { throw new GameTestException("Expected item stack to contain the " + type + " component"); } } - public static void itemStackDoesNotHaveComponent(ItemStack value, DataComponentType type) { + public static void itemStackDoesNotHaveDataComponent(ItemStack value, ComponentType type) { if (value.get(type) != null) { throw new GameTestException("Expected item stack to not contain the " + type + " component"); } } - public static void itemStackHasComponent(ItemStack value, DataComponentType type, Consumer assertion) { - itemStackHasComponent(value, type); - assertion.accept(TestUtil.getComponent(value, type)); + public static void itemStackHasDataComponent(ItemStack value, ComponentType type, Consumer assertion) { + itemStackHasDataComponent(value, type); + assertion.accept(TestUtil.getDataComponent(value, type)); } public static void itemStackHasPotion(ItemStack value, RegistryEntry expected) { - itemStackHasComponent(value, DataComponentTypes.POTION_CONTENTS, component -> { + itemStackHasDataComponent(value, DataComponentTypes.POTION_CONTENTS, component -> { RegistryEntry potion = component.potion() .orElseThrow(() -> new GameTestException("Expected item stack to have potion " + expected.getKey().orElseThrow())); if (expected != potion) { @@ -86,6 +88,16 @@ public static void itemStackHasPotion(ItemStack value, RegistryEntry exp }); } + public static void dataComponentHasEnchantment(ItemEnchantmentsComponent enchantments, RegistryKey expected) { + for (RegistryEntry enchantment : enchantments.getEnchantments()) { + if (enchantment.matchesKey(expected)) { + return; + } + } + + throw new GameTestException("Expected data component to have enchantment " + expected); + } + public static void entityDoesNotHaveStatusEffect(LivingEntity entity, RegistryEntry effect) { if (entity.getStatusEffect(effect) != null) { throw new GameTestException("Expected entity to not have the " + effect.getKey().orElseThrow() + " status effect"); diff --git a/src/gametest/java/net/errorcraft/itematic/gametest/TestUtil.java b/src/gametest/java/net/errorcraft/itematic/gametest/TestUtil.java index 3cf678eb..0a88bd5c 100644 --- a/src/gametest/java/net/errorcraft/itematic/gametest/TestUtil.java +++ b/src/gametest/java/net/errorcraft/itematic/gametest/TestUtil.java @@ -5,14 +5,24 @@ import net.errorcraft.itematic.registry.ItematicRegistries; import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.component.DataComponentType; +import net.minecraft.component.ComponentType; +import net.minecraft.enchantment.Enchantment; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUsageContext; import net.minecraft.registry.Registries; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.screen.NamedScreenHandlerFactory; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.screen.ScreenHandlerType; +import net.minecraft.server.world.ServerWorld; import net.minecraft.test.GameTestException; +import net.minecraft.test.PositionedException; import net.minecraft.test.TestContext; import net.minecraft.util.Hand; import net.minecraft.util.hit.BlockHitResult; @@ -26,16 +36,36 @@ public class TestUtil { private TestUtil() {} + public static ItemStack createItemStackWithSlightDamage(ServerWorld world, RegistryKey item) { + ItemStack stack = world.itematic$createStack(item); + if (!stack.isDamageable()) { + throw new AssertionError("Item " + item.getValue() + " is not damageable"); + } + + stack.setDamage(1); + return stack; + } + + public static ItemStack createItemStackWithEnchantment(ServerWorld world, RegistryKey item, RegistryKey enchantment) { + ItemStack stack = world.itematic$createStack(item); + RegistryEntry enchantmentEntry = world.getRegistryManager() + .getWrapperOrThrow(RegistryKeys.ENCHANTMENT) + .getOrThrow(enchantment); + stack.addEnchantment(enchantmentEntry, 1); + return stack; + } + public static > T getItemComponent(ItemStack stack, ItemComponentType type) { return stack.itematic$getComponent(type) .orElseThrow(() -> new GameTestException("Item " + stack.itematic$key() + " does not contain the " + ItematicRegistries.ITEM_COMPONENT_TYPE.getKey(type).orElseThrow() + " item component")); } - public static T getComponent(ItemStack stack, DataComponentType type) { + public static T getDataComponent(ItemStack stack, ComponentType type) { T component = stack.get(type); if (component == null) { throw new GameTestException("Item stack does not contain the " + type + " component"); } + return component; } @@ -55,6 +85,7 @@ public static T createEntity(TestContext context, EntityType< if (entity == null) { throw new GameTestException("Entity is null"); } + initializer.accept(entity); return entity; } @@ -84,4 +115,34 @@ public static void useBlock(TestContext context, BlockPos pos, PlayerEntity play BlockPos absolutePos = context.getAbsolutePos(pos); context.useBlock(pos, player, new BlockHitResult(Vec3d.ofCenter(absolutePos), direction, absolutePos, true)); } + + @SuppressWarnings("unchecked") + public static T getMenuFromBlock(TestContext context, BlockPos pos, PlayerEntity player, ScreenHandlerType type) { + BlockPos absolutePos = context.getAbsolutePos(pos); + NamedScreenHandlerFactory factory = context.getBlockState(pos).createScreenHandlerFactory(context.getWorld(), absolutePos); + if (factory == null) { + throw new PositionedException("Block does not provide a menu", absolutePos, pos, context.getTick()); + } + + ScreenHandler menu = factory.createMenu(-1, player.getInventory(), player); + if (menu == null) { + throw new PositionedException("Block does not create a menu", absolutePos, pos, context.getTick()); + } + + try { + ScreenHandlerType actualType = menu.getType(); + if (type == actualType) { + return (T) menu; + } + + throw new PositionedException( + "Block has the incorrect menu type " + Registries.SCREEN_HANDLER.getId(actualType) + ", expected " + Registries.SCREEN_HANDLER.getId(type), + absolutePos, + pos, + context.getTick() + ); + } catch (UnsupportedOperationException ignored) { + throw new PositionedException("Block does not create a menu by type", absolutePos, pos, context.getTick()); + } + } } diff --git a/src/gametest/java/net/errorcraft/itematic/gametest/block/AnvilBlockTestSuite.java b/src/gametest/java/net/errorcraft/itematic/gametest/block/AnvilBlockTestSuite.java new file mode 100644 index 00000000..3f56fb03 --- /dev/null +++ b/src/gametest/java/net/errorcraft/itematic/gametest/block/AnvilBlockTestSuite.java @@ -0,0 +1,101 @@ +package net.errorcraft.itematic.gametest.block; + +import net.errorcraft.itematic.gametest.Assert; +import net.errorcraft.itematic.gametest.TestUtil; +import net.errorcraft.itematic.item.ItemKeys; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.enchantment.Enchantments; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.AnvilScreenHandler; +import net.minecraft.screen.ScreenHandlerType; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.test.GameTest; +import net.minecraft.test.TestContext; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.GameMode; + +public class AnvilBlockTestSuite { + private static final BlockPos BLOCK_POSITION = new BlockPos(1, 2, 1); + + @GameTest(templateName = "itematic:block.anvil") + public void combiningEnchantedItemsWithSameIdInAnvilCombinesEnchantments(TestContext context) { + ServerWorld world = context.getWorld(); + PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL); + AnvilScreenHandler anvilMenu = TestUtil.getMenuFromBlock(context, BLOCK_POSITION, player, ScreenHandlerType.ANVIL); + anvilMenu.getSlot(0) + .setStack(TestUtil.createItemStackWithEnchantment(world, ItemKeys.IRON_PICKAXE, Enchantments.UNBREAKING)); + anvilMenu.getSlot(1) + .setStack(TestUtil.createItemStackWithEnchantment(world, ItemKeys.IRON_PICKAXE, Enchantments.EFFICIENCY)); + context.addInstantFinalTask(() -> { + ItemStack result = anvilMenu.getSlot(2).getStack(); + Assert.itemStackIsOf(result, ItemKeys.IRON_PICKAXE); + Assert.itemStackHasDataComponent(result, DataComponentTypes.ENCHANTMENTS, enchantments -> { + Assert.dataComponentHasEnchantment(enchantments, Enchantments.UNBREAKING); + Assert.dataComponentHasEnchantment(enchantments, Enchantments.EFFICIENCY); + }); + }); + } + + @GameTest(templateName = "itematic:block.anvil") + public void combiningEnchantedItemsWithDifferentIdsInAnvilRejectsCombination(TestContext context) { + ServerWorld world = context.getWorld(); + PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL); + AnvilScreenHandler anvilMenu = TestUtil.getMenuFromBlock(context, BLOCK_POSITION, player, ScreenHandlerType.ANVIL); + anvilMenu.getSlot(0) + .setStack(TestUtil.createItemStackWithEnchantment(world, ItemKeys.IRON_PICKAXE, Enchantments.UNBREAKING)); + anvilMenu.getSlot(1) + .setStack(TestUtil.createItemStackWithEnchantment(world, ItemKeys.DIAMOND_PICKAXE, Enchantments.EFFICIENCY)); + context.addInstantFinalTask(() -> Assert.itemStackIsEmpty(anvilMenu.getSlot(2).getStack())); + } + + @GameTest(templateName = "itematic:block.anvil") + public void combiningItemWithEnchantedBookInAnvilAddsEnchantment(TestContext context) { + ServerWorld world = context.getWorld(); + PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL); + AnvilScreenHandler anvilMenu = TestUtil.getMenuFromBlock(context, BLOCK_POSITION, player, ScreenHandlerType.ANVIL); + anvilMenu.getSlot(0) + .setStack(TestUtil.createItemStackWithEnchantment(world, ItemKeys.IRON_PICKAXE, Enchantments.UNBREAKING)); + anvilMenu.getSlot(1) + .setStack(TestUtil.createItemStackWithEnchantment(world, ItemKeys.ENCHANTED_BOOK, Enchantments.EFFICIENCY)); + context.addInstantFinalTask(() -> { + ItemStack result = anvilMenu.getSlot(2).getStack(); + Assert.itemStackIsOf(result, ItemKeys.IRON_PICKAXE); + Assert.itemStackHasDataComponent(result, DataComponentTypes.ENCHANTMENTS, enchantments -> { + Assert.dataComponentHasEnchantment(enchantments, Enchantments.UNBREAKING); + Assert.dataComponentHasEnchantment(enchantments, Enchantments.EFFICIENCY); + }); + }); + } + + @GameTest(templateName = "itematic:block.anvil") + public void combiningItemWithEnchantedBookWithIncompatibleEnchantmentInAnvilRejectsCombination(TestContext context) { + ServerWorld world = context.getWorld(); + PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL); + AnvilScreenHandler anvilMenu = TestUtil.getMenuFromBlock(context, BLOCK_POSITION, player, ScreenHandlerType.ANVIL); + anvilMenu.getSlot(0) + .setStack(TestUtil.createItemStackWithEnchantment(world, ItemKeys.IRON_PICKAXE, Enchantments.UNBREAKING)); + anvilMenu.getSlot(1) + .setStack(TestUtil.createItemStackWithEnchantment(world, ItemKeys.ENCHANTED_BOOK, Enchantments.SHARPNESS)); + context.addInstantFinalTask(() -> Assert.itemStackIsEmpty(anvilMenu.getSlot(2).getStack())); + } + + @GameTest(templateName = "itematic:block.anvil") + public void combiningEnchantedBooksInAnvilCombinesEnchantments(TestContext context) { + ServerWorld world = context.getWorld(); + PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL); + AnvilScreenHandler anvilMenu = TestUtil.getMenuFromBlock(context, BLOCK_POSITION, player, ScreenHandlerType.ANVIL); + anvilMenu.getSlot(0) + .setStack(TestUtil.createItemStackWithEnchantment(world, ItemKeys.ENCHANTED_BOOK, Enchantments.UNBREAKING)); + anvilMenu.getSlot(1) + .setStack(TestUtil.createItemStackWithEnchantment(world, ItemKeys.ENCHANTED_BOOK, Enchantments.EFFICIENCY)); + context.addInstantFinalTask(() -> { + ItemStack result = anvilMenu.getSlot(2).getStack(); + Assert.itemStackIsOf(result, ItemKeys.ENCHANTED_BOOK); + Assert.itemStackHasDataComponent(result, DataComponentTypes.STORED_ENCHANTMENTS, storedEnchantments -> { + Assert.dataComponentHasEnchantment(storedEnchantments, Enchantments.UNBREAKING); + Assert.dataComponentHasEnchantment(storedEnchantments, Enchantments.EFFICIENCY); + }); + }); + } +} diff --git a/src/gametest/java/net/errorcraft/itematic/gametest/block/DispenserBehaviorTestSuite.java b/src/gametest/java/net/errorcraft/itematic/gametest/block/DispenserBehaviorTestSuite.java index fa9fd14a..61414e73 100644 --- a/src/gametest/java/net/errorcraft/itematic/gametest/block/DispenserBehaviorTestSuite.java +++ b/src/gametest/java/net/errorcraft/itematic/gametest/block/DispenserBehaviorTestSuite.java @@ -668,7 +668,7 @@ public void dispensingShearsWithNoValidTargetKeepsItem(TestContext context) { context.runAtTick(4, () -> context.addFinalTask(() -> { context.dontExpectItem(world.itematic$getItem(ItemKeys.SHEARS).value()); Assert.itemStackIsOf(blockEntity.getStack(0), ItemKeys.SHEARS); - context.assertFalse(blockEntity.getStack(0).isDamaged(), "Expected item stack to not be damaged"); + context.assertFalse(blockEntity.getStack(0).isDamaged(), "Expected item stack not to be damaged"); })); } @@ -740,7 +740,7 @@ public void dispensingFlintAndSteelOnInvalidBlockKeepsItem(TestContext context) context.runAtTick(4, () -> context.addFinalTask(() -> { context.dontExpectItem(world.itematic$getItem(ItemKeys.FLINT_AND_STEEL).value()); Assert.itemStackIsOf(blockEntity.getStack(0), ItemKeys.FLINT_AND_STEEL); - context.assertFalse(blockEntity.getStack(0).isDamaged(), "Expected item stack to not be damaged"); + context.assertFalse(blockEntity.getStack(0).isDamaged(), "Expected item stack not to be damaged"); })); } @@ -768,7 +768,7 @@ public void dispensingBrushWithNoEntityKeepsItem(TestContext context) { context.runAtTick(4, () -> context.addFinalTask(() -> { context.dontExpectItem(world.itematic$getItem(ItemKeys.BRUSH).value()); Assert.itemStackIsOf(blockEntity.getStack(0), ItemKeys.BRUSH); - context.assertFalse(blockEntity.getStack(0).isDamaged(), "Expected item stack to not be damaged"); + context.assertFalse(blockEntity.getStack(0).isDamaged(), "Expected item stack not to be damaged"); })); } diff --git a/src/gametest/java/net/errorcraft/itematic/gametest/block/EnchantingTableTestSuite.java b/src/gametest/java/net/errorcraft/itematic/gametest/block/EnchantingTableTestSuite.java new file mode 100644 index 00000000..efcca339 --- /dev/null +++ b/src/gametest/java/net/errorcraft/itematic/gametest/block/EnchantingTableTestSuite.java @@ -0,0 +1,105 @@ +package net.errorcraft.itematic.gametest.block; + +import net.errorcraft.itematic.gametest.Assert; +import net.errorcraft.itematic.gametest.TestUtil; +import net.errorcraft.itematic.item.ItemKeys; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.enchantment.Enchantments; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.EnchantmentScreenHandler; +import net.minecraft.screen.ScreenHandlerType; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.test.GameTest; +import net.minecraft.test.TestContext; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.GameMode; + +public class EnchantingTableTestSuite { + private static final BlockPos BLOCK_POSITION = new BlockPos(1, 2, 1); + + @GameTest(templateName = "itematic:block.enchanting_table") + public void placingEnchantableItemWithoutEnchantmentsSuggestsEnchantments(TestContext context) { + ServerWorld world = context.getWorld(); + PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL); + EnchantmentScreenHandler enchantmentMenu = TestUtil.getMenuFromBlock(context, BLOCK_POSITION, player, ScreenHandlerType.ENCHANTMENT); + enchantmentMenu.getSlot(0) + .setStack(world.itematic$createStack(ItemKeys.IRON_PICKAXE)); + enchantmentMenu.getSlot(1) + .setStack(world.itematic$createStack(ItemKeys.LAPIS_LAZULI)); + context.addInstantFinalTask(() -> { + context.assertTrue(enchantmentMenu.enchantmentPower[0] > 0, "Expected enchantments to be suggested"); + }); + } + + @GameTest(templateName = "itematic:block.enchanting_table") + public void placingUnenchantableItemInEnchantingTableDoesNotSuggestEnchantments(TestContext context) { + ServerWorld world = context.getWorld(); + PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL); + EnchantmentScreenHandler enchantmentMenu = TestUtil.getMenuFromBlock(context, BLOCK_POSITION, player, ScreenHandlerType.ENCHANTMENT); + enchantmentMenu.getSlot(0) + .setStack(world.itematic$createStack(ItemKeys.STICK)); + enchantmentMenu.getSlot(1) + .setStack(world.itematic$createStack(ItemKeys.LAPIS_LAZULI)); + context.addInstantFinalTask(() -> { + context.assertTrue(enchantmentMenu.enchantmentPower[0] == 0, "Expected no enchantments to be suggested"); + }); + } + + @GameTest(templateName = "itematic:block.enchanting_table") + public void placingEnchantableItemWithEnchantmentsInEnchantingTableDoesNotSuggestEnchantments(TestContext context) { + ServerWorld world = context.getWorld(); + PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL); + EnchantmentScreenHandler enchantmentMenu = TestUtil.getMenuFromBlock(context, BLOCK_POSITION, player, ScreenHandlerType.ENCHANTMENT); + enchantmentMenu.getSlot(0) + .setStack(TestUtil.createItemStackWithEnchantment(world, ItemKeys.IRON_PICKAXE, Enchantments.UNBREAKING)); + enchantmentMenu.getSlot(1) + .setStack(world.itematic$createStack(ItemKeys.LAPIS_LAZULI)); + context.addInstantFinalTask(() -> { + context.assertTrue(enchantmentMenu.enchantmentPower[0] == 0, "Expected no enchantments to be suggested"); + }); + } + + @GameTest(templateName = "itematic:block.enchanting_table") + public void enchantingEnchantableItemInEnchantingTableAddsEnchantments(TestContext context) { + ServerWorld world = context.getWorld(); + PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL); + player.experienceLevel = 1000; + EnchantmentScreenHandler enchantmentMenu = TestUtil.getMenuFromBlock(context, BLOCK_POSITION, player, ScreenHandlerType.ENCHANTMENT); + enchantmentMenu.getSlot(0) + .setStack(world.itematic$createStack(ItemKeys.IRON_PICKAXE)); + enchantmentMenu.getSlot(1) + .setStack(world.itematic$createStack(ItemKeys.LAPIS_LAZULI)); + enchantmentMenu.onButtonClick(player, 0); + context.addInstantFinalTask(() -> { + ItemStack result = enchantmentMenu.getSlot(0).getStack(); + Assert.itemStackIsOf(result, ItemKeys.IRON_PICKAXE); + Assert.itemStackHasDataComponent(result, DataComponentTypes.ENCHANTMENTS, enchantments -> { + context.assertFalse(enchantments.isEmpty(), "Expected enchantments to be added to " + DataComponentTypes.ENCHANTMENTS); + }); + }); + } + + @GameTest(templateName = "itematic:block.enchanting_table") + public void enchantingBookInEnchantingTableTransformsItemIntoEnchantedBookAndAddsEnchantmentsToStoredEnchantments(TestContext context) { + ServerWorld world = context.getWorld(); + PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL); + player.experienceLevel = 1000; + EnchantmentScreenHandler enchantmentMenu = TestUtil.getMenuFromBlock(context, BLOCK_POSITION, player, ScreenHandlerType.ENCHANTMENT); + enchantmentMenu.getSlot(0) + .setStack(world.itematic$createStack(ItemKeys.BOOK)); + enchantmentMenu.getSlot(1) + .setStack(world.itematic$createStack(ItemKeys.LAPIS_LAZULI)); + enchantmentMenu.onButtonClick(player, 0); + context.addInstantFinalTask(() -> { + ItemStack result = enchantmentMenu.getSlot(0).getStack(); + Assert.itemStackIsOf(result, ItemKeys.ENCHANTED_BOOK); + Assert.itemStackHasDataComponent(result, DataComponentTypes.ENCHANTMENTS, enchantments -> { + context.assertTrue(enchantments.isEmpty(), "Expected enchantments not to be added to " + DataComponentTypes.ENCHANTMENTS); + }); + Assert.itemStackHasDataComponent(result, DataComponentTypes.STORED_ENCHANTMENTS, storedEnchantments -> { + context.assertFalse(storedEnchantments.isEmpty(), "Expected enchantments to be added to " + DataComponentTypes.STORED_ENCHANTMENTS); + }); + }); + } +} diff --git a/src/gametest/java/net/errorcraft/itematic/gametest/block/GrindstoneTestSuite.java b/src/gametest/java/net/errorcraft/itematic/gametest/block/GrindstoneTestSuite.java new file mode 100644 index 00000000..81569b7f --- /dev/null +++ b/src/gametest/java/net/errorcraft/itematic/gametest/block/GrindstoneTestSuite.java @@ -0,0 +1,82 @@ +package net.errorcraft.itematic.gametest.block; + +import net.errorcraft.itematic.gametest.Assert; +import net.errorcraft.itematic.gametest.TestUtil; +import net.errorcraft.itematic.item.ItemKeys; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.enchantment.Enchantments; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.GrindstoneScreenHandler; +import net.minecraft.screen.ScreenHandlerType; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.test.GameTest; +import net.minecraft.test.TestContext; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.GameMode; + +public class GrindstoneTestSuite { + private static final BlockPos BLOCK_POSITION = new BlockPos(1, 2, 1); + + @GameTest(templateName = "itematic:block.grindstone") + public void placingEnchantedItemInGrindstoneDisenchantsItem(TestContext context) { + ServerWorld world = context.getWorld(); + PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL); + GrindstoneScreenHandler grindstoneMenu = TestUtil.getMenuFromBlock(context, BLOCK_POSITION, player, ScreenHandlerType.GRINDSTONE); + grindstoneMenu.getSlot(0) + .setStack(TestUtil.createItemStackWithEnchantment(world, ItemKeys.IRON_PICKAXE, Enchantments.UNBREAKING)); + context.addInstantFinalTask(() -> { + ItemStack result = grindstoneMenu.getSlot(2).getStack(); + Assert.itemStackIsOf(result, ItemKeys.IRON_PICKAXE); + Assert.itemStackHasDataComponent(result, DataComponentTypes.ENCHANTMENTS, enchantments -> { + context.assertTrue(enchantments.isEmpty(), "Expected item to not have any enchantments"); + }); + }); + } + + @GameTest(templateName = "itematic:block.grindstone") + public void placingEnchantedBookInGrindstoneTransformsItemIntoBook(TestContext context) { + ServerWorld world = context.getWorld(); + PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL); + GrindstoneScreenHandler grindstoneMenu = TestUtil.getMenuFromBlock(context, BLOCK_POSITION, player, ScreenHandlerType.GRINDSTONE); + grindstoneMenu.getSlot(0) + .setStack(TestUtil.createItemStackWithEnchantment(world, ItemKeys.ENCHANTED_BOOK, Enchantments.UNBREAKING)); + context.addInstantFinalTask(() -> { + ItemStack result = grindstoneMenu.getSlot(2).getStack(); + Assert.itemStackIsOf(result, ItemKeys.BOOK); + Assert.itemStackHasDataComponent(result, DataComponentTypes.ENCHANTMENTS, enchantments -> { + context.assertTrue(enchantments.isEmpty(), "Expected item to not have any enchantments"); + }); + }); + } + + @GameTest(templateName = "itematic:block.grindstone") + public void placingDamageableItemsWithSameIsInGrindstoneRepairsItem(TestContext context) { + ServerWorld world = context.getWorld(); + PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL); + GrindstoneScreenHandler grindstoneMenu = TestUtil.getMenuFromBlock(context, BLOCK_POSITION, player, ScreenHandlerType.GRINDSTONE); + grindstoneMenu.getSlot(0) + .setStack(TestUtil.createItemStackWithSlightDamage(world, ItemKeys.IRON_PICKAXE)); + grindstoneMenu.getSlot(1) + .setStack(TestUtil.createItemStackWithSlightDamage(world, ItemKeys.IRON_PICKAXE)); + context.addInstantFinalTask(() -> { + ItemStack result = grindstoneMenu.getSlot(2).getStack(); + Assert.itemStackIsOf(result, ItemKeys.IRON_PICKAXE); + context.assertFalse(result.isDamaged(), "Expected item stack not to be damaged"); + }); + } + + @GameTest(templateName = "itematic:block.grindstone") + public void placingDamageableItemsWithDifferentIdsInGrindstoneRejectsRepair(TestContext context) { + ServerWorld world = context.getWorld(); + PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL); + GrindstoneScreenHandler grindstoneMenu = TestUtil.getMenuFromBlock(context, BLOCK_POSITION, player, ScreenHandlerType.GRINDSTONE); + grindstoneMenu.getSlot(0) + .setStack(TestUtil.createItemStackWithSlightDamage(world, ItemKeys.IRON_PICKAXE)); + grindstoneMenu.getSlot(1) + .setStack(TestUtil.createItemStackWithSlightDamage(world, ItemKeys.DIAMOND_PICKAXE)); + context.addInstantFinalTask(() -> { + Assert.itemStackIsEmpty(grindstoneMenu.getSlot(2).getStack()); + }); + } +} diff --git a/src/gametest/java/net/errorcraft/itematic/gametest/block/WaterCauldronBlockTestSuite.java b/src/gametest/java/net/errorcraft/itematic/gametest/block/WaterCauldronBlockTestSuite.java index 63476278..0f0c1a5a 100644 --- a/src/gametest/java/net/errorcraft/itematic/gametest/block/WaterCauldronBlockTestSuite.java +++ b/src/gametest/java/net/errorcraft/itematic/gametest/block/WaterCauldronBlockTestSuite.java @@ -36,6 +36,6 @@ public void usingColoredWolfArmorOnWaterCauldronClearsColor(TestContext context) player.setStackInHand(Hand.MAIN_HAND, stack); world.spawnEntity(player); context.useBlock(WATER_CAULDRON_POSITION, player); - context.addFinalTask(() -> Assert.itemStackDoesNotHaveComponent(player.getStackInHand(Hand.MAIN_HAND), DataComponentTypes.DYED_COLOR)); + context.addFinalTask(() -> Assert.itemStackDoesNotHaveDataComponent(player.getStackInHand(Hand.MAIN_HAND), DataComponentTypes.DYED_COLOR)); } } diff --git a/src/gametest/java/net/errorcraft/itematic/gametest/entity/passive/MooshroomEntityTestSuite.java b/src/gametest/java/net/errorcraft/itematic/gametest/entity/passive/MooshroomEntityTestSuite.java index b3dda6e1..bf0faa02 100644 --- a/src/gametest/java/net/errorcraft/itematic/gametest/entity/passive/MooshroomEntityTestSuite.java +++ b/src/gametest/java/net/errorcraft/itematic/gametest/entity/passive/MooshroomEntityTestSuite.java @@ -34,7 +34,7 @@ public void usingFlowerOnBrownMooshroomGivesMooshroomSuspiciousEffects(TestConte context.assertTrue(bowlResult.isAccepted(), "Expected interaction with bowl on brown Mooshroom to be successful"); ItemStack heldStack = player.getStackInHand(Hand.MAIN_HAND); Assert.itemStackIsOf(heldStack, ItemKeys.SUSPICIOUS_STEW); - Assert.itemStackHasComponent(heldStack, DataComponentTypes.SUSPICIOUS_STEW_EFFECTS, + Assert.itemStackHasDataComponent(heldStack, DataComponentTypes.SUSPICIOUS_STEW_EFFECTS, component -> context.assertTrue(!component.effects().isEmpty(), "Expected item stack to have suspicious effects") ); }); diff --git a/src/gametest/java/net/errorcraft/itematic/gametest/item/BowTestSuite.java b/src/gametest/java/net/errorcraft/itematic/gametest/item/BowTestSuite.java new file mode 100644 index 00000000..284a469e --- /dev/null +++ b/src/gametest/java/net/errorcraft/itematic/gametest/item/BowTestSuite.java @@ -0,0 +1,44 @@ +package net.errorcraft.itematic.gametest.item; + +import net.errorcraft.itematic.gametest.TestUtil; +import net.errorcraft.itematic.item.ItemKeys; +import net.minecraft.enchantment.Enchantments; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.test.GameTest; +import net.minecraft.test.TestContext; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.GameMode; + +public class BowTestSuite { + private static final BlockPos SPAWN_POSITION = new BlockPos(1, 2, 1); + + @GameTest(templateName = "itematic:item.bow.platform") + public void usingBowWithMultishotSpawnsMultipleArrows(TestContext context) { + ServerWorld world = context.getWorld(); + ItemStack stack = world.itematic$createStack(ItemKeys.BOW); + stack.addEnchantment( + world.getRegistryManager() + .getWrapperOrThrow(RegistryKeys.ENCHANTMENT) + .getOrThrow(Enchantments.MULTISHOT), + 1 + ); + ItemStack ammunition = world.itematic$createStack(ItemKeys.ARROW); + PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL); + TestUtil.setEntityPos(context, player, SPAWN_POSITION); + player.setStackInHand(Hand.MAIN_HAND, stack); + player.getInventory().insertStack(ammunition); + world.spawnEntity(player); + context.createTimedTaskRunner() + .createAndAddReported(() -> stack.use(world, player, Hand.MAIN_HAND)) + .expectMinDurationAndRun(20, () -> { + player.stopUsingItem(); + context.expectEntities(EntityType.ARROW, 3); + }) + .completeIfSuccessful(); + } +} diff --git a/src/gametest/java/net/errorcraft/itematic/gametest/item/BundleTestSuite.java b/src/gametest/java/net/errorcraft/itematic/gametest/item/BundleTestSuite.java index 35c74240..ec70ed68 100644 --- a/src/gametest/java/net/errorcraft/itematic/gametest/item/BundleTestSuite.java +++ b/src/gametest/java/net/errorcraft/itematic/gametest/item/BundleTestSuite.java @@ -32,7 +32,7 @@ public void addingNormalItemToBundleAddsIt(TestContext context) { context.addInstantFinalTask(() -> { context.assertTrue(bundleStack.onStackClicked(slot, ClickType.RIGHT, player), "Expected right-clicking with Bundle to be successful"); Assert.itemStackIsEmpty(slot.getStack()); - Assert.itemStackHasComponent(bundleStack, DataComponentTypes.BUNDLE_CONTENTS, bundleContents -> { + Assert.itemStackHasDataComponent(bundleStack, DataComponentTypes.BUNDLE_CONTENTS, bundleContents -> { Assert.itemStackIsOf(bundleContents.get(0), ItemKeys.STICK); }); }); @@ -50,7 +50,7 @@ public void addingShulkerBoxToBundleRejectsIt(TestContext context) { context.addInstantFinalTask(() -> { context.assertTrue(bundleStack.onStackClicked(slot, ClickType.RIGHT, player), "Expected right-clicking with Bundle to be successful"); Assert.itemStackIsNotEmpty(slot.getStack()); - Assert.itemStackHasComponent(bundleStack, DataComponentTypes.BUNDLE_CONTENTS, bundleContents -> { + Assert.itemStackHasDataComponent(bundleStack, DataComponentTypes.BUNDLE_CONTENTS, bundleContents -> { context.assertTrue(bundleContents.isEmpty(), "Expected Bundle to be empty"); }); }); @@ -68,7 +68,7 @@ public void addingBundleToBundleAddsItWithPenalty(TestContext context) { context.addInstantFinalTask(() -> { context.assertTrue(bundleStack.onStackClicked(slot, ClickType.RIGHT, player), "Expected right-clicking with Bundle to be successful"); Assert.itemStackIsEmpty(slot.getStack()); - Assert.itemStackHasComponent(bundleStack, DataComponentTypes.BUNDLE_CONTENTS, bundleContents -> { + Assert.itemStackHasDataComponent(bundleStack, DataComponentTypes.BUNDLE_CONTENTS, bundleContents -> { Assert.itemStackIsOf(bundleContents.get(0), ItemKeys.BUNDLE); }); context.assertEquals( diff --git a/src/gametest/java/net/errorcraft/itematic/gametest/item/CrossbowTestSuite.java b/src/gametest/java/net/errorcraft/itematic/gametest/item/CrossbowTestSuite.java new file mode 100644 index 00000000..fdfeb605 --- /dev/null +++ b/src/gametest/java/net/errorcraft/itematic/gametest/item/CrossbowTestSuite.java @@ -0,0 +1,44 @@ +package net.errorcraft.itematic.gametest.item; + +import net.errorcraft.itematic.gametest.Assert; +import net.errorcraft.itematic.item.ItemKeys; +import net.fabricmc.fabric.api.gametest.v1.FabricGameTest; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.enchantment.Enchantments; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.test.GameTest; +import net.minecraft.test.TestContext; +import net.minecraft.util.Hand; +import net.minecraft.world.GameMode; + +public class CrossbowTestSuite { + @GameTest(templateName = FabricGameTest.EMPTY_STRUCTURE) + public void usingCrossbowWithInfinityChargesArrowFromInventoryButDoesNotConsumeTheArrow(TestContext context) { + ServerWorld world = context.getWorld(); + ItemStack stack = world.itematic$createStack(ItemKeys.CROSSBOW); + stack.addEnchantment( + world.getRegistryManager() + .getWrapperOrThrow(RegistryKeys.ENCHANTMENT) + .getOrThrow(Enchantments.INFINITY), + 1 + ); + ItemStack ammunition = world.itematic$createStack(ItemKeys.ARROW); + PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL); + player.setStackInHand(Hand.MAIN_HAND, stack); + player.getInventory().insertStack(ammunition); + world.spawnEntity(player); + context.createTimedTaskRunner() + .createAndAddReported(() -> stack.use(world, player, Hand.MAIN_HAND)) + .expectMinDurationAndRun(stack.getMaxUseTime(player), () -> { + player.stopUsingItem(); + Assert.itemStackHasDataComponent(player.getStackInHand(Hand.MAIN_HAND), DataComponentTypes.CHARGED_PROJECTILES, + component -> context.assertTrue(component.itematic$contains(ItemKeys.ARROW), "Expected item stack to have an Arrow as a charged projectile") + ); + context.assertTrue(player.getInventory().contains(s -> s.itematic$isOf(ItemKeys.ARROW)), "Expected player to have an Arrow in their inventory"); + }) + .completeIfSuccessful(); + } +} diff --git a/src/gametest/java/net/errorcraft/itematic/gametest/item/HoneyBottleTestSuite.java b/src/gametest/java/net/errorcraft/itematic/gametest/item/HoneyBottleTestSuite.java index 258785eb..2b58b687 100644 --- a/src/gametest/java/net/errorcraft/itematic/gametest/item/HoneyBottleTestSuite.java +++ b/src/gametest/java/net/errorcraft/itematic/gametest/item/HoneyBottleTestSuite.java @@ -27,7 +27,7 @@ public void consumingHoneyBottleRemovesPoisonStatusEffect(TestContext context) { world.spawnEntity(player); stack.use(world, player, Hand.MAIN_HAND); context.createTimedTaskRunner().expectMinDurationAndRun( - TestUtil.getComponent(stack, ItematicDataComponentTypes.USE_DURATION).ticks(stack, player), + TestUtil.getDataComponent(stack, ItematicDataComponentTypes.USE_DURATION).ticks(stack, player), () -> Assert.entityDoesNotHaveStatusEffect(player, StatusEffects.POISON) ).completeIfSuccessful(); } diff --git a/src/gametest/java/net/errorcraft/itematic/gametest/item/component/ConsumableItemComponentTestSuite.java b/src/gametest/java/net/errorcraft/itematic/gametest/item/component/ConsumableItemComponentTestSuite.java index 9e04e6fc..97ceb116 100644 --- a/src/gametest/java/net/errorcraft/itematic/gametest/item/component/ConsumableItemComponentTestSuite.java +++ b/src/gametest/java/net/errorcraft/itematic/gametest/item/component/ConsumableItemComponentTestSuite.java @@ -24,7 +24,7 @@ public void consumingHoneyBottleReplacesItemWithGlassBottle(TestContext context) world.spawnEntity(player); stack.use(world, player, Hand.MAIN_HAND); context.createTimedTaskRunner().expectMinDurationAndRun( - TestUtil.getComponent(stack, ItematicDataComponentTypes.USE_DURATION).ticks(stack, player), + TestUtil.getDataComponent(stack, ItematicDataComponentTypes.USE_DURATION).ticks(stack, player), () -> Assert.itemStackIsOf(player.getStackInHand(Hand.MAIN_HAND), ItemKeys.GLASS_BOTTLE) ).completeIfSuccessful(); } diff --git a/src/gametest/java/net/errorcraft/itematic/gametest/item/component/FoodItemComponentTestSuite.java b/src/gametest/java/net/errorcraft/itematic/gametest/item/component/FoodItemComponentTestSuite.java index 8d4aa205..e8e49204 100644 --- a/src/gametest/java/net/errorcraft/itematic/gametest/item/component/FoodItemComponentTestSuite.java +++ b/src/gametest/java/net/errorcraft/itematic/gametest/item/component/FoodItemComponentTestSuite.java @@ -31,7 +31,7 @@ public void eatingFoodItemAddsNutrition(TestContext context) { FoodItemComponent component = TestUtil.getItemComponent(stack, ItemComponentTypes.FOOD); stack.use(world, player, Hand.MAIN_HAND); context.createTimedTaskRunner().expectMinDurationAndRun( - TestUtil.getComponent(stack, ItematicDataComponentTypes.USE_DURATION).ticks(stack, player), + TestUtil.getDataComponent(stack, ItematicDataComponentTypes.USE_DURATION).ticks(stack, player), () -> { Assert.itemStackIsEmpty(player.getStackInHand(Hand.MAIN_HAND)); Assert.areIntsEqual( @@ -55,7 +55,7 @@ public void eatingSuspiciousStewAddsSuspiciousEffects(TestContext context) { world.spawnEntity(player); stack.use(world, player, Hand.MAIN_HAND); context.createTimedTaskRunner().expectMinDurationAndRun( - TestUtil.getComponent(stack, ItematicDataComponentTypes.USE_DURATION).ticks(stack, player), + TestUtil.getDataComponent(stack, ItematicDataComponentTypes.USE_DURATION).ticks(stack, player), () -> { Assert.forAll(effects, effect -> context.expectEntityHasEffect(player, effect.effect(), effect.createStatusEffectInstance().getAmplifier())); Assert.itemStackIsOf(player.getStackInHand(Hand.MAIN_HAND), ItemKeys.BOWL); diff --git a/src/gametest/java/net/errorcraft/itematic/gametest/item/component/ItemHolderItemComponentTestSuite.java b/src/gametest/java/net/errorcraft/itematic/gametest/item/component/ItemHolderItemComponentTestSuite.java index 1e9e4051..ab22e814 100644 --- a/src/gametest/java/net/errorcraft/itematic/gametest/item/component/ItemHolderItemComponentTestSuite.java +++ b/src/gametest/java/net/errorcraft/itematic/gametest/item/component/ItemHolderItemComponentTestSuite.java @@ -37,7 +37,7 @@ public void rightClickingOnStackWithItemHolderAddsStackToItemHolder(TestContext context.addInstantFinalTask(() -> { context.assertTrue(success, "Expected right clicking with item holder to be successful"); Assert.itemStackIsEmpty(inventory.getStack(SLOT)); - Assert.itemStackHasComponent(stack, DataComponentTypes.BUNDLE_CONTENTS, + Assert.itemStackHasDataComponent(stack, DataComponentTypes.BUNDLE_CONTENTS, component -> Assert.itemStackIsOf(component.get(0), ItemKeys.STICK) ); }); @@ -57,7 +57,7 @@ public void rightClickingOnEmptySlotPlacesLastStackFromItemHolderInSlot(TestCont context.addInstantFinalTask(() -> { context.assertTrue(success, "Expected right clicking with item holder to be successful"); Assert.itemStackIsOf(inventory.getStack(SLOT), ItemKeys.STICK); - Assert.itemStackHasComponent(stack, DataComponentTypes.BUNDLE_CONTENTS, + Assert.itemStackHasDataComponent(stack, DataComponentTypes.BUNDLE_CONTENTS, component -> context.assertTrue(component.isEmpty(), "Expected item holder to be empty") ); }); @@ -78,7 +78,7 @@ public void rightClickingOnItemHolderWithStackAddsStackToItemHolder(TestContext context.addInstantFinalTask(() -> { context.assertTrue(success, "Expected right clicking on item holder to be successful"); Assert.itemStackIsEmpty(cursorStack.get()); - Assert.itemStackHasComponent(inventory.getStack(SLOT), DataComponentTypes.BUNDLE_CONTENTS, + Assert.itemStackHasDataComponent(inventory.getStack(SLOT), DataComponentTypes.BUNDLE_CONTENTS, component -> Assert.itemStackIsOf(component.get(0), ItemKeys.STICK) ); }); @@ -101,7 +101,7 @@ public void rightClickingOnItemHolderRemovesStackFromItemHolder(TestContext cont context.addInstantFinalTask(() -> { context.assertTrue(success, "Expected right clicking on item holder to be successful"); Assert.itemStackIsOf(cursorStack.get(), ItemKeys.STICK); - Assert.itemStackHasComponent(inventory.getStack(SLOT), DataComponentTypes.BUNDLE_CONTENTS, + Assert.itemStackHasDataComponent(inventory.getStack(SLOT), DataComponentTypes.BUNDLE_CONTENTS, component -> context.assertTrue(component.isEmpty(), "Expected item holder to be empty") ); }); diff --git a/src/gametest/java/net/errorcraft/itematic/gametest/item/component/MappableItemComponentTestSuite.java b/src/gametest/java/net/errorcraft/itematic/gametest/item/component/MappableItemComponentTestSuite.java index e719f87d..92c83ec4 100644 --- a/src/gametest/java/net/errorcraft/itematic/gametest/item/component/MappableItemComponentTestSuite.java +++ b/src/gametest/java/net/errorcraft/itematic/gametest/item/component/MappableItemComponentTestSuite.java @@ -23,7 +23,7 @@ public void usingMapFillsMap(TestContext context) { ItemStack resultStack = stack.use(world, player, Hand.MAIN_HAND).getValue(); context.addInstantFinalTask(() -> { Assert.itemStackIsOf(resultStack, ItemKeys.FILLED_MAP); - Assert.itemStackHasComponent(resultStack, DataComponentTypes.MAP_ID); + Assert.itemStackHasDataComponent(resultStack, DataComponentTypes.MAP_ID); }); } } diff --git a/src/gametest/java/net/errorcraft/itematic/gametest/item/component/PotionItemComponentTestSuite.java b/src/gametest/java/net/errorcraft/itematic/gametest/item/component/PotionItemComponentTestSuite.java index f4139431..6c5790d1 100644 --- a/src/gametest/java/net/errorcraft/itematic/gametest/item/component/PotionItemComponentTestSuite.java +++ b/src/gametest/java/net/errorcraft/itematic/gametest/item/component/PotionItemComponentTestSuite.java @@ -25,7 +25,7 @@ public void drinkingPotionItemAddsEffects(TestContext context) { world.spawnEntity(player); stack.use(world, player, Hand.MAIN_HAND); context.createTimedTaskRunner().expectMinDurationAndRun( - TestUtil.getComponent(stack, ItematicDataComponentTypes.USE_DURATION).ticks(stack, player), + TestUtil.getDataComponent(stack, ItematicDataComponentTypes.USE_DURATION).ticks(stack, player), () -> Assert.forAll( Potions.LEAPING.value().getEffects(), effectInstance -> context.expectEntityHasEffect(player, effectInstance.getEffectType(), effectInstance.getAmplifier()) diff --git a/src/gametest/java/net/errorcraft/itematic/gametest/item/component/ShooterItemComponentTestSuite.java b/src/gametest/java/net/errorcraft/itematic/gametest/item/component/ShooterItemComponentTestSuite.java index a321e773..4934d321 100644 --- a/src/gametest/java/net/errorcraft/itematic/gametest/item/component/ShooterItemComponentTestSuite.java +++ b/src/gametest/java/net/errorcraft/itematic/gametest/item/component/ShooterItemComponentTestSuite.java @@ -2,7 +2,6 @@ import net.errorcraft.itematic.gametest.Assert; import net.errorcraft.itematic.item.ItemKeys; -import net.errorcraft.itematic.item.component.components.ShooterItemComponent; import net.fabricmc.fabric.api.gametest.v1.FabricGameTest; import net.minecraft.component.DataComponentTypes; import net.minecraft.entity.player.PlayerEntity; @@ -15,7 +14,7 @@ public class ShooterItemComponentTestSuite { @GameTest(templateName = FabricGameTest.EMPTY_STRUCTURE) - public void usingCrossbowLoadsArrowFromInventory(TestContext context) { + public void usingCrossbowChargesArrowFromInventory(TestContext context) { PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL); ServerWorld world = context.getWorld(); ItemStack stack = world.itematic$createStack(ItemKeys.CROSSBOW); @@ -25,19 +24,19 @@ public void usingCrossbowLoadsArrowFromInventory(TestContext context) { world.spawnEntity(player); stack.use(world, player, Hand.MAIN_HAND); context.createTimedTaskRunner().expectMinDurationAndRun( - ShooterItemComponent.getPullTime(stack), + stack.getMaxUseTime(player), () -> { stack.onStoppedUsing(world, player, player.getItemUseTimeLeft()); - Assert.itemStackHasComponent(player.getStackInHand(Hand.MAIN_HAND), DataComponentTypes.CHARGED_PROJECTILES, - component -> context.assertTrue(component.itematic$contains(ItemKeys.ARROW), "Expected item stack to have an arrow as a charged projectile") + Assert.itemStackHasDataComponent(player.getStackInHand(Hand.MAIN_HAND), DataComponentTypes.CHARGED_PROJECTILES, + component -> context.assertTrue(component.itematic$contains(ItemKeys.ARROW), "Expected item stack to have an Arrow as a charged projectile") ); - context.assertTrue(!player.getInventory().contains(s -> s.itematic$isOf(ItemKeys.ARROW)), "Expected player to have no arrows in their inventory"); + context.assertTrue(!player.getInventory().contains(s -> s.itematic$isOf(ItemKeys.ARROW)), "Expected player to have no Arrows in their inventory"); } ).completeIfSuccessful(); } @GameTest(templateName = FabricGameTest.EMPTY_STRUCTURE) - public void usingCrossbowLoadsFireworkRocketFromOffhand(TestContext context) { + public void usingCrossbowChargesFireworkRocketFromOffhand(TestContext context) { PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL); ServerWorld world = context.getWorld(); ItemStack stack = world.itematic$createStack(ItemKeys.CROSSBOW); @@ -47,11 +46,11 @@ public void usingCrossbowLoadsFireworkRocketFromOffhand(TestContext context) { world.spawnEntity(player); stack.use(world, player, Hand.MAIN_HAND); context.createTimedTaskRunner().expectMinDurationAndRun( - ShooterItemComponent.getPullTime(stack), + stack.getMaxUseTime(player), () -> { stack.onStoppedUsing(world, player, player.getItemUseTimeLeft()); - Assert.itemStackHasComponent(player.getStackInHand(Hand.MAIN_HAND), DataComponentTypes.CHARGED_PROJECTILES, - component -> context.assertTrue(component.itematic$contains(ItemKeys.FIREWORK_ROCKET), "Expected item stack to have a firework rocket as a charged projectile") + Assert.itemStackHasDataComponent(player.getStackInHand(Hand.MAIN_HAND), DataComponentTypes.CHARGED_PROJECTILES, + component -> context.assertTrue(component.itematic$contains(ItemKeys.FIREWORK_ROCKET), "Expected item stack to have a Firework Rocket as a charged projectile") ); Assert.itemStackIsEmpty(player.getStackInHand(Hand.OFF_HAND)); } diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.anvil.snbt b/src/gametest/resources/data/itematic/gametest/structures/block.anvil.snbt new file mode 100644 index 00000000..6b755b7c --- /dev/null +++ b/src/gametest/resources/data/itematic/gametest/structures/block.anvil.snbt @@ -0,0 +1,39 @@ +{ + DataVersion: 3940, + size: [3, 3, 3], + data: [ + {pos: [0, 0, 0], state: "minecraft:bedrock"}, + {pos: [0, 0, 1], state: "minecraft:bedrock"}, + {pos: [0, 0, 2], state: "minecraft:bedrock"}, + {pos: [1, 0, 0], state: "minecraft:bedrock"}, + {pos: [1, 0, 1], state: "minecraft:bedrock"}, + {pos: [1, 0, 2], state: "minecraft:bedrock"}, + {pos: [2, 0, 0], state: "minecraft:bedrock"}, + {pos: [2, 0, 1], state: "minecraft:bedrock"}, + {pos: [2, 0, 2], state: "minecraft:bedrock"}, + {pos: [0, 1, 0], state: "minecraft:air"}, + {pos: [0, 1, 1], state: "minecraft:air"}, + {pos: [0, 1, 2], state: "minecraft:air"}, + {pos: [1, 1, 0], state: "minecraft:air"}, + {pos: [1, 1, 1], state: "minecraft:anvil{facing:west}"}, + {pos: [1, 1, 2], state: "minecraft:air"}, + {pos: [2, 1, 0], state: "minecraft:air"}, + {pos: [2, 1, 1], state: "minecraft:air"}, + {pos: [2, 1, 2], state: "minecraft:air"}, + {pos: [0, 2, 0], state: "minecraft:air"}, + {pos: [0, 2, 1], state: "minecraft:air"}, + {pos: [0, 2, 2], state: "minecraft:air"}, + {pos: [1, 2, 0], state: "minecraft:air"}, + {pos: [1, 2, 1], state: "minecraft:air"}, + {pos: [1, 2, 2], state: "minecraft:air"}, + {pos: [2, 2, 0], state: "minecraft:air"}, + {pos: [2, 2, 1], state: "minecraft:air"}, + {pos: [2, 2, 2], state: "minecraft:air"} + ], + entities: [], + palette: [ + "minecraft:bedrock", + "minecraft:air", + "minecraft:anvil{facing:west}" + ] +} diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.enchanting_table.snbt b/src/gametest/resources/data/itematic/gametest/structures/block.enchanting_table.snbt new file mode 100644 index 00000000..f77982ba --- /dev/null +++ b/src/gametest/resources/data/itematic/gametest/structures/block.enchanting_table.snbt @@ -0,0 +1,39 @@ +{ + DataVersion: 3940, + size: [3, 3, 3], + data: [ + {pos: [0, 0, 0], state: "minecraft:bedrock"}, + {pos: [0, 0, 1], state: "minecraft:bedrock"}, + {pos: [0, 0, 2], state: "minecraft:bedrock"}, + {pos: [1, 0, 0], state: "minecraft:bedrock"}, + {pos: [1, 0, 1], state: "minecraft:bedrock"}, + {pos: [1, 0, 2], state: "minecraft:bedrock"}, + {pos: [2, 0, 0], state: "minecraft:bedrock"}, + {pos: [2, 0, 1], state: "minecraft:bedrock"}, + {pos: [2, 0, 2], state: "minecraft:bedrock"}, + {pos: [0, 1, 0], state: "minecraft:air"}, + {pos: [0, 1, 1], state: "minecraft:air"}, + {pos: [0, 1, 2], state: "minecraft:air"}, + {pos: [1, 1, 0], state: "minecraft:air"}, + {pos: [1, 1, 1], state: "minecraft:enchanting_table", nbt: {id: "minecraft:enchanting_table"}}, + {pos: [1, 1, 2], state: "minecraft:air"}, + {pos: [2, 1, 0], state: "minecraft:air"}, + {pos: [2, 1, 1], state: "minecraft:air"}, + {pos: [2, 1, 2], state: "minecraft:air"}, + {pos: [0, 2, 0], state: "minecraft:air"}, + {pos: [0, 2, 1], state: "minecraft:air"}, + {pos: [0, 2, 2], state: "minecraft:air"}, + {pos: [1, 2, 0], state: "minecraft:air"}, + {pos: [1, 2, 1], state: "minecraft:air"}, + {pos: [1, 2, 2], state: "minecraft:air"}, + {pos: [2, 2, 0], state: "minecraft:air"}, + {pos: [2, 2, 1], state: "minecraft:air"}, + {pos: [2, 2, 2], state: "minecraft:air"} + ], + entities: [], + palette: [ + "minecraft:bedrock", + "minecraft:air", + "minecraft:enchanting_table" + ] +} diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.grindstone.snbt b/src/gametest/resources/data/itematic/gametest/structures/block.grindstone.snbt new file mode 100644 index 00000000..e83891d4 --- /dev/null +++ b/src/gametest/resources/data/itematic/gametest/structures/block.grindstone.snbt @@ -0,0 +1,39 @@ +{ + DataVersion: 3940, + size: [3, 3, 3], + data: [ + {pos: [0, 0, 0], state: "minecraft:bedrock"}, + {pos: [0, 0, 1], state: "minecraft:bedrock"}, + {pos: [0, 0, 2], state: "minecraft:bedrock"}, + {pos: [1, 0, 0], state: "minecraft:bedrock"}, + {pos: [1, 0, 1], state: "minecraft:bedrock"}, + {pos: [1, 0, 2], state: "minecraft:bedrock"}, + {pos: [2, 0, 0], state: "minecraft:bedrock"}, + {pos: [2, 0, 1], state: "minecraft:bedrock"}, + {pos: [2, 0, 2], state: "minecraft:bedrock"}, + {pos: [0, 1, 0], state: "minecraft:air"}, + {pos: [0, 1, 1], state: "minecraft:air"}, + {pos: [0, 1, 2], state: "minecraft:air"}, + {pos: [1, 1, 0], state: "minecraft:air"}, + {pos: [1, 1, 1], state: "minecraft:grindstone{face:floor,facing:south}"}, + {pos: [1, 1, 2], state: "minecraft:air"}, + {pos: [2, 1, 0], state: "minecraft:air"}, + {pos: [2, 1, 1], state: "minecraft:air"}, + {pos: [2, 1, 2], state: "minecraft:air"}, + {pos: [0, 2, 0], state: "minecraft:air"}, + {pos: [0, 2, 1], state: "minecraft:air"}, + {pos: [0, 2, 2], state: "minecraft:air"}, + {pos: [1, 2, 0], state: "minecraft:air"}, + {pos: [1, 2, 1], state: "minecraft:air"}, + {pos: [1, 2, 2], state: "minecraft:air"}, + {pos: [2, 2, 0], state: "minecraft:air"}, + {pos: [2, 2, 1], state: "minecraft:air"}, + {pos: [2, 2, 2], state: "minecraft:air"} + ], + entities: [], + palette: [ + "minecraft:bedrock", + "minecraft:air", + "minecraft:grindstone{face:floor,facing:south}" + ] +} diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.bow.platform.snbt b/src/gametest/resources/data/itematic/gametest/structures/item.bow.platform.snbt new file mode 100644 index 00000000..6b61c514 --- /dev/null +++ b/src/gametest/resources/data/itematic/gametest/structures/item.bow.platform.snbt @@ -0,0 +1,38 @@ +{ + DataVersion: 3940, + size: [3, 3, 3], + data: [ + {pos: [0, 0, 0], state: "minecraft:bedrock"}, + {pos: [0, 0, 1], state: "minecraft:bedrock"}, + {pos: [0, 0, 2], state: "minecraft:bedrock"}, + {pos: [1, 0, 0], state: "minecraft:bedrock"}, + {pos: [1, 0, 1], state: "minecraft:bedrock"}, + {pos: [1, 0, 2], state: "minecraft:bedrock"}, + {pos: [2, 0, 0], state: "minecraft:bedrock"}, + {pos: [2, 0, 1], state: "minecraft:bedrock"}, + {pos: [2, 0, 2], state: "minecraft:bedrock"}, + {pos: [0, 1, 0], state: "minecraft:air"}, + {pos: [0, 1, 1], state: "minecraft:air"}, + {pos: [0, 1, 2], state: "minecraft:air"}, + {pos: [1, 1, 0], state: "minecraft:air"}, + {pos: [1, 1, 1], state: "minecraft:air"}, + {pos: [1, 1, 2], state: "minecraft:air"}, + {pos: [2, 1, 0], state: "minecraft:air"}, + {pos: [2, 1, 1], state: "minecraft:air"}, + {pos: [2, 1, 2], state: "minecraft:air"}, + {pos: [0, 2, 0], state: "minecraft:air"}, + {pos: [0, 2, 1], state: "minecraft:air"}, + {pos: [0, 2, 2], state: "minecraft:air"}, + {pos: [1, 2, 0], state: "minecraft:air"}, + {pos: [1, 2, 1], state: "minecraft:air"}, + {pos: [1, 2, 2], state: "minecraft:air"}, + {pos: [2, 2, 0], state: "minecraft:air"}, + {pos: [2, 2, 1], state: "minecraft:air"}, + {pos: [2, 2, 2], state: "minecraft:air"} + ], + entities: [], + palette: [ + "minecraft:bedrock", + "minecraft:air" + ] +} diff --git a/src/gametest/resources/fabric.mod.json b/src/gametest/resources/fabric.mod.json index a00bf284..dbacdbc0 100644 --- a/src/gametest/resources/fabric.mod.json +++ b/src/gametest/resources/fabric.mod.json @@ -7,10 +7,13 @@ "environment": "*", "entrypoints": { "fabric-gametest": [ + "net.errorcraft.itematic.gametest.block.AnvilBlockTestSuite", "net.errorcraft.itematic.gametest.block.BeehiveBlockTestSuite", "net.errorcraft.itematic.gametest.block.CandleBlockTestSuite", "net.errorcraft.itematic.gametest.block.ComposterBlockTestSuite", "net.errorcraft.itematic.gametest.block.DispenserBehaviorTestSuite", + "net.errorcraft.itematic.gametest.block.EnchantingTableTestSuite", + "net.errorcraft.itematic.gametest.block.GrindstoneTestSuite", "net.errorcraft.itematic.gametest.block.PickBlockTestSuite", "net.errorcraft.itematic.gametest.block.ShulkerBoxBlockTestSuite", "net.errorcraft.itematic.gametest.block.WaterCauldronBlockTestSuite", @@ -24,8 +27,10 @@ "net.errorcraft.itematic.gametest.entity.passive.SheepEntityTestSuite", "net.errorcraft.itematic.gametest.entity.passive.SnifferEntityTestSuite", "net.errorcraft.itematic.gametest.entity.passive.WolfEntityTestSuite", - "net.errorcraft.itematic.gametest.item.BundleTestSuite", + "net.errorcraft.itematic.gametest.item.BowTestSuite", "net.errorcraft.itematic.gametest.item.BrushTestSuite", + "net.errorcraft.itematic.gametest.item.BundleTestSuite", + "net.errorcraft.itematic.gametest.item.CrossbowTestSuite", "net.errorcraft.itematic.gametest.item.FishingRodTestSuite", "net.errorcraft.itematic.gametest.item.FlowerPotItemTestSuite", "net.errorcraft.itematic.gametest.item.HoneyBottleTestSuite", diff --git a/src/main/generated/data/minecraft/item/arrow.json b/src/main/generated/data/minecraft/item/arrow.json index f8be902a..80c9a73b 100644 --- a/src/main/generated/data/minecraft/item/arrow.json +++ b/src/main/generated/data/minecraft/item/arrow.json @@ -7,7 +7,6 @@ "behavior": "minecraft:shoot_projectile" }, "minecraft:projectile": { - "damage": 1, "entity": { "type": "minecraft:arrow" } diff --git a/src/main/generated/data/minecraft/item/bogged_spawn_egg.json b/src/main/generated/data/minecraft/item/bogged_spawn_egg.json new file mode 100644 index 00000000..03d6d1ea --- /dev/null +++ b/src/main/generated/data/minecraft/item/bogged_spawn_egg.json @@ -0,0 +1,28 @@ +{ + "base": { + "translation_key": "item.minecraft.bogged_spawn_egg" + }, + "components": { + "minecraft:dispensable": { + "behavior": "minecraft:spawn_entity_from_item" + }, + "minecraft:entity": { + "allow_item_data": true, + "entity": { + "type": "minecraft:bogged" + } + }, + "minecraft:spawn_egg": {}, + "minecraft:stackable": 64, + "minecraft:tinted": { + "tint": { + "type": "minecraft:index", + "indices": [ + 9084018, + 3231003 + ] + } + }, + "minecraft:useable_on_fluid": {} + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/bolt_armor_trim_smithing_template.json b/src/main/generated/data/minecraft/item/bolt_armor_trim_smithing_template.json new file mode 100644 index 00000000..d765acb7 --- /dev/null +++ b/src/main/generated/data/minecraft/item/bolt_armor_trim_smithing_template.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "item.minecraft.bolt_armor_trim_smithing_template" + }, + "components": { + "minecraft:smithing_template": { + "template": "minecraft:bolt_pattern" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/bow.json b/src/main/generated/data/minecraft/item/bow.json index 51dd5fdc..652090dc 100644 --- a/src/main/generated/data/minecraft/item/bow.json +++ b/src/main/generated/data/minecraft/item/bow.json @@ -7,11 +7,7 @@ "durability": 384 }, "minecraft:enchantable": { - "enchantability": 1, - "enchantments": "minecraft:bow_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:bow_forging" + "enchantability": 1 }, "minecraft:fuel": { "ticks": 300 @@ -19,6 +15,13 @@ "minecraft:shooter": { "ammunition": "#minecraft:bow_ammunition", "held_ammunition": "#minecraft:bow_ammunition", + "item_damage": { + "default_damage": 1, + "rules": [] + }, + "method": { + "type": "minecraft:direct" + }, "range": 15 }, "minecraft:stackable": 1, diff --git a/src/main/generated/data/minecraft/item/breeze_rod.json b/src/main/generated/data/minecraft/item/breeze_rod.json new file mode 100644 index 00000000..a1b31330 --- /dev/null +++ b/src/main/generated/data/minecraft/item/breeze_rod.json @@ -0,0 +1,8 @@ +{ + "base": { + "translation_key": "item.minecraft.breeze_rod" + }, + "components": { + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/breeze_spawn_egg.json b/src/main/generated/data/minecraft/item/breeze_spawn_egg.json new file mode 100644 index 00000000..ca624de9 --- /dev/null +++ b/src/main/generated/data/minecraft/item/breeze_spawn_egg.json @@ -0,0 +1,28 @@ +{ + "base": { + "translation_key": "item.minecraft.breeze_spawn_egg" + }, + "components": { + "minecraft:dispensable": { + "behavior": "minecraft:spawn_entity_from_item" + }, + "minecraft:entity": { + "allow_item_data": true, + "entity": { + "type": "minecraft:breeze" + } + }, + "minecraft:spawn_egg": {}, + "minecraft:stackable": 64, + "minecraft:tinted": { + "tint": { + "type": "minecraft:index", + "indices": [ + 11506911, + 9529055 + ] + } + }, + "minecraft:useable_on_fluid": {} + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/brush.json b/src/main/generated/data/minecraft/item/brush.json index 80f8938b..60dbfb0f 100644 --- a/src/main/generated/data/minecraft/item/brush.json +++ b/src/main/generated/data/minecraft/item/brush.json @@ -10,9 +10,6 @@ "minecraft:dispensable": { "behavior": "minecraft:brush" }, - "minecraft:forgeable": { - "enchantments": "minecraft:brush_forging" - }, "minecraft:stackable": 1, "minecraft:useable": { "animation": "brush", diff --git a/src/main/generated/data/minecraft/item/carrot_on_a_stick.json b/src/main/generated/data/minecraft/item/carrot_on_a_stick.json index 67cddb6a..140a457d 100644 --- a/src/main/generated/data/minecraft/item/carrot_on_a_stick.json +++ b/src/main/generated/data/minecraft/item/carrot_on_a_stick.json @@ -6,9 +6,6 @@ "minecraft:damageable": { "durability": 25 }, - "minecraft:forgeable": { - "enchantments": "minecraft:steering_forging" - }, "minecraft:stackable": 1, "minecraft:steering": { "damage_per_use": 7, diff --git a/src/main/generated/data/minecraft/item/chainmail_boots.json b/src/main/generated/data/minecraft/item/chainmail_boots.json index 3d20f7eb..804356df 100644 --- a/src/main/generated/data/minecraft/item/chainmail_boots.json +++ b/src/main/generated/data/minecraft/item/chainmail_boots.json @@ -13,17 +13,13 @@ "behavior": "minecraft:equip_entity" }, "minecraft:enchantable": { - "enchantability": 12, - "enchantments": "minecraft:boots_enchanting" + "enchantability": 12 }, "minecraft:equipment": { "equip_sound": "minecraft:item.armor.equip_chain", "slot": "feet", "swappable": true }, - "minecraft:forgeable": { - "enchantments": "minecraft:boots_forging" - }, "minecraft:repairable": { "items": "minecraft:repairs_chainmail_armor" }, diff --git a/src/main/generated/data/minecraft/item/chainmail_chestplate.json b/src/main/generated/data/minecraft/item/chainmail_chestplate.json index a48f56da..520fcc5f 100644 --- a/src/main/generated/data/minecraft/item/chainmail_chestplate.json +++ b/src/main/generated/data/minecraft/item/chainmail_chestplate.json @@ -13,17 +13,13 @@ "behavior": "minecraft:equip_entity" }, "minecraft:enchantable": { - "enchantability": 12, - "enchantments": "minecraft:chestplate_enchanting" + "enchantability": 12 }, "minecraft:equipment": { "equip_sound": "minecraft:item.armor.equip_chain", "slot": "chest", "swappable": true }, - "minecraft:forgeable": { - "enchantments": "minecraft:chestplate_forging" - }, "minecraft:repairable": { "items": "minecraft:repairs_chainmail_armor" }, diff --git a/src/main/generated/data/minecraft/item/chainmail_helmet.json b/src/main/generated/data/minecraft/item/chainmail_helmet.json index 9f9d31c5..1998528c 100644 --- a/src/main/generated/data/minecraft/item/chainmail_helmet.json +++ b/src/main/generated/data/minecraft/item/chainmail_helmet.json @@ -13,17 +13,13 @@ "behavior": "minecraft:equip_entity" }, "minecraft:enchantable": { - "enchantability": 12, - "enchantments": "minecraft:helmet_enchanting" + "enchantability": 12 }, "minecraft:equipment": { "equip_sound": "minecraft:item.armor.equip_chain", "slot": "head", "swappable": true }, - "minecraft:forgeable": { - "enchantments": "minecraft:helmet_forging" - }, "minecraft:repairable": { "items": "minecraft:repairs_chainmail_armor" }, diff --git a/src/main/generated/data/minecraft/item/chainmail_leggings.json b/src/main/generated/data/minecraft/item/chainmail_leggings.json index 454c96a3..a9bf7884 100644 --- a/src/main/generated/data/minecraft/item/chainmail_leggings.json +++ b/src/main/generated/data/minecraft/item/chainmail_leggings.json @@ -13,17 +13,13 @@ "behavior": "minecraft:equip_entity" }, "minecraft:enchantable": { - "enchantability": 12, - "enchantments": "minecraft:leggings_enchanting" + "enchantability": 12 }, "minecraft:equipment": { "equip_sound": "minecraft:item.armor.equip_chain", "slot": "legs", "swappable": true }, - "minecraft:forgeable": { - "enchantments": "minecraft:leggings_forging" - }, "minecraft:repairable": { "items": "minecraft:repairs_chainmail_armor" }, diff --git a/src/main/generated/data/minecraft/item/chiseled_copper.json b/src/main/generated/data/minecraft/item/chiseled_copper.json new file mode 100644 index 00000000..e2e478d4 --- /dev/null +++ b/src/main/generated/data/minecraft/item/chiseled_copper.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.chiseled_copper" + }, + "components": { + "minecraft:block": { + "block": "minecraft:chiseled_copper" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/chiseled_tuff.json b/src/main/generated/data/minecraft/item/chiseled_tuff.json new file mode 100644 index 00000000..70de83c8 --- /dev/null +++ b/src/main/generated/data/minecraft/item/chiseled_tuff.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.chiseled_tuff" + }, + "components": { + "minecraft:block": { + "block": "minecraft:chiseled_tuff" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/chiseled_tuff_bricks.json b/src/main/generated/data/minecraft/item/chiseled_tuff_bricks.json new file mode 100644 index 00000000..7edb8750 --- /dev/null +++ b/src/main/generated/data/minecraft/item/chiseled_tuff_bricks.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.chiseled_tuff_bricks" + }, + "components": { + "minecraft:block": { + "block": "minecraft:chiseled_tuff_bricks" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/copper_bulb.json b/src/main/generated/data/minecraft/item/copper_bulb.json new file mode 100644 index 00000000..43c395dd --- /dev/null +++ b/src/main/generated/data/minecraft/item/copper_bulb.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.copper_bulb" + }, + "components": { + "minecraft:block": { + "block": "minecraft:copper_bulb" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/copper_door.json b/src/main/generated/data/minecraft/item/copper_door.json new file mode 100644 index 00000000..75d57b9f --- /dev/null +++ b/src/main/generated/data/minecraft/item/copper_door.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.copper_door" + }, + "components": { + "minecraft:block": { + "block": "minecraft:copper_door" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/copper_grate.json b/src/main/generated/data/minecraft/item/copper_grate.json new file mode 100644 index 00000000..ab6bc70a --- /dev/null +++ b/src/main/generated/data/minecraft/item/copper_grate.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.copper_grate" + }, + "components": { + "minecraft:block": { + "block": "minecraft:copper_grate" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/copper_trapdoor.json b/src/main/generated/data/minecraft/item/copper_trapdoor.json new file mode 100644 index 00000000..61e6cf06 --- /dev/null +++ b/src/main/generated/data/minecraft/item/copper_trapdoor.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.copper_trapdoor" + }, + "components": { + "minecraft:block": { + "block": "minecraft:copper_trapdoor" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/crafter.json b/src/main/generated/data/minecraft/item/crafter.json new file mode 100644 index 00000000..642b4639 --- /dev/null +++ b/src/main/generated/data/minecraft/item/crafter.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.crafter" + }, + "components": { + "minecraft:block": { + "block": "minecraft:crafter" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/crossbow.json b/src/main/generated/data/minecraft/item/crossbow.json index c8c96632..11f006f1 100644 --- a/src/main/generated/data/minecraft/item/crossbow.json +++ b/src/main/generated/data/minecraft/item/crossbow.json @@ -7,28 +7,41 @@ "durability": 465 }, "minecraft:enchantable": { - "enchantability": 1, - "enchantments": "minecraft:crossbow_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:crossbow_forging" + "enchantability": 1 }, "minecraft:fuel": { "ticks": 300 }, "minecraft:shooter": { "ammunition": "#minecraft:bow_ammunition", - "chargeable": { - "quick_charge_sounds": { - "default": "minecraft:item.crossbow.loading_start", - "levels": [ - "minecraft:item.crossbow.quick_charge_1", - "minecraft:item.crossbow.quick_charge_2", - "minecraft:item.crossbow.quick_charge_3" + "held_ammunition": "#minecraft:crossbow_ammunition", + "item_damage": { + "default_damage": 1, + "rules": [ + { + "damage": 3, + "items": "minecraft:firework_rocket" + } + ] + }, + "method": { + "type": "minecraft:chargeable", + "charged_power_rules": { + "default_power": 3.15, + "rules": [ + { + "items": "minecraft:firework_rocket", + "power": 1.6 + } ] + }, + "default_charge_time": 1.25, + "default_charging_sounds": { + "end": "minecraft:item.crossbow.loading_end", + "mid": "minecraft:item.crossbow.loading_middle", + "start": "minecraft:item.crossbow.loading_start" } }, - "held_ammunition": "#minecraft:crossbow_ammunition", "range": 8 }, "minecraft:stackable": 1, diff --git a/src/main/generated/data/minecraft/item/diamond_axe.json b/src/main/generated/data/minecraft/item/diamond_axe.json index 7ab41439..9c5c33b4 100644 --- a/src/main/generated/data/minecraft/item/diamond_axe.json +++ b/src/main/generated/data/minecraft/item/diamond_axe.json @@ -7,11 +7,7 @@ "durability": 1561 }, "minecraft:enchantable": { - "enchantability": 10, - "enchantments": "minecraft:axe_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:axe_forging" + "enchantability": 10 }, "minecraft:repairable": { "items": "minecraft:repairs_diamond_tool" diff --git a/src/main/generated/data/minecraft/item/diamond_boots.json b/src/main/generated/data/minecraft/item/diamond_boots.json index b1a39d0e..fa3ba6f1 100644 --- a/src/main/generated/data/minecraft/item/diamond_boots.json +++ b/src/main/generated/data/minecraft/item/diamond_boots.json @@ -13,17 +13,13 @@ "behavior": "minecraft:equip_entity" }, "minecraft:enchantable": { - "enchantability": 10, - "enchantments": "minecraft:boots_enchanting" + "enchantability": 10 }, "minecraft:equipment": { "equip_sound": "minecraft:item.armor.equip_diamond", "slot": "feet", "swappable": true }, - "minecraft:forgeable": { - "enchantments": "minecraft:boots_forging" - }, "minecraft:repairable": { "items": "minecraft:repairs_diamond_armor" }, diff --git a/src/main/generated/data/minecraft/item/diamond_chestplate.json b/src/main/generated/data/minecraft/item/diamond_chestplate.json index f526aa98..a542c789 100644 --- a/src/main/generated/data/minecraft/item/diamond_chestplate.json +++ b/src/main/generated/data/minecraft/item/diamond_chestplate.json @@ -13,17 +13,13 @@ "behavior": "minecraft:equip_entity" }, "minecraft:enchantable": { - "enchantability": 10, - "enchantments": "minecraft:chestplate_enchanting" + "enchantability": 10 }, "minecraft:equipment": { "equip_sound": "minecraft:item.armor.equip_diamond", "slot": "chest", "swappable": true }, - "minecraft:forgeable": { - "enchantments": "minecraft:chestplate_forging" - }, "minecraft:repairable": { "items": "minecraft:repairs_diamond_armor" }, diff --git a/src/main/generated/data/minecraft/item/diamond_helmet.json b/src/main/generated/data/minecraft/item/diamond_helmet.json index 7982dec8..82a49c42 100644 --- a/src/main/generated/data/minecraft/item/diamond_helmet.json +++ b/src/main/generated/data/minecraft/item/diamond_helmet.json @@ -13,17 +13,13 @@ "behavior": "minecraft:equip_entity" }, "minecraft:enchantable": { - "enchantability": 10, - "enchantments": "minecraft:helmet_enchanting" + "enchantability": 10 }, "minecraft:equipment": { "equip_sound": "minecraft:item.armor.equip_diamond", "slot": "head", "swappable": true }, - "minecraft:forgeable": { - "enchantments": "minecraft:helmet_forging" - }, "minecraft:repairable": { "items": "minecraft:repairs_diamond_armor" }, diff --git a/src/main/generated/data/minecraft/item/diamond_hoe.json b/src/main/generated/data/minecraft/item/diamond_hoe.json index 2bd62e5c..d18a370d 100644 --- a/src/main/generated/data/minecraft/item/diamond_hoe.json +++ b/src/main/generated/data/minecraft/item/diamond_hoe.json @@ -7,11 +7,7 @@ "durability": 1561 }, "minecraft:enchantable": { - "enchantability": 10, - "enchantments": "minecraft:hoe_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:hoe_forging" + "enchantability": 10 }, "minecraft:repairable": { "items": "minecraft:repairs_diamond_tool" diff --git a/src/main/generated/data/minecraft/item/diamond_leggings.json b/src/main/generated/data/minecraft/item/diamond_leggings.json index 0fe94262..e440581a 100644 --- a/src/main/generated/data/minecraft/item/diamond_leggings.json +++ b/src/main/generated/data/minecraft/item/diamond_leggings.json @@ -13,17 +13,13 @@ "behavior": "minecraft:equip_entity" }, "minecraft:enchantable": { - "enchantability": 10, - "enchantments": "minecraft:leggings_enchanting" + "enchantability": 10 }, "minecraft:equipment": { "equip_sound": "minecraft:item.armor.equip_diamond", "slot": "legs", "swappable": true }, - "minecraft:forgeable": { - "enchantments": "minecraft:leggings_forging" - }, "minecraft:repairable": { "items": "minecraft:repairs_diamond_armor" }, diff --git a/src/main/generated/data/minecraft/item/diamond_pickaxe.json b/src/main/generated/data/minecraft/item/diamond_pickaxe.json index 2f4c09b9..c9f6d1ef 100644 --- a/src/main/generated/data/minecraft/item/diamond_pickaxe.json +++ b/src/main/generated/data/minecraft/item/diamond_pickaxe.json @@ -7,11 +7,7 @@ "durability": 1561 }, "minecraft:enchantable": { - "enchantability": 10, - "enchantments": "minecraft:pickaxe_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:pickaxe_forging" + "enchantability": 10 }, "minecraft:repairable": { "items": "minecraft:repairs_diamond_tool" diff --git a/src/main/generated/data/minecraft/item/diamond_shovel.json b/src/main/generated/data/minecraft/item/diamond_shovel.json index 076c6cc7..501ea2a7 100644 --- a/src/main/generated/data/minecraft/item/diamond_shovel.json +++ b/src/main/generated/data/minecraft/item/diamond_shovel.json @@ -7,11 +7,7 @@ "durability": 1561 }, "minecraft:enchantable": { - "enchantability": 10, - "enchantments": "minecraft:shovel_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:shovel_forging" + "enchantability": 10 }, "minecraft:repairable": { "items": "minecraft:repairs_diamond_tool" diff --git a/src/main/generated/data/minecraft/item/diamond_sword.json b/src/main/generated/data/minecraft/item/diamond_sword.json index f265ff03..b30b6839 100644 --- a/src/main/generated/data/minecraft/item/diamond_sword.json +++ b/src/main/generated/data/minecraft/item/diamond_sword.json @@ -7,11 +7,7 @@ "durability": 1561 }, "minecraft:enchantable": { - "enchantability": 10, - "enchantments": "minecraft:sword_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:sword_forging" + "enchantability": 10 }, "minecraft:repairable": { "items": "minecraft:repairs_diamond_tool" diff --git a/src/main/generated/data/minecraft/item/ender_eye.json b/src/main/generated/data/minecraft/item/ender_eye.json index 29a002bc..c6c8fc71 100644 --- a/src/main/generated/data/minecraft/item/ender_eye.json +++ b/src/main/generated/data/minecraft/item/ender_eye.json @@ -22,7 +22,10 @@ "action": { "type": "minecraft:play_sound", "category": "neutral", - "pitch": 1.2, + "pitch": { + "max": 0.5, + "min": 0.33 + }, "position": "this", "sound": "minecraft:entity.ender_eye.launch", "volume": 1.0 diff --git a/src/main/generated/data/minecraft/item/exposed_chiseled_copper.json b/src/main/generated/data/minecraft/item/exposed_chiseled_copper.json new file mode 100644 index 00000000..60114863 --- /dev/null +++ b/src/main/generated/data/minecraft/item/exposed_chiseled_copper.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.exposed_chiseled_copper" + }, + "components": { + "minecraft:block": { + "block": "minecraft:exposed_chiseled_copper" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/exposed_copper_bulb.json b/src/main/generated/data/minecraft/item/exposed_copper_bulb.json new file mode 100644 index 00000000..c7799385 --- /dev/null +++ b/src/main/generated/data/minecraft/item/exposed_copper_bulb.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.exposed_copper_bulb" + }, + "components": { + "minecraft:block": { + "block": "minecraft:exposed_copper_bulb" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/exposed_copper_door.json b/src/main/generated/data/minecraft/item/exposed_copper_door.json new file mode 100644 index 00000000..bf9f75a0 --- /dev/null +++ b/src/main/generated/data/minecraft/item/exposed_copper_door.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.exposed_copper_door" + }, + "components": { + "minecraft:block": { + "block": "minecraft:exposed_copper_door" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/exposed_copper_grate.json b/src/main/generated/data/minecraft/item/exposed_copper_grate.json new file mode 100644 index 00000000..c1477e39 --- /dev/null +++ b/src/main/generated/data/minecraft/item/exposed_copper_grate.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.exposed_copper_grate" + }, + "components": { + "minecraft:block": { + "block": "minecraft:exposed_copper_grate" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/exposed_copper_trapdoor.json b/src/main/generated/data/minecraft/item/exposed_copper_trapdoor.json new file mode 100644 index 00000000..abd998c2 --- /dev/null +++ b/src/main/generated/data/minecraft/item/exposed_copper_trapdoor.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.exposed_copper_trapdoor" + }, + "components": { + "minecraft:block": { + "block": "minecraft:exposed_copper_trapdoor" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/firework_rocket.json b/src/main/generated/data/minecraft/item/firework_rocket.json index bd72802d..4fb18aa0 100644 --- a/src/main/generated/data/minecraft/item/firework_rocket.json +++ b/src/main/generated/data/minecraft/item/firework_rocket.json @@ -8,8 +8,6 @@ }, "minecraft:firework": {}, "minecraft:projectile": { - "charged_speed": 1.6, - "damage": 3, "entity": { "type": "minecraft:firework_rocket" } diff --git a/src/main/generated/data/minecraft/item/flow_armor_trim_smithing_template.json b/src/main/generated/data/minecraft/item/flow_armor_trim_smithing_template.json new file mode 100644 index 00000000..bc7b0670 --- /dev/null +++ b/src/main/generated/data/minecraft/item/flow_armor_trim_smithing_template.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "item.minecraft.flow_armor_trim_smithing_template" + }, + "components": { + "minecraft:smithing_template": { + "template": "minecraft:flow_pattern" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/flow_banner_pattern.json b/src/main/generated/data/minecraft/item/flow_banner_pattern.json new file mode 100644 index 00000000..1067a601 --- /dev/null +++ b/src/main/generated/data/minecraft/item/flow_banner_pattern.json @@ -0,0 +1,17 @@ +{ + "base": { + "tooltip": [ + { + "color": "gray", + "translate": "item.minecraft.flow_banner_pattern.desc" + } + ], + "translation_key": "item.minecraft.flow_banner_pattern" + }, + "components": { + "minecraft:banner_pattern": { + "patterns": "minecraft:pattern_item/flow" + }, + "minecraft:stackable": 1 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/flow_pottery_sherd.json b/src/main/generated/data/minecraft/item/flow_pottery_sherd.json new file mode 100644 index 00000000..1425b5a2 --- /dev/null +++ b/src/main/generated/data/minecraft/item/flow_pottery_sherd.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "item.minecraft.flow_pottery_sherd" + }, + "components": { + "minecraft:decorated_pot_pattern": { + "pattern": "minecraft:flow_pottery_pattern" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/golden_axe.json b/src/main/generated/data/minecraft/item/golden_axe.json index 79b25474..438b2948 100644 --- a/src/main/generated/data/minecraft/item/golden_axe.json +++ b/src/main/generated/data/minecraft/item/golden_axe.json @@ -7,11 +7,7 @@ "durability": 32 }, "minecraft:enchantable": { - "enchantability": 22, - "enchantments": "minecraft:axe_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:axe_forging" + "enchantability": 22 }, "minecraft:repairable": { "items": "minecraft:repairs_golden_tool" diff --git a/src/main/generated/data/minecraft/item/golden_boots.json b/src/main/generated/data/minecraft/item/golden_boots.json index cd2d6268..9c9a8fcc 100644 --- a/src/main/generated/data/minecraft/item/golden_boots.json +++ b/src/main/generated/data/minecraft/item/golden_boots.json @@ -13,17 +13,13 @@ "behavior": "minecraft:equip_entity" }, "minecraft:enchantable": { - "enchantability": 25, - "enchantments": "minecraft:boots_enchanting" + "enchantability": 25 }, "minecraft:equipment": { "equip_sound": "minecraft:item.armor.equip_gold", "slot": "feet", "swappable": true }, - "minecraft:forgeable": { - "enchantments": "minecraft:boots_forging" - }, "minecraft:repairable": { "items": "minecraft:repairs_golden_armor" }, diff --git a/src/main/generated/data/minecraft/item/golden_chestplate.json b/src/main/generated/data/minecraft/item/golden_chestplate.json index 4fa93afd..b871fc75 100644 --- a/src/main/generated/data/minecraft/item/golden_chestplate.json +++ b/src/main/generated/data/minecraft/item/golden_chestplate.json @@ -13,17 +13,13 @@ "behavior": "minecraft:equip_entity" }, "minecraft:enchantable": { - "enchantability": 25, - "enchantments": "minecraft:chestplate_enchanting" + "enchantability": 25 }, "minecraft:equipment": { "equip_sound": "minecraft:item.armor.equip_gold", "slot": "chest", "swappable": true }, - "minecraft:forgeable": { - "enchantments": "minecraft:chestplate_forging" - }, "minecraft:repairable": { "items": "minecraft:repairs_golden_armor" }, diff --git a/src/main/generated/data/minecraft/item/golden_helmet.json b/src/main/generated/data/minecraft/item/golden_helmet.json index fd9aaae4..1fb485a0 100644 --- a/src/main/generated/data/minecraft/item/golden_helmet.json +++ b/src/main/generated/data/minecraft/item/golden_helmet.json @@ -13,17 +13,13 @@ "behavior": "minecraft:equip_entity" }, "minecraft:enchantable": { - "enchantability": 25, - "enchantments": "minecraft:helmet_enchanting" + "enchantability": 25 }, "minecraft:equipment": { "equip_sound": "minecraft:item.armor.equip_gold", "slot": "head", "swappable": true }, - "minecraft:forgeable": { - "enchantments": "minecraft:helmet_forging" - }, "minecraft:repairable": { "items": "minecraft:repairs_golden_armor" }, diff --git a/src/main/generated/data/minecraft/item/golden_hoe.json b/src/main/generated/data/minecraft/item/golden_hoe.json index d48a1381..e83b1fe5 100644 --- a/src/main/generated/data/minecraft/item/golden_hoe.json +++ b/src/main/generated/data/minecraft/item/golden_hoe.json @@ -7,11 +7,7 @@ "durability": 32 }, "minecraft:enchantable": { - "enchantability": 22, - "enchantments": "minecraft:hoe_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:hoe_forging" + "enchantability": 22 }, "minecraft:repairable": { "items": "minecraft:repairs_golden_tool" diff --git a/src/main/generated/data/minecraft/item/golden_leggings.json b/src/main/generated/data/minecraft/item/golden_leggings.json index 28b757d7..603ee5ae 100644 --- a/src/main/generated/data/minecraft/item/golden_leggings.json +++ b/src/main/generated/data/minecraft/item/golden_leggings.json @@ -13,17 +13,13 @@ "behavior": "minecraft:equip_entity" }, "minecraft:enchantable": { - "enchantability": 25, - "enchantments": "minecraft:leggings_enchanting" + "enchantability": 25 }, "minecraft:equipment": { "equip_sound": "minecraft:item.armor.equip_gold", "slot": "legs", "swappable": true }, - "minecraft:forgeable": { - "enchantments": "minecraft:leggings_forging" - }, "minecraft:repairable": { "items": "minecraft:repairs_golden_armor" }, diff --git a/src/main/generated/data/minecraft/item/golden_pickaxe.json b/src/main/generated/data/minecraft/item/golden_pickaxe.json index f73d07d5..fb351533 100644 --- a/src/main/generated/data/minecraft/item/golden_pickaxe.json +++ b/src/main/generated/data/minecraft/item/golden_pickaxe.json @@ -7,11 +7,7 @@ "durability": 32 }, "minecraft:enchantable": { - "enchantability": 22, - "enchantments": "minecraft:pickaxe_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:pickaxe_forging" + "enchantability": 22 }, "minecraft:repairable": { "items": "minecraft:repairs_golden_tool" diff --git a/src/main/generated/data/minecraft/item/golden_shovel.json b/src/main/generated/data/minecraft/item/golden_shovel.json index 1ae37926..924a52a1 100644 --- a/src/main/generated/data/minecraft/item/golden_shovel.json +++ b/src/main/generated/data/minecraft/item/golden_shovel.json @@ -7,11 +7,7 @@ "durability": 32 }, "minecraft:enchantable": { - "enchantability": 22, - "enchantments": "minecraft:shovel_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:shovel_forging" + "enchantability": 22 }, "minecraft:repairable": { "items": "minecraft:repairs_golden_tool" diff --git a/src/main/generated/data/minecraft/item/golden_sword.json b/src/main/generated/data/minecraft/item/golden_sword.json index 3b2cd6f9..14454b67 100644 --- a/src/main/generated/data/minecraft/item/golden_sword.json +++ b/src/main/generated/data/minecraft/item/golden_sword.json @@ -7,11 +7,7 @@ "durability": 32 }, "minecraft:enchantable": { - "enchantability": 22, - "enchantments": "minecraft:sword_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:sword_forging" + "enchantability": 22 }, "minecraft:repairable": { "items": "minecraft:repairs_golden_tool" diff --git a/src/main/generated/data/minecraft/item/guster_banner_pattern.json b/src/main/generated/data/minecraft/item/guster_banner_pattern.json new file mode 100644 index 00000000..03291cf8 --- /dev/null +++ b/src/main/generated/data/minecraft/item/guster_banner_pattern.json @@ -0,0 +1,17 @@ +{ + "base": { + "tooltip": [ + { + "color": "gray", + "translate": "item.minecraft.guster_banner_pattern.desc" + } + ], + "translation_key": "item.minecraft.guster_banner_pattern" + }, + "components": { + "minecraft:banner_pattern": { + "patterns": "minecraft:pattern_item/guster" + }, + "minecraft:stackable": 1 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/guster_pottery_sherd.json b/src/main/generated/data/minecraft/item/guster_pottery_sherd.json new file mode 100644 index 00000000..fc7da49d --- /dev/null +++ b/src/main/generated/data/minecraft/item/guster_pottery_sherd.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "item.minecraft.guster_pottery_sherd" + }, + "components": { + "minecraft:decorated_pot_pattern": { + "pattern": "minecraft:guster_pottery_pattern" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/heavy_core.json b/src/main/generated/data/minecraft/item/heavy_core.json new file mode 100644 index 00000000..26b57d83 --- /dev/null +++ b/src/main/generated/data/minecraft/item/heavy_core.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.heavy_core" + }, + "components": { + "minecraft:block": { + "block": "minecraft:heavy_core" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/honey_bottle.json b/src/main/generated/data/minecraft/item/honey_bottle.json index 8462e608..93f7a440 100644 --- a/src/main/generated/data/minecraft/item/honey_bottle.json +++ b/src/main/generated/data/minecraft/item/honey_bottle.json @@ -4,7 +4,9 @@ }, "components": { "minecraft:consumable": { - "result_item": "minecraft:glass_bottle" + "has_consume_particles": false, + "result_item": "minecraft:glass_bottle", + "sound": "minecraft:item.honey_bottle.drink" }, "minecraft:food": { "nutrition": 6, diff --git a/src/main/generated/data/minecraft/item/iron_axe.json b/src/main/generated/data/minecraft/item/iron_axe.json index d853919d..8ebfed3a 100644 --- a/src/main/generated/data/minecraft/item/iron_axe.json +++ b/src/main/generated/data/minecraft/item/iron_axe.json @@ -7,11 +7,7 @@ "durability": 250 }, "minecraft:enchantable": { - "enchantability": 14, - "enchantments": "minecraft:axe_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:axe_forging" + "enchantability": 14 }, "minecraft:repairable": { "items": "minecraft:repairs_iron_tool" diff --git a/src/main/generated/data/minecraft/item/iron_boots.json b/src/main/generated/data/minecraft/item/iron_boots.json index ce8ab44f..8270fb7c 100644 --- a/src/main/generated/data/minecraft/item/iron_boots.json +++ b/src/main/generated/data/minecraft/item/iron_boots.json @@ -13,17 +13,13 @@ "behavior": "minecraft:equip_entity" }, "minecraft:enchantable": { - "enchantability": 9, - "enchantments": "minecraft:boots_enchanting" + "enchantability": 9 }, "minecraft:equipment": { "equip_sound": "minecraft:item.armor.equip_iron", "slot": "feet", "swappable": true }, - "minecraft:forgeable": { - "enchantments": "minecraft:boots_forging" - }, "minecraft:repairable": { "items": "minecraft:repairs_iron_armor" }, diff --git a/src/main/generated/data/minecraft/item/iron_chestplate.json b/src/main/generated/data/minecraft/item/iron_chestplate.json index 6c054564..ed3e7f05 100644 --- a/src/main/generated/data/minecraft/item/iron_chestplate.json +++ b/src/main/generated/data/minecraft/item/iron_chestplate.json @@ -13,17 +13,13 @@ "behavior": "minecraft:equip_entity" }, "minecraft:enchantable": { - "enchantability": 9, - "enchantments": "minecraft:chestplate_enchanting" + "enchantability": 9 }, "minecraft:equipment": { "equip_sound": "minecraft:item.armor.equip_iron", "slot": "chest", "swappable": true }, - "minecraft:forgeable": { - "enchantments": "minecraft:chestplate_forging" - }, "minecraft:repairable": { "items": "minecraft:repairs_iron_armor" }, diff --git a/src/main/generated/data/minecraft/item/iron_helmet.json b/src/main/generated/data/minecraft/item/iron_helmet.json index 8e06a589..75ad2db9 100644 --- a/src/main/generated/data/minecraft/item/iron_helmet.json +++ b/src/main/generated/data/minecraft/item/iron_helmet.json @@ -13,17 +13,13 @@ "behavior": "minecraft:equip_entity" }, "minecraft:enchantable": { - "enchantability": 9, - "enchantments": "minecraft:helmet_enchanting" + "enchantability": 9 }, "minecraft:equipment": { "equip_sound": "minecraft:item.armor.equip_iron", "slot": "head", "swappable": true }, - "minecraft:forgeable": { - "enchantments": "minecraft:helmet_forging" - }, "minecraft:repairable": { "items": "minecraft:repairs_iron_armor" }, diff --git a/src/main/generated/data/minecraft/item/iron_hoe.json b/src/main/generated/data/minecraft/item/iron_hoe.json index bf866b57..64608658 100644 --- a/src/main/generated/data/minecraft/item/iron_hoe.json +++ b/src/main/generated/data/minecraft/item/iron_hoe.json @@ -7,11 +7,7 @@ "durability": 250 }, "minecraft:enchantable": { - "enchantability": 14, - "enchantments": "minecraft:hoe_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:hoe_forging" + "enchantability": 14 }, "minecraft:repairable": { "items": "minecraft:repairs_iron_tool" diff --git a/src/main/generated/data/minecraft/item/iron_leggings.json b/src/main/generated/data/minecraft/item/iron_leggings.json index ad34f713..c349613c 100644 --- a/src/main/generated/data/minecraft/item/iron_leggings.json +++ b/src/main/generated/data/minecraft/item/iron_leggings.json @@ -13,17 +13,13 @@ "behavior": "minecraft:equip_entity" }, "minecraft:enchantable": { - "enchantability": 9, - "enchantments": "minecraft:leggings_enchanting" + "enchantability": 9 }, "minecraft:equipment": { "equip_sound": "minecraft:item.armor.equip_iron", "slot": "legs", "swappable": true }, - "minecraft:forgeable": { - "enchantments": "minecraft:leggings_forging" - }, "minecraft:repairable": { "items": "minecraft:repairs_iron_armor" }, diff --git a/src/main/generated/data/minecraft/item/iron_pickaxe.json b/src/main/generated/data/minecraft/item/iron_pickaxe.json index 2eaba7fb..450a43c5 100644 --- a/src/main/generated/data/minecraft/item/iron_pickaxe.json +++ b/src/main/generated/data/minecraft/item/iron_pickaxe.json @@ -7,11 +7,7 @@ "durability": 250 }, "minecraft:enchantable": { - "enchantability": 14, - "enchantments": "minecraft:pickaxe_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:pickaxe_forging" + "enchantability": 14 }, "minecraft:repairable": { "items": "minecraft:repairs_iron_tool" diff --git a/src/main/generated/data/minecraft/item/iron_shovel.json b/src/main/generated/data/minecraft/item/iron_shovel.json index dc405a97..2e2c3d65 100644 --- a/src/main/generated/data/minecraft/item/iron_shovel.json +++ b/src/main/generated/data/minecraft/item/iron_shovel.json @@ -7,11 +7,7 @@ "durability": 250 }, "minecraft:enchantable": { - "enchantability": 14, - "enchantments": "minecraft:shovel_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:shovel_forging" + "enchantability": 14 }, "minecraft:repairable": { "items": "minecraft:repairs_iron_tool" diff --git a/src/main/generated/data/minecraft/item/iron_sword.json b/src/main/generated/data/minecraft/item/iron_sword.json index ee3a36e3..32582fe3 100644 --- a/src/main/generated/data/minecraft/item/iron_sword.json +++ b/src/main/generated/data/minecraft/item/iron_sword.json @@ -7,11 +7,7 @@ "durability": 250 }, "minecraft:enchantable": { - "enchantability": 14, - "enchantments": "minecraft:sword_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:sword_forging" + "enchantability": 14 }, "minecraft:repairable": { "items": "minecraft:repairs_iron_tool" diff --git a/src/main/generated/data/minecraft/item/leather_boots.json b/src/main/generated/data/minecraft/item/leather_boots.json index b78ef426..998ccb95 100644 --- a/src/main/generated/data/minecraft/item/leather_boots.json +++ b/src/main/generated/data/minecraft/item/leather_boots.json @@ -16,17 +16,13 @@ "default_color": -6265536 }, "minecraft:enchantable": { - "enchantability": 15, - "enchantments": "minecraft:boots_enchanting" + "enchantability": 15 }, "minecraft:equipment": { "equip_sound": "minecraft:item.armor.equip_leather", "slot": "feet", "swappable": true }, - "minecraft:forgeable": { - "enchantments": "minecraft:boots_forging" - }, "minecraft:repairable": { "items": "minecraft:repairs_leather_armor" }, diff --git a/src/main/generated/data/minecraft/item/leather_chestplate.json b/src/main/generated/data/minecraft/item/leather_chestplate.json index 1da0d902..30276445 100644 --- a/src/main/generated/data/minecraft/item/leather_chestplate.json +++ b/src/main/generated/data/minecraft/item/leather_chestplate.json @@ -16,17 +16,13 @@ "default_color": -6265536 }, "minecraft:enchantable": { - "enchantability": 15, - "enchantments": "minecraft:chestplate_enchanting" + "enchantability": 15 }, "minecraft:equipment": { "equip_sound": "minecraft:item.armor.equip_leather", "slot": "chest", "swappable": true }, - "minecraft:forgeable": { - "enchantments": "minecraft:chestplate_forging" - }, "minecraft:repairable": { "items": "minecraft:repairs_leather_armor" }, diff --git a/src/main/generated/data/minecraft/item/leather_helmet.json b/src/main/generated/data/minecraft/item/leather_helmet.json index 6b283e98..8c77f8b0 100644 --- a/src/main/generated/data/minecraft/item/leather_helmet.json +++ b/src/main/generated/data/minecraft/item/leather_helmet.json @@ -16,17 +16,13 @@ "default_color": -6265536 }, "minecraft:enchantable": { - "enchantability": 15, - "enchantments": "minecraft:helmet_enchanting" + "enchantability": 15 }, "minecraft:equipment": { "equip_sound": "minecraft:item.armor.equip_leather", "slot": "head", "swappable": true }, - "minecraft:forgeable": { - "enchantments": "minecraft:helmet_forging" - }, "minecraft:repairable": { "items": "minecraft:repairs_leather_armor" }, diff --git a/src/main/generated/data/minecraft/item/leather_leggings.json b/src/main/generated/data/minecraft/item/leather_leggings.json index 2fd092e9..1ae7ecdf 100644 --- a/src/main/generated/data/minecraft/item/leather_leggings.json +++ b/src/main/generated/data/minecraft/item/leather_leggings.json @@ -16,17 +16,13 @@ "default_color": -6265536 }, "minecraft:enchantable": { - "enchantability": 15, - "enchantments": "minecraft:leggings_enchanting" + "enchantability": 15 }, "minecraft:equipment": { "equip_sound": "minecraft:item.armor.equip_leather", "slot": "legs", "swappable": true }, - "minecraft:forgeable": { - "enchantments": "minecraft:leggings_forging" - }, "minecraft:repairable": { "items": "minecraft:repairs_leather_armor" }, diff --git a/src/main/generated/data/minecraft/item/mace.json b/src/main/generated/data/minecraft/item/mace.json new file mode 100644 index 00000000..a4253174 --- /dev/null +++ b/src/main/generated/data/minecraft/item/mace.json @@ -0,0 +1,29 @@ +{ + "base": { + "translation_key": "item.minecraft.mace" + }, + "components": { + "minecraft:damageable": { + "durability": 500 + }, + "minecraft:enchantable": { + "enchantability": 15 + }, + "minecraft:repairable": { + "items": "minecraft:repairs_mace" + }, + "minecraft:stackable": 1, + "minecraft:tool": { + "damage_per_block": 2, + "rules": [] + }, + "minecraft:weapon": { + "attack_damage": { + "default_damage": 6.0, + "rules": [] + }, + "attack_speed": 0.125, + "may_smash": true + } + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/milk_bucket.json b/src/main/generated/data/minecraft/item/milk_bucket.json index 60520504..8c3a57f9 100644 --- a/src/main/generated/data/minecraft/item/milk_bucket.json +++ b/src/main/generated/data/minecraft/item/milk_bucket.json @@ -4,7 +4,9 @@ }, "components": { "minecraft:consumable": { - "result_item": "minecraft:bucket" + "has_consume_particles": false, + "result_item": "minecraft:bucket", + "sound": "minecraft:entity.generic.drink" }, "minecraft:recipe_remainder": { "item": "minecraft:bucket" diff --git a/src/main/generated/data/minecraft/item/music_disc_creator.json b/src/main/generated/data/minecraft/item/music_disc_creator.json new file mode 100644 index 00000000..b3fee811 --- /dev/null +++ b/src/main/generated/data/minecraft/item/music_disc_creator.json @@ -0,0 +1,15 @@ +{ + "base": { + "rarity": "epic", + "translation_key": "item.minecraft.music_disc_creator" + }, + "components": { + "minecraft:record": { + "description_key": "item.minecraft.music_disc_creator.desc", + "duration": 3520, + "output_signal": 12, + "sound_event": "minecraft:music_disc.creator" + }, + "minecraft:stackable": 1 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/music_disc_creator_music_box.json b/src/main/generated/data/minecraft/item/music_disc_creator_music_box.json new file mode 100644 index 00000000..4e1a3d95 --- /dev/null +++ b/src/main/generated/data/minecraft/item/music_disc_creator_music_box.json @@ -0,0 +1,15 @@ +{ + "base": { + "rarity": "epic", + "translation_key": "item.minecraft.music_disc_creator_music_box" + }, + "components": { + "minecraft:record": { + "description_key": "item.minecraft.music_disc_creator_music_box.desc", + "duration": 1460, + "output_signal": 11, + "sound_event": "minecraft:music_disc.creator_music_box" + }, + "minecraft:stackable": 1 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/music_disc_precipice.json b/src/main/generated/data/minecraft/item/music_disc_precipice.json new file mode 100644 index 00000000..40b2bfd1 --- /dev/null +++ b/src/main/generated/data/minecraft/item/music_disc_precipice.json @@ -0,0 +1,15 @@ +{ + "base": { + "rarity": "epic", + "translation_key": "item.minecraft.music_disc_precipice" + }, + "components": { + "minecraft:record": { + "description_key": "item.minecraft.music_disc_precipice.desc", + "duration": 5980, + "output_signal": 13, + "sound_event": "minecraft:music_disc.precipice" + }, + "minecraft:stackable": 1 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/netherite_axe.json b/src/main/generated/data/minecraft/item/netherite_axe.json index 6a754a8f..7f8dfe00 100644 --- a/src/main/generated/data/minecraft/item/netherite_axe.json +++ b/src/main/generated/data/minecraft/item/netherite_axe.json @@ -7,11 +7,7 @@ "durability": 2031 }, "minecraft:enchantable": { - "enchantability": 15, - "enchantments": "minecraft:axe_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:axe_forging" + "enchantability": 15 }, "minecraft:immune_to_damage": { "damage": "minecraft:is_fire" diff --git a/src/main/generated/data/minecraft/item/netherite_boots.json b/src/main/generated/data/minecraft/item/netherite_boots.json index 9dac1f99..b337f128 100644 --- a/src/main/generated/data/minecraft/item/netherite_boots.json +++ b/src/main/generated/data/minecraft/item/netherite_boots.json @@ -13,17 +13,13 @@ "behavior": "minecraft:equip_entity" }, "minecraft:enchantable": { - "enchantability": 15, - "enchantments": "minecraft:boots_enchanting" + "enchantability": 15 }, "minecraft:equipment": { "equip_sound": "minecraft:item.armor.equip_netherite", "slot": "feet", "swappable": true }, - "minecraft:forgeable": { - "enchantments": "minecraft:boots_forging" - }, "minecraft:immune_to_damage": { "damage": "minecraft:is_fire" }, diff --git a/src/main/generated/data/minecraft/item/netherite_chestplate.json b/src/main/generated/data/minecraft/item/netherite_chestplate.json index 546df0f4..8b1cf3e7 100644 --- a/src/main/generated/data/minecraft/item/netherite_chestplate.json +++ b/src/main/generated/data/minecraft/item/netherite_chestplate.json @@ -13,17 +13,13 @@ "behavior": "minecraft:equip_entity" }, "minecraft:enchantable": { - "enchantability": 15, - "enchantments": "minecraft:chestplate_enchanting" + "enchantability": 15 }, "minecraft:equipment": { "equip_sound": "minecraft:item.armor.equip_netherite", "slot": "chest", "swappable": true }, - "minecraft:forgeable": { - "enchantments": "minecraft:chestplate_forging" - }, "minecraft:immune_to_damage": { "damage": "minecraft:is_fire" }, diff --git a/src/main/generated/data/minecraft/item/netherite_helmet.json b/src/main/generated/data/minecraft/item/netherite_helmet.json index bfb0e8bc..4bc0f6a8 100644 --- a/src/main/generated/data/minecraft/item/netherite_helmet.json +++ b/src/main/generated/data/minecraft/item/netherite_helmet.json @@ -13,17 +13,13 @@ "behavior": "minecraft:equip_entity" }, "minecraft:enchantable": { - "enchantability": 15, - "enchantments": "minecraft:helmet_enchanting" + "enchantability": 15 }, "minecraft:equipment": { "equip_sound": "minecraft:item.armor.equip_netherite", "slot": "head", "swappable": true }, - "minecraft:forgeable": { - "enchantments": "minecraft:helmet_forging" - }, "minecraft:immune_to_damage": { "damage": "minecraft:is_fire" }, diff --git a/src/main/generated/data/minecraft/item/netherite_hoe.json b/src/main/generated/data/minecraft/item/netherite_hoe.json index ca529f97..94961596 100644 --- a/src/main/generated/data/minecraft/item/netherite_hoe.json +++ b/src/main/generated/data/minecraft/item/netherite_hoe.json @@ -7,11 +7,7 @@ "durability": 2031 }, "minecraft:enchantable": { - "enchantability": 15, - "enchantments": "minecraft:hoe_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:hoe_forging" + "enchantability": 15 }, "minecraft:immune_to_damage": { "damage": "minecraft:is_fire" diff --git a/src/main/generated/data/minecraft/item/netherite_leggings.json b/src/main/generated/data/minecraft/item/netherite_leggings.json index 027ae4c4..c1ec96d7 100644 --- a/src/main/generated/data/minecraft/item/netherite_leggings.json +++ b/src/main/generated/data/minecraft/item/netherite_leggings.json @@ -13,17 +13,13 @@ "behavior": "minecraft:equip_entity" }, "minecraft:enchantable": { - "enchantability": 15, - "enchantments": "minecraft:leggings_enchanting" + "enchantability": 15 }, "minecraft:equipment": { "equip_sound": "minecraft:item.armor.equip_netherite", "slot": "legs", "swappable": true }, - "minecraft:forgeable": { - "enchantments": "minecraft:leggings_forging" - }, "minecraft:immune_to_damage": { "damage": "minecraft:is_fire" }, diff --git a/src/main/generated/data/minecraft/item/netherite_pickaxe.json b/src/main/generated/data/minecraft/item/netherite_pickaxe.json index e8133375..66393a94 100644 --- a/src/main/generated/data/minecraft/item/netherite_pickaxe.json +++ b/src/main/generated/data/minecraft/item/netherite_pickaxe.json @@ -7,11 +7,7 @@ "durability": 2031 }, "minecraft:enchantable": { - "enchantability": 15, - "enchantments": "minecraft:pickaxe_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:pickaxe_forging" + "enchantability": 15 }, "minecraft:immune_to_damage": { "damage": "minecraft:is_fire" diff --git a/src/main/generated/data/minecraft/item/netherite_shovel.json b/src/main/generated/data/minecraft/item/netherite_shovel.json index c3b43310..78e1bf06 100644 --- a/src/main/generated/data/minecraft/item/netherite_shovel.json +++ b/src/main/generated/data/minecraft/item/netherite_shovel.json @@ -7,11 +7,7 @@ "durability": 2031 }, "minecraft:enchantable": { - "enchantability": 15, - "enchantments": "minecraft:shovel_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:shovel_forging" + "enchantability": 15 }, "minecraft:immune_to_damage": { "damage": "minecraft:is_fire" diff --git a/src/main/generated/data/minecraft/item/netherite_sword.json b/src/main/generated/data/minecraft/item/netherite_sword.json index 2c7528b7..8e1c5a6f 100644 --- a/src/main/generated/data/minecraft/item/netherite_sword.json +++ b/src/main/generated/data/minecraft/item/netherite_sword.json @@ -7,11 +7,7 @@ "durability": 2031 }, "minecraft:enchantable": { - "enchantability": 15, - "enchantments": "minecraft:sword_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:sword_forging" + "enchantability": 15 }, "minecraft:immune_to_damage": { "damage": "minecraft:is_fire" diff --git a/src/main/generated/data/minecraft/item/ominous_bottle.json b/src/main/generated/data/minecraft/item/ominous_bottle.json new file mode 100644 index 00000000..1ef5c453 --- /dev/null +++ b/src/main/generated/data/minecraft/item/ominous_bottle.json @@ -0,0 +1,32 @@ +{ + "base": { + "rarity": "uncommon", + "translation_key": "item.minecraft.ominous_bottle" + }, + "components": { + "minecraft:consumable": { + "has_consume_particles": false, + "sound": "minecraft:entity.generic.drink" + }, + "minecraft:ominous_effect_provider": {}, + "minecraft:stackable": 64, + "minecraft:useable": { + "animation": "drink", + "ticks": { + "type": "minecraft:constant", + "amount": 32 + } + } + }, + "events": { + "minecraft:consume_item": { + "action": { + "type": "minecraft:play_sound", + "pitch": 1.0, + "position": "this", + "sound": "minecraft:item.ominous_bottle.dispose", + "volume": 1.0 + } + } + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/ominous_trial_key.json b/src/main/generated/data/minecraft/item/ominous_trial_key.json new file mode 100644 index 00000000..4cd52f5f --- /dev/null +++ b/src/main/generated/data/minecraft/item/ominous_trial_key.json @@ -0,0 +1,8 @@ +{ + "base": { + "translation_key": "item.minecraft.ominous_trial_key" + }, + "components": { + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/oxidized_chiseled_copper.json b/src/main/generated/data/minecraft/item/oxidized_chiseled_copper.json new file mode 100644 index 00000000..0feff433 --- /dev/null +++ b/src/main/generated/data/minecraft/item/oxidized_chiseled_copper.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.oxidized_chiseled_copper" + }, + "components": { + "minecraft:block": { + "block": "minecraft:oxidized_chiseled_copper" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/oxidized_copper_bulb.json b/src/main/generated/data/minecraft/item/oxidized_copper_bulb.json new file mode 100644 index 00000000..97bd3d2f --- /dev/null +++ b/src/main/generated/data/minecraft/item/oxidized_copper_bulb.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.oxidized_copper_bulb" + }, + "components": { + "minecraft:block": { + "block": "minecraft:oxidized_copper_bulb" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/oxidized_copper_door.json b/src/main/generated/data/minecraft/item/oxidized_copper_door.json new file mode 100644 index 00000000..ab04ba7b --- /dev/null +++ b/src/main/generated/data/minecraft/item/oxidized_copper_door.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.oxidized_copper_door" + }, + "components": { + "minecraft:block": { + "block": "minecraft:oxidized_copper_door" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/oxidized_copper_grate.json b/src/main/generated/data/minecraft/item/oxidized_copper_grate.json new file mode 100644 index 00000000..d37bea17 --- /dev/null +++ b/src/main/generated/data/minecraft/item/oxidized_copper_grate.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.oxidized_copper_grate" + }, + "components": { + "minecraft:block": { + "block": "minecraft:oxidized_copper_grate" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/oxidized_copper_trapdoor.json b/src/main/generated/data/minecraft/item/oxidized_copper_trapdoor.json new file mode 100644 index 00000000..a9660cf0 --- /dev/null +++ b/src/main/generated/data/minecraft/item/oxidized_copper_trapdoor.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.oxidized_copper_trapdoor" + }, + "components": { + "minecraft:block": { + "block": "minecraft:oxidized_copper_trapdoor" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/polished_tuff.json b/src/main/generated/data/minecraft/item/polished_tuff.json new file mode 100644 index 00000000..738082ed --- /dev/null +++ b/src/main/generated/data/minecraft/item/polished_tuff.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.polished_tuff" + }, + "components": { + "minecraft:block": { + "block": "minecraft:polished_tuff" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/polished_tuff_slab.json b/src/main/generated/data/minecraft/item/polished_tuff_slab.json new file mode 100644 index 00000000..91997932 --- /dev/null +++ b/src/main/generated/data/minecraft/item/polished_tuff_slab.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.polished_tuff_slab" + }, + "components": { + "minecraft:block": { + "block": "minecraft:polished_tuff_slab" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/polished_tuff_stairs.json b/src/main/generated/data/minecraft/item/polished_tuff_stairs.json new file mode 100644 index 00000000..d1a72d9d --- /dev/null +++ b/src/main/generated/data/minecraft/item/polished_tuff_stairs.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.polished_tuff_stairs" + }, + "components": { + "minecraft:block": { + "block": "minecraft:polished_tuff_stairs" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/polished_tuff_wall.json b/src/main/generated/data/minecraft/item/polished_tuff_wall.json new file mode 100644 index 00000000..11d3873e --- /dev/null +++ b/src/main/generated/data/minecraft/item/polished_tuff_wall.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.polished_tuff_wall" + }, + "components": { + "minecraft:block": { + "block": "minecraft:polished_tuff_wall" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/potion.json b/src/main/generated/data/minecraft/item/potion.json index 44c3f056..00b2ee63 100644 --- a/src/main/generated/data/minecraft/item/potion.json +++ b/src/main/generated/data/minecraft/item/potion.json @@ -4,7 +4,9 @@ }, "components": { "minecraft:consumable": { - "result_item": "minecraft:glass_bottle" + "has_consume_particles": false, + "result_item": "minecraft:glass_bottle", + "sound": "minecraft:entity.generic.drink" }, "minecraft:dispensable": { "behavior": "minecraft:use_item_on_block_or_dispense_item" diff --git a/src/main/generated/data/minecraft/item/scrape_pottery_sherd.json b/src/main/generated/data/minecraft/item/scrape_pottery_sherd.json new file mode 100644 index 00000000..ecf86251 --- /dev/null +++ b/src/main/generated/data/minecraft/item/scrape_pottery_sherd.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "item.minecraft.scrape_pottery_sherd" + }, + "components": { + "minecraft:decorated_pot_pattern": { + "pattern": "minecraft:scrape_pottery_pattern" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/spectral_arrow.json b/src/main/generated/data/minecraft/item/spectral_arrow.json index 51c3f5b3..4c6bd815 100644 --- a/src/main/generated/data/minecraft/item/spectral_arrow.json +++ b/src/main/generated/data/minecraft/item/spectral_arrow.json @@ -7,7 +7,6 @@ "behavior": "minecraft:shoot_projectile" }, "minecraft:projectile": { - "damage": 1, "entity": { "type": "minecraft:spectral_arrow" } diff --git a/src/main/generated/data/minecraft/item/stone_axe.json b/src/main/generated/data/minecraft/item/stone_axe.json index a3060ec9..7527df6a 100644 --- a/src/main/generated/data/minecraft/item/stone_axe.json +++ b/src/main/generated/data/minecraft/item/stone_axe.json @@ -7,11 +7,7 @@ "durability": 131 }, "minecraft:enchantable": { - "enchantability": 5, - "enchantments": "minecraft:axe_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:axe_forging" + "enchantability": 5 }, "minecraft:repairable": { "items": "minecraft:repairs_stone_tool" diff --git a/src/main/generated/data/minecraft/item/stone_hoe.json b/src/main/generated/data/minecraft/item/stone_hoe.json index 9566409a..8156335d 100644 --- a/src/main/generated/data/minecraft/item/stone_hoe.json +++ b/src/main/generated/data/minecraft/item/stone_hoe.json @@ -7,11 +7,7 @@ "durability": 131 }, "minecraft:enchantable": { - "enchantability": 5, - "enchantments": "minecraft:hoe_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:hoe_forging" + "enchantability": 5 }, "minecraft:repairable": { "items": "minecraft:repairs_stone_tool" diff --git a/src/main/generated/data/minecraft/item/stone_pickaxe.json b/src/main/generated/data/minecraft/item/stone_pickaxe.json index 7b239e5a..5aeea2f2 100644 --- a/src/main/generated/data/minecraft/item/stone_pickaxe.json +++ b/src/main/generated/data/minecraft/item/stone_pickaxe.json @@ -7,11 +7,7 @@ "durability": 131 }, "minecraft:enchantable": { - "enchantability": 5, - "enchantments": "minecraft:pickaxe_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:pickaxe_forging" + "enchantability": 5 }, "minecraft:repairable": { "items": "minecraft:repairs_stone_tool" diff --git a/src/main/generated/data/minecraft/item/stone_shovel.json b/src/main/generated/data/minecraft/item/stone_shovel.json index cfa3f618..018267bf 100644 --- a/src/main/generated/data/minecraft/item/stone_shovel.json +++ b/src/main/generated/data/minecraft/item/stone_shovel.json @@ -7,11 +7,7 @@ "durability": 131 }, "minecraft:enchantable": { - "enchantability": 5, - "enchantments": "minecraft:shovel_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:shovel_forging" + "enchantability": 5 }, "minecraft:repairable": { "items": "minecraft:repairs_stone_tool" diff --git a/src/main/generated/data/minecraft/item/stone_sword.json b/src/main/generated/data/minecraft/item/stone_sword.json index 4314e111..ae1e02f3 100644 --- a/src/main/generated/data/minecraft/item/stone_sword.json +++ b/src/main/generated/data/minecraft/item/stone_sword.json @@ -7,11 +7,7 @@ "durability": 131 }, "minecraft:enchantable": { - "enchantability": 5, - "enchantments": "minecraft:sword_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:sword_forging" + "enchantability": 5 }, "minecraft:repairable": { "items": "minecraft:repairs_stone_tool" diff --git a/src/main/generated/data/minecraft/item/tipped_arrow.json b/src/main/generated/data/minecraft/item/tipped_arrow.json index 019ea66b..3794b4d9 100644 --- a/src/main/generated/data/minecraft/item/tipped_arrow.json +++ b/src/main/generated/data/minecraft/item/tipped_arrow.json @@ -10,7 +10,6 @@ "duration_multiplier": 0.125 }, "minecraft:projectile": { - "damage": 1, "entity": { "type": "minecraft:arrow" } diff --git a/src/main/generated/data/minecraft/item/trial_key.json b/src/main/generated/data/minecraft/item/trial_key.json new file mode 100644 index 00000000..c20cbd5a --- /dev/null +++ b/src/main/generated/data/minecraft/item/trial_key.json @@ -0,0 +1,8 @@ +{ + "base": { + "translation_key": "item.minecraft.trial_key" + }, + "components": { + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/trial_spawner.json b/src/main/generated/data/minecraft/item/trial_spawner.json new file mode 100644 index 00000000..8327a51b --- /dev/null +++ b/src/main/generated/data/minecraft/item/trial_spawner.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.trial_spawner" + }, + "components": { + "minecraft:block": { + "block": "minecraft:trial_spawner" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/trident.json b/src/main/generated/data/minecraft/item/trident.json index 070c373e..ab9febd1 100644 --- a/src/main/generated/data/minecraft/item/trident.json +++ b/src/main/generated/data/minecraft/item/trident.json @@ -8,14 +8,9 @@ "preserve_item": true }, "minecraft:enchantable": { - "enchantability": 1, - "enchantments": "minecraft:trident_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:trident_forging" + "enchantability": 1 }, "minecraft:projectile": { - "damage": 1, "entity": { "type": "minecraft:trident", "prevent_spawn_from_riptide": true @@ -86,7 +81,7 @@ "predicates": { "minecraft:enchantments": [ { - "enchantment": "minecraft:riptide" + "enchantments": "minecraft:riptide" } ] } diff --git a/src/main/generated/data/minecraft/item/tuff_brick_slab.json b/src/main/generated/data/minecraft/item/tuff_brick_slab.json new file mode 100644 index 00000000..c4e8f26a --- /dev/null +++ b/src/main/generated/data/minecraft/item/tuff_brick_slab.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.tuff_brick_slab" + }, + "components": { + "minecraft:block": { + "block": "minecraft:tuff_brick_slab" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/tuff_brick_stairs.json b/src/main/generated/data/minecraft/item/tuff_brick_stairs.json new file mode 100644 index 00000000..13845d08 --- /dev/null +++ b/src/main/generated/data/minecraft/item/tuff_brick_stairs.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.tuff_brick_stairs" + }, + "components": { + "minecraft:block": { + "block": "minecraft:tuff_brick_stairs" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/tuff_brick_wall.json b/src/main/generated/data/minecraft/item/tuff_brick_wall.json new file mode 100644 index 00000000..3572afe7 --- /dev/null +++ b/src/main/generated/data/minecraft/item/tuff_brick_wall.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.tuff_brick_wall" + }, + "components": { + "minecraft:block": { + "block": "minecraft:tuff_brick_wall" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/tuff_bricks.json b/src/main/generated/data/minecraft/item/tuff_bricks.json new file mode 100644 index 00000000..2725a959 --- /dev/null +++ b/src/main/generated/data/minecraft/item/tuff_bricks.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.tuff_bricks" + }, + "components": { + "minecraft:block": { + "block": "minecraft:tuff_bricks" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/tuff_slab.json b/src/main/generated/data/minecraft/item/tuff_slab.json new file mode 100644 index 00000000..8d2569dd --- /dev/null +++ b/src/main/generated/data/minecraft/item/tuff_slab.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.tuff_slab" + }, + "components": { + "minecraft:block": { + "block": "minecraft:tuff_slab" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/tuff_stairs.json b/src/main/generated/data/minecraft/item/tuff_stairs.json new file mode 100644 index 00000000..de2990c3 --- /dev/null +++ b/src/main/generated/data/minecraft/item/tuff_stairs.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.tuff_stairs" + }, + "components": { + "minecraft:block": { + "block": "minecraft:tuff_stairs" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/tuff_wall.json b/src/main/generated/data/minecraft/item/tuff_wall.json new file mode 100644 index 00000000..6708577b --- /dev/null +++ b/src/main/generated/data/minecraft/item/tuff_wall.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.tuff_wall" + }, + "components": { + "minecraft:block": { + "block": "minecraft:tuff_wall" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/turtle_helmet.json b/src/main/generated/data/minecraft/item/turtle_helmet.json index 4ce7f40f..a20c6f3d 100644 --- a/src/main/generated/data/minecraft/item/turtle_helmet.json +++ b/src/main/generated/data/minecraft/item/turtle_helmet.json @@ -13,17 +13,13 @@ "behavior": "minecraft:equip_entity" }, "minecraft:enchantable": { - "enchantability": 9, - "enchantments": "minecraft:helmet_enchanting" + "enchantability": 9 }, "minecraft:equipment": { "equip_sound": "minecraft:item.armor.equip_turtle", "slot": "head", "swappable": true }, - "minecraft:forgeable": { - "enchantments": "minecraft:helmet_forging" - }, "minecraft:repairable": { "items": "minecraft:repairs_turtle_armor" }, diff --git a/src/main/generated/data/minecraft/item/vault.json b/src/main/generated/data/minecraft/item/vault.json new file mode 100644 index 00000000..c8b995d8 --- /dev/null +++ b/src/main/generated/data/minecraft/item/vault.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.vault" + }, + "components": { + "minecraft:block": { + "block": "minecraft:vault" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/warped_fungus_on_a_stick.json b/src/main/generated/data/minecraft/item/warped_fungus_on_a_stick.json index 70e7ecc5..f884ebf5 100644 --- a/src/main/generated/data/minecraft/item/warped_fungus_on_a_stick.json +++ b/src/main/generated/data/minecraft/item/warped_fungus_on_a_stick.json @@ -6,9 +6,6 @@ "minecraft:damageable": { "durability": 100 }, - "minecraft:forgeable": { - "enchantments": "minecraft:steering_forging" - }, "minecraft:stackable": 1, "minecraft:steering": { "target": "minecraft:strider" diff --git a/src/main/generated/data/minecraft/item/waxed_chiseled_copper.json b/src/main/generated/data/minecraft/item/waxed_chiseled_copper.json new file mode 100644 index 00000000..a7ed7216 --- /dev/null +++ b/src/main/generated/data/minecraft/item/waxed_chiseled_copper.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.waxed_chiseled_copper" + }, + "components": { + "minecraft:block": { + "block": "minecraft:waxed_chiseled_copper" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/waxed_copper_bulb.json b/src/main/generated/data/minecraft/item/waxed_copper_bulb.json new file mode 100644 index 00000000..35c9b735 --- /dev/null +++ b/src/main/generated/data/minecraft/item/waxed_copper_bulb.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.waxed_copper_bulb" + }, + "components": { + "minecraft:block": { + "block": "minecraft:waxed_copper_bulb" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/waxed_copper_door.json b/src/main/generated/data/minecraft/item/waxed_copper_door.json new file mode 100644 index 00000000..2d26ea96 --- /dev/null +++ b/src/main/generated/data/minecraft/item/waxed_copper_door.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.waxed_copper_door" + }, + "components": { + "minecraft:block": { + "block": "minecraft:waxed_copper_door" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/waxed_copper_grate.json b/src/main/generated/data/minecraft/item/waxed_copper_grate.json new file mode 100644 index 00000000..71172cf4 --- /dev/null +++ b/src/main/generated/data/minecraft/item/waxed_copper_grate.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.waxed_copper_grate" + }, + "components": { + "minecraft:block": { + "block": "minecraft:waxed_copper_grate" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/waxed_copper_trapdoor.json b/src/main/generated/data/minecraft/item/waxed_copper_trapdoor.json new file mode 100644 index 00000000..3c0b6550 --- /dev/null +++ b/src/main/generated/data/minecraft/item/waxed_copper_trapdoor.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.waxed_copper_trapdoor" + }, + "components": { + "minecraft:block": { + "block": "minecraft:waxed_copper_trapdoor" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/waxed_exposed_chiseled_copper.json b/src/main/generated/data/minecraft/item/waxed_exposed_chiseled_copper.json new file mode 100644 index 00000000..8c2cd503 --- /dev/null +++ b/src/main/generated/data/minecraft/item/waxed_exposed_chiseled_copper.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.waxed_exposed_chiseled_copper" + }, + "components": { + "minecraft:block": { + "block": "minecraft:waxed_exposed_chiseled_copper" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/waxed_exposed_copper_bulb.json b/src/main/generated/data/minecraft/item/waxed_exposed_copper_bulb.json new file mode 100644 index 00000000..f840e10f --- /dev/null +++ b/src/main/generated/data/minecraft/item/waxed_exposed_copper_bulb.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.waxed_exposed_copper_bulb" + }, + "components": { + "minecraft:block": { + "block": "minecraft:waxed_exposed_copper_bulb" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/waxed_exposed_copper_door.json b/src/main/generated/data/minecraft/item/waxed_exposed_copper_door.json new file mode 100644 index 00000000..9a824f49 --- /dev/null +++ b/src/main/generated/data/minecraft/item/waxed_exposed_copper_door.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.waxed_exposed_copper_door" + }, + "components": { + "minecraft:block": { + "block": "minecraft:waxed_exposed_copper_door" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/waxed_exposed_copper_grate.json b/src/main/generated/data/minecraft/item/waxed_exposed_copper_grate.json new file mode 100644 index 00000000..322e3bab --- /dev/null +++ b/src/main/generated/data/minecraft/item/waxed_exposed_copper_grate.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.waxed_exposed_copper_grate" + }, + "components": { + "minecraft:block": { + "block": "minecraft:waxed_exposed_copper_grate" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/waxed_exposed_copper_trapdoor.json b/src/main/generated/data/minecraft/item/waxed_exposed_copper_trapdoor.json new file mode 100644 index 00000000..997d021b --- /dev/null +++ b/src/main/generated/data/minecraft/item/waxed_exposed_copper_trapdoor.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.waxed_exposed_copper_trapdoor" + }, + "components": { + "minecraft:block": { + "block": "minecraft:waxed_exposed_copper_trapdoor" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/waxed_oxidized_chiseled_copper.json b/src/main/generated/data/minecraft/item/waxed_oxidized_chiseled_copper.json new file mode 100644 index 00000000..b34a237c --- /dev/null +++ b/src/main/generated/data/minecraft/item/waxed_oxidized_chiseled_copper.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.waxed_oxidized_chiseled_copper" + }, + "components": { + "minecraft:block": { + "block": "minecraft:waxed_oxidized_chiseled_copper" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/waxed_oxidized_copper_bulb.json b/src/main/generated/data/minecraft/item/waxed_oxidized_copper_bulb.json new file mode 100644 index 00000000..35c52d0e --- /dev/null +++ b/src/main/generated/data/minecraft/item/waxed_oxidized_copper_bulb.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.waxed_oxidized_copper_bulb" + }, + "components": { + "minecraft:block": { + "block": "minecraft:waxed_oxidized_copper_bulb" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/waxed_oxidized_copper_door.json b/src/main/generated/data/minecraft/item/waxed_oxidized_copper_door.json new file mode 100644 index 00000000..b05efe43 --- /dev/null +++ b/src/main/generated/data/minecraft/item/waxed_oxidized_copper_door.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.waxed_oxidized_copper_door" + }, + "components": { + "minecraft:block": { + "block": "minecraft:waxed_oxidized_copper_door" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/waxed_oxidized_copper_grate.json b/src/main/generated/data/minecraft/item/waxed_oxidized_copper_grate.json new file mode 100644 index 00000000..5a55e81e --- /dev/null +++ b/src/main/generated/data/minecraft/item/waxed_oxidized_copper_grate.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.waxed_oxidized_copper_grate" + }, + "components": { + "minecraft:block": { + "block": "minecraft:waxed_oxidized_copper_grate" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/waxed_oxidized_copper_trapdoor.json b/src/main/generated/data/minecraft/item/waxed_oxidized_copper_trapdoor.json new file mode 100644 index 00000000..b0937399 --- /dev/null +++ b/src/main/generated/data/minecraft/item/waxed_oxidized_copper_trapdoor.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.waxed_oxidized_copper_trapdoor" + }, + "components": { + "minecraft:block": { + "block": "minecraft:waxed_oxidized_copper_trapdoor" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/waxed_weathered_chiseled_copper.json b/src/main/generated/data/minecraft/item/waxed_weathered_chiseled_copper.json new file mode 100644 index 00000000..28e1020a --- /dev/null +++ b/src/main/generated/data/minecraft/item/waxed_weathered_chiseled_copper.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.waxed_weathered_chiseled_copper" + }, + "components": { + "minecraft:block": { + "block": "minecraft:waxed_weathered_chiseled_copper" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/waxed_weathered_copper_bulb.json b/src/main/generated/data/minecraft/item/waxed_weathered_copper_bulb.json new file mode 100644 index 00000000..0ae8b78b --- /dev/null +++ b/src/main/generated/data/minecraft/item/waxed_weathered_copper_bulb.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.waxed_weathered_copper_bulb" + }, + "components": { + "minecraft:block": { + "block": "minecraft:waxed_weathered_copper_bulb" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/waxed_weathered_copper_door.json b/src/main/generated/data/minecraft/item/waxed_weathered_copper_door.json new file mode 100644 index 00000000..41fad5d8 --- /dev/null +++ b/src/main/generated/data/minecraft/item/waxed_weathered_copper_door.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.waxed_weathered_copper_door" + }, + "components": { + "minecraft:block": { + "block": "minecraft:waxed_weathered_copper_door" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/waxed_weathered_copper_grate.json b/src/main/generated/data/minecraft/item/waxed_weathered_copper_grate.json new file mode 100644 index 00000000..b45383c8 --- /dev/null +++ b/src/main/generated/data/minecraft/item/waxed_weathered_copper_grate.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.waxed_weathered_copper_grate" + }, + "components": { + "minecraft:block": { + "block": "minecraft:waxed_weathered_copper_grate" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/waxed_weathered_copper_trapdoor.json b/src/main/generated/data/minecraft/item/waxed_weathered_copper_trapdoor.json new file mode 100644 index 00000000..85c5baf4 --- /dev/null +++ b/src/main/generated/data/minecraft/item/waxed_weathered_copper_trapdoor.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.waxed_weathered_copper_trapdoor" + }, + "components": { + "minecraft:block": { + "block": "minecraft:waxed_weathered_copper_trapdoor" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/weathered_chiseled_copper.json b/src/main/generated/data/minecraft/item/weathered_chiseled_copper.json new file mode 100644 index 00000000..48ac4b87 --- /dev/null +++ b/src/main/generated/data/minecraft/item/weathered_chiseled_copper.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.weathered_chiseled_copper" + }, + "components": { + "minecraft:block": { + "block": "minecraft:weathered_chiseled_copper" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/weathered_copper_bulb.json b/src/main/generated/data/minecraft/item/weathered_copper_bulb.json new file mode 100644 index 00000000..94d3fe30 --- /dev/null +++ b/src/main/generated/data/minecraft/item/weathered_copper_bulb.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.weathered_copper_bulb" + }, + "components": { + "minecraft:block": { + "block": "minecraft:weathered_copper_bulb" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/weathered_copper_door.json b/src/main/generated/data/minecraft/item/weathered_copper_door.json new file mode 100644 index 00000000..d46b3c53 --- /dev/null +++ b/src/main/generated/data/minecraft/item/weathered_copper_door.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.weathered_copper_door" + }, + "components": { + "minecraft:block": { + "block": "minecraft:weathered_copper_door" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/weathered_copper_grate.json b/src/main/generated/data/minecraft/item/weathered_copper_grate.json new file mode 100644 index 00000000..e1c0a7d9 --- /dev/null +++ b/src/main/generated/data/minecraft/item/weathered_copper_grate.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.weathered_copper_grate" + }, + "components": { + "minecraft:block": { + "block": "minecraft:weathered_copper_grate" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/weathered_copper_trapdoor.json b/src/main/generated/data/minecraft/item/weathered_copper_trapdoor.json new file mode 100644 index 00000000..583731cb --- /dev/null +++ b/src/main/generated/data/minecraft/item/weathered_copper_trapdoor.json @@ -0,0 +1,11 @@ +{ + "base": { + "translation_key": "block.minecraft.weathered_copper_trapdoor" + }, + "components": { + "minecraft:block": { + "block": "minecraft:weathered_copper_trapdoor" + }, + "minecraft:stackable": 64 + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/wind_charge.json b/src/main/generated/data/minecraft/item/wind_charge.json new file mode 100644 index 00000000..6cf6717b --- /dev/null +++ b/src/main/generated/data/minecraft/item/wind_charge.json @@ -0,0 +1,23 @@ +{ + "base": { + "translation_key": "item.minecraft.wind_charge" + }, + "components": { + "minecraft:cooldown": { + "ticks": 10 + }, + "minecraft:dispensable": { + "behavior": "minecraft:shoot_projectile" + }, + "minecraft:projectile": { + "entity": { + "type": "minecraft:wind_charge" + } + }, + "minecraft:stackable": 64, + "minecraft:throwable": { + "angle_offset": 0.0, + "speed": 1.5 + } + } +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/wooden_axe.json b/src/main/generated/data/minecraft/item/wooden_axe.json index f5f8763d..1a76bbf8 100644 --- a/src/main/generated/data/minecraft/item/wooden_axe.json +++ b/src/main/generated/data/minecraft/item/wooden_axe.json @@ -7,11 +7,7 @@ "durability": 59 }, "minecraft:enchantable": { - "enchantability": 15, - "enchantments": "minecraft:axe_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:axe_forging" + "enchantability": 15 }, "minecraft:fuel": { "ticks": 200 diff --git a/src/main/generated/data/minecraft/item/wooden_hoe.json b/src/main/generated/data/minecraft/item/wooden_hoe.json index 5bb18c92..627201f3 100644 --- a/src/main/generated/data/minecraft/item/wooden_hoe.json +++ b/src/main/generated/data/minecraft/item/wooden_hoe.json @@ -7,11 +7,7 @@ "durability": 59 }, "minecraft:enchantable": { - "enchantability": 15, - "enchantments": "minecraft:hoe_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:hoe_forging" + "enchantability": 15 }, "minecraft:fuel": { "ticks": 200 diff --git a/src/main/generated/data/minecraft/item/wooden_pickaxe.json b/src/main/generated/data/minecraft/item/wooden_pickaxe.json index a775d580..0bcc5ab7 100644 --- a/src/main/generated/data/minecraft/item/wooden_pickaxe.json +++ b/src/main/generated/data/minecraft/item/wooden_pickaxe.json @@ -7,11 +7,7 @@ "durability": 59 }, "minecraft:enchantable": { - "enchantability": 15, - "enchantments": "minecraft:pickaxe_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:pickaxe_forging" + "enchantability": 15 }, "minecraft:fuel": { "ticks": 200 diff --git a/src/main/generated/data/minecraft/item/wooden_shovel.json b/src/main/generated/data/minecraft/item/wooden_shovel.json index 2b0e48a1..9b0689cd 100644 --- a/src/main/generated/data/minecraft/item/wooden_shovel.json +++ b/src/main/generated/data/minecraft/item/wooden_shovel.json @@ -7,11 +7,7 @@ "durability": 59 }, "minecraft:enchantable": { - "enchantability": 15, - "enchantments": "minecraft:shovel_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:shovel_forging" + "enchantability": 15 }, "minecraft:fuel": { "ticks": 200 diff --git a/src/main/generated/data/minecraft/item/wooden_sword.json b/src/main/generated/data/minecraft/item/wooden_sword.json index 9fa1478a..5e9fd309 100644 --- a/src/main/generated/data/minecraft/item/wooden_sword.json +++ b/src/main/generated/data/minecraft/item/wooden_sword.json @@ -7,11 +7,7 @@ "durability": 59 }, "minecraft:enchantable": { - "enchantability": 15, - "enchantments": "minecraft:sword_enchanting" - }, - "minecraft:forgeable": { - "enchantments": "minecraft:sword_forging" + "enchantability": 15 }, "minecraft:fuel": { "ticks": 200 diff --git a/src/main/generated/data/minecraft/item_group_entry_provider/combat.json b/src/main/generated/data/minecraft/item_group_entry_provider/combat.json index 1abaeeda..a9aaf1be 100644 --- a/src/main/generated/data/minecraft/item_group_entry_provider/combat.json +++ b/src/main/generated/data/minecraft/item_group_entry_provider/combat.json @@ -9,6 +9,7 @@ "tag": "minecraft:item_group/axes" }, "minecraft:trident", + "minecraft:mace", "minecraft:shield", { "type": "tag", @@ -24,6 +25,7 @@ "minecraft:end_crystal", "minecraft:snowball", "minecraft:egg", + "minecraft:wind_charge", "minecraft:bow", "minecraft:crossbow", { diff --git a/src/main/generated/data/minecraft/item_group_entry_provider/food_and_drinks.json b/src/main/generated/data/minecraft/item_group_entry_provider/food_and_drinks.json index 42b5dd35..15efd453 100644 --- a/src/main/generated/data/minecraft/item_group_entry_provider/food_and_drinks.json +++ b/src/main/generated/data/minecraft/item_group_entry_provider/food_and_drinks.json @@ -10,6 +10,41 @@ }, "minecraft:milk_bucket", "minecraft:honey_bottle", + { + "type": "stack", + "components": { + "minecraft:ominous_bottle_amplifier": 0 + }, + "item": "minecraft:ominous_bottle" + }, + { + "type": "stack", + "components": { + "minecraft:ominous_bottle_amplifier": 1 + }, + "item": "minecraft:ominous_bottle" + }, + { + "type": "stack", + "components": { + "minecraft:ominous_bottle_amplifier": 2 + }, + "item": "minecraft:ominous_bottle" + }, + { + "type": "stack", + "components": { + "minecraft:ominous_bottle_amplifier": 3 + }, + "item": "minecraft:ominous_bottle" + }, + { + "type": "stack", + "components": { + "minecraft:ominous_bottle_amplifier": 4 + }, + "item": "minecraft:ominous_bottle" + }, { "type": "potion", "item": "minecraft:potion" diff --git a/src/main/generated/data/minecraft/item_group_entry_provider/functional_blocks.json b/src/main/generated/data/minecraft/item_group_entry_provider/functional_blocks.json index 91c2a9f7..263504e2 100644 --- a/src/main/generated/data/minecraft/item_group_entry_provider/functional_blocks.json +++ b/src/main/generated/data/minecraft/item_group_entry_provider/functional_blocks.json @@ -137,6 +137,7 @@ "minecraft:dragon_egg", "minecraft:end_portal_frame", "minecraft:ender_eye", + "minecraft:vault", { "type": "tag", "tag": "minecraft:item_group/infested_blocks" diff --git a/src/main/generated/data/minecraft/item_group_entry_provider/ingredients.json b/src/main/generated/data/minecraft/item_group_entry_provider/ingredients.json index 1b7ccab7..cc202611 100644 --- a/src/main/generated/data/minecraft/item_group_entry_provider/ingredients.json +++ b/src/main/generated/data/minecraft/item_group_entry_provider/ingredients.json @@ -42,6 +42,8 @@ "minecraft:heart_of_the_sea", "minecraft:fire_charge", "minecraft:blaze_rod", + "minecraft:breeze_rod", + "minecraft:heavy_core", "minecraft:nether_star", "minecraft:ender_pearl", "minecraft:ender_eye", @@ -76,1321 +78,10 @@ "tag": "minecraft:item_group/smithing_templates" }, "minecraft:experience_bottle", + "minecraft:trial_key", + "minecraft:ominous_trial_key", { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:protection": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:protection": 2 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:protection": 3 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:protection": 4 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:fire_protection": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:fire_protection": 2 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:fire_protection": 3 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:fire_protection": 4 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:feather_falling": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:feather_falling": 2 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:feather_falling": 3 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:feather_falling": 4 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:blast_protection": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:blast_protection": 2 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:blast_protection": 3 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:blast_protection": 4 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:projectile_protection": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:projectile_protection": 2 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:projectile_protection": 3 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:projectile_protection": 4 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:respiration": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:respiration": 2 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:respiration": 3 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:aqua_affinity": 1 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:thorns": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:thorns": 2 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:thorns": 3 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:depth_strider": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:depth_strider": 2 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:depth_strider": 3 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:frost_walker": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:frost_walker": 2 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:binding_curse": 1 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:soul_speed": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:soul_speed": 2 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:soul_speed": 3 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:swift_sneak": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:swift_sneak": 2 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:swift_sneak": 3 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:sharpness": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:sharpness": 2 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:sharpness": 3 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:sharpness": 4 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:sharpness": 5 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:smite": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:smite": 2 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:smite": 3 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:smite": 4 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:smite": 5 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:bane_of_arthropods": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:bane_of_arthropods": 2 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:bane_of_arthropods": 3 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:bane_of_arthropods": 4 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:bane_of_arthropods": 5 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:knockback": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:knockback": 2 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:fire_aspect": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:fire_aspect": 2 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:looting": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:looting": 2 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:looting": 3 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:sweeping_edge": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:sweeping_edge": 2 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:sweeping_edge": 3 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:efficiency": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:efficiency": 2 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:efficiency": 3 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:efficiency": 4 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:efficiency": 5 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:silk_touch": 1 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:unbreaking": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:unbreaking": 2 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:unbreaking": 3 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:fortune": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:fortune": 2 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:fortune": 3 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:power": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:power": 2 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:power": 3 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:power": 4 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:power": 5 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:punch": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:punch": 2 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:flame": 1 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:infinity": 1 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:luck_of_the_sea": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:luck_of_the_sea": 2 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:luck_of_the_sea": 3 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:lure": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:lure": 2 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:lure": 3 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:loyalty": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:loyalty": 2 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:loyalty": 3 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:impaling": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:impaling": 2 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:impaling": 3 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:impaling": 4 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:impaling": 5 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:riptide": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:riptide": 2 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:riptide": 3 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:channeling": 1 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:multishot": 1 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:quick_charge": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:quick_charge": 2 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:quick_charge": 3 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:piercing": 1 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:piercing": 2 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:piercing": 3 - } - } - }, - "item": "minecraft:enchanted_book", - "visibility": "search_tab_only" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:piercing": 4 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:mending": 1 - } - } - }, - "item": "minecraft:enchanted_book" - }, - { - "type": "stack", - "components": { - "minecraft:enchantments": { - "levels": { - "minecraft:vanishing_curse": 1 - } - } - }, + "type": "enchantment", "item": "minecraft:enchanted_book" } ] diff --git a/src/main/generated/data/minecraft/item_group_entry_provider/redstone_blocks.json b/src/main/generated/data/minecraft/item_group_entry_provider/redstone_blocks.json index 076af17a..2759282f 100644 --- a/src/main/generated/data/minecraft/item_group_entry_provider/redstone_blocks.json +++ b/src/main/generated/data/minecraft/item_group_entry_provider/redstone_blocks.json @@ -6,6 +6,10 @@ "minecraft:repeater", "minecraft:comparator", "minecraft:target", + "minecraft:copper_bulb", + "minecraft:exposed_copper_bulb", + "minecraft:weathered_copper_bulb", + "minecraft:oxidized_copper_bulb", "minecraft:lever", "minecraft:oak_button", "minecraft:stone_button", @@ -29,6 +33,7 @@ "minecraft:honey_block", "minecraft:dispenser", "minecraft:dropper", + "minecraft:crafter", "minecraft:hopper", "minecraft:chest", "minecraft:barrel", diff --git a/src/main/generated/data/minecraft/item_group_entry_provider/spawn_eggs.json b/src/main/generated/data/minecraft/item_group_entry_provider/spawn_eggs.json index 1baff13a..cefe9d7d 100644 --- a/src/main/generated/data/minecraft/item_group_entry_provider/spawn_eggs.json +++ b/src/main/generated/data/minecraft/item_group_entry_provider/spawn_eggs.json @@ -10,6 +10,8 @@ "minecraft:bat_spawn_egg", "minecraft:bee_spawn_egg", "minecraft:blaze_spawn_egg", + "minecraft:bogged_spawn_egg", + "minecraft:breeze_spawn_egg", "minecraft:camel_spawn_egg", "minecraft:cat_spawn_egg", "minecraft:cave_spider_spawn_egg", diff --git a/src/main/generated/data/minecraft/item_group_entry_provider/tools_and_utilities.json b/src/main/generated/data/minecraft/item_group_entry_provider/tools_and_utilities.json index df4ec346..cc7ee9b4 100644 --- a/src/main/generated/data/minecraft/item_group_entry_provider/tools_and_utilities.json +++ b/src/main/generated/data/minecraft/item_group_entry_provider/tools_and_utilities.json @@ -23,6 +23,7 @@ "minecraft:spyglass", "minecraft:map", "minecraft:writable_book", + "minecraft:wind_charge", "minecraft:ender_pearl", "minecraft:ender_eye", "minecraft:elytra", diff --git a/src/main/generated/data/minecraft/smithing_template/bolt_pattern.json b/src/main/generated/data/minecraft/smithing_template/bolt_pattern.json new file mode 100644 index 00000000..c84566c5 --- /dev/null +++ b/src/main/generated/data/minecraft/smithing_template/bolt_pattern.json @@ -0,0 +1,4 @@ +{ + "type": "minecraft:trim_pattern", + "trim_pattern": "minecraft:bolt" +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/smithing_template/flow_pattern.json b/src/main/generated/data/minecraft/smithing_template/flow_pattern.json new file mode 100644 index 00000000..295c5fd8 --- /dev/null +++ b/src/main/generated/data/minecraft/smithing_template/flow_pattern.json @@ -0,0 +1,4 @@ +{ + "type": "minecraft:trim_pattern", + "trim_pattern": "minecraft:flow" +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/armor_enchanting.json b/src/main/generated/data/minecraft/tags/enchantment/armor_enchanting.json deleted file mode 100644 index 5d740c24..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/armor_enchanting.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "values": [ - "#minecraft:enchanting", - "minecraft:protection", - "minecraft:fire_protection", - "minecraft:blast_protection", - "minecraft:projectile_protection" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/armor_forging.json b/src/main/generated/data/minecraft/tags/enchantment/armor_forging.json deleted file mode 100644 index 56413ed2..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/armor_forging.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "#minecraft:forging" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/axe_enchanting.json b/src/main/generated/data/minecraft/tags/enchantment/axe_enchanting.json deleted file mode 100644 index 31dbe8ea..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/axe_enchanting.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "#minecraft:tool_enchanting" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/axe_forging.json b/src/main/generated/data/minecraft/tags/enchantment/axe_forging.json deleted file mode 100644 index 0f36ca15..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/axe_forging.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "values": [ - "#minecraft:tool_forging", - "#minecraft:axe_enchanting", - "minecraft:bane_of_arthropods", - "minecraft:sharpness", - "minecraft:smite" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/boots_enchanting.json b/src/main/generated/data/minecraft/tags/enchantment/boots_enchanting.json deleted file mode 100644 index 69219d69..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/boots_enchanting.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "#minecraft:armor_enchanting", - "minecraft:feather_falling", - "minecraft:depth_strider" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/boots_forging.json b/src/main/generated/data/minecraft/tags/enchantment/boots_forging.json deleted file mode 100644 index e0830bf3..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/boots_forging.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "values": [ - "#minecraft:armor_forging", - "minecraft:thorns", - "minecraft:frost_walker", - "minecraft:soul_speed" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/bow_enchanting.json b/src/main/generated/data/minecraft/tags/enchantment/bow_enchanting.json deleted file mode 100644 index 36422490..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/bow_enchanting.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "values": [ - "#minecraft:enchanting", - "minecraft:power", - "minecraft:punch", - "minecraft:flame", - "minecraft:infinity" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/bow_forging.json b/src/main/generated/data/minecraft/tags/enchantment/bow_forging.json deleted file mode 100644 index c77a712b..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/bow_forging.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "values": [ - "#minecraft:bow_enchanting", - "#minecraft:forging" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/brush_forging.json b/src/main/generated/data/minecraft/tags/enchantment/brush_forging.json deleted file mode 100644 index 68eb644a..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/brush_forging.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "minecraft:vanishing_curse", - "minecraft:mending", - "minecraft:unbreaking" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/chestplate_enchanting.json b/src/main/generated/data/minecraft/tags/enchantment/chestplate_enchanting.json deleted file mode 100644 index ee7df08a..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/chestplate_enchanting.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "values": [ - "#minecraft:armor_enchanting", - "minecraft:thorns" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/chestplate_forging.json b/src/main/generated/data/minecraft/tags/enchantment/chestplate_forging.json deleted file mode 100644 index 228b6deb..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/chestplate_forging.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "#minecraft:armor_forging" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/crossbow_enchanting.json b/src/main/generated/data/minecraft/tags/enchantment/crossbow_enchanting.json deleted file mode 100644 index 53a062be..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/crossbow_enchanting.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "values": [ - "#minecraft:enchanting", - "minecraft:multishot", - "minecraft:quick_charge", - "minecraft:piercing" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/crossbow_forging.json b/src/main/generated/data/minecraft/tags/enchantment/crossbow_forging.json deleted file mode 100644 index 9006d3e3..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/crossbow_forging.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "values": [ - "#minecraft:crossbow_enchanting", - "#minecraft:forging" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/cursed.json b/src/main/generated/data/minecraft/tags/enchantment/cursed.json deleted file mode 100644 index 0c7d6110..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/cursed.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "values": [ - "minecraft:binding_curse", - "minecraft:vanishing_curse" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/enchanting.json b/src/main/generated/data/minecraft/tags/enchantment/enchanting.json deleted file mode 100644 index 03f2f16d..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/enchanting.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "minecraft:unbreaking" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/forging.json b/src/main/generated/data/minecraft/tags/enchantment/forging.json deleted file mode 100644 index 90b7263b..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/forging.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "values": [ - "#minecraft:cursed", - "minecraft:mending" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/helmet_enchanting.json b/src/main/generated/data/minecraft/tags/enchantment/helmet_enchanting.json deleted file mode 100644 index a4701593..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/helmet_enchanting.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "#minecraft:armor_enchanting", - "minecraft:respiration", - "minecraft:aqua_affinity" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/helmet_forging.json b/src/main/generated/data/minecraft/tags/enchantment/helmet_forging.json deleted file mode 100644 index 00c11ea4..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/helmet_forging.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "values": [ - "#minecraft:armor_forging", - "minecraft:thorns" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/hoe_enchanting.json b/src/main/generated/data/minecraft/tags/enchantment/hoe_enchanting.json deleted file mode 100644 index 31dbe8ea..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/hoe_enchanting.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "#minecraft:tool_enchanting" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/hoe_forging.json b/src/main/generated/data/minecraft/tags/enchantment/hoe_forging.json deleted file mode 100644 index e8476823..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/hoe_forging.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "values": [ - "#minecraft:tool_forging", - "#minecraft:hoe_enchanting" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/leggings_enchanting.json b/src/main/generated/data/minecraft/tags/enchantment/leggings_enchanting.json deleted file mode 100644 index bb14a786..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/leggings_enchanting.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "#minecraft:armor_enchanting" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/leggings_forging.json b/src/main/generated/data/minecraft/tags/enchantment/leggings_forging.json deleted file mode 100644 index a5d47c93..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/leggings_forging.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "#minecraft:armor_forging", - "minecraft:thorns", - "minecraft:swift_sneak" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/pickaxe_enchanting.json b/src/main/generated/data/minecraft/tags/enchantment/pickaxe_enchanting.json deleted file mode 100644 index 31dbe8ea..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/pickaxe_enchanting.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "#minecraft:tool_enchanting" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/pickaxe_forging.json b/src/main/generated/data/minecraft/tags/enchantment/pickaxe_forging.json deleted file mode 100644 index 4f611b44..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/pickaxe_forging.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "values": [ - "#minecraft:tool_forging", - "#minecraft:pickaxe_enchanting" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/shovel_enchanting.json b/src/main/generated/data/minecraft/tags/enchantment/shovel_enchanting.json deleted file mode 100644 index 31dbe8ea..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/shovel_enchanting.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "#minecraft:tool_enchanting" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/shovel_forging.json b/src/main/generated/data/minecraft/tags/enchantment/shovel_forging.json deleted file mode 100644 index cdcad1f1..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/shovel_forging.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "values": [ - "#minecraft:tool_forging", - "#minecraft:shovel_enchanting" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/steering_forging.json b/src/main/generated/data/minecraft/tags/enchantment/steering_forging.json deleted file mode 100644 index 68eb644a..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/steering_forging.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "minecraft:vanishing_curse", - "minecraft:mending", - "minecraft:unbreaking" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/sword_enchanting.json b/src/main/generated/data/minecraft/tags/enchantment/sword_enchanting.json deleted file mode 100644 index 2ecdd491..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/sword_enchanting.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "values": [ - "#minecraft:enchanting", - "minecraft:sharpness", - "minecraft:smite", - "minecraft:bane_of_arthropods", - "minecraft:knockback", - "minecraft:fire_aspect", - "minecraft:looting", - "minecraft:sweeping_edge" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/sword_forging.json b/src/main/generated/data/minecraft/tags/enchantment/sword_forging.json deleted file mode 100644 index f6e6f2df..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/sword_forging.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "values": [ - "#minecraft:forging", - "#minecraft:sword_enchanting" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/tool_enchanting.json b/src/main/generated/data/minecraft/tags/enchantment/tool_enchanting.json deleted file mode 100644 index 3e89873c..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/tool_enchanting.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "values": [ - "#minecraft:enchanting", - "minecraft:efficiency", - "minecraft:silk_touch", - "minecraft:fortune" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/tool_forging.json b/src/main/generated/data/minecraft/tags/enchantment/tool_forging.json deleted file mode 100644 index 56413ed2..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/tool_forging.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "#minecraft:forging" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/tradeable.json b/src/main/generated/data/minecraft/tags/enchantment/tradeable.json deleted file mode 100644 index 186f70a8..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/tradeable.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "values": [ - "minecraft:protection", - "minecraft:fire_protection", - "minecraft:feather_falling", - "minecraft:blast_protection", - "minecraft:projectile_protection", - "minecraft:respiration", - "minecraft:aqua_affinity", - "minecraft:thorns", - "minecraft:depth_strider", - "minecraft:frost_walker", - "minecraft:binding_curse", - "minecraft:sharpness", - "minecraft:smite", - "minecraft:bane_of_arthropods", - "minecraft:knockback", - "minecraft:fire_aspect", - "minecraft:looting", - "minecraft:sweeping_edge", - "minecraft:efficiency", - "minecraft:silk_touch", - "minecraft:unbreaking", - "minecraft:fortune", - "minecraft:power", - "minecraft:punch", - "minecraft:flame", - "minecraft:infinity", - "minecraft:luck_of_the_sea", - "minecraft:lure", - "minecraft:loyalty", - "minecraft:impaling", - "minecraft:riptide", - "minecraft:channeling", - "minecraft:multishot", - "minecraft:quick_charge", - "minecraft:piercing", - "minecraft:density", - "minecraft:breach", - "minecraft:mending", - "minecraft:vanishing_curse" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/trident_enchanting.json b/src/main/generated/data/minecraft/tags/enchantment/trident_enchanting.json deleted file mode 100644 index 6775cf4d..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/trident_enchanting.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "values": [ - "#minecraft:enchanting", - "minecraft:channeling", - "minecraft:riptide", - "minecraft:loyalty" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/enchantment/trident_forging.json b/src/main/generated/data/minecraft/tags/enchantment/trident_forging.json deleted file mode 100644 index ef30ba80..00000000 --- a/src/main/generated/data/minecraft/tags/enchantment/trident_forging.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "values": [ - "#minecraft:trident_enchanting", - "#minecraft:forging" - ] -} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/items/item_group/banner_patterns.json b/src/main/generated/data/minecraft/tags/items/item_group/banner_patterns.json index 95d7f6a9..3b75513b 100644 --- a/src/main/generated/data/minecraft/tags/items/item_group/banner_patterns.json +++ b/src/main/generated/data/minecraft/tags/items/item_group/banner_patterns.json @@ -5,6 +5,8 @@ "minecraft:skull_banner_pattern", "minecraft:mojang_banner_pattern", "minecraft:globe_banner_pattern", - "minecraft:piglin_banner_pattern" + "minecraft:piglin_banner_pattern", + "minecraft:flow_banner_pattern", + "minecraft:guster_banner_pattern" ] } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/items/item_group/copper_building_blocks.json b/src/main/generated/data/minecraft/tags/items/item_group/copper_building_blocks.json index 1266d1fa..9876eeec 100644 --- a/src/main/generated/data/minecraft/tags/items/item_group/copper_building_blocks.json +++ b/src/main/generated/data/minecraft/tags/items/item_group/copper_building_blocks.json @@ -1,8 +1,13 @@ { "values": [ "minecraft:copper_block", + "minecraft:chiseled_copper", + "minecraft:copper_grate", "minecraft:cut_copper", "minecraft:cut_copper_stairs", - "minecraft:cut_copper_slab" + "minecraft:cut_copper_slab", + "minecraft:copper_door", + "minecraft:copper_trapdoor", + "minecraft:copper_bulb" ] } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/items/item_group/exposed_copper_building_blocks.json b/src/main/generated/data/minecraft/tags/items/item_group/exposed_copper_building_blocks.json index f2dc2242..b4874898 100644 --- a/src/main/generated/data/minecraft/tags/items/item_group/exposed_copper_building_blocks.json +++ b/src/main/generated/data/minecraft/tags/items/item_group/exposed_copper_building_blocks.json @@ -1,8 +1,13 @@ { "values": [ "minecraft:exposed_copper", + "minecraft:exposed_chiseled_copper", + "minecraft:exposed_copper_grate", "minecraft:exposed_cut_copper", "minecraft:exposed_cut_copper_stairs", - "minecraft:exposed_cut_copper_slab" + "minecraft:exposed_cut_copper_slab", + "minecraft:exposed_copper_door", + "minecraft:exposed_copper_trapdoor", + "minecraft:exposed_copper_bulb" ] } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/items/item_group/light_emitting_blocks.json b/src/main/generated/data/minecraft/tags/items/item_group/light_emitting_blocks.json index 7f53fd81..fcd05165 100644 --- a/src/main/generated/data/minecraft/tags/items/item_group/light_emitting_blocks.json +++ b/src/main/generated/data/minecraft/tags/items/item_group/light_emitting_blocks.json @@ -3,6 +3,14 @@ "minecraft:end_rod", "minecraft:sea_lantern", "minecraft:redstone_lamp", + "minecraft:copper_bulb", + "minecraft:exposed_copper_bulb", + "minecraft:weathered_copper_bulb", + "minecraft:oxidized_copper_bulb", + "minecraft:waxed_copper_bulb", + "minecraft:waxed_exposed_copper_bulb", + "minecraft:waxed_weathered_copper_bulb", + "minecraft:waxed_oxidized_copper_bulb", "minecraft:glowstone", "minecraft:shroomlight", "#minecraft:item_group/froglights", diff --git a/src/main/generated/data/minecraft/tags/items/item_group/music_discs.json b/src/main/generated/data/minecraft/tags/items/item_group/music_discs.json index 52e1ff6b..b70fbefc 100644 --- a/src/main/generated/data/minecraft/tags/items/item_group/music_discs.json +++ b/src/main/generated/data/minecraft/tags/items/item_group/music_discs.json @@ -4,6 +4,8 @@ "minecraft:music_disc_cat", "minecraft:music_disc_blocks", "minecraft:music_disc_chirp", + "minecraft:music_disc_creator", + "minecraft:music_disc_creator_music_box", "minecraft:music_disc_far", "minecraft:music_disc_mall", "minecraft:music_disc_mellohi", @@ -15,6 +17,7 @@ "minecraft:music_disc_otherside", "minecraft:music_disc_relic", "minecraft:music_disc_5", - "minecraft:music_disc_pigstep" + "minecraft:music_disc_pigstep", + "minecraft:music_disc_precipice" ] } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/items/item_group/oxidized_copper_building_blocks.json b/src/main/generated/data/minecraft/tags/items/item_group/oxidized_copper_building_blocks.json index b7849838..ef33a7b2 100644 --- a/src/main/generated/data/minecraft/tags/items/item_group/oxidized_copper_building_blocks.json +++ b/src/main/generated/data/minecraft/tags/items/item_group/oxidized_copper_building_blocks.json @@ -1,8 +1,13 @@ { "values": [ "minecraft:oxidized_copper", + "minecraft:oxidized_chiseled_copper", + "minecraft:oxidized_copper_grate", "minecraft:oxidized_cut_copper", "minecraft:oxidized_cut_copper_stairs", - "minecraft:oxidized_cut_copper_slab" + "minecraft:oxidized_cut_copper_slab", + "minecraft:oxidized_copper_door", + "minecraft:oxidized_copper_trapdoor", + "minecraft:oxidized_copper_bulb" ] } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/items/item_group/smithing_templates.json b/src/main/generated/data/minecraft/tags/items/item_group/smithing_templates.json index 423505a2..ba38306e 100644 --- a/src/main/generated/data/minecraft/tags/items/item_group/smithing_templates.json +++ b/src/main/generated/data/minecraft/tags/items/item_group/smithing_templates.json @@ -16,6 +16,8 @@ "minecraft:snout_armor_trim_smithing_template", "minecraft:rib_armor_trim_smithing_template", "minecraft:eye_armor_trim_smithing_template", - "minecraft:spire_armor_trim_smithing_template" + "minecraft:spire_armor_trim_smithing_template", + "minecraft:flow_armor_trim_smithing_template", + "minecraft:bolt_armor_trim_smithing_template" ] } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/items/item_group/spawners.json b/src/main/generated/data/minecraft/tags/items/item_group/spawners.json index 3749347f..266975d2 100644 --- a/src/main/generated/data/minecraft/tags/items/item_group/spawners.json +++ b/src/main/generated/data/minecraft/tags/items/item_group/spawners.json @@ -1,5 +1,6 @@ { "values": [ - "minecraft:spawner" + "minecraft:spawner", + "minecraft:trial_spawner" ] } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/items/item_group/tuff_building_blocks.json b/src/main/generated/data/minecraft/tags/items/item_group/tuff_building_blocks.json index 23133aff..bc7df761 100644 --- a/src/main/generated/data/minecraft/tags/items/item_group/tuff_building_blocks.json +++ b/src/main/generated/data/minecraft/tags/items/item_group/tuff_building_blocks.json @@ -1,5 +1,18 @@ { "values": [ - "minecraft:tuff" + "minecraft:tuff", + "minecraft:tuff_stairs", + "minecraft:tuff_slab", + "minecraft:tuff_wall", + "minecraft:chiseled_tuff", + "minecraft:polished_tuff", + "minecraft:polished_tuff_stairs", + "minecraft:polished_tuff_slab", + "minecraft:polished_tuff_wall", + "minecraft:tuff_bricks", + "minecraft:tuff_brick_stairs", + "minecraft:tuff_brick_slab", + "minecraft:tuff_brick_wall", + "minecraft:chiseled_tuff_bricks" ] } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/items/item_group/waxed_copper_building_blocks.json b/src/main/generated/data/minecraft/tags/items/item_group/waxed_copper_building_blocks.json index e4e33278..e85e89ca 100644 --- a/src/main/generated/data/minecraft/tags/items/item_group/waxed_copper_building_blocks.json +++ b/src/main/generated/data/minecraft/tags/items/item_group/waxed_copper_building_blocks.json @@ -1,8 +1,13 @@ { "values": [ "minecraft:waxed_copper_block", + "minecraft:waxed_chiseled_copper", + "minecraft:waxed_copper_grate", "minecraft:waxed_cut_copper", "minecraft:waxed_cut_copper_stairs", - "minecraft:waxed_cut_copper_slab" + "minecraft:waxed_cut_copper_slab", + "minecraft:waxed_copper_door", + "minecraft:waxed_copper_trapdoor", + "minecraft:waxed_copper_bulb" ] } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/items/item_group/waxed_exposed_copper_building_blocks.json b/src/main/generated/data/minecraft/tags/items/item_group/waxed_exposed_copper_building_blocks.json index dc39b0d0..bd8e859b 100644 --- a/src/main/generated/data/minecraft/tags/items/item_group/waxed_exposed_copper_building_blocks.json +++ b/src/main/generated/data/minecraft/tags/items/item_group/waxed_exposed_copper_building_blocks.json @@ -1,8 +1,13 @@ { "values": [ "minecraft:waxed_exposed_copper", + "minecraft:waxed_exposed_chiseled_copper", + "minecraft:waxed_exposed_copper_grate", "minecraft:waxed_exposed_cut_copper", "minecraft:waxed_exposed_cut_copper_stairs", - "minecraft:waxed_exposed_cut_copper_slab" + "minecraft:waxed_exposed_cut_copper_slab", + "minecraft:waxed_exposed_copper_door", + "minecraft:waxed_exposed_copper_trapdoor", + "minecraft:waxed_exposed_copper_bulb" ] } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/items/item_group/waxed_oxidized_copper_building_blocks.json b/src/main/generated/data/minecraft/tags/items/item_group/waxed_oxidized_copper_building_blocks.json index b8220489..39bb43e3 100644 --- a/src/main/generated/data/minecraft/tags/items/item_group/waxed_oxidized_copper_building_blocks.json +++ b/src/main/generated/data/minecraft/tags/items/item_group/waxed_oxidized_copper_building_blocks.json @@ -1,8 +1,13 @@ { "values": [ "minecraft:waxed_oxidized_copper", + "minecraft:waxed_oxidized_chiseled_copper", + "minecraft:waxed_oxidized_copper_grate", "minecraft:waxed_oxidized_cut_copper", "minecraft:waxed_oxidized_cut_copper_stairs", - "minecraft:waxed_oxidized_cut_copper_slab" + "minecraft:waxed_oxidized_cut_copper_slab", + "minecraft:waxed_oxidized_copper_door", + "minecraft:waxed_oxidized_copper_trapdoor", + "minecraft:waxed_oxidized_copper_bulb" ] } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/items/item_group/waxed_weathered_copper_building_blocks.json b/src/main/generated/data/minecraft/tags/items/item_group/waxed_weathered_copper_building_blocks.json index bab366e6..b4350e18 100644 --- a/src/main/generated/data/minecraft/tags/items/item_group/waxed_weathered_copper_building_blocks.json +++ b/src/main/generated/data/minecraft/tags/items/item_group/waxed_weathered_copper_building_blocks.json @@ -1,8 +1,13 @@ { "values": [ "minecraft:waxed_weathered_copper", + "minecraft:waxed_weathered_chiseled_copper", + "minecraft:waxed_weathered_copper_grate", "minecraft:waxed_weathered_cut_copper", "minecraft:waxed_weathered_cut_copper_stairs", - "minecraft:waxed_weathered_cut_copper_slab" + "minecraft:waxed_weathered_cut_copper_slab", + "minecraft:waxed_weathered_copper_door", + "minecraft:waxed_weathered_copper_trapdoor", + "minecraft:waxed_weathered_copper_bulb" ] } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/items/item_group/weathered_copper_building_blocks.json b/src/main/generated/data/minecraft/tags/items/item_group/weathered_copper_building_blocks.json index 9149feb1..e5dba808 100644 --- a/src/main/generated/data/minecraft/tags/items/item_group/weathered_copper_building_blocks.json +++ b/src/main/generated/data/minecraft/tags/items/item_group/weathered_copper_building_blocks.json @@ -1,8 +1,13 @@ { "values": [ "minecraft:weathered_copper", + "minecraft:weathered_chiseled_copper", + "minecraft:weathered_copper_grate", "minecraft:weathered_cut_copper", "minecraft:weathered_cut_copper_stairs", - "minecraft:weathered_cut_copper_slab" + "minecraft:weathered_cut_copper_slab", + "minecraft:weathered_copper_door", + "minecraft:weathered_copper_trapdoor", + "minecraft:weathered_copper_bulb" ] } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/items/repairs_mace.json b/src/main/generated/data/minecraft/tags/items/repairs_mace.json new file mode 100644 index 00000000..8290ef56 --- /dev/null +++ b/src/main/generated/data/minecraft/tags/items/repairs_mace.json @@ -0,0 +1,5 @@ +{ + "values": [ + "minecraft:breeze_rod" + ] +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/potion/tradeable.json b/src/main/generated/data/minecraft/tags/potion/tradeable.json index 41cb21b3..b65bfd7f 100644 --- a/src/main/generated/data/minecraft/tags/potion/tradeable.json +++ b/src/main/generated/data/minecraft/tags/potion/tradeable.json @@ -36,6 +36,10 @@ "minecraft:weakness", "minecraft:long_weakness", "minecraft:slow_falling", - "minecraft:long_slow_falling" + "minecraft:long_slow_falling", + "minecraft:wind_charged", + "minecraft:weaving", + "minecraft:oozing", + "minecraft:infested" ] } \ No newline at end of file diff --git a/src/main/java/net/errorcraft/itematic/Itematic.java b/src/main/java/net/errorcraft/itematic/Itematic.java index fbed3033..ba889cbd 100644 --- a/src/main/java/net/errorcraft/itematic/Itematic.java +++ b/src/main/java/net/errorcraft/itematic/Itematic.java @@ -8,6 +8,7 @@ import net.errorcraft.itematic.item.model.override.ModelOverrides; import net.errorcraft.itematic.item.placement.block.picker.BlockPickerTypes; import net.errorcraft.itematic.item.pointer.Pointers; +import net.errorcraft.itematic.item.shooter.method.ShooterMethodTypes; import net.errorcraft.itematic.item.smithing.template.SmithingTemplateTypes; import net.errorcraft.itematic.item.use.provider.IntegerProviderTypes; import net.errorcraft.itematic.loot.context.ItematicLootContextParameters; @@ -41,5 +42,6 @@ public void onInitialize() { ItematicDataComponentTypes.init(); IntegerProviderTypes.init(); ItemHolderRuleTypes.init(); + ShooterMethodTypes.init(); } } diff --git a/src/main/java/net/errorcraft/itematic/access/component/type/ChargedProjectilesComponentAccess.java b/src/main/java/net/errorcraft/itematic/access/component/type/ChargedProjectilesComponentAccess.java index 4e6b3150..008ac1e1 100644 --- a/src/main/java/net/errorcraft/itematic/access/component/type/ChargedProjectilesComponentAccess.java +++ b/src/main/java/net/errorcraft/itematic/access/component/type/ChargedProjectilesComponentAccess.java @@ -7,7 +7,4 @@ public interface ChargedProjectilesComponentAccess { default boolean itematic$contains(RegistryKey item) { return false; } - default float itematic$getChargedSpeed() { - return 0.0f; - } } diff --git a/src/main/java/net/errorcraft/itematic/access/item/ItemStackAccess.java b/src/main/java/net/errorcraft/itematic/access/item/ItemStackAccess.java index ecbd0378..5243381b 100644 --- a/src/main/java/net/errorcraft/itematic/access/item/ItemStackAccess.java +++ b/src/main/java/net/errorcraft/itematic/access/item/ItemStackAccess.java @@ -6,7 +6,6 @@ import net.errorcraft.itematic.world.action.context.ActionContext; import net.minecraft.block.BlockState; import net.minecraft.component.ComponentMapImpl; -import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -58,9 +57,6 @@ public interface ItemStackAccess { default boolean itematic$mayStartUsing(World world, PlayerEntity user, Hand hand, ItemStack stack) { return false; } - default int itematic$useDuration(LivingEntity user) { - return 0; - } default double itematic$attackSpeedMultiplier() { return 0.0d; } diff --git a/src/main/java/net/errorcraft/itematic/access/predicate/item/ItemPredicateBuilderAccess.java b/src/main/java/net/errorcraft/itematic/access/predicate/item/ItemPredicateBuilderAccess.java index c1d3f7a1..f15d4002 100644 --- a/src/main/java/net/errorcraft/itematic/access/predicate/item/ItemPredicateBuilderAccess.java +++ b/src/main/java/net/errorcraft/itematic/access/predicate/item/ItemPredicateBuilderAccess.java @@ -1,7 +1,7 @@ package net.errorcraft.itematic.access.predicate.item; import net.errorcraft.itematic.item.component.ItemComponentType; -import net.minecraft.component.DataComponentType; +import net.minecraft.component.ComponentType; import net.minecraft.item.Item; import net.minecraft.predicate.item.ItemPredicate; import net.minecraft.registry.entry.RegistryEntryList; @@ -13,7 +13,7 @@ public interface ItemPredicateBuilderAccess { default ItemPredicate.Builder itematic$behavior(ItemComponentType... behavior) { return null; } - default ItemPredicate.Builder itematic$dataComponents(DataComponentType... dataComponents) { + default ItemPredicate.Builder itematic$dataComponents(ComponentType... dataComponents) { return null; } } diff --git a/src/main/java/net/errorcraft/itematic/block/BlockKeys.java b/src/main/java/net/errorcraft/itematic/block/BlockKeys.java index 72c620a4..cfb8012b 100644 --- a/src/main/java/net/errorcraft/itematic/block/BlockKeys.java +++ b/src/main/java/net/errorcraft/itematic/block/BlockKeys.java @@ -881,6 +881,19 @@ public class BlockKeys { public static final RegistryKey MEDIUM_AMETHYST_BUD = of("medium_amethyst_bud"); public static final RegistryKey SMALL_AMETHYST_BUD = of("small_amethyst_bud"); public static final RegistryKey TUFF = of("tuff"); + public static final RegistryKey TUFF_SLAB = of("tuff_slab"); + public static final RegistryKey TUFF_STAIRS = of("tuff_stairs"); + public static final RegistryKey TUFF_WALL = of("tuff_wall"); + public static final RegistryKey POLISHED_TUFF = of("polished_tuff"); + public static final RegistryKey POLISHED_TUFF_SLAB = of("polished_tuff_slab"); + public static final RegistryKey POLISHED_TUFF_STAIRS = of("polished_tuff_stairs"); + public static final RegistryKey POLISHED_TUFF_WALL = of("polished_tuff_wall"); + public static final RegistryKey CHISELED_TUFF = of("chiseled_tuff"); + public static final RegistryKey TUFF_BRICKS = of("tuff_bricks"); + public static final RegistryKey TUFF_BRICK_SLAB = of("tuff_brick_slab"); + public static final RegistryKey TUFF_BRICK_STAIRS = of("tuff_brick_stairs"); + public static final RegistryKey TUFF_BRICK_WALL = of("tuff_brick_wall"); + public static final RegistryKey CHISELED_TUFF_BRICKS = of("chiseled_tuff_bricks"); public static final RegistryKey CALCITE = of("calcite"); public static final RegistryKey TINTED_GLASS = of("tinted_glass"); public static final RegistryKey POWDER_SNOW = of("powder_snow"); @@ -890,16 +903,24 @@ public class BlockKeys { public static final RegistryKey SCULK_VEIN = of("sculk_vein"); public static final RegistryKey SCULK_CATALYST = of("sculk_catalyst"); public static final RegistryKey SCULK_SHRIEKER = of("sculk_shrieker"); - public static final RegistryKey OXIDIZED_COPPER = of("oxidized_copper"); - public static final RegistryKey WEATHERED_COPPER = of("weathered_copper"); - public static final RegistryKey EXPOSED_COPPER = of("exposed_copper"); public static final RegistryKey COPPER_BLOCK = of("copper_block"); + public static final RegistryKey EXPOSED_COPPER = of("exposed_copper"); + public static final RegistryKey WEATHERED_COPPER = of("weathered_copper"); + public static final RegistryKey OXIDIZED_COPPER = of("oxidized_copper"); public static final RegistryKey COPPER_ORE = of("copper_ore"); public static final RegistryKey DEEPSLATE_COPPER_ORE = of("deepslate_copper_ore"); public static final RegistryKey OXIDIZED_CUT_COPPER = of("oxidized_cut_copper"); public static final RegistryKey WEATHERED_CUT_COPPER = of("weathered_cut_copper"); public static final RegistryKey EXPOSED_CUT_COPPER = of("exposed_cut_copper"); public static final RegistryKey CUT_COPPER = of("cut_copper"); + public static final RegistryKey OXIDIZED_CHISELED_COPPER = of("oxidized_chiseled_copper"); + public static final RegistryKey WEATHERED_CHISELED_COPPER = of("weathered_chiseled_copper"); + public static final RegistryKey EXPOSED_CHISELED_COPPER = of("exposed_chiseled_copper"); + public static final RegistryKey CHISELED_COPPER = of("chiseled_copper"); + public static final RegistryKey WAXED_OXIDIZED_CHISELED_COPPER = of("waxed_oxidized_chiseled_copper"); + public static final RegistryKey WAXED_WEATHERED_CHISELED_COPPER = of("waxed_weathered_chiseled_copper"); + public static final RegistryKey WAXED_EXPOSED_CHISELED_COPPER = of("waxed_exposed_chiseled_copper"); + public static final RegistryKey WAXED_CHISELED_COPPER = of("waxed_chiseled_copper"); public static final RegistryKey OXIDIZED_CUT_COPPER_STAIRS = of("oxidized_cut_copper_stairs"); public static final RegistryKey WEATHERED_CUT_COPPER_STAIRS = of("weathered_cut_copper_stairs"); public static final RegistryKey EXPOSED_CUT_COPPER_STAIRS = of("exposed_cut_copper_stairs"); @@ -924,6 +945,38 @@ public class BlockKeys { public static final RegistryKey WAXED_WEATHERED_CUT_COPPER_SLAB = of("waxed_weathered_cut_copper_slab"); public static final RegistryKey WAXED_EXPOSED_CUT_COPPER_SLAB = of("waxed_exposed_cut_copper_slab"); public static final RegistryKey WAXED_CUT_COPPER_SLAB = of("waxed_cut_copper_slab"); + public static final RegistryKey COPPER_DOOR = of("copper_door"); + public static final RegistryKey EXPOSED_COPPER_DOOR = of("exposed_copper_door"); + public static final RegistryKey OXIDIZED_COPPER_DOOR = of("oxidized_copper_door"); + public static final RegistryKey WEATHERED_COPPER_DOOR = of("weathered_copper_door"); + public static final RegistryKey WAXED_COPPER_DOOR = of("waxed_copper_door"); + public static final RegistryKey WAXED_EXPOSED_COPPER_DOOR = of("waxed_exposed_copper_door"); + public static final RegistryKey WAXED_OXIDIZED_COPPER_DOOR = of("waxed_oxidized_copper_door"); + public static final RegistryKey WAXED_WEATHERED_COPPER_DOOR = of("waxed_weathered_copper_door"); + public static final RegistryKey COPPER_TRAPDOOR = of("copper_trapdoor"); + public static final RegistryKey EXPOSED_COPPER_TRAPDOOR = of("exposed_copper_trapdoor"); + public static final RegistryKey OXIDIZED_COPPER_TRAPDOOR = of("oxidized_copper_trapdoor"); + public static final RegistryKey WEATHERED_COPPER_TRAPDOOR = of("weathered_copper_trapdoor"); + public static final RegistryKey WAXED_COPPER_TRAPDOOR = of("waxed_copper_trapdoor"); + public static final RegistryKey WAXED_EXPOSED_COPPER_TRAPDOOR = of("waxed_exposed_copper_trapdoor"); + public static final RegistryKey WAXED_OXIDIZED_COPPER_TRAPDOOR = of("waxed_oxidized_copper_trapdoor"); + public static final RegistryKey WAXED_WEATHERED_COPPER_TRAPDOOR = of("waxed_weathered_copper_trapdoor"); + public static final RegistryKey COPPER_GRATE = of("copper_grate"); + public static final RegistryKey EXPOSED_COPPER_GRATE = of("exposed_copper_grate"); + public static final RegistryKey WEATHERED_COPPER_GRATE = of("weathered_copper_grate"); + public static final RegistryKey OXIDIZED_COPPER_GRATE = of("oxidized_copper_grate"); + public static final RegistryKey WAXED_COPPER_GRATE = of("waxed_copper_grate"); + public static final RegistryKey WAXED_EXPOSED_COPPER_GRATE = of("waxed_exposed_copper_grate"); + public static final RegistryKey WAXED_WEATHERED_COPPER_GRATE = of("waxed_weathered_copper_grate"); + public static final RegistryKey WAXED_OXIDIZED_COPPER_GRATE = of("waxed_oxidized_copper_grate"); + public static final RegistryKey COPPER_BULB = of("copper_bulb"); + public static final RegistryKey EXPOSED_COPPER_BULB = of("exposed_copper_bulb"); + public static final RegistryKey WEATHERED_COPPER_BULB = of("weathered_copper_bulb"); + public static final RegistryKey OXIDIZED_COPPER_BULB = of("oxidized_copper_bulb"); + public static final RegistryKey WAXED_COPPER_BULB = of("waxed_copper_bulb"); + public static final RegistryKey WAXED_EXPOSED_COPPER_BULB = of("waxed_exposed_copper_bulb"); + public static final RegistryKey WAXED_WEATHERED_COPPER_BULB = of("waxed_weathered_copper_bulb"); + public static final RegistryKey WAXED_OXIDIZED_COPPER_BULB = of("waxed_oxidized_copper_bulb"); public static final RegistryKey LIGHTNING_ROD = of("lightning_rod"); public static final RegistryKey POINTED_DRIPSTONE = of("pointed_dripstone"); public static final RegistryKey DRIPSTONE_BLOCK = of("dripstone_block"); @@ -972,6 +1025,10 @@ public class BlockKeys { public static final RegistryKey FROGSPAWN = of("frogspawn"); public static final RegistryKey REINFORCED_DEEPSLATE = of("reinforced_deepslate"); public static final RegistryKey DECORATED_POT = of("decorated_pot"); + public static final RegistryKey CRAFTER = of("crafter"); + public static final RegistryKey TRIAL_SPAWNER = of("trial_spawner"); + public static final RegistryKey VAULT = of("vault"); + public static final RegistryKey HEAVY_CORE = of("heavy_core"); private BlockKeys() {} diff --git a/src/main/java/net/errorcraft/itematic/component/ItematicDataComponentTypes.java b/src/main/java/net/errorcraft/itematic/component/ItematicDataComponentTypes.java index 81af6646..6b51a92a 100644 --- a/src/main/java/net/errorcraft/itematic/component/ItematicDataComponentTypes.java +++ b/src/main/java/net/errorcraft/itematic/component/ItematicDataComponentTypes.java @@ -1,32 +1,41 @@ package net.errorcraft.itematic.component; -import net.errorcraft.itematic.component.type.ImmuneToDamageComponent; -import net.errorcraft.itematic.component.type.ItemListDataComponent; -import net.errorcraft.itematic.component.type.UseDurationDataComponent; -import net.errorcraft.itematic.component.type.WeaponAttackDamageDataComponent; +import net.errorcraft.itematic.component.type.*; import net.errorcraft.itematic.item.component.components.ItemHolderItemComponent; import net.errorcraft.itematic.item.holder.rule.ItemHolderRules; +import net.errorcraft.itematic.item.shooter.ChargingSoundsUtil; +import net.errorcraft.itematic.item.shooter.method.methods.ChargeableShooterMethod; import net.errorcraft.itematic.mixin.component.DataComponentTypesAccessor; import net.errorcraft.itematic.network.codec.PacketCodecUtil; import net.errorcraft.itematic.serialization.ItematicCodecs; import net.errorcraft.itematic.util.UseActionUtil; -import net.minecraft.component.DataComponentType; +import net.minecraft.component.ComponentType; +import net.minecraft.item.CrossbowItem; import net.minecraft.network.codec.PacketCodecs; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.sound.SoundEvent; import net.minecraft.util.Identifier; import net.minecraft.util.UseAction; import org.apache.commons.lang3.math.Fraction; public class ItematicDataComponentTypes { - public static final DataComponentType IMMUNE_TO_DAMAGE = DataComponentTypesAccessor.register("immune_to_damage", builder -> builder.codec(ImmuneToDamageComponent.CODEC).packetCodec(ImmuneToDamageComponent.PACKET_CODEC)); - public static final DataComponentType USE_DURATION = DataComponentTypesAccessor.register("use_duration", builder -> builder.codec(UseDurationDataComponent.CODEC).packetCodec(UseDurationDataComponent.PACKET_CODEC)); - public static final DataComponentType USE_ANIMATION = DataComponentTypesAccessor.register("use_animation", builder -> builder.codec(UseActionUtil.CODEC).packetCodec(UseActionUtil.PACKET_CODEC)); - public static final DataComponentType SHOOTER_AMMUNITION = DataComponentTypesAccessor.register("shooter_ammunition", builder -> builder.codec(ItemListDataComponent.CODEC).packetCodec(ItemListDataComponent.PACKET_CODEC)); - public static final DataComponentType SHOOTER_HELD_AMMUNITION = DataComponentTypesAccessor.register("shooter_held_ammunition", builder -> builder.codec(ItemListDataComponent.CODEC).packetCodec(ItemListDataComponent.PACKET_CODEC)); - public static final DataComponentType ATTACK_SPEED_MULTIPLIER = DataComponentTypesAccessor.register("attack_speed_multiplier", builder -> builder.codec(ItematicCodecs.NON_NEGATIVE_DOUBLE).packetCodec(PacketCodecs.DOUBLE)); - public static final DataComponentType WEAPON_ATTACK_DAMAGE = DataComponentTypesAccessor.register("weapon_attack_damage", builder -> builder.codec(WeaponAttackDamageDataComponent.CODEC).packetCodec(WeaponAttackDamageDataComponent.PACKET_CODEC)); - public static final DataComponentType ITEM_BAR_STYLE = DataComponentTypesAccessor.register("item_bar_style", builder -> builder.codec(Identifier.CODEC).packetCodec(Identifier.PACKET_CODEC).cache()); - public static final DataComponentType ITEM_HOLDER_CAPACITY = DataComponentTypesAccessor.register("item_holder_capacity", builder -> builder.codec(ItemHolderItemComponent.CAPACITY_CODEC).packetCodec(PacketCodecUtil.FRACTION)); - public static final DataComponentType ITEM_HOLDER_RULES = DataComponentTypesAccessor.register("item_holder_rules", builder -> builder.codec(ItemHolderRules.CODEC).packetCodec(ItemHolderRules.PACKET_CODEC).cache()); + public static final ComponentType IMMUNE_TO_DAMAGE = DataComponentTypesAccessor.register("immune_to_damage", builder -> builder.codec(ImmuneToDamageComponent.CODEC).packetCodec(ImmuneToDamageComponent.PACKET_CODEC)); + public static final ComponentType USE_DURATION = DataComponentTypesAccessor.register("use_duration", builder -> builder.codec(UseDurationDataComponent.CODEC).packetCodec(UseDurationDataComponent.PACKET_CODEC).cache()); + public static final ComponentType USE_ANIMATION = DataComponentTypesAccessor.register("use_animation", builder -> builder.codec(UseActionUtil.CODEC).packetCodec(UseActionUtil.PACKET_CODEC).cache()); + public static final ComponentType SHOOTER_AMMUNITION = DataComponentTypesAccessor.register("shooter_ammunition", builder -> builder.codec(ItemListDataComponent.CODEC).packetCodec(ItemListDataComponent.PACKET_CODEC).cache()); + public static final ComponentType SHOOTER_HELD_AMMUNITION = DataComponentTypesAccessor.register("shooter_held_ammunition", builder -> builder.codec(ItemListDataComponent.CODEC).packetCodec(ItemListDataComponent.PACKET_CODEC).cache()); + public static final ComponentType ATTACK_SPEED_MULTIPLIER = DataComponentTypesAccessor.register("attack_speed_multiplier", builder -> builder.codec(ItematicCodecs.NON_NEGATIVE_DOUBLE).packetCodec(PacketCodecs.DOUBLE).cache()); + public static final ComponentType WEAPON_ATTACK_DAMAGE = DataComponentTypesAccessor.register("weapon_attack_damage", builder -> builder.codec(WeaponAttackDamageDataComponent.CODEC).packetCodec(WeaponAttackDamageDataComponent.PACKET_CODEC).cache()); + public static final ComponentType ITEM_BAR_STYLE = DataComponentTypesAccessor.register("item_bar_style", builder -> builder.codec(Identifier.CODEC).packetCodec(Identifier.PACKET_CODEC).cache()); + public static final ComponentType ITEM_HOLDER_CAPACITY = DataComponentTypesAccessor.register("item_holder_capacity", builder -> builder.codec(ItemHolderItemComponent.CAPACITY_CODEC).packetCodec(PacketCodecUtil.FRACTION).cache()); + public static final ComponentType ITEM_HOLDER_RULES = DataComponentTypesAccessor.register("item_holder_rules", builder -> builder.codec(ItemHolderRules.CODEC).packetCodec(ItemHolderRules.PACKET_CODEC).cache()); + public static final ComponentType SHOOTER_DAMAGE_RULES = DataComponentTypesAccessor.register("shooter_damage_rules", builder -> builder.codec(ItemDamageRulesDataComponent.CODEC).packetCodec(ItemDamageRulesDataComponent.PACKET_CODEC).cache()); + public static final ComponentType SHOOTER_DEFAULT_CHARGE_TIME = DataComponentTypesAccessor.register("shooter_default_charge_time", builder -> builder.codec(ItematicCodecs.NON_NEGATIVE_FLOAT).packetCodec(PacketCodecs.FLOAT).cache()); + public static final ComponentType SHOOTER_DEFAULT_CHARGING_SOUNDS = DataComponentTypesAccessor.register("shooter_default_charging_sounds", builder -> builder.codec(CrossbowItem.LoadingSounds.CODEC).packetCodec(ChargingSoundsUtil.PACKET_CODEC).cache()); + public static final ComponentType SHOOTER_CHARGED_POWER_RULES = DataComponentTypesAccessor.register("shooter_charged_power_rules", builder -> builder.codec(ChargeableShooterMethod.ChargedPowerRules.CODEC).packetCodec(ChargeableShooterMethod.ChargedPowerRules.PACKET_CODEC)); + public static final ComponentType> SHOOTER_SHOOT_SOUND = DataComponentTypesAccessor.register("shooter_shoot_sound", builder -> builder.codec(SoundEvent.ENTRY_CODEC).packetCodec(SoundEvent.ENTRY_PACKET_CODEC)); + + private ItematicDataComponentTypes() {} public static void init() {} } diff --git a/src/main/java/net/errorcraft/itematic/component/type/ItemDamageRulesDataComponent.java b/src/main/java/net/errorcraft/itematic/component/type/ItemDamageRulesDataComponent.java new file mode 100644 index 00000000..fddaf5d6 --- /dev/null +++ b/src/main/java/net/errorcraft/itematic/component/type/ItemDamageRulesDataComponent.java @@ -0,0 +1,58 @@ +package net.errorcraft.itematic.component.type; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; +import net.minecraft.registry.RegistryCodecs; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.entry.RegistryEntryList; +import net.minecraft.util.dynamic.Codecs; + +import java.util.List; +import java.util.Optional; + +public record ItemDamageRulesDataComponent(List rules, int defaultItemDamage) { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Rule.CODEC.listOf().fieldOf("rules").forGetter(ItemDamageRulesDataComponent::rules), + Codecs.NONNEGATIVE_INT.fieldOf("default_damage").forGetter(ItemDamageRulesDataComponent::defaultItemDamage) + ).apply(instance, ItemDamageRulesDataComponent::new)); + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + Rule.PACKET_CODEC.collect(PacketCodecs.toList()), ItemDamageRulesDataComponent::rules, + PacketCodecs.VAR_INT, ItemDamageRulesDataComponent::defaultItemDamage, + ItemDamageRulesDataComponent::new + ); + + public int damage(ItemStack stack) { + for (Rule rule : this.rules) { + if (rule.damage.isPresent() && rule.matches(stack)) { + return rule.damage.get(); + } + } + + return this.defaultItemDamage; + } + + public record Rule(RegistryEntryList items, Optional damage) { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + RegistryCodecs.entryList(RegistryKeys.ITEM).fieldOf("items").forGetter(Rule::items), + Codecs.NONNEGATIVE_INT.optionalFieldOf("damage").forGetter(Rule::damage) + ).apply(instance, Rule::new)); + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + PacketCodecs.registryEntryList(RegistryKeys.ITEM), Rule::items, + PacketCodecs.VAR_INT.collect(PacketCodecs::optional), Rule::damage, + Rule::new + ); + + public static Rule of(RegistryEntryList items, int damage) { + return new Rule(items, Optional.of(damage)); + } + + public boolean matches(ItemStack stack) { + return stack.isIn(this.items); + } + } +} diff --git a/src/main/java/net/errorcraft/itematic/enchantment/EnchantmentKeys.java b/src/main/java/net/errorcraft/itematic/enchantment/EnchantmentKeys.java deleted file mode 100644 index 38800d0b..00000000 --- a/src/main/java/net/errorcraft/itematic/enchantment/EnchantmentKeys.java +++ /dev/null @@ -1,54 +0,0 @@ -package net.errorcraft.itematic.enchantment; - -import net.minecraft.enchantment.Enchantment; -import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.util.Identifier; - -public class EnchantmentKeys { - public static final RegistryKey PROTECTION = of("protection"); - public static final RegistryKey FIRE_PROTECTION = of("fire_protection"); - public static final RegistryKey FEATHER_FALLING = of("feather_falling"); - public static final RegistryKey BLAST_PROTECTION = of("blast_protection"); - public static final RegistryKey PROJECTILE_PROTECTION = of("projectile_protection"); - public static final RegistryKey RESPIRATION = of("respiration"); - public static final RegistryKey AQUA_AFFINITY = of("aqua_affinity"); - public static final RegistryKey THORNS = of("thorns"); - public static final RegistryKey DEPTH_STRIDER = of("depth_strider"); - public static final RegistryKey FROST_WALKER = of("frost_walker"); - public static final RegistryKey BINDING_CURSE = of("binding_curse"); - public static final RegistryKey SOUL_SPEED = of("soul_speed"); - public static final RegistryKey SWIFT_SNEAK = of("swift_sneak"); - public static final RegistryKey SHARPNESS = of("sharpness"); - public static final RegistryKey SMITE = of("smite"); - public static final RegistryKey BANE_OF_ARTHROPODS = of("bane_of_arthropods"); - public static final RegistryKey KNOCKBACK = of("knockback"); - public static final RegistryKey FIRE_ASPECT = of("fire_aspect"); - public static final RegistryKey LOOTING = of("looting"); - public static final RegistryKey SWEEPING_EDGE = of("sweeping_edge"); - public static final RegistryKey EFFICIENCY = of("efficiency"); - public static final RegistryKey SILK_TOUCH = of("silk_touch"); - public static final RegistryKey UNBREAKING = of("unbreaking"); - public static final RegistryKey FORTUNE = of("fortune"); - public static final RegistryKey POWER = of("power"); - public static final RegistryKey PUNCH = of("punch"); - public static final RegistryKey FLAME = of("flame"); - public static final RegistryKey INFINITY = of("infinity"); - public static final RegistryKey LUCK_OF_THE_SEA = of("luck_of_the_sea"); - public static final RegistryKey LURE = of("lure"); - public static final RegistryKey LOYALTY = of("loyalty"); - public static final RegistryKey IMPALING = of("impaling"); - public static final RegistryKey RIPTIDE = of("riptide"); - public static final RegistryKey CHANNELING = of("channeling"); - public static final RegistryKey MULTISHOT = of("multishot"); - public static final RegistryKey QUICK_CHARGE = of("quick_charge"); - public static final RegistryKey PIERCING = of("piercing"); - public static final RegistryKey MENDING = of("mending"); - public static final RegistryKey VANISHING_CURSE = of("vanishing_curse"); - - private EnchantmentKeys() {} - - private static RegistryKey of(String id) { - return RegistryKey.of(RegistryKeys.ENCHANTMENT, new Identifier(id)); - } -} diff --git a/src/main/java/net/errorcraft/itematic/enchantment/EnchantmentTags.java b/src/main/java/net/errorcraft/itematic/enchantment/EnchantmentTags.java deleted file mode 100644 index 0e410e27..00000000 --- a/src/main/java/net/errorcraft/itematic/enchantment/EnchantmentTags.java +++ /dev/null @@ -1,52 +0,0 @@ -package net.errorcraft.itematic.enchantment; - -import net.minecraft.enchantment.Enchantment; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.registry.tag.TagKey; -import net.minecraft.util.Identifier; - -public class EnchantmentTags { - public static final TagKey CURSED = of("cursed"); - public static final TagKey ENCHANTING = of("enchanting"); - public static final TagKey FORGING = of("forging"); - - public static final TagKey ARMOR_ENCHANTING = of("armor_enchanting"); - public static final TagKey BOOTS_ENCHANTING = of("boots_enchanting"); - public static final TagKey LEGGINGS_ENCHANTING = of("leggings_enchanting"); - public static final TagKey CHESTPLATE_ENCHANTING = of("chestplate_enchanting"); - public static final TagKey HELMET_ENCHANTING = of("helmet_enchanting"); - public static final TagKey SWORD_ENCHANTING = of("sword_enchanting"); - public static final TagKey TOOL_ENCHANTING = of("tool_enchanting"); - public static final TagKey TOOL_FORGING = of("tool_forging"); - public static final TagKey SHOVEL_ENCHANTING = of("shovel_enchanting"); - public static final TagKey PICKAXE_ENCHANTING = of("pickaxe_enchanting"); - public static final TagKey AXE_ENCHANTING = of("axe_enchanting"); - public static final TagKey HOE_ENCHANTING = of("hoe_enchanting"); - public static final TagKey BOW_ENCHANTING = of("bow_enchanting"); - public static final TagKey CROSSBOW_ENCHANTING = of("crossbow_enchanting"); - public static final TagKey TRIDENT_ENCHANTING = of("trident_enchanting"); - - public static final TagKey ARMOR_FORGING = of("armor_forging"); - public static final TagKey BOOTS_FORGING = of("boots_forging"); - public static final TagKey LEGGINGS_FORGING = of("leggings_forging"); - public static final TagKey CHESTPLATE_FORGING = of("chestplate_forging"); - public static final TagKey HELMET_FORGING = of("helmet_forging"); - public static final TagKey SWORD_FORGING = of("sword_forging"); - public static final TagKey SHOVEL_FORGING = of("shovel_forging"); - public static final TagKey PICKAXE_FORGING = of("pickaxe_forging"); - public static final TagKey AXE_FORGING = of("axe_forging"); - public static final TagKey HOE_FORGING = of("hoe_forging"); - public static final TagKey BOW_FORGING = of("bow_forging"); - public static final TagKey CROSSBOW_FORGING = of("crossbow_forging"); - public static final TagKey TRIDENT_FORGING = of("trident_forging"); - public static final TagKey STEERING_FORGING = of("steering_forging"); - public static final TagKey BRUSH_FORGING = of("brush_forging"); - - public static final TagKey TRADEABLE = of("tradeable"); - - private EnchantmentTags() {} - - private static TagKey of(String id) { - return TagKey.of(RegistryKeys.ENCHANTMENT, new Identifier(id)); - } -} diff --git a/src/main/java/net/errorcraft/itematic/entity/EntityTypeKeys.java b/src/main/java/net/errorcraft/itematic/entity/EntityTypeKeys.java index d3bf0c47..59febf98 100644 --- a/src/main/java/net/errorcraft/itematic/entity/EntityTypeKeys.java +++ b/src/main/java/net/errorcraft/itematic/entity/EntityTypeKeys.java @@ -13,6 +13,8 @@ public class EntityTypeKeys { public static final RegistryKey> BAT = of("bat"); public static final RegistryKey> BEE = of("bee"); public static final RegistryKey> BLAZE = of("blaze"); + public static final RegistryKey> BOGGED = of("bogged"); + public static final RegistryKey> BREEZE = of("breeze"); public static final RegistryKey> CAMEL = of("camel"); public static final RegistryKey> CAT = of("cat"); public static final RegistryKey> CAVE_SPIDER = of("cave_spider"); @@ -83,6 +85,7 @@ public class EntityTypeKeys { public static final RegistryKey> VINDICATOR = of("vindicator"); public static final RegistryKey> WANDERING_TRADER = of("wandering_trader"); public static final RegistryKey> WARDEN = of("warden"); + public static final RegistryKey> WIND_CHARGE = of("wind_charge"); public static final RegistryKey> WITCH = of("witch"); public static final RegistryKey> WITHER = of("wither"); public static final RegistryKey> WITHER_SKELETON = of("wither_skeleton"); diff --git a/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/EyeOfEnderEntityInitializer.java b/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/EyeOfEnderEntityInitializer.java index 3c6423a1..531963c8 100644 --- a/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/EyeOfEnderEntityInitializer.java +++ b/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/EyeOfEnderEntityInitializer.java @@ -12,11 +12,8 @@ import net.minecraft.registry.tag.StructureTags; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; -import net.minecraft.world.WorldEvents; import net.minecraft.world.event.GameEvent; public record EyeOfEnderEntityInitializer() implements EntityInitializer { @@ -45,8 +42,6 @@ public EyeOfEnderEntity create(ActionContext context) { Criteria.USED_ENDER_EYE.trigger(serverPlayer, strongholdPos); } - world.itematic$playSound(null, pos, SoundEvents.ENTITY_ENDER_EYE_LAUNCH, SoundCategory.NEUTRAL, 0.5f, 0.4f / (world.getRandom().nextFloat() * 0.4f + 0.8f)); - world.syncWorldEvent(null, WorldEvents.EYE_OF_ENDER_LAUNCHES, blockPos, 0); return entity; } diff --git a/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/PersistentProjectileEntityInitializer.java b/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/PersistentProjectileEntityInitializer.java index 5593dc6c..080d1107 100644 --- a/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/PersistentProjectileEntityInitializer.java +++ b/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/PersistentProjectileEntityInitializer.java @@ -10,15 +10,29 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; +import org.jetbrains.annotations.Nullable; public record PersistentProjectileEntityInitializer(EntityType type, OwnerCreator ownerCreator, SimpleCreator simpleCreator) implements EntityInitializer { @Override public T create(ActionContext context) { if (context.entity(ActionContextParameter.THIS).orElse(null) instanceof LivingEntity entity) { - return this.ownerCreator.create(context.world(), entity, context.stack().copyWithCount(1)); + return this.ownerCreator.create( + context.world(), + entity, + context.stack().copyWithCount(1), + entity.getActiveItem() + ); } + Vec3d pos = context.position(ActionContextParameter.TARGET); - T entity = this.simpleCreator.create(context.world(), pos.getX(), pos.getY(), pos.getZ(), context.stack().copyWithCount(1)); + T entity = this.simpleCreator.create( + context.world(), + pos.getX(), + pos.getY(), + pos.getZ(), + context.stack().copyWithCount(1), + null + ); entity.pickupType = PersistentProjectileEntity.PickupPermission.ALLOWED; return entity; } @@ -29,11 +43,11 @@ public static MapCodec { - T create(World world, LivingEntity owner, ItemStack stack); + T create(World world, LivingEntity owner, ItemStack ammunition, @Nullable ItemStack weapon); } @FunctionalInterface public interface SimpleCreator { - T create(World world, double x, double y, double z, ItemStack stack); + T create(World world, double x, double y, double z, ItemStack ammunition, @Nullable ItemStack weapon); } } diff --git a/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/TridentEntityInitializer.java b/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/TridentEntityInitializer.java index 8a8fd4ee..489519c3 100644 --- a/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/TridentEntityInitializer.java +++ b/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/TridentEntityInitializer.java @@ -8,10 +8,10 @@ import net.errorcraft.itematic.world.action.context.parameter.ActionContextParameter; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.EntityType; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.projectile.PersistentProjectileEntity; import net.minecraft.entity.projectile.TridentEntity; import net.minecraft.item.ItemStack; -import net.minecraft.server.world.ServerWorld; public record TridentEntityInitializer(boolean preventSpawnFromRiptide) implements EntityInitializer { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( @@ -26,9 +26,14 @@ public EntityType type() { @Override public TridentEntity create(ActionContext context) { ItemStack stack = context.stack(); - if (this.preventSpawnFromRiptide && EnchantmentHelper.getRiptide(stack) > 0) { + LivingEntity user = context.livingEntity(ActionContextParameter.THIS).orElse(null); + float spinAttackStrength = user != null ? + EnchantmentHelper.getTridentSpinAttackStrength(context.world(), stack, user) : + 0.0f; + if (this.preventSpawnFromRiptide && spinAttackStrength > 0.0f) { return null; } + stack.itematic$damage(1, context); TridentEntity entity = this.create(context, stack); stack.decrementUnlessCreative(1, context.player(ActionContextParameter.THIS).orElse(null)); @@ -41,11 +46,10 @@ public static TridentEntityInitializer of(boolean preventSpawnFromRiptide) { } private TridentEntity create(ActionContext context, ItemStack stack) { - ServerWorld world = context.world(); - return context.player(ActionContextParameter.THIS) - .map(player -> new TridentEntity(world, player, stack)) + return context.livingEntity(ActionContextParameter.THIS) + .map(user -> new TridentEntity(context.world(), user, stack)) .orElseGet(() -> { - TridentEntity entity = new TridentEntity(EntityType.TRIDENT, world); + TridentEntity entity = new TridentEntity(EntityType.TRIDENT, context.world()); entity.setPosition(context.position(ActionContextParameter.TARGET)); return entity; }); diff --git a/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/WindChargeEntityInitializer.java b/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/WindChargeEntityInitializer.java new file mode 100644 index 00000000..d5dca7f5 --- /dev/null +++ b/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/WindChargeEntityInitializer.java @@ -0,0 +1,60 @@ +package net.errorcraft.itematic.entity.initializer.initializers; + +import com.mojang.serialization.MapCodec; +import net.errorcraft.itematic.entity.initializer.EntityInitializer; +import net.errorcraft.itematic.world.action.context.ActionContext; +import net.errorcraft.itematic.world.action.context.parameter.ActionContextParameter; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.projectile.WindChargeEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.random.Random; + +public class WindChargeEntityInitializer implements EntityInitializer { + public static final WindChargeEntityInitializer INSTANCE = new WindChargeEntityInitializer(); + public static final MapCodec CODEC = MapCodec.unit(INSTANCE); + private static final double VELOCITY_DEVIATION = 0.11485d; + + private WindChargeEntityInitializer() {} + + @Override + public EntityType type() { + return EntityType.WIND_CHARGE; + } + + @Override + public WindChargeEntity create(ActionContext context) { + ServerWorld world = context.world(); + PlayerEntity user = context.player(ActionContextParameter.THIS).orElse(null); + if (user != null) { + return spawnFromUser(world, user); + } + + Direction side = context.side(); + if (side != null) { + return spawnFromSide(world, side, context.position(ActionContextParameter.TARGET)); + } + + return null; + } + + private static WindChargeEntity spawnFromUser(ServerWorld world, PlayerEntity user) { + Vec3d position = user.getEyePos().add(user.getRotationVecClient().multiply(0.8f)); + if (!world.getBlockState(BlockPos.ofFloored(position)).isReplaceable()) { + position = user.getEyePos().add(user.getRotationVecClient().multiply(0.05f)); + } + + return new WindChargeEntity(user, world, position.getX(), position.getY(), position.getZ()); + } + + private static WindChargeEntity spawnFromSide(ServerWorld world, Direction direction, Vec3d position) { + Random random = world.getRandom(); + double velocityX = random.nextTriangular(direction.getOffsetX(), VELOCITY_DEVIATION); + double velocityY = random.nextTriangular(direction.getOffsetY(), VELOCITY_DEVIATION); + double velocityZ = random.nextTriangular(direction.getOffsetZ(), VELOCITY_DEVIATION); + return new WindChargeEntity(world, position.getX(), position.getY(), position.getZ(), velocityX, velocityY, velocityZ); + } +} diff --git a/src/main/java/net/errorcraft/itematic/item/ItemKeys.java b/src/main/java/net/errorcraft/itematic/item/ItemKeys.java index 5d8b419f..cd4cc43e 100644 --- a/src/main/java/net/errorcraft/itematic/item/ItemKeys.java +++ b/src/main/java/net/errorcraft/itematic/item/ItemKeys.java @@ -19,6 +19,19 @@ public class ItemKeys { public static final RegistryKey POLISHED_DEEPSLATE = register("polished_deepslate"); public static final RegistryKey CALCITE = register("calcite"); public static final RegistryKey TUFF = register("tuff"); + public static final RegistryKey TUFF_SLAB = register("tuff_slab"); + public static final RegistryKey TUFF_STAIRS = register("tuff_stairs"); + public static final RegistryKey TUFF_WALL = register("tuff_wall"); + public static final RegistryKey CHISELED_TUFF = register("chiseled_tuff"); + public static final RegistryKey POLISHED_TUFF = register("polished_tuff"); + public static final RegistryKey POLISHED_TUFF_SLAB = register("polished_tuff_slab"); + public static final RegistryKey POLISHED_TUFF_STAIRS = register("polished_tuff_stairs"); + public static final RegistryKey POLISHED_TUFF_WALL = register("polished_tuff_wall"); + public static final RegistryKey TUFF_BRICKS = register("tuff_bricks"); + public static final RegistryKey TUFF_BRICK_SLAB = register("tuff_brick_slab"); + public static final RegistryKey TUFF_BRICK_STAIRS = register("tuff_brick_stairs"); + public static final RegistryKey TUFF_BRICK_WALL = register("tuff_brick_wall"); + public static final RegistryKey CHISELED_TUFF_BRICKS = register("chiseled_tuff_bricks"); public static final RegistryKey DRIPSTONE_BLOCK = register("dripstone_block"); public static final RegistryKey GRASS_BLOCK = register("grass_block"); public static final RegistryKey DIRT = register("dirt"); @@ -78,6 +91,7 @@ public class ItemKeys { public static final RegistryKey RAW_IRON_BLOCK = register("raw_iron_block"); public static final RegistryKey RAW_COPPER_BLOCK = register("raw_copper_block"); public static final RegistryKey RAW_GOLD_BLOCK = register("raw_gold_block"); + public static final RegistryKey HEAVY_CORE = register("heavy_core"); public static final RegistryKey AMETHYST_BLOCK = register("amethyst_block"); public static final RegistryKey BUDDING_AMETHYST = register("budding_amethyst"); public static final RegistryKey IRON_BLOCK = register("iron_block"); @@ -88,6 +102,10 @@ public class ItemKeys { public static final RegistryKey EXPOSED_COPPER = register("exposed_copper"); public static final RegistryKey WEATHERED_COPPER = register("weathered_copper"); public static final RegistryKey OXIDIZED_COPPER = register("oxidized_copper"); + public static final RegistryKey CHISELED_COPPER = register("chiseled_copper"); + public static final RegistryKey EXPOSED_CHISELED_COPPER = register("exposed_chiseled_copper"); + public static final RegistryKey WEATHERED_CHISELED_COPPER = register("weathered_chiseled_copper"); + public static final RegistryKey OXIDIZED_CHISELED_COPPER = register("oxidized_chiseled_copper"); public static final RegistryKey CUT_COPPER = register("cut_copper"); public static final RegistryKey EXPOSED_CUT_COPPER = register("exposed_cut_copper"); public static final RegistryKey WEATHERED_CUT_COPPER = register("weathered_cut_copper"); @@ -104,6 +122,10 @@ public class ItemKeys { public static final RegistryKey WAXED_EXPOSED_COPPER = register("waxed_exposed_copper"); public static final RegistryKey WAXED_WEATHERED_COPPER = register("waxed_weathered_copper"); public static final RegistryKey WAXED_OXIDIZED_COPPER = register("waxed_oxidized_copper"); + public static final RegistryKey WAXED_CHISELED_COPPER = register("waxed_chiseled_copper"); + public static final RegistryKey WAXED_EXPOSED_CHISELED_COPPER = register("waxed_exposed_chiseled_copper"); + public static final RegistryKey WAXED_WEATHERED_CHISELED_COPPER = register("waxed_weathered_chiseled_copper"); + public static final RegistryKey WAXED_OXIDIZED_CHISELED_COPPER = register("waxed_oxidized_chiseled_copper"); public static final RegistryKey WAXED_CUT_COPPER = register("waxed_cut_copper"); public static final RegistryKey WAXED_EXPOSED_CUT_COPPER = register("waxed_exposed_cut_copper"); public static final RegistryKey WAXED_WEATHERED_CUT_COPPER = register("waxed_weathered_cut_copper"); @@ -706,6 +728,14 @@ public class ItemKeys { public static final RegistryKey BAMBOO_DOOR = register("bamboo_door"); public static final RegistryKey CRIMSON_DOOR = register("crimson_door"); public static final RegistryKey WARPED_DOOR = register("warped_door"); + public static final RegistryKey COPPER_DOOR = register("copper_door"); + public static final RegistryKey EXPOSED_COPPER_DOOR = register("exposed_copper_door"); + public static final RegistryKey WEATHERED_COPPER_DOOR = register("weathered_copper_door"); + public static final RegistryKey OXIDIZED_COPPER_DOOR = register("oxidized_copper_door"); + public static final RegistryKey WAXED_COPPER_DOOR = register("waxed_copper_door"); + public static final RegistryKey WAXED_EXPOSED_COPPER_DOOR = register("waxed_exposed_copper_door"); + public static final RegistryKey WAXED_WEATHERED_COPPER_DOOR = register("waxed_weathered_copper_door"); + public static final RegistryKey WAXED_OXIDIZED_COPPER_DOOR = register("waxed_oxidized_copper_door"); public static final RegistryKey IRON_TRAPDOOR = register("iron_trapdoor"); public static final RegistryKey OAK_TRAPDOOR = register("oak_trapdoor"); public static final RegistryKey SPRUCE_TRAPDOOR = register("spruce_trapdoor"); @@ -718,6 +748,14 @@ public class ItemKeys { public static final RegistryKey BAMBOO_TRAPDOOR = register("bamboo_trapdoor"); public static final RegistryKey CRIMSON_TRAPDOOR = register("crimson_trapdoor"); public static final RegistryKey WARPED_TRAPDOOR = register("warped_trapdoor"); + public static final RegistryKey COPPER_TRAPDOOR = register("copper_trapdoor"); + public static final RegistryKey EXPOSED_COPPER_TRAPDOOR = register("exposed_copper_trapdoor"); + public static final RegistryKey WEATHERED_COPPER_TRAPDOOR = register("weathered_copper_trapdoor"); + public static final RegistryKey OXIDIZED_COPPER_TRAPDOOR = register("oxidized_copper_trapdoor"); + public static final RegistryKey WAXED_COPPER_TRAPDOOR = register("waxed_copper_trapdoor"); + public static final RegistryKey WAXED_EXPOSED_COPPER_TRAPDOOR = register("waxed_exposed_copper_trapdoor"); + public static final RegistryKey WAXED_WEATHERED_COPPER_TRAPDOOR = register("waxed_weathered_copper_trapdoor"); + public static final RegistryKey WAXED_OXIDIZED_COPPER_TRAPDOOR = register("waxed_oxidized_copper_trapdoor"); public static final RegistryKey OAK_FENCE_GATE = register("oak_fence_gate"); public static final RegistryKey SPRUCE_FENCE_GATE = register("spruce_fence_gate"); public static final RegistryKey BIRCH_FENCE_GATE = register("birch_fence_gate"); @@ -949,6 +987,7 @@ public class ItemKeys { public static final RegistryKey RED_BED = register("red_bed"); public static final RegistryKey BLACK_BED = register("black_bed"); public static final RegistryKey COOKIE = register("cookie"); + public static final RegistryKey CRAFTER = register("crafter"); public static final RegistryKey FILLED_MAP = register("filled_map"); public static final RegistryKey SHEARS = register("shears"); public static final RegistryKey MELON_SLICE = register("melon_slice"); @@ -981,6 +1020,8 @@ public class ItemKeys { public static final RegistryKey BAT_SPAWN_EGG = register("bat_spawn_egg"); public static final RegistryKey BEE_SPAWN_EGG = register("bee_spawn_egg"); public static final RegistryKey BLAZE_SPAWN_EGG = register("blaze_spawn_egg"); + public static final RegistryKey BOGGED_SPAWN_EGG = register("bogged_spawn_egg"); + public static final RegistryKey BREEZE_SPAWN_EGG = register("breeze_spawn_egg"); public static final RegistryKey CAT_SPAWN_EGG = register("cat_spawn_egg"); public static final RegistryKey CAMEL_SPAWN_EGG = register("camel_spawn_egg"); public static final RegistryKey CAVE_SPIDER_SPAWN_EGG = register("cave_spider_spawn_egg"); @@ -1055,8 +1096,10 @@ public class ItemKeys { public static final RegistryKey ZOMBIFIED_PIGLIN_SPAWN_EGG = register("zombified_piglin_spawn_egg"); public static final RegistryKey EXPERIENCE_BOTTLE = register("experience_bottle"); public static final RegistryKey FIRE_CHARGE = register("fire_charge"); + public static final RegistryKey WIND_CHARGE = register("wind_charge"); public static final RegistryKey WRITABLE_BOOK = register("writable_book"); public static final RegistryKey WRITTEN_BOOK = register("written_book"); + public static final RegistryKey MACE = register("mace"); public static final RegistryKey ITEM_FRAME = register("item_frame"); public static final RegistryKey GLOW_ITEM_FRAME = register("glow_item_frame"); public static final RegistryKey FLOWER_POT = register("flower_pot"); @@ -1135,6 +1178,8 @@ public class ItemKeys { public static final RegistryKey MUSIC_DISC_CAT = register("music_disc_cat"); public static final RegistryKey MUSIC_DISC_BLOCKS = register("music_disc_blocks"); public static final RegistryKey MUSIC_DISC_CHIRP = register("music_disc_chirp"); + public static final RegistryKey MUSIC_DISC_CREATOR = register("music_disc_creator"); + public static final RegistryKey MUSIC_DISC_CREATOR_MUSIC_BOX = register("music_disc_creator_music_box"); public static final RegistryKey MUSIC_DISC_FAR = register("music_disc_far"); public static final RegistryKey MUSIC_DISC_MALL = register("music_disc_mall"); public static final RegistryKey MUSIC_DISC_MELLOHI = register("music_disc_mellohi"); @@ -1147,6 +1192,7 @@ public class ItemKeys { public static final RegistryKey MUSIC_DISC_RELIC = register("music_disc_relic"); public static final RegistryKey MUSIC_DISC_5 = register("music_disc_5"); public static final RegistryKey MUSIC_DISC_PIGSTEP = register("music_disc_pigstep"); + public static final RegistryKey MUSIC_DISC_PRECIPICE = register("music_disc_precipice"); public static final RegistryKey DISC_FRAGMENT_5 = register("disc_fragment_5"); public static final RegistryKey TRIDENT = register("trident"); public static final RegistryKey PHANTOM_MEMBRANE = register("phantom_membrane"); @@ -1161,6 +1207,8 @@ public class ItemKeys { public static final RegistryKey MOJANG_BANNER_PATTERN = register("mojang_banner_pattern"); public static final RegistryKey GLOBE_BANNER_PATTERN = register("globe_banner_pattern"); public static final RegistryKey PIGLIN_BANNER_PATTERN = register("piglin_banner_pattern"); + public static final RegistryKey FLOW_BANNER_PATTERN = register("flow_banner_pattern"); + public static final RegistryKey GUSTER_BANNER_PATTERN = register("guster_banner_pattern"); public static final RegistryKey GOAT_HORN = register("goat_horn"); public static final RegistryKey COMPOSTER = register("composter"); public static final RegistryKey BARREL = register("barrel"); @@ -1244,6 +1292,8 @@ public class ItemKeys { public static final RegistryKey SILENCE_ARMOR_TRIM_SMITHING_TEMPLATE = register("silence_armor_trim_smithing_template"); public static final RegistryKey RAISER_ARMOR_TRIM_SMITHING_TEMPLATE = register("raiser_armor_trim_smithing_template"); public static final RegistryKey HOST_ARMOR_TRIM_SMITHING_TEMPLATE = register("host_armor_trim_smithing_template"); + public static final RegistryKey FLOW_ARMOR_TRIM_SMITHING_TEMPLATE = register("flow_armor_trim_smithing_template"); + public static final RegistryKey BOLT_ARMOR_TRIM_SMITHING_TEMPLATE = register("bolt_armor_trim_smithing_template"); public static final RegistryKey ANGLER_POTTERY_SHERD = register("angler_pottery_sherd"); public static final RegistryKey ARCHER_POTTERY_SHERD = register("archer_pottery_sherd"); public static final RegistryKey ARMS_UP_POTTERY_SHERD = register("arms_up_pottery_sherd"); @@ -1252,7 +1302,9 @@ public class ItemKeys { public static final RegistryKey BURN_POTTERY_SHERD = register("burn_pottery_sherd"); public static final RegistryKey DANGER_POTTERY_SHERD = register("danger_pottery_sherd"); public static final RegistryKey EXPLORER_POTTERY_SHERD = register("explorer_pottery_sherd"); + public static final RegistryKey FLOW_POTTERY_SHERD = register("flow_pottery_sherd"); public static final RegistryKey FRIEND_POTTERY_SHERD = register("friend_pottery_sherd"); + public static final RegistryKey GUSTER_POTTERY_SHERD = register("guster_pottery_sherd"); public static final RegistryKey HEART_POTTERY_SHERD = register("heart_pottery_sherd"); public static final RegistryKey HEARTBREAK_POTTERY_SHERD = register("heartbreak_pottery_sherd"); public static final RegistryKey HOWL_POTTERY_SHERD = register("howl_pottery_sherd"); @@ -1260,10 +1312,33 @@ public class ItemKeys { public static final RegistryKey MOURNER_POTTERY_SHERD = register("mourner_pottery_sherd"); public static final RegistryKey PLENTY_POTTERY_SHERD = register("plenty_pottery_sherd"); public static final RegistryKey PRIZE_POTTERY_SHERD = register("prize_pottery_sherd"); + public static final RegistryKey SCRAPE_POTTERY_SHERD = register("scrape_pottery_sherd"); public static final RegistryKey SHEAF_POTTERY_SHERD = register("sheaf_pottery_sherd"); public static final RegistryKey SHELTER_POTTERY_SHERD = register("shelter_pottery_sherd"); public static final RegistryKey SKULL_POTTERY_SHERD = register("skull_pottery_sherd"); public static final RegistryKey SNORT_POTTERY_SHERD = register("snort_pottery_sherd"); + public static final RegistryKey COPPER_GRATE = register("copper_grate"); + public static final RegistryKey EXPOSED_COPPER_GRATE = register("exposed_copper_grate"); + public static final RegistryKey WEATHERED_COPPER_GRATE = register("weathered_copper_grate"); + public static final RegistryKey OXIDIZED_COPPER_GRATE = register("oxidized_copper_grate"); + public static final RegistryKey WAXED_COPPER_GRATE = register("waxed_copper_grate"); + public static final RegistryKey WAXED_EXPOSED_COPPER_GRATE = register("waxed_exposed_copper_grate"); + public static final RegistryKey WAXED_WEATHERED_COPPER_GRATE = register("waxed_weathered_copper_grate"); + public static final RegistryKey WAXED_OXIDIZED_COPPER_GRATE = register("waxed_oxidized_copper_grate"); + public static final RegistryKey COPPER_BULB = register("copper_bulb"); + public static final RegistryKey EXPOSED_COPPER_BULB = register("exposed_copper_bulb"); + public static final RegistryKey WEATHERED_COPPER_BULB = register("weathered_copper_bulb"); + public static final RegistryKey OXIDIZED_COPPER_BULB = register("oxidized_copper_bulb"); + public static final RegistryKey WAXED_COPPER_BULB = register("waxed_copper_bulb"); + public static final RegistryKey WAXED_EXPOSED_COPPER_BULB = register("waxed_exposed_copper_bulb"); + public static final RegistryKey WAXED_WEATHERED_COPPER_BULB = register("waxed_weathered_copper_bulb"); + public static final RegistryKey WAXED_OXIDIZED_COPPER_BULB = register("waxed_oxidized_copper_bulb"); + public static final RegistryKey TRIAL_SPAWNER = register("trial_spawner"); + public static final RegistryKey TRIAL_KEY = register("trial_key"); + public static final RegistryKey OMINOUS_TRIAL_KEY = register("ominous_trial_key"); + public static final RegistryKey VAULT = register("vault"); + public static final RegistryKey OMINOUS_BOTTLE = register("ominous_bottle"); + public static final RegistryKey BREEZE_ROD = register("breeze_rod"); private static RegistryKey register(String name) { diff --git a/src/main/java/net/errorcraft/itematic/item/ItemUtil.java b/src/main/java/net/errorcraft/itematic/item/ItemUtil.java index 66584d0b..6422741d 100644 --- a/src/main/java/net/errorcraft/itematic/item/ItemUtil.java +++ b/src/main/java/net/errorcraft/itematic/item/ItemUtil.java @@ -5,7 +5,7 @@ import net.errorcraft.itematic.block.BlockKeys; import net.errorcraft.itematic.block.ComposterBlockUtil; import net.errorcraft.itematic.block.entity.FurnaceBlockEntityUtil; -import net.errorcraft.itematic.enchantment.EnchantmentTags; +import net.errorcraft.itematic.component.type.ItemDamageRulesDataComponent; import net.errorcraft.itematic.entity.EntityTypeKeys; import net.errorcraft.itematic.entity.ItematicEntityTypeTags; import net.errorcraft.itematic.entity.effect.StatusEffectKeys; @@ -27,6 +27,8 @@ import net.errorcraft.itematic.item.holder.rule.rules.RejectItemHolderRule; import net.errorcraft.itematic.item.pointer.Pointer; import net.errorcraft.itematic.item.pointer.PointerKeys; +import net.errorcraft.itematic.item.shooter.method.methods.ChargeableShooterMethod; +import net.errorcraft.itematic.item.shooter.method.methods.DirectShooterMethod; import net.errorcraft.itematic.item.smithing.template.SmithingTemplate; import net.errorcraft.itematic.item.smithing.template.SmithingTemplates; import net.errorcraft.itematic.loot.predicate.SideCheckPredicate; @@ -52,6 +54,7 @@ import net.minecraft.component.ComponentChanges; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.*; +import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.Enchantments; import net.minecraft.entity.EntityType; import net.minecraft.entity.EquipmentSlot; @@ -139,6 +142,7 @@ private static class Bootstrapper { private final RegistryEntryLookup decoratedPotPatterns; private final RegistryEntryLookup statusEffects; private final RegistryEntryLookup potions; + private final RegistryEntryLookup enchantments; private Bootstrapper(Registerable registerable) { this.registerable = registerable; @@ -156,6 +160,7 @@ private Bootstrapper(Registerable registerable) { this.decoratedPotPatterns = registerable.getRegistryLookup(RegistryKeys.DECORATED_POT_PATTERN); this.statusEffects = registerable.getRegistryLookup(RegistryKeys.STATUS_EFFECT); this.potions = registerable.getRegistryLookup(RegistryKeys.POTION); + this.enchantments = registerable.getRegistryLookup(RegistryKeys.ENCHANTMENT); } private void bootstrap() { @@ -183,11 +188,12 @@ private void bootstrapConsumables() { ItemBase.Builder.forItem(ItemKeys.MILK_BUCKET).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(1)) - .with(UseableItemComponent.builder() - .ticks(MilkBucketItemAccessor.getMaxUseTime()) - .animation(UseAction.DRINK) + .with(ConsumableItemComponent.builder(MilkBucketItemAccessor.getMaxUseTime()) + .useAnimation(UseAction.DRINK) + .resultItem(this.items.getOrThrow(ItemKeys.BUCKET)) + .noConsumeParticles() + .consumeSound(this.soundEvents.getOrThrow(SoundEventKeys.GENERIC_DRINK)) .build()) - .with(ConsumableItemComponent.of(this.items.getOrThrow(ItemKeys.BUCKET))) .with(RecipeRemainderItemComponent.of(this.items.getOrThrow(ItemKeys.BUCKET))) .build(), ItemEventMap.builder() @@ -198,13 +204,14 @@ private void bootstrapConsumables() { ItemBase.Builder.forItem(ItemKeys.POTION).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(1)) - .with(UseableItemComponent.builder() - .ticks(PotionItemAccessor.getMaxUseTime()) - .animation(UseAction.DRINK) + .with(ConsumableItemComponent.builder(PotionItemAccessor.getMaxUseTime()) + .useAnimation(UseAction.DRINK) + .resultItem(this.items.getOrThrow(ItemKeys.GLASS_BOTTLE)) + .noConsumeParticles() + .consumeSound(this.soundEvents.getOrThrow(SoundEventKeys.GENERIC_DRINK)) .build()) .with(PotionItemComponent.INSTANCE) .with(PotionHolderItemComponent.of(1.0f)) - .with(ConsumableItemComponent.of(this.items.getOrThrow(ItemKeys.GLASS_BOTTLE))) .with(TintedItemComponent.of(PotionItemColor.INSTANCE)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.USE_ITEM_ON_BLOCK_OR_DISPENSE_ITEM))) .build(), @@ -247,6 +254,23 @@ private void bootstrapConsumables() { )) .build() )); + this.registerable.register(ItemKeys.OMINOUS_BOTTLE, create( + ItemBase.Builder.forItem(ItemKeys.OMINOUS_BOTTLE) + .rarity(Rarity.UNCOMMON) + .build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(ConsumableItemComponent.builder(OminousBottleItemAccessor.useDuration()) + .useAnimation(UseAction.DRINK) + .noConsumeParticles() + .consumeSound(this.soundEvents.getOrThrow(SoundEventKeys.GENERIC_DRINK)) + .build()) + .with(OminousEffectProviderItemComponent.INSTANCE) + .build(), + ItemEventMap.builder() + .add(ItemEvents.CONSUME_ITEM, ActionEntry.of(PlaySoundAction.of(ActionContextParameter.THIS, this.soundEvents.getOrThrow(SoundEventKeys.OMINOUS_BOTTLE_DISPOSE)))) + .build() + )); } private void bootstrapFood() { @@ -254,7 +278,7 @@ private void bootstrapFood() { ItemBase.Builder.forItem(ItemKeys.APPLE).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.APPLE)) + .with(ConsumableItemComponent.builder(FoodComponents.APPLE).build()) .with(CompostableItemComponent.of(ComposterBlockUtil.BIG_CHANCE_TO_COMPOST)) .build() )); @@ -262,7 +286,7 @@ private void bootstrapFood() { ItemBase.Builder.forItem(ItemKeys.MELON_SLICE).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.MELON_SLICE)) + .with(ConsumableItemComponent.builder(FoodComponents.MELON_SLICE).build()) .with(CompostableItemComponent.of(ComposterBlockUtil.HALF_CHANCE_TO_COMPOST)) .build() )); @@ -270,7 +294,7 @@ private void bootstrapFood() { ItemBase.Builder.forItem(ItemKeys.DRIED_KELP).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.DRIED_KELP)) + .with(ConsumableItemComponent.builder(FoodComponents.DRIED_KELP).build()) .with(CompostableItemComponent.of(ComposterBlockUtil.SMALL_CHANCE_TO_COMPOST)) .build() )); @@ -278,7 +302,7 @@ private void bootstrapFood() { ItemBase.Builder.forItem(ItemKeys.CARROT).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.CARROT)) + .with(ConsumableItemComponent.builder(FoodComponents.CARROT).build()) .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.CARROTS))) .with(CompostableItemComponent.of(ComposterBlockUtil.BIG_CHANCE_TO_COMPOST)) .build() @@ -287,7 +311,7 @@ private void bootstrapFood() { ItemBase.Builder.forItem(ItemKeys.POTATO).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.POTATO)) + .with(ConsumableItemComponent.builder(FoodComponents.POTATO).build()) .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.POTATOES))) .with(CompostableItemComponent.of(ComposterBlockUtil.BIG_CHANCE_TO_COMPOST)) .build() @@ -296,7 +320,7 @@ private void bootstrapFood() { ItemBase.Builder.forItem(ItemKeys.BAKED_POTATO).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.BAKED_POTATO)) + .with(ConsumableItemComponent.builder(FoodComponents.BAKED_POTATO).build()) .with(CompostableItemComponent.of(ComposterBlockUtil.ALMOST_GUARANTEED_TO_COMPOST)) .build() )); @@ -304,7 +328,7 @@ private void bootstrapFood() { ItemBase.Builder.forItem(ItemKeys.CHORUS_FRUIT).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.CHORUS_FRUIT)) + .with(ConsumableItemComponent.builder(FoodComponents.CHORUS_FRUIT).build()) .build(), ItemEventMap.builder() .add(ItemEvents.CONSUME_ITEM, ActionEntry.of(TeleportAction.of(16, ActionContextParameter.THIS))) @@ -314,7 +338,7 @@ private void bootstrapFood() { ItemBase.Builder.forItem(ItemKeys.BEETROOT).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.BEETROOT)) + .with(ConsumableItemComponent.builder(FoodComponents.BEETROOT).build()) .with(CompostableItemComponent.of(ComposterBlockUtil.BIG_CHANCE_TO_COMPOST)) .build() )); @@ -322,7 +346,7 @@ private void bootstrapFood() { ItemBase.Builder.forItem(ItemKeys.SWEET_BERRIES).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.SWEET_BERRIES)) + .with(ConsumableItemComponent.builder(FoodComponents.SWEET_BERRIES).build()) .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.SWEET_BERRY_BUSH))) .with(CompostableItemComponent.of(ComposterBlockUtil.SMALL_CHANCE_TO_COMPOST)) .build() @@ -331,7 +355,7 @@ private void bootstrapFood() { ItemBase.Builder.forItem(ItemKeys.GLOW_BERRIES).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.GLOW_BERRIES)) + .with(ConsumableItemComponent.builder(FoodComponents.GLOW_BERRIES).build()) .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.CAVE_VINES))) .with(CompostableItemComponent.of(ComposterBlockUtil.SMALL_CHANCE_TO_COMPOST)) .build() @@ -340,7 +364,7 @@ private void bootstrapFood() { ItemBase.Builder.forItem(ItemKeys.BREAD).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.BREAD)) + .with(ConsumableItemComponent.builder(FoodComponents.BREAD).build()) .with(CompostableItemComponent.of(ComposterBlockUtil.ALMOST_GUARANTEED_TO_COMPOST)) .build() )); @@ -348,148 +372,161 @@ private void bootstrapFood() { ItemBase.Builder.forItem(ItemKeys.COOKIE).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.COOKIE)) + .with(ConsumableItemComponent.builder(FoodComponents.COOKIE).build()) .with(CompostableItemComponent.of(ComposterBlockUtil.ALMOST_GUARANTEED_TO_COMPOST)) .build() )); + this.registerable.register(ItemKeys.CRAFTER, create( + ItemBase.Builder.forBlock(ItemKeys.CRAFTER).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.CRAFTER))) + .build() + )); this.registerable.register(ItemKeys.PORKCHOP, create( ItemBase.Builder.forItem(ItemKeys.PORKCHOP).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.PORKCHOP)) + .with(ConsumableItemComponent.builder(FoodComponents.PORKCHOP).build()) .build() )); this.registerable.register(ItemKeys.COOKED_PORKCHOP, create( ItemBase.Builder.forItem(ItemKeys.COOKED_PORKCHOP).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.COOKED_PORKCHOP)) + .with(ConsumableItemComponent.builder(FoodComponents.COOKED_PORKCHOP).build()) .build() )); this.registerable.register(ItemKeys.BEEF, create( ItemBase.Builder.forItem(ItemKeys.BEEF).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.BEEF)) + .with(ConsumableItemComponent.builder(FoodComponents.BEEF).build()) .build() )); this.registerable.register(ItemKeys.COOKED_BEEF, create( ItemBase.Builder.forItem(ItemKeys.COOKED_BEEF).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.COOKED_BEEF)) + .with(ConsumableItemComponent.builder(FoodComponents.COOKED_BEEF).build()) .build() )); this.registerable.register(ItemKeys.CHICKEN, create( ItemBase.Builder.forItem(ItemKeys.CHICKEN).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.CHICKEN)) + .with(ConsumableItemComponent.builder(FoodComponents.CHICKEN).build()) .build() )); this.registerable.register(ItemKeys.COOKED_CHICKEN, create( ItemBase.Builder.forItem(ItemKeys.COOKED_CHICKEN).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.COOKED_CHICKEN)) + .with(ConsumableItemComponent.builder(FoodComponents.COOKED_CHICKEN).build()) .build() )); this.registerable.register(ItemKeys.RABBIT, create( ItemBase.Builder.forItem(ItemKeys.RABBIT).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.RABBIT)) + .with(ConsumableItemComponent.builder(FoodComponents.RABBIT).build()) .build() )); this.registerable.register(ItemKeys.COOKED_RABBIT, create( ItemBase.Builder.forItem(ItemKeys.COOKED_RABBIT).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.COOKED_RABBIT)) + .with(ConsumableItemComponent.builder(FoodComponents.COOKED_RABBIT).build()) .build() )); this.registerable.register(ItemKeys.MUTTON, create( ItemBase.Builder.forItem(ItemKeys.MUTTON).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.MUTTON)) + .with(ConsumableItemComponent.builder(FoodComponents.MUTTON).build()) .build() )); this.registerable.register(ItemKeys.COOKED_MUTTON, create( ItemBase.Builder.forItem(ItemKeys.COOKED_MUTTON).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.COOKED_MUTTON)) + .with(ConsumableItemComponent.builder(FoodComponents.COOKED_MUTTON).build()) .build() )); this.registerable.register(ItemKeys.COD, create( ItemBase.Builder.forItem(ItemKeys.COD).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.COD)) + .with(ConsumableItemComponent.builder(FoodComponents.COD).build()) .build() )); this.registerable.register(ItemKeys.SALMON, create( ItemBase.Builder.forItem(ItemKeys.SALMON).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.SALMON)) + .with(ConsumableItemComponent.builder(FoodComponents.SALMON).build()) .build() )); this.registerable.register(ItemKeys.TROPICAL_FISH, create( ItemBase.Builder.forItem(ItemKeys.TROPICAL_FISH).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.TROPICAL_FISH)) + .with(ConsumableItemComponent.builder(FoodComponents.TROPICAL_FISH).build()) .build() )); this.registerable.register(ItemKeys.PUFFERFISH, create( ItemBase.Builder.forItem(ItemKeys.PUFFERFISH).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.PUFFERFISH)) + .with(ConsumableItemComponent.builder(FoodComponents.PUFFERFISH).build()) .build() )); this.registerable.register(ItemKeys.COOKED_COD, create( ItemBase.Builder.forItem(ItemKeys.COOKED_COD).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.COOKED_COD)) + .with(ConsumableItemComponent.builder(FoodComponents.COOKED_COD).build()) .build() )); this.registerable.register(ItemKeys.COOKED_SALMON, create( ItemBase.Builder.forItem(ItemKeys.COOKED_SALMON).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.COOKED_SALMON)) + .with(ConsumableItemComponent.builder(FoodComponents.COOKED_SALMON).build()) .build() )); this.registerable.register(ItemKeys.MUSHROOM_STEW, create( ItemBase.Builder.forItem(ItemKeys.MUSHROOM_STEW).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(1)) - .with(FoodItemComponent.from(FoodComponents.MUSHROOM_STEW, this.items.getOrThrow(ItemKeys.BOWL))) + .with(ConsumableItemComponent.builder(FoodComponents.MUSHROOM_STEW) + .resultItem(this.items.getOrThrow(ItemKeys.BOWL)) + .build()) .build() )); this.registerable.register(ItemKeys.RABBIT_STEW, create( ItemBase.Builder.forItem(ItemKeys.RABBIT_STEW).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(1)) - .with(FoodItemComponent.from(FoodComponents.RABBIT_STEW, this.items.getOrThrow(ItemKeys.BOWL))) + .with(ConsumableItemComponent.builder(FoodComponents.RABBIT_STEW) + .resultItem(this.items.getOrThrow(ItemKeys.BOWL)) + .build()) .build() )); this.registerable.register(ItemKeys.BEETROOT_SOUP, create( ItemBase.Builder.forItem(ItemKeys.BEETROOT_SOUP).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(1)) - .with(FoodItemComponent.from(FoodComponents.BEETROOT_SOUP)) + .with(ConsumableItemComponent.builder(FoodComponents.BEETROOT_SOUP).build()) .build() )); this.registerable.register(ItemKeys.SUSPICIOUS_STEW, create( ItemBase.Builder.forItem(ItemKeys.SUSPICIOUS_STEW).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(1)) - .with(FoodItemComponent.from(FoodComponents.SUSPICIOUS_STEW, this.items.getOrThrow(ItemKeys.BOWL))) + .with(ConsumableItemComponent.builder(FoodComponents.SUSPICIOUS_STEW) + .resultItem(this.items.getOrThrow(ItemKeys.BOWL)) + .build()) .build(), ItemEventMap.builder() .add(ItemEvents.CONSUME_ITEM, ActionEntry.of( @@ -503,21 +540,21 @@ private void bootstrapFood() { ItemBase.Builder.forItem(ItemKeys.ROTTEN_FLESH).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.ROTTEN_FLESH)) + .with(ConsumableItemComponent.builder(FoodComponents.ROTTEN_FLESH).build()) .build() )); this.registerable.register(ItemKeys.SPIDER_EYE, create( ItemBase.Builder.forItem(ItemKeys.SPIDER_EYE).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.SPIDER_EYE)) + .with(ConsumableItemComponent.builder(FoodComponents.SPIDER_EYE).build()) .build() )); this.registerable.register(ItemKeys.POISONOUS_POTATO, create( ItemBase.Builder.forItem(ItemKeys.POISONOUS_POTATO).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.POISONOUS_POTATO)) + .with(ConsumableItemComponent.builder(FoodComponents.POISONOUS_POTATO).build()) .build() )); this.registerable.register(ItemKeys.GOLDEN_APPLE, create( @@ -526,7 +563,7 @@ private void bootstrapFood() { .build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.GOLDEN_APPLE)) + .with(ConsumableItemComponent.builder(FoodComponents.GOLDEN_APPLE).build()) .build() )); this.registerable.register(ItemKeys.ENCHANTED_GOLDEN_APPLE, create( @@ -536,21 +573,21 @@ private void bootstrapFood() { .build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.ENCHANTED_GOLDEN_APPLE)) + .with(ConsumableItemComponent.builder(FoodComponents.ENCHANTED_GOLDEN_APPLE).build()) .build() )); this.registerable.register(ItemKeys.GOLDEN_CARROT, create( ItemBase.Builder.forItem(ItemKeys.GOLDEN_CARROT).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.GOLDEN_CARROT)) + .with(ConsumableItemComponent.builder(FoodComponents.GOLDEN_CARROT).build()) .build() )); this.registerable.register(ItemKeys.PUMPKIN_PIE, create( ItemBase.Builder.forItem(ItemKeys.PUMPKIN_PIE).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(FoodItemComponent.from(FoodComponents.PUMPKIN_PIE)) + .with(ConsumableItemComponent.builder(FoodComponents.PUMPKIN_PIE).build()) .with(CompostableItemComponent.of(ComposterBlockUtil.GUARANTEED_TO_COMPOST)) .build() )); @@ -558,7 +595,13 @@ private void bootstrapFood() { ItemBase.Builder.forItem(ItemKeys.HONEY_BOTTLE).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(16)) - .with(FoodItemComponent.from(FoodComponents.HONEY_BOTTLE, HoneyBottleItemAccessor.maxUseTime(), UseAction.DRINK, this.items.getOrThrow(ItemKeys.GLASS_BOTTLE))) + .with(ConsumableItemComponent.builder(HoneyBottleItemAccessor.useDuration()) + .food(FoodComponents.HONEY_BOTTLE) + .useAnimation(UseAction.DRINK) + .resultItem(this.items.getOrThrow(ItemKeys.GLASS_BOTTLE)) + .noConsumeParticles() + .consumeSound(this.soundEvents.getOrThrow(SoundEventKeys.HONEY_BOTTLE_DRINK)) + .build()) .with(RecipeRemainderItemComponent.of(this.items.getOrThrow(ItemKeys.GLASS_BOTTLE))) .build(), ItemEventMap.builder() @@ -661,6 +704,97 @@ private void bootstrapBlocks() { .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.TUFF))) .build() )); + this.registerable.register(ItemKeys.TUFF_SLAB, create( + ItemBase.Builder.forBlock(ItemKeys.TUFF_SLAB).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.TUFF_SLAB))) + .build() + )); + this.registerable.register(ItemKeys.TUFF_STAIRS, create( + ItemBase.Builder.forBlock(ItemKeys.TUFF_STAIRS).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.TUFF_STAIRS))) + .build() + )); + this.registerable.register(ItemKeys.TUFF_WALL, create( + ItemBase.Builder.forBlock(ItemKeys.TUFF_WALL).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.TUFF_WALL))) + .build() + )); + this.registerable.register(ItemKeys.CHISELED_TUFF, create( + ItemBase.Builder.forBlock(ItemKeys.CHISELED_TUFF).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.CHISELED_TUFF))) + .build() + )); + this.registerable.register(ItemKeys.POLISHED_TUFF, create( + ItemBase.Builder.forBlock(ItemKeys.POLISHED_TUFF).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.POLISHED_TUFF))) + .build() + )); + this.registerable.register(ItemKeys.POLISHED_TUFF_SLAB, create( + ItemBase.Builder.forBlock(ItemKeys.POLISHED_TUFF_SLAB).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.POLISHED_TUFF_SLAB))) + .build() + )); + this.registerable.register(ItemKeys.POLISHED_TUFF_STAIRS, create( + ItemBase.Builder.forBlock(ItemKeys.POLISHED_TUFF_STAIRS).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.POLISHED_TUFF_STAIRS))) + .build() + )); + this.registerable.register(ItemKeys.POLISHED_TUFF_WALL, create( + ItemBase.Builder.forBlock(ItemKeys.POLISHED_TUFF_WALL).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.POLISHED_TUFF_WALL))) + .build() + )); + this.registerable.register(ItemKeys.TUFF_BRICKS, create( + ItemBase.Builder.forBlock(ItemKeys.TUFF_BRICKS).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.TUFF_BRICKS))) + .build() + )); + this.registerable.register(ItemKeys.TUFF_BRICK_SLAB, create( + ItemBase.Builder.forBlock(ItemKeys.TUFF_BRICK_SLAB).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.TUFF_BRICK_SLAB))) + .build() + )); + this.registerable.register(ItemKeys.TUFF_BRICK_STAIRS, create( + ItemBase.Builder.forBlock(ItemKeys.TUFF_BRICK_STAIRS).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.TUFF_BRICK_STAIRS))) + .build() + )); + this.registerable.register(ItemKeys.TUFF_BRICK_WALL, create( + ItemBase.Builder.forBlock(ItemKeys.TUFF_BRICK_WALL).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.TUFF_BRICK_WALL))) + .build() + )); + this.registerable.register(ItemKeys.CHISELED_TUFF_BRICKS, create( + ItemBase.Builder.forBlock(ItemKeys.CHISELED_TUFF_BRICKS).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.CHISELED_TUFF_BRICKS))) + .build() + )); this.registerable.register(ItemKeys.DRIPSTONE_BLOCK, create( ItemBase.Builder.forBlock(ItemKeys.DRIPSTONE_BLOCK).build(), ItemComponentSet.builder() @@ -935,6 +1069,13 @@ private void bootstrapBlocks() { .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.RAW_GOLD_BLOCK))) .build() )); + this.registerable.register(ItemKeys.HEAVY_CORE, create( + ItemBase.Builder.forBlock(ItemKeys.HEAVY_CORE).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.HEAVY_CORE))) + .build() + )); this.registerable.register(ItemKeys.AMETHYST_BLOCK, create( ItemBase.Builder.forBlock(ItemKeys.AMETHYST_BLOCK).build(), ItemComponentSet.builder() @@ -998,6 +1139,34 @@ private void bootstrapBlocks() { .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.OXIDIZED_COPPER))) .build() )); + this.registerable.register(ItemKeys.CHISELED_COPPER, create( + ItemBase.Builder.forBlock(ItemKeys.CHISELED_COPPER).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.CHISELED_COPPER))) + .build() + )); + this.registerable.register(ItemKeys.EXPOSED_CHISELED_COPPER, create( + ItemBase.Builder.forBlock(ItemKeys.EXPOSED_CHISELED_COPPER).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.EXPOSED_CHISELED_COPPER))) + .build() + )); + this.registerable.register(ItemKeys.WEATHERED_CHISELED_COPPER, create( + ItemBase.Builder.forBlock(ItemKeys.WEATHERED_CHISELED_COPPER).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WEATHERED_CHISELED_COPPER))) + .build() + )); + this.registerable.register(ItemKeys.OXIDIZED_CHISELED_COPPER, create( + ItemBase.Builder.forBlock(ItemKeys.OXIDIZED_CHISELED_COPPER).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.OXIDIZED_CHISELED_COPPER))) + .build() + )); this.registerable.register(ItemKeys.CUT_COPPER, create( ItemBase.Builder.forBlock(ItemKeys.CUT_COPPER).build(), ItemComponentSet.builder() @@ -1110,6 +1279,34 @@ private void bootstrapBlocks() { .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WAXED_OXIDIZED_COPPER))) .build() )); + this.registerable.register(ItemKeys.WAXED_CHISELED_COPPER, create( + ItemBase.Builder.forBlock(ItemKeys.WAXED_CHISELED_COPPER).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WAXED_CHISELED_COPPER))) + .build() + )); + this.registerable.register(ItemKeys.WAXED_EXPOSED_CHISELED_COPPER, create( + ItemBase.Builder.forBlock(ItemKeys.WAXED_EXPOSED_CHISELED_COPPER).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WAXED_EXPOSED_CHISELED_COPPER))) + .build() + )); + this.registerable.register(ItemKeys.WAXED_WEATHERED_CHISELED_COPPER, create( + ItemBase.Builder.forBlock(ItemKeys.WAXED_WEATHERED_CHISELED_COPPER).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WAXED_WEATHERED_CHISELED_COPPER))) + .build() + )); + this.registerable.register(ItemKeys.WAXED_OXIDIZED_CHISELED_COPPER, create( + ItemBase.Builder.forBlock(ItemKeys.WAXED_OXIDIZED_CHISELED_COPPER).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WAXED_OXIDIZED_CHISELED_COPPER))) + .build() + )); this.registerable.register(ItemKeys.WAXED_CUT_COPPER, create( ItemBase.Builder.forBlock(ItemKeys.WAXED_CUT_COPPER).build(), ItemComponentSet.builder() @@ -3000,6 +3197,62 @@ private void bootstrapBlocks() { .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WARPED_DOOR))) .build() )); + this.registerable.register(ItemKeys.COPPER_DOOR, create( + ItemBase.Builder.forBlock(ItemKeys.COPPER_DOOR).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.COPPER_DOOR))) + .build() + )); + this.registerable.register(ItemKeys.EXPOSED_COPPER_DOOR, create( + ItemBase.Builder.forBlock(ItemKeys.EXPOSED_COPPER_DOOR).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.EXPOSED_COPPER_DOOR))) + .build() + )); + this.registerable.register(ItemKeys.WEATHERED_COPPER_DOOR, create( + ItemBase.Builder.forBlock(ItemKeys.WEATHERED_COPPER_DOOR).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WEATHERED_COPPER_DOOR))) + .build() + )); + this.registerable.register(ItemKeys.OXIDIZED_COPPER_DOOR, create( + ItemBase.Builder.forBlock(ItemKeys.OXIDIZED_COPPER_DOOR).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.OXIDIZED_COPPER_DOOR))) + .build() + )); + this.registerable.register(ItemKeys.WAXED_COPPER_DOOR, create( + ItemBase.Builder.forBlock(ItemKeys.WAXED_COPPER_DOOR).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WAXED_COPPER_DOOR))) + .build() + )); + this.registerable.register(ItemKeys.WAXED_EXPOSED_COPPER_DOOR, create( + ItemBase.Builder.forBlock(ItemKeys.WAXED_EXPOSED_COPPER_DOOR).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WAXED_EXPOSED_COPPER_DOOR))) + .build() + )); + this.registerable.register(ItemKeys.WAXED_WEATHERED_COPPER_DOOR, create( + ItemBase.Builder.forBlock(ItemKeys.WAXED_WEATHERED_COPPER_DOOR).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WAXED_WEATHERED_COPPER_DOOR))) + .build() + )); + this.registerable.register(ItemKeys.WAXED_OXIDIZED_COPPER_DOOR, create( + ItemBase.Builder.forBlock(ItemKeys.WAXED_OXIDIZED_COPPER_DOOR).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WAXED_OXIDIZED_COPPER_DOOR))) + .build() + )); this.registerable.register(ItemKeys.IRON_TRAPDOOR, create( ItemBase.Builder.forBlock(ItemKeys.IRON_TRAPDOOR).build(), ItemComponentSet.builder() @@ -3021,6 +3274,62 @@ private void bootstrapBlocks() { .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WARPED_TRAPDOOR))) .build() )); + this.registerable.register(ItemKeys.COPPER_TRAPDOOR, create( + ItemBase.Builder.forBlock(ItemKeys.COPPER_TRAPDOOR).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.COPPER_TRAPDOOR))) + .build() + )); + this.registerable.register(ItemKeys.EXPOSED_COPPER_TRAPDOOR, create( + ItemBase.Builder.forBlock(ItemKeys.EXPOSED_COPPER_TRAPDOOR).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.EXPOSED_COPPER_TRAPDOOR))) + .build() + )); + this.registerable.register(ItemKeys.WEATHERED_COPPER_TRAPDOOR, create( + ItemBase.Builder.forBlock(ItemKeys.WEATHERED_COPPER_TRAPDOOR).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WEATHERED_COPPER_TRAPDOOR))) + .build() + )); + this.registerable.register(ItemKeys.OXIDIZED_COPPER_TRAPDOOR, create( + ItemBase.Builder.forBlock(ItemKeys.OXIDIZED_COPPER_TRAPDOOR).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.OXIDIZED_COPPER_TRAPDOOR))) + .build() + )); + this.registerable.register(ItemKeys.WAXED_COPPER_TRAPDOOR, create( + ItemBase.Builder.forBlock(ItemKeys.WAXED_COPPER_TRAPDOOR).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WAXED_COPPER_TRAPDOOR))) + .build() + )); + this.registerable.register(ItemKeys.WAXED_EXPOSED_COPPER_TRAPDOOR, create( + ItemBase.Builder.forBlock(ItemKeys.WAXED_EXPOSED_COPPER_TRAPDOOR).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WAXED_EXPOSED_COPPER_TRAPDOOR))) + .build() + )); + this.registerable.register(ItemKeys.WAXED_WEATHERED_COPPER_TRAPDOOR, create( + ItemBase.Builder.forBlock(ItemKeys.WAXED_WEATHERED_COPPER_TRAPDOOR).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WAXED_WEATHERED_COPPER_TRAPDOOR))) + .build() + )); + this.registerable.register(ItemKeys.WAXED_OXIDIZED_COPPER_TRAPDOOR, create( + ItemBase.Builder.forBlock(ItemKeys.WAXED_OXIDIZED_COPPER_TRAPDOOR).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WAXED_OXIDIZED_COPPER_TRAPDOOR))) + .build() + )); this.registerable.register(ItemKeys.CRIMSON_FENCE_GATE, create( ItemBase.Builder.forBlock(ItemKeys.CRIMSON_FENCE_GATE).build(), ItemComponentSet.builder() @@ -3343,6 +3652,132 @@ private void bootstrapBlocks() { .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.FROGSPAWN), BlockItemComponent.Pass.FLUID)) .build() )); + this.registerable.register(ItemKeys.COPPER_GRATE, create( + ItemBase.Builder.forBlock(ItemKeys.COPPER_GRATE).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.COPPER_GRATE))) + .build() + )); + this.registerable.register(ItemKeys.EXPOSED_COPPER_GRATE, create( + ItemBase.Builder.forBlock(ItemKeys.EXPOSED_COPPER_GRATE).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.EXPOSED_COPPER_GRATE))) + .build() + )); + this.registerable.register(ItemKeys.WEATHERED_COPPER_GRATE, create( + ItemBase.Builder.forBlock(ItemKeys.WEATHERED_COPPER_GRATE).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WEATHERED_COPPER_GRATE))) + .build() + )); + this.registerable.register(ItemKeys.OXIDIZED_COPPER_GRATE, create( + ItemBase.Builder.forBlock(ItemKeys.OXIDIZED_COPPER_GRATE).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.OXIDIZED_COPPER_GRATE))) + .build() + )); + this.registerable.register(ItemKeys.WAXED_COPPER_GRATE, create( + ItemBase.Builder.forBlock(ItemKeys.WAXED_COPPER_GRATE).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WAXED_COPPER_GRATE))) + .build() + )); + this.registerable.register(ItemKeys.WAXED_EXPOSED_COPPER_GRATE, create( + ItemBase.Builder.forBlock(ItemKeys.WAXED_EXPOSED_COPPER_GRATE).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WAXED_EXPOSED_COPPER_GRATE))) + .build() + )); + this.registerable.register(ItemKeys.WAXED_WEATHERED_COPPER_GRATE, create( + ItemBase.Builder.forBlock(ItemKeys.WAXED_WEATHERED_COPPER_GRATE).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WAXED_WEATHERED_COPPER_GRATE))) + .build() + )); + this.registerable.register(ItemKeys.WAXED_OXIDIZED_COPPER_GRATE, create( + ItemBase.Builder.forBlock(ItemKeys.WAXED_OXIDIZED_COPPER_GRATE).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WAXED_OXIDIZED_COPPER_GRATE))) + .build() + )); + this.registerable.register(ItemKeys.COPPER_BULB, create( + ItemBase.Builder.forBlock(ItemKeys.COPPER_BULB).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.COPPER_BULB))) + .build() + )); + this.registerable.register(ItemKeys.EXPOSED_COPPER_BULB, create( + ItemBase.Builder.forBlock(ItemKeys.EXPOSED_COPPER_BULB).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.EXPOSED_COPPER_BULB))) + .build() + )); + this.registerable.register(ItemKeys.WEATHERED_COPPER_BULB, create( + ItemBase.Builder.forBlock(ItemKeys.WEATHERED_COPPER_BULB).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WEATHERED_COPPER_BULB))) + .build() + )); + this.registerable.register(ItemKeys.OXIDIZED_COPPER_BULB, create( + ItemBase.Builder.forBlock(ItemKeys.OXIDIZED_COPPER_BULB).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.OXIDIZED_COPPER_BULB))) + .build() + )); + this.registerable.register(ItemKeys.WAXED_COPPER_BULB, create( + ItemBase.Builder.forBlock(ItemKeys.WAXED_COPPER_BULB).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WAXED_COPPER_BULB))) + .build() + )); + this.registerable.register(ItemKeys.WAXED_EXPOSED_COPPER_BULB, create( + ItemBase.Builder.forBlock(ItemKeys.WAXED_EXPOSED_COPPER_BULB).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WAXED_EXPOSED_COPPER_BULB))) + .build() + )); + this.registerable.register(ItemKeys.WAXED_WEATHERED_COPPER_BULB, create( + ItemBase.Builder.forBlock(ItemKeys.WAXED_WEATHERED_COPPER_BULB).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WAXED_WEATHERED_COPPER_BULB))) + .build() + )); + this.registerable.register(ItemKeys.WAXED_OXIDIZED_COPPER_BULB, create( + ItemBase.Builder.forBlock(ItemKeys.WAXED_OXIDIZED_COPPER_BULB).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.WAXED_OXIDIZED_COPPER_BULB))) + .build() + )); + this.registerable.register(ItemKeys.TRIAL_SPAWNER, create( + ItemBase.Builder.forBlock(ItemKeys.TRIAL_SPAWNER).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.TRIAL_SPAWNER))) + .build() + )); + this.registerable.register(ItemKeys.VAULT, create( + ItemBase.Builder.forBlock(ItemKeys.VAULT).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.VAULT))) + .build() + )); } private void bootstrapAttachedToSideBlocks() { @@ -4825,9 +5260,14 @@ private void bootstrapToolsAndWeapons() { ItemComponentSet.builder() .with(StackableItemComponent.of(1)) .with(DamageableItemComponent.of(384)) - .with(ShooterItemComponent.of(this.items.getOrThrow(ItematicItemTags.BOW_AMMUNITION), this.items.getOrThrow(ItematicItemTags.BOW_AMMUNITION), BowItem.RANGE)) - .with(EnchantableItemComponent.enchants(1, EnchantmentTags.BOW_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.BOW_FORGING)) + .with(ShooterItemComponent.of( + UseAction.BOW, + this.items.getOrThrow(ItematicItemTags.BOW_AMMUNITION), + this.items.getOrThrow(ItematicItemTags.BOW_AMMUNITION), + BowItem.RANGE, + DirectShooterMethod.of() + )) + .with(EnchantableItemComponent.of(1)) .with(FuelItemComponent.of(FurnaceBlockEntityUtil.WOOD_FUEL_TIME)) .build() )); @@ -4836,9 +5276,24 @@ private void bootstrapToolsAndWeapons() { ItemComponentSet.builder() .with(StackableItemComponent.of(1)) .with(DamageableItemComponent.of(465)) - .with(ShooterItemComponent.of(this.items.getOrThrow(ItematicItemTags.CROSSBOW_AMMUNITION), this.items.getOrThrow(ItematicItemTags.BOW_AMMUNITION), CrossbowItem.RANGE, this.soundEvents.getOrThrow(SoundEventKeys.CROSSBOW_LOADING_START), this.soundEvents.getOrThrow(SoundEventKeys.CROSSBOW_QUICK_CHARGE_1), this.soundEvents.getOrThrow(SoundEventKeys.CROSSBOW_QUICK_CHARGE_2), this.soundEvents.getOrThrow(SoundEventKeys.CROSSBOW_QUICK_CHARGE_3))) - .with(EnchantableItemComponent.enchants(1, EnchantmentTags.CROSSBOW_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.CROSSBOW_FORGING)) + .with(ShooterItemComponent.of( + UseAction.CROSSBOW, + this.items.getOrThrow(ItematicItemTags.CROSSBOW_AMMUNITION), + this.items.getOrThrow(ItematicItemTags.BOW_AMMUNITION), + CrossbowItem.RANGE, + ChargeableShooterMethod.of( + CrossbowItemAccessor.defaultChargingSounds(), + ChargeableShooterMethod.ChargedPowerRules.Rule.of( + RegistryEntryList.of(this.items.getOrThrow(ItemKeys.FIREWORK_ROCKET)), + CrossbowItemAccessor.fireworkRocketPower() + ) + ), + ItemDamageRulesDataComponent.Rule.of( + RegistryEntryList.of(this.items.getOrThrow(ItemKeys.FIREWORK_ROCKET)), + 3 + ) + )) + .with(EnchantableItemComponent.of(1)) .with(FuelItemComponent.of(FurnaceBlockEntityUtil.WOOD_FUEL_TIME)) .build() )); @@ -4851,9 +5306,8 @@ private void bootstrapToolsAndWeapons() { .build()) .with(WeaponItemComponent.of(1, TridentItem.ATTACK_DAMAGE + 1, 0.275d)) .with(ThrowableItemComponent.trident(TridentItem.THROW_SPEED, 0.0f, TridentItem.MIN_DRAW_DURATION)) - .with(ProjectileItemComponent.of(TridentEntityInitializer.of(true), 1)) - .with(EnchantableItemComponent.enchants(1, EnchantmentTags.TRIDENT_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.TRIDENT_FORGING)) + .with(ProjectileItemComponent.of(TridentEntityInitializer.of(true))) + .with(EnchantableItemComponent.of(1)) .build(), ItemEventMap.builder() .add(ItemEvents.STOPPED_USING, ActionEntry.of( @@ -4869,7 +5323,7 @@ private void bootstrapToolsAndWeapons() { MatchToolLootCondition.builder( ItemPredicate.Builder.create() .subPredicate(ItemSubPredicateTypes.ENCHANTMENTS, EnchantmentsPredicate.enchantments(List.of( - new EnchantmentPredicate(Enchantments.RIPTIDE, NumberRange.IntRange.ANY) + new EnchantmentPredicate(this.enchantments.getOrThrow(Enchantments.RIPTIDE), NumberRange.IntRange.ANY) )))) ).build() ), @@ -4884,7 +5338,6 @@ private void bootstrapToolsAndWeapons() { ItemComponentSet.builder() .with(StackableItemComponent.of(1)) .with(DamageableItemComponent.of(25)) - .with(ForgeableItemComponent.of(EnchantmentTags.STEERING_FORGING)) .with(SteeringItemComponent.of(this.entityTypes.getOrThrow(EntityTypeKeys.PIG), 7)) .build(), ItemEventMap.builder() @@ -4896,7 +5349,6 @@ private void bootstrapToolsAndWeapons() { ItemComponentSet.builder() .with(StackableItemComponent.of(1)) .with(DamageableItemComponent.of(100)) - .with(ForgeableItemComponent.of(EnchantmentTags.STEERING_FORGING)) .with(SteeringItemComponent.of(this.entityTypes.getOrThrow(EntityTypeKeys.STRIDER), 1)) .build(), ItemEventMap.builder() @@ -4927,10 +5379,20 @@ private void bootstrapToolsAndWeapons() { .with(StackableItemComponent.of(1)) .with(BrushItemComponent.of(BrushItemAccessor.maxBrushTime())) .with(DamageableItemComponent.of(64)) - .with(ForgeableItemComponent.of(EnchantmentTags.BRUSH_FORGING)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.BRUSH))) .build() )); + this.registerable.register(ItemKeys.MACE, create( + ItemBase.Builder.forItem(ItemKeys.MACE).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(1)) + .with(DamageableItemComponent.of(500)) + .with(ToolItemComponent.builder(2).build()) + .with(WeaponItemComponent.ofSmashing(1, 6.0d, 0.125d)) + .with(EnchantableItemComponent.of(15)) + .with(RepairableItemComponent.of(ItematicItemTags.REPAIRS_MACE)) + .build() + )); } private void bootstrapEntities() { @@ -5206,6 +5668,20 @@ private void bootstrapSpawnEggs() { .with(SpawnEggItemComponent.from(this.entityTypes.getOrThrow(EntityTypeKeys.BLAZE), 0xf6b201, 0xfff87e, this.dispenseBehaviors)) .build() )); + this.registerable.register(ItemKeys.BOGGED_SPAWN_EGG, create( + ItemBase.Builder.forItem(ItemKeys.BOGGED_SPAWN_EGG).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(SpawnEggItemComponent.from(this.entityTypes.getOrThrow(EntityTypeKeys.BOGGED), 0x8a9c72, 0x314d1b, this.dispenseBehaviors)) + .build() + )); + this.registerable.register(ItemKeys.BREEZE_SPAWN_EGG, create( + ItemBase.Builder.forItem(ItemKeys.BREEZE_SPAWN_EGG).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(SpawnEggItemComponent.from(this.entityTypes.getOrThrow(EntityTypeKeys.BREEZE), 0xaf94df, 0x9166df, this.dispenseBehaviors)) + .build() + )); this.registerable.register(ItemKeys.CAT_SPAWN_EGG, create( ItemBase.Builder.forItem(ItemKeys.CAT_SPAWN_EGG).build(), ItemComponentSet.builder() @@ -6627,8 +7103,7 @@ private void bootstrapArmor() { ItemBase.Builder.forItem(ItemKeys.LEATHER_HELMET).build(), ItemComponentSet.builder() .with(ArmorItemComponent.of(ArmorItem.Type.HELMET, 5, this.armorMaterials.getOrThrow(ArmorMaterialKeys.LEATHER), this.soundEvents.getOrThrow(SoundEventKeys.ARMOR_EQUIP_LEATHER))) - .with(EnchantableItemComponent.enchants(ArmorMaterials.LEATHER, EnchantmentTags.HELMET_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.HELMET_FORGING)) + .with(EnchantableItemComponent.of(ArmorMaterials.LEATHER)) .with(RepairableItemComponent.of(ItematicItemTags.REPAIRS_LEATHER_ARMOR)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY))) .with(DyeableItemComponent.of()) @@ -6639,8 +7114,7 @@ private void bootstrapArmor() { ItemBase.Builder.forItem(ItemKeys.LEATHER_CHESTPLATE).build(), ItemComponentSet.builder() .with(ArmorItemComponent.of(ArmorItem.Type.CHESTPLATE, 5, this.armorMaterials.getOrThrow(ArmorMaterialKeys.LEATHER), this.soundEvents.getOrThrow(SoundEventKeys.ARMOR_EQUIP_LEATHER))) - .with(EnchantableItemComponent.enchants(ArmorMaterials.LEATHER, EnchantmentTags.CHESTPLATE_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.CHESTPLATE_FORGING)) + .with(EnchantableItemComponent.of(ArmorMaterials.LEATHER)) .with(RepairableItemComponent.of(ItematicItemTags.REPAIRS_LEATHER_ARMOR)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY))) .with(DyeableItemComponent.of()) @@ -6651,8 +7125,7 @@ private void bootstrapArmor() { ItemBase.Builder.forItem(ItemKeys.LEATHER_LEGGINGS).build(), ItemComponentSet.builder() .with(ArmorItemComponent.of(ArmorItem.Type.LEGGINGS, 5, this.armorMaterials.getOrThrow(ArmorMaterialKeys.LEATHER), this.soundEvents.getOrThrow(SoundEventKeys.ARMOR_EQUIP_LEATHER))) - .with(EnchantableItemComponent.enchants(ArmorMaterials.LEATHER, EnchantmentTags.LEGGINGS_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.LEGGINGS_FORGING)) + .with(EnchantableItemComponent.of(ArmorMaterials.LEATHER)) .with(RepairableItemComponent.of(ItematicItemTags.REPAIRS_LEATHER_ARMOR)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY))) .with(DyeableItemComponent.of()) @@ -6663,8 +7136,7 @@ private void bootstrapArmor() { ItemBase.Builder.forItem(ItemKeys.LEATHER_BOOTS).build(), ItemComponentSet.builder() .with(ArmorItemComponent.of(ArmorItem.Type.BOOTS, 5, this.armorMaterials.getOrThrow(ArmorMaterialKeys.LEATHER), this.soundEvents.getOrThrow(SoundEventKeys.ARMOR_EQUIP_LEATHER))) - .with(EnchantableItemComponent.enchants(ArmorMaterials.LEATHER, EnchantmentTags.BOOTS_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.BOOTS_FORGING)) + .with(EnchantableItemComponent.of(ArmorMaterials.LEATHER)) .with(RepairableItemComponent.of(ItematicItemTags.REPAIRS_LEATHER_ARMOR)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY))) .with(DyeableItemComponent.of()) @@ -6675,8 +7147,7 @@ private void bootstrapArmor() { ItemBase.Builder.forItem(ItemKeys.CHAINMAIL_HELMET).build(), ItemComponentSet.builder() .with(ArmorItemComponent.of(ArmorItem.Type.HELMET, 15, this.armorMaterials.getOrThrow(ArmorMaterialKeys.CHAINMAIL), this.soundEvents.getOrThrow(SoundEventKeys.ARMOR_EQUIP_CHAIN))) - .with(EnchantableItemComponent.enchants(ArmorMaterials.CHAIN, EnchantmentTags.HELMET_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.HELMET_FORGING)) + .with(EnchantableItemComponent.of(ArmorMaterials.CHAIN)) .with(RepairableItemComponent.of(ItematicItemTags.REPAIRS_CHAINMAIL_ARMOR)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY))) .build() @@ -6685,8 +7156,7 @@ private void bootstrapArmor() { ItemBase.Builder.forItem(ItemKeys.CHAINMAIL_CHESTPLATE).build(), ItemComponentSet.builder() .with(ArmorItemComponent.of(ArmorItem.Type.CHESTPLATE, 15, this.armorMaterials.getOrThrow(ArmorMaterialKeys.CHAINMAIL), this.soundEvents.getOrThrow(SoundEventKeys.ARMOR_EQUIP_CHAIN))) - .with(EnchantableItemComponent.enchants(ArmorMaterials.CHAIN, EnchantmentTags.CHESTPLATE_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.CHESTPLATE_FORGING)) + .with(EnchantableItemComponent.of(ArmorMaterials.CHAIN)) .with(RepairableItemComponent.of(ItematicItemTags.REPAIRS_CHAINMAIL_ARMOR)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY))) .build() @@ -6695,8 +7165,7 @@ private void bootstrapArmor() { ItemBase.Builder.forItem(ItemKeys.CHAINMAIL_LEGGINGS).build(), ItemComponentSet.builder() .with(ArmorItemComponent.of(ArmorItem.Type.LEGGINGS, 15, this.armorMaterials.getOrThrow(ArmorMaterialKeys.CHAINMAIL), this.soundEvents.getOrThrow(SoundEventKeys.ARMOR_EQUIP_CHAIN))) - .with(EnchantableItemComponent.enchants(ArmorMaterials.CHAIN, EnchantmentTags.LEGGINGS_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.LEGGINGS_FORGING)) + .with(EnchantableItemComponent.of(ArmorMaterials.CHAIN)) .with(RepairableItemComponent.of(ItematicItemTags.REPAIRS_CHAINMAIL_ARMOR)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY))) .build() @@ -6705,8 +7174,7 @@ private void bootstrapArmor() { ItemBase.Builder.forItem(ItemKeys.CHAINMAIL_BOOTS).build(), ItemComponentSet.builder() .with(ArmorItemComponent.of(ArmorItem.Type.BOOTS, 15, this.armorMaterials.getOrThrow(ArmorMaterialKeys.CHAINMAIL), this.soundEvents.getOrThrow(SoundEventKeys.ARMOR_EQUIP_CHAIN))) - .with(EnchantableItemComponent.enchants(ArmorMaterials.CHAIN, EnchantmentTags.BOOTS_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.BOOTS_FORGING)) + .with(EnchantableItemComponent.of(ArmorMaterials.CHAIN)) .with(RepairableItemComponent.of(ItematicItemTags.REPAIRS_CHAINMAIL_ARMOR)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY))) .build() @@ -6715,8 +7183,7 @@ private void bootstrapArmor() { ItemBase.Builder.forItem(ItemKeys.IRON_HELMET).build(), ItemComponentSet.builder() .with(ArmorItemComponent.of(ArmorItem.Type.HELMET, 15, this.armorMaterials.getOrThrow(ArmorMaterialKeys.IRON), this.soundEvents.getOrThrow(SoundEventKeys.ARMOR_EQUIP_IRON))) - .with(EnchantableItemComponent.enchants(ArmorMaterials.IRON, EnchantmentTags.HELMET_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.HELMET_FORGING)) + .with(EnchantableItemComponent.of(ArmorMaterials.IRON)) .with(RepairableItemComponent.of(ItematicItemTags.REPAIRS_IRON_ARMOR)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY))) .build() @@ -6725,8 +7192,7 @@ private void bootstrapArmor() { ItemBase.Builder.forItem(ItemKeys.IRON_CHESTPLATE).build(), ItemComponentSet.builder() .with(ArmorItemComponent.of(ArmorItem.Type.CHESTPLATE, 15, this.armorMaterials.getOrThrow(ArmorMaterialKeys.IRON), this.soundEvents.getOrThrow(SoundEventKeys.ARMOR_EQUIP_IRON))) - .with(EnchantableItemComponent.enchants(ArmorMaterials.IRON, EnchantmentTags.CHESTPLATE_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.CHESTPLATE_FORGING)) + .with(EnchantableItemComponent.of(ArmorMaterials.IRON)) .with(RepairableItemComponent.of(ItematicItemTags.REPAIRS_IRON_ARMOR)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY))) .build() @@ -6735,8 +7201,7 @@ private void bootstrapArmor() { ItemBase.Builder.forItem(ItemKeys.IRON_LEGGINGS).build(), ItemComponentSet.builder() .with(ArmorItemComponent.of(ArmorItem.Type.LEGGINGS, 15, this.armorMaterials.getOrThrow(ArmorMaterialKeys.IRON), this.soundEvents.getOrThrow(SoundEventKeys.ARMOR_EQUIP_IRON))) - .with(EnchantableItemComponent.enchants(ArmorMaterials.IRON, EnchantmentTags.LEGGINGS_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.LEGGINGS_FORGING)) + .with(EnchantableItemComponent.of(ArmorMaterials.IRON)) .with(RepairableItemComponent.of(ItematicItemTags.REPAIRS_IRON_ARMOR)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY))) .build() @@ -6745,8 +7210,7 @@ private void bootstrapArmor() { ItemBase.Builder.forItem(ItemKeys.IRON_BOOTS).build(), ItemComponentSet.builder() .with(ArmorItemComponent.of(ArmorItem.Type.BOOTS, 15, this.armorMaterials.getOrThrow(ArmorMaterialKeys.IRON), this.soundEvents.getOrThrow(SoundEventKeys.ARMOR_EQUIP_IRON))) - .with(EnchantableItemComponent.enchants(ArmorMaterials.IRON, EnchantmentTags.BOOTS_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.BOOTS_FORGING)) + .with(EnchantableItemComponent.of(ArmorMaterials.IRON)) .with(RepairableItemComponent.of(ItematicItemTags.REPAIRS_IRON_ARMOR)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY))) .build() @@ -6755,8 +7219,7 @@ private void bootstrapArmor() { ItemBase.Builder.forItem(ItemKeys.DIAMOND_HELMET).build(), ItemComponentSet.builder() .with(ArmorItemComponent.of(ArmorItem.Type.HELMET, 33, this.armorMaterials.getOrThrow(ArmorMaterialKeys.DIAMOND), this.soundEvents.getOrThrow(SoundEventKeys.ARMOR_EQUIP_DIAMOND))) - .with(EnchantableItemComponent.enchants(ArmorMaterials.DIAMOND, EnchantmentTags.HELMET_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.HELMET_FORGING)) + .with(EnchantableItemComponent.of(ArmorMaterials.DIAMOND)) .with(RepairableItemComponent.of(ItematicItemTags.REPAIRS_DIAMOND_ARMOR)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY))) .build() @@ -6765,8 +7228,7 @@ private void bootstrapArmor() { ItemBase.Builder.forItem(ItemKeys.DIAMOND_CHESTPLATE).build(), ItemComponentSet.builder() .with(ArmorItemComponent.of(ArmorItem.Type.CHESTPLATE, 33, this.armorMaterials.getOrThrow(ArmorMaterialKeys.DIAMOND), this.soundEvents.getOrThrow(SoundEventKeys.ARMOR_EQUIP_DIAMOND))) - .with(EnchantableItemComponent.enchants(ArmorMaterials.DIAMOND, EnchantmentTags.CHESTPLATE_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.CHESTPLATE_FORGING)) + .with(EnchantableItemComponent.of(ArmorMaterials.DIAMOND)) .with(RepairableItemComponent.of(ItematicItemTags.REPAIRS_DIAMOND_ARMOR)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY))) .build() @@ -6775,8 +7237,7 @@ private void bootstrapArmor() { ItemBase.Builder.forItem(ItemKeys.DIAMOND_LEGGINGS).build(), ItemComponentSet.builder() .with(ArmorItemComponent.of(ArmorItem.Type.LEGGINGS, 33, this.armorMaterials.getOrThrow(ArmorMaterialKeys.DIAMOND), this.soundEvents.getOrThrow(SoundEventKeys.ARMOR_EQUIP_DIAMOND))) - .with(EnchantableItemComponent.enchants(ArmorMaterials.DIAMOND, EnchantmentTags.LEGGINGS_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.LEGGINGS_FORGING)) + .with(EnchantableItemComponent.of(ArmorMaterials.DIAMOND)) .with(RepairableItemComponent.of(ItematicItemTags.REPAIRS_DIAMOND_ARMOR)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY))) .build() @@ -6785,8 +7246,7 @@ private void bootstrapArmor() { ItemBase.Builder.forItem(ItemKeys.DIAMOND_BOOTS).build(), ItemComponentSet.builder() .with(ArmorItemComponent.of(ArmorItem.Type.BOOTS, 33, this.armorMaterials.getOrThrow(ArmorMaterialKeys.DIAMOND), this.soundEvents.getOrThrow(SoundEventKeys.ARMOR_EQUIP_DIAMOND))) - .with(EnchantableItemComponent.enchants(ArmorMaterials.DIAMOND, EnchantmentTags.BOOTS_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.BOOTS_FORGING)) + .with(EnchantableItemComponent.of(ArmorMaterials.DIAMOND)) .with(RepairableItemComponent.of(ItematicItemTags.REPAIRS_DIAMOND_ARMOR)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY))) .build() @@ -6795,8 +7255,7 @@ private void bootstrapArmor() { ItemBase.Builder.forItem(ItemKeys.GOLDEN_HELMET).build(), ItemComponentSet.builder() .with(ArmorItemComponent.of(ArmorItem.Type.HELMET, 7, this.armorMaterials.getOrThrow(ArmorMaterialKeys.GOLD), this.soundEvents.getOrThrow(SoundEventKeys.ARMOR_EQUIP_GOLD))) - .with(EnchantableItemComponent.enchants(ArmorMaterials.GOLD, EnchantmentTags.HELMET_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.HELMET_FORGING)) + .with(EnchantableItemComponent.of(ArmorMaterials.GOLD)) .with(RepairableItemComponent.of(ItematicItemTags.REPAIRS_GOLDEN_ARMOR)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY))) .build() @@ -6805,8 +7264,7 @@ private void bootstrapArmor() { ItemBase.Builder.forItem(ItemKeys.GOLDEN_CHESTPLATE).build(), ItemComponentSet.builder() .with(ArmorItemComponent.of(ArmorItem.Type.CHESTPLATE, 7, this.armorMaterials.getOrThrow(ArmorMaterialKeys.GOLD), this.soundEvents.getOrThrow(SoundEventKeys.ARMOR_EQUIP_GOLD))) - .with(EnchantableItemComponent.enchants(ArmorMaterials.GOLD, EnchantmentTags.CHESTPLATE_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.CHESTPLATE_FORGING)) + .with(EnchantableItemComponent.of(ArmorMaterials.GOLD)) .with(RepairableItemComponent.of(ItematicItemTags.REPAIRS_GOLDEN_ARMOR)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY))) .build() @@ -6815,8 +7273,7 @@ private void bootstrapArmor() { ItemBase.Builder.forItem(ItemKeys.GOLDEN_LEGGINGS).build(), ItemComponentSet.builder() .with(ArmorItemComponent.of(ArmorItem.Type.LEGGINGS, 7, this.armorMaterials.getOrThrow(ArmorMaterialKeys.GOLD), this.soundEvents.getOrThrow(SoundEventKeys.ARMOR_EQUIP_GOLD))) - .with(EnchantableItemComponent.enchants(ArmorMaterials.GOLD, EnchantmentTags.LEGGINGS_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.LEGGINGS_FORGING)) + .with(EnchantableItemComponent.of(ArmorMaterials.GOLD)) .with(RepairableItemComponent.of(ItematicItemTags.REPAIRS_GOLDEN_ARMOR)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY))) .build() @@ -6825,8 +7282,7 @@ private void bootstrapArmor() { ItemBase.Builder.forItem(ItemKeys.GOLDEN_BOOTS).build(), ItemComponentSet.builder() .with(ArmorItemComponent.of(ArmorItem.Type.BOOTS, 7, this.armorMaterials.getOrThrow(ArmorMaterialKeys.GOLD), this.soundEvents.getOrThrow(SoundEventKeys.ARMOR_EQUIP_GOLD))) - .with(EnchantableItemComponent.enchants(ArmorMaterials.GOLD, EnchantmentTags.BOOTS_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.BOOTS_FORGING)) + .with(EnchantableItemComponent.of(ArmorMaterials.GOLD)) .with(RepairableItemComponent.of(ItematicItemTags.REPAIRS_GOLDEN_ARMOR)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY))) .build() @@ -6836,8 +7292,7 @@ private void bootstrapArmor() { ItemComponentSet.builder() .with(ArmorItemComponent.of(ArmorItem.Type.HELMET, 37, this.armorMaterials.getOrThrow(ArmorMaterialKeys.NETHERITE), this.soundEvents.getOrThrow(SoundEventKeys.ARMOR_EQUIP_NETHERITE))) .with(ImmuneToDamageItemComponent.of(DamageTypeTags.IS_FIRE)) - .with(EnchantableItemComponent.enchants(ArmorMaterials.NETHERITE, EnchantmentTags.HELMET_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.HELMET_FORGING)) + .with(EnchantableItemComponent.of(ArmorMaterials.NETHERITE)) .with(RepairableItemComponent.of(ItematicItemTags.REPAIRS_NETHERITE_ARMOR)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY))) .build() @@ -6847,8 +7302,7 @@ private void bootstrapArmor() { ItemComponentSet.builder() .with(ArmorItemComponent.of(ArmorItem.Type.CHESTPLATE, 37, this.armorMaterials.getOrThrow(ArmorMaterialKeys.NETHERITE), this.soundEvents.getOrThrow(SoundEventKeys.ARMOR_EQUIP_NETHERITE))) .with(ImmuneToDamageItemComponent.of(DamageTypeTags.IS_FIRE)) - .with(EnchantableItemComponent.enchants(ArmorMaterials.NETHERITE, EnchantmentTags.CHESTPLATE_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.CHESTPLATE_FORGING)) + .with(EnchantableItemComponent.of(ArmorMaterials.NETHERITE)) .with(RepairableItemComponent.of(ItematicItemTags.REPAIRS_NETHERITE_ARMOR)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY))) .build() @@ -6858,8 +7312,7 @@ private void bootstrapArmor() { ItemComponentSet.builder() .with(ArmorItemComponent.of(ArmorItem.Type.LEGGINGS, 37, this.armorMaterials.getOrThrow(ArmorMaterialKeys.NETHERITE), this.soundEvents.getOrThrow(SoundEventKeys.ARMOR_EQUIP_NETHERITE))) .with(ImmuneToDamageItemComponent.of(DamageTypeTags.IS_FIRE)) - .with(EnchantableItemComponent.enchants(ArmorMaterials.NETHERITE, EnchantmentTags.LEGGINGS_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.LEGGINGS_FORGING)) + .with(EnchantableItemComponent.of(ArmorMaterials.NETHERITE)) .with(RepairableItemComponent.of(ItematicItemTags.REPAIRS_NETHERITE_ARMOR)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY))) .build() @@ -6869,8 +7322,7 @@ private void bootstrapArmor() { ItemComponentSet.builder() .with(ArmorItemComponent.of(ArmorItem.Type.BOOTS, 37, this.armorMaterials.getOrThrow(ArmorMaterialKeys.NETHERITE), this.soundEvents.getOrThrow(SoundEventKeys.ARMOR_EQUIP_NETHERITE))) .with(ImmuneToDamageItemComponent.of(DamageTypeTags.IS_FIRE)) - .with(EnchantableItemComponent.enchants(ArmorMaterials.NETHERITE, EnchantmentTags.BOOTS_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.BOOTS_FORGING)) + .with(EnchantableItemComponent.of(ArmorMaterials.NETHERITE)) .with(RepairableItemComponent.of(ItematicItemTags.REPAIRS_NETHERITE_ARMOR)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY))) .build() @@ -6879,8 +7331,7 @@ private void bootstrapArmor() { ItemBase.Builder.forItem(ItemKeys.TURTLE_HELMET).build(), ItemComponentSet.builder() .with(ArmorItemComponent.of(275, EquipmentSlot.HEAD, this.armorMaterials.getOrThrow(ArmorMaterialKeys.TURTLE), this.soundEvents.getOrThrow(SoundEventKeys.ARMOR_EQUIP_TURTLE))) - .with(EnchantableItemComponent.enchants(ArmorMaterials.TURTLE, EnchantmentTags.HELMET_ENCHANTING)) - .with(ForgeableItemComponent.of(EnchantmentTags.HELMET_FORGING)) + .with(EnchantableItemComponent.of(ArmorMaterials.TURTLE)) .with(RepairableItemComponent.of(ItematicItemTags.REPAIRS_TURTLE_ARMOR)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.EQUIP_ENTITY))) .build() @@ -8613,7 +9064,7 @@ private void bootstrapProjectiles() { ItemComponentSet.builder() .with(StackableItemComponent.of(64)) .with(ThrowableItemComponent.of()) - .with(ProjectileItemComponent.of(EyeOfEnderEntityInitializer.INSTANCE, 0)) + .with(ProjectileItemComponent.of(EyeOfEnderEntityInitializer.INSTANCE)) .with(PreventUseWhenUsedOnTargetItemComponent.forBlock()) .build(), ItemEventMap.builder() @@ -8621,11 +9072,11 @@ private void bootstrapProjectiles() { ActionRequirements.of( ActionContextParameters.of(ActionContextParameter.THIS, ActionContextParameter.TARGET), LocationCheckLootCondition.builder( - LocationPredicate.Builder.create() - .block(BlockPredicate.Builder.create() - .blocks(this.blocks.getOrThrow(BlockKeys.END_PORTAL_FRAME).value()) - .state(StatePredicate.Builder.create() - .exactMatch(Properties.EYE, false)))) + LocationPredicate.Builder.create() + .block(BlockPredicate.Builder.create() + .blocks(this.blocks.getOrThrow(BlockKeys.END_PORTAL_FRAME).value()) + .state(StatePredicate.Builder.create() + .exactMatch(Properties.EYE, false)))) .build() ), PassingSequenceHandler.builder() @@ -8646,7 +9097,9 @@ private void bootstrapProjectiles() { .addOptional(LightEndPortalAction.of(ActionContextParameter.TARGET)) )) .add(ItemEvents.THROW_PROJECTILE, ActionEntry.of( - PlaySoundAction.of(ActionContextParameter.THIS, this.soundEvents.getOrThrow(SoundEventKeys.ENDER_EYE_LAUNCH), SoundCategory.NEUTRAL, 1.0f, 1.2f) + PlaySoundAction.builder(ActionContextParameter.THIS, this.soundEvents.getOrThrow(SoundEventKeys.ENDER_EYE_LAUNCH), SoundCategory.NEUTRAL) + .pitch(0.33f, 0.5f) + .build() )) .build() )); @@ -8681,12 +9134,22 @@ private void bootstrapProjectiles() { )) .build() )); + this.registerable.register(ItemKeys.WIND_CHARGE, create( + ItemBase.Builder.forItem(ItemKeys.WIND_CHARGE).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .with(ThrowableItemComponent.of(1.5f)) + .with(ProjectileItemComponent.of(this.entityTypes.getOrThrow(EntityTypeKeys.WIND_CHARGE))) + .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.SHOOT_PROJECTILE))) + .with(CooldownItemComponent.of(WindChargeItemAccessor.cooldown())) + .build() + )); this.registerable.register(ItemKeys.FIREWORK_ROCKET, create( ItemBase.Builder.forItem(ItemKeys.FIREWORK_ROCKET).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) .with(FireworkItemComponent.INSTANCE) - .with(ProjectileItemComponent.of(FireworkRocketEntityInitializer.INSTANCE, 3, CrossbowItemAccessor.fireworkRocketSpeed())) + .with(ProjectileItemComponent.of(FireworkRocketEntityInitializer.INSTANCE)) .with(DispensableItemComponent.of(this.dispenseBehaviors.getOrThrow(DispenseBehaviors.SHOOT_FIREWORK_ROCKET))) .build() )); @@ -8880,6 +9343,23 @@ private void bootstrapRecords() { .with(RecordItemComponent.of(this.soundEvents.getOrThrow(SoundEventKeys.MUSIC_DISC_CHIRP), ItemKeys.MUSIC_DISC_CHIRP, 185 * 20, 4)) .build() )); + this.registerable.register(ItemKeys.MUSIC_DISC_CREATOR, create( + ItemBase.Builder.forItem(ItemKeys.MUSIC_DISC_CREATOR) + .rarity(Rarity.EPIC) + .build(), + ItemComponentSet.builder() + .with(RecordItemComponent.of(this.soundEvents.getOrThrow(SoundEventKeys.MUSIC_DISC_CREATOR), ItemKeys.MUSIC_DISC_CREATOR, 176 * 20, 12)) + .build() + )); + this.registerable.register(ItemKeys.MUSIC_DISC_CREATOR_MUSIC_BOX, create( + ItemBase.Builder.forItem(ItemKeys.MUSIC_DISC_CREATOR_MUSIC_BOX) + .rarity(Rarity.EPIC) + .build(), + ItemComponentSet.builder() + .with(RecordItemComponent.of(this.soundEvents.getOrThrow(SoundEventKeys.MUSIC_DISC_CREATOR_MUSIC_BOX), ItemKeys.MUSIC_DISC_CREATOR_MUSIC_BOX, 73 * 20, 11)) + .build() + )); + this.registerable.register(ItemKeys.MUSIC_DISC_FAR, create( ItemBase.Builder.forItem(ItemKeys.MUSIC_DISC_FAR) .rarity(Rarity.EPIC) @@ -8968,6 +9448,14 @@ private void bootstrapRecords() { .with(RecordItemComponent.of(this.soundEvents.getOrThrow(SoundEventKeys.MUSIC_DISC_PIGSTEP), ItemKeys.MUSIC_DISC_PIGSTEP, 149 * 20, 13)) .build() )); + this.registerable.register(ItemKeys.MUSIC_DISC_PRECIPICE, create( + ItemBase.Builder.forItem(ItemKeys.MUSIC_DISC_PRECIPICE) + .rarity(Rarity.EPIC) + .build(), + ItemComponentSet.builder() + .with(RecordItemComponent.of(this.soundEvents.getOrThrow(SoundEventKeys.MUSIC_DISC_PRECIPICE), ItemKeys.MUSIC_DISC_PRECIPICE, 299 * 20, 13)) + .build() + )); this.registerable.register(ItemKeys.MUSIC_DISC_5, create( ItemBase.Builder.forItem(ItemKeys.MUSIC_DISC_5) .rarity(Rarity.EPIC) @@ -9022,31 +9510,31 @@ private void bootstrapBuckets() { this.registerable.register(ItemKeys.SALMON_BUCKET, create( ItemBase.Builder.forItem(ItemKeys.SALMON_BUCKET).build(), ItemComponentSet.builder() - .with(BucketItemComponent.entity(this.fluids.getOrThrow(FluidKeys.WATER), this.entityTypes.getOrThrow(EntityTypeKeys.SALMON), this.soundEvents.getOrThrow(SoundEventKeys.BUCKET_EMPTY_FISH), this.items, this.dispenseBehaviors)) + .with(BucketItemComponent.entity(this.fluids.getOrThrow(FluidKeys.WATER), this.entityTypes.getOrThrow(EntityTypeKeys.SALMON), this.soundEvents.getOrThrow(SoundEventKeys.BUCKET_EMPTY_FISH), this.items, this.dispenseBehaviors)) .build() )); this.registerable.register(ItemKeys.COD_BUCKET, create( ItemBase.Builder.forItem(ItemKeys.COD_BUCKET).build(), ItemComponentSet.builder() - .with(BucketItemComponent.entity(this.fluids.getOrThrow(FluidKeys.WATER), this.entityTypes.getOrThrow(EntityTypeKeys.COD), this.soundEvents.getOrThrow(SoundEventKeys.BUCKET_EMPTY_FISH), this.items, this.dispenseBehaviors)) + .with(BucketItemComponent.entity(this.fluids.getOrThrow(FluidKeys.WATER), this.entityTypes.getOrThrow(EntityTypeKeys.COD), this.soundEvents.getOrThrow(SoundEventKeys.BUCKET_EMPTY_FISH), this.items, this.dispenseBehaviors)) .build() )); this.registerable.register(ItemKeys.TROPICAL_FISH_BUCKET, create( ItemBase.Builder.forItem(ItemKeys.TROPICAL_FISH_BUCKET).build(), ItemComponentSet.builder() - .with(BucketItemComponent.entity(this.fluids.getOrThrow(FluidKeys.WATER), this.entityTypes.getOrThrow(EntityTypeKeys.TROPICAL_FISH), this.soundEvents.getOrThrow(SoundEventKeys.BUCKET_EMPTY_FISH), this.items, this.dispenseBehaviors)) + .with(BucketItemComponent.entity(this.fluids.getOrThrow(FluidKeys.WATER), this.entityTypes.getOrThrow(EntityTypeKeys.TROPICAL_FISH), this.soundEvents.getOrThrow(SoundEventKeys.BUCKET_EMPTY_FISH), this.items, this.dispenseBehaviors)) .build() )); this.registerable.register(ItemKeys.AXOLOTL_BUCKET, create( ItemBase.Builder.forItem(ItemKeys.AXOLOTL_BUCKET).build(), ItemComponentSet.builder() - .with(BucketItemComponent.entity(this.fluids.getOrThrow(FluidKeys.WATER), this.entityTypes.getOrThrow(EntityTypeKeys.AXOLOTL), this.soundEvents.getOrThrow(SoundEventKeys.BUCKET_EMPTY_AXOLOTL), this.items, this.dispenseBehaviors)) + .with(BucketItemComponent.entity(this.fluids.getOrThrow(FluidKeys.WATER), this.entityTypes.getOrThrow(EntityTypeKeys.AXOLOTL), this.soundEvents.getOrThrow(SoundEventKeys.BUCKET_EMPTY_AXOLOTL), this.items, this.dispenseBehaviors)) .build() )); this.registerable.register(ItemKeys.TADPOLE_BUCKET, create( ItemBase.Builder.forItem(ItemKeys.TADPOLE_BUCKET).build(), ItemComponentSet.builder() - .with(BucketItemComponent.entity(this.fluids.getOrThrow(FluidKeys.WATER), this.entityTypes.getOrThrow(EntityTypeKeys.TADPOLE), this.soundEvents.getOrThrow(SoundEventKeys.BUCKET_EMPTY_TADPOLE), this.items, this.dispenseBehaviors)) + .with(BucketItemComponent.entity(this.fluids.getOrThrow(FluidKeys.WATER), this.entityTypes.getOrThrow(EntityTypeKeys.TADPOLE), this.soundEvents.getOrThrow(SoundEventKeys.BUCKET_EMPTY_TADPOLE), this.items, this.dispenseBehaviors)) .build() )); } @@ -9055,122 +9543,117 @@ private void bootstrapSmithingTemplates() { this.registerable.register(ItemKeys.NETHERITE_UPGRADE_SMITHING_TEMPLATE, create( ItemBase.Builder.forItem(ItemKeys.NETHERITE_UPGRADE_SMITHING_TEMPLATE).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(SmithingTemplateItemComponent.of(this.smithingTemplates.getOrThrow(SmithingTemplates.NETHERITE_UPGRADE))) .build() )); this.registerable.register(ItemKeys.SENTRY_ARMOR_TRIM_SMITHING_TEMPLATE, create( ItemBase.Builder.forItem(ItemKeys.SENTRY_ARMOR_TRIM_SMITHING_TEMPLATE).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(SmithingTemplateItemComponent.of(this.smithingTemplates.getOrThrow(SmithingTemplates.SENTRY_PATTERN))) .build() )); this.registerable.register(ItemKeys.DUNE_ARMOR_TRIM_SMITHING_TEMPLATE, create( ItemBase.Builder.forItem(ItemKeys.DUNE_ARMOR_TRIM_SMITHING_TEMPLATE).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(SmithingTemplateItemComponent.of(this.smithingTemplates.getOrThrow(SmithingTemplates.DUNE_PATTERN))) .build() )); this.registerable.register(ItemKeys.COAST_ARMOR_TRIM_SMITHING_TEMPLATE, create( ItemBase.Builder.forItem(ItemKeys.COAST_ARMOR_TRIM_SMITHING_TEMPLATE).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(SmithingTemplateItemComponent.of(this.smithingTemplates.getOrThrow(SmithingTemplates.COAST_PATTERN))) .build() )); this.registerable.register(ItemKeys.WILD_ARMOR_TRIM_SMITHING_TEMPLATE, create( ItemBase.Builder.forItem(ItemKeys.WILD_ARMOR_TRIM_SMITHING_TEMPLATE).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(SmithingTemplateItemComponent.of(this.smithingTemplates.getOrThrow(SmithingTemplates.WILD_PATTERN))) .build() )); this.registerable.register(ItemKeys.WARD_ARMOR_TRIM_SMITHING_TEMPLATE, create( ItemBase.Builder.forItem(ItemKeys.WARD_ARMOR_TRIM_SMITHING_TEMPLATE).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(SmithingTemplateItemComponent.of(this.smithingTemplates.getOrThrow(SmithingTemplates.WARD_PATTERN))) .build() )); this.registerable.register(ItemKeys.EYE_ARMOR_TRIM_SMITHING_TEMPLATE, create( ItemBase.Builder.forItem(ItemKeys.EYE_ARMOR_TRIM_SMITHING_TEMPLATE).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(SmithingTemplateItemComponent.of(this.smithingTemplates.getOrThrow(SmithingTemplates.EYE_PATTERN))) .build() )); this.registerable.register(ItemKeys.VEX_ARMOR_TRIM_SMITHING_TEMPLATE, create( ItemBase.Builder.forItem(ItemKeys.VEX_ARMOR_TRIM_SMITHING_TEMPLATE).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(SmithingTemplateItemComponent.of(this.smithingTemplates.getOrThrow(SmithingTemplates.VEX_PATTERN))) .build() )); this.registerable.register(ItemKeys.TIDE_ARMOR_TRIM_SMITHING_TEMPLATE, create( ItemBase.Builder.forItem(ItemKeys.TIDE_ARMOR_TRIM_SMITHING_TEMPLATE).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(SmithingTemplateItemComponent.of(this.smithingTemplates.getOrThrow(SmithingTemplates.TIDE_PATTERN))) .build() )); this.registerable.register(ItemKeys.SNOUT_ARMOR_TRIM_SMITHING_TEMPLATE, create( ItemBase.Builder.forItem(ItemKeys.SNOUT_ARMOR_TRIM_SMITHING_TEMPLATE).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(SmithingTemplateItemComponent.of(this.smithingTemplates.getOrThrow(SmithingTemplates.SNOUT_PATTERN))) .build() )); this.registerable.register(ItemKeys.RIB_ARMOR_TRIM_SMITHING_TEMPLATE, create( ItemBase.Builder.forItem(ItemKeys.RIB_ARMOR_TRIM_SMITHING_TEMPLATE).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(SmithingTemplateItemComponent.of(this.smithingTemplates.getOrThrow(SmithingTemplates.RIB_PATTERN))) .build() )); this.registerable.register(ItemKeys.SPIRE_ARMOR_TRIM_SMITHING_TEMPLATE, create( ItemBase.Builder.forItem(ItemKeys.SPIRE_ARMOR_TRIM_SMITHING_TEMPLATE).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(SmithingTemplateItemComponent.of(this.smithingTemplates.getOrThrow(SmithingTemplates.SPIRE_PATTERN))) .build() )); this.registerable.register(ItemKeys.WAYFINDER_ARMOR_TRIM_SMITHING_TEMPLATE, create( ItemBase.Builder.forItem(ItemKeys.WAYFINDER_ARMOR_TRIM_SMITHING_TEMPLATE).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(SmithingTemplateItemComponent.of(this.smithingTemplates.getOrThrow(SmithingTemplates.WAYFINDER_PATTERN))) .build() )); this.registerable.register(ItemKeys.SHAPER_ARMOR_TRIM_SMITHING_TEMPLATE, create( ItemBase.Builder.forItem(ItemKeys.SHAPER_ARMOR_TRIM_SMITHING_TEMPLATE).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(SmithingTemplateItemComponent.of(this.smithingTemplates.getOrThrow(SmithingTemplates.SHAPER_PATTERN))) .build() )); this.registerable.register(ItemKeys.SILENCE_ARMOR_TRIM_SMITHING_TEMPLATE, create( ItemBase.Builder.forItem(ItemKeys.SILENCE_ARMOR_TRIM_SMITHING_TEMPLATE).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(SmithingTemplateItemComponent.of(this.smithingTemplates.getOrThrow(SmithingTemplates.SILENCE_PATTERN))) .build() )); this.registerable.register(ItemKeys.RAISER_ARMOR_TRIM_SMITHING_TEMPLATE, create( ItemBase.Builder.forItem(ItemKeys.RAISER_ARMOR_TRIM_SMITHING_TEMPLATE).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(SmithingTemplateItemComponent.of(this.smithingTemplates.getOrThrow(SmithingTemplates.RAISER_PATTERN))) .build() )); this.registerable.register(ItemKeys.HOST_ARMOR_TRIM_SMITHING_TEMPLATE, create( ItemBase.Builder.forItem(ItemKeys.HOST_ARMOR_TRIM_SMITHING_TEMPLATE).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(SmithingTemplateItemComponent.of(this.smithingTemplates.getOrThrow(SmithingTemplates.HOST_PATTERN))) .build() )); + this.registerable.register(ItemKeys.FLOW_ARMOR_TRIM_SMITHING_TEMPLATE, create( + ItemBase.Builder.forItem(ItemKeys.FLOW_ARMOR_TRIM_SMITHING_TEMPLATE).build(), + ItemComponentSet.builder() + .with(SmithingTemplateItemComponent.of(this.smithingTemplates.getOrThrow(SmithingTemplates.FLOW_PATTERN))) + .build() + )); + this.registerable.register(ItemKeys.BOLT_ARMOR_TRIM_SMITHING_TEMPLATE, create( + ItemBase.Builder.forItem(ItemKeys.BOLT_ARMOR_TRIM_SMITHING_TEMPLATE).build(), + ItemComponentSet.builder() + .with(SmithingTemplateItemComponent.of(this.smithingTemplates.getOrThrow(SmithingTemplates.BOLT_PATTERN))) + .build() + )); } private void bootstrapBanners() { @@ -9367,6 +9850,18 @@ private void bootstrapBannerPatterns() { .with(BannerPatternItemComponent.of(BannerPatternTags.PIGLIN_PATTERN_ITEM)) .build() )); + this.registerable.register(ItemKeys.FLOW_BANNER_PATTERN, create( + ItemBase.Builder.forItem(ItemKeys.FLOW_BANNER_PATTERN).tooltip(ItemKeys.FLOW_BANNER_PATTERN).build(), + ItemComponentSet.builder() + .with(BannerPatternItemComponent.of(BannerPatternTags.FLOW_PATTERN_ITEM)) + .build() + )); + this.registerable.register(ItemKeys.GUSTER_BANNER_PATTERN, create( + ItemBase.Builder.forItem(ItemKeys.GUSTER_BANNER_PATTERN).tooltip(ItemKeys.GUSTER_BANNER_PATTERN).build(), + ItemComponentSet.builder() + .with(BannerPatternItemComponent.of(BannerPatternTags.GUSTER_PATTERN_ITEM)) + .build() + )); } private void bootstrapDecoratedPotPatterns() { @@ -9380,140 +9875,138 @@ private void bootstrapDecoratedPotPatterns() { this.registerable.register(ItemKeys.ANGLER_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.ANGLER_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.angler()))) .build() )); this.registerable.register(ItemKeys.ARCHER_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.ARCHER_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.archer()))) .build() )); this.registerable.register(ItemKeys.ARMS_UP_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.ARMS_UP_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.armsUp()))) .build() )); this.registerable.register(ItemKeys.BLADE_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.BLADE_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.blade()))) .build() )); this.registerable.register(ItemKeys.BREWER_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.BREWER_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.brewer()))) .build() )); this.registerable.register(ItemKeys.BURN_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.BURN_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.burn()))) .build() )); this.registerable.register(ItemKeys.DANGER_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.DANGER_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.danger()))) .build() )); this.registerable.register(ItemKeys.EXPLORER_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.EXPLORER_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.explorer()))) .build() )); + this.registerable.register(ItemKeys.FLOW_POTTERY_SHERD, create( + ItemBase.Builder.forItem(ItemKeys.FLOW_POTTERY_SHERD).build(), + ItemComponentSet.builder() + .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.flow()))) + .build() + )); this.registerable.register(ItemKeys.FRIEND_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.FRIEND_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.friend()))) .build() )); + this.registerable.register(ItemKeys.GUSTER_POTTERY_SHERD, create( + ItemBase.Builder.forItem(ItemKeys.GUSTER_POTTERY_SHERD).build(), + ItemComponentSet.builder() + .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.guster()))) + .build() + )); this.registerable.register(ItemKeys.HEART_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.HEART_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.heart()))) .build() )); this.registerable.register(ItemKeys.HEARTBREAK_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.HEARTBREAK_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.heartbreak()))) .build() )); this.registerable.register(ItemKeys.HOWL_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.HOWL_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.howl()))) .build() )); this.registerable.register(ItemKeys.MINER_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.MINER_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.miner()))) .build() )); this.registerable.register(ItemKeys.MOURNER_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.MOURNER_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.mourner()))) .build() )); this.registerable.register(ItemKeys.PLENTY_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.PLENTY_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.plenty()))) .build() )); this.registerable.register(ItemKeys.PRIZE_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.PRIZE_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.prize()))) .build() )); + this.registerable.register(ItemKeys.SCRAPE_POTTERY_SHERD, create( + ItemBase.Builder.forItem(ItemKeys.SCRAPE_POTTERY_SHERD).build(), + ItemComponentSet.builder() + .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.scrape()))) + .build() + )); this.registerable.register(ItemKeys.SHEAF_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.SHEAF_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.sheaf()))) .build() )); this.registerable.register(ItemKeys.SHELTER_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.SHELTER_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.shelter()))) .build() )); this.registerable.register(ItemKeys.SKULL_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.SKULL_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.skull()))) .build() )); this.registerable.register(ItemKeys.SNORT_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.SNORT_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(StackableItemComponent.of(64)) .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.snort()))) .build() )); @@ -9693,7 +10186,7 @@ private void bootstrapMiscellaneous() { ItemBase.Builder.forItem(ItemKeys.BOOK).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(EnchantableItemComponent.transforms(1, this.items.getOrThrow(ItemKeys.ENCHANTED_BOOK))) + .with(EnchantableItemComponent.ofTransforming(1, this.items.getOrThrow(ItemKeys.ENCHANTED_BOOK))) .build() )); this.registerable.register(ItemKeys.SLIME_BALL, create( @@ -9713,9 +10206,9 @@ private void bootstrapMiscellaneous() { ActionRequirements.of( ActionContextParameters.of(ActionContextParameter.THIS, ActionContextParameter.TARGET), LocationCheckLootCondition.builder( - LocationPredicate.Builder.create() - .block(BlockPredicate.Builder.create() - .blocks(this.blocks.getOrThrow(BlockKeys.LODESTONE).value()))) + LocationPredicate.Builder.create() + .block(BlockPredicate.Builder.create() + .blocks(this.blocks.getOrThrow(BlockKeys.LODESTONE).value()))) .build() ), PassingSequenceHandler.builder() @@ -10107,6 +10600,24 @@ private void bootstrapMiscellaneous() { .with(StackableItemComponent.of(64)) .build() )); + this.registerable.register(ItemKeys.TRIAL_KEY, create( + ItemBase.Builder.forItem(ItemKeys.TRIAL_KEY).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .build() + )); + this.registerable.register(ItemKeys.OMINOUS_TRIAL_KEY, create( + ItemBase.Builder.forItem(ItemKeys.OMINOUS_TRIAL_KEY).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .build() + )); + this.registerable.register(ItemKeys.BREEZE_ROD, create( + ItemBase.Builder.forItem(ItemKeys.BREEZE_ROD).build(), + ItemComponentSet.builder() + .with(StackableItemComponent.of(64)) + .build() + )); } } } diff --git a/src/main/java/net/errorcraft/itematic/item/ItematicItemTags.java b/src/main/java/net/errorcraft/itematic/item/ItematicItemTags.java index 7d67ba62..0f06c25f 100644 --- a/src/main/java/net/errorcraft/itematic/item/ItematicItemTags.java +++ b/src/main/java/net/errorcraft/itematic/item/ItematicItemTags.java @@ -21,6 +21,7 @@ public class ItematicItemTags { public static final TagKey REPAIRS_IRON_TOOL = of("repairs_iron_tool"); public static final TagKey REPAIRS_DIAMOND_TOOL = of("repairs_diamond_tool"); public static final TagKey REPAIRS_NETHERITE_TOOL = of("repairs_netherite_tool"); + public static final TagKey REPAIRS_MACE = of("repairs_mace"); public static final TagKey REPAIRS_SHIELD = of("repairs_shield"); public static final TagKey FURNACE_MINECART_FUEL = of("furnace_minecart_fuel"); diff --git a/src/main/java/net/errorcraft/itematic/item/component/ItemComponentTypes.java b/src/main/java/net/errorcraft/itematic/item/component/ItemComponentTypes.java index 74781f7b..e32d62c6 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/ItemComponentTypes.java +++ b/src/main/java/net/errorcraft/itematic/item/component/ItemComponentTypes.java @@ -18,7 +18,6 @@ public class ItemComponentTypes { public static final ItemComponentType FUEL = register("fuel", new ItemComponentType<>(FuelItemComponent.CODEC)); public static final ItemComponentType ENCHANTABLE = register("enchantable", new ItemComponentType<>(EnchantableItemComponent.CODEC)); public static final ItemComponentType ENCHANTMENT_HOLDER = register("enchantment_holder", new ItemComponentType<>(EnchantmentHolderItemComponent.CODEC)); - public static final ItemComponentType FORGEABLE = register("forgeable", new ItemComponentType<>(ForgeableItemComponent.CODEC)); public static final ItemComponentType REPAIRABLE = register("repairable", new ItemComponentType<>(RepairableItemComponent.CODEC)); public static final ItemComponentType THROWABLE = register("throwable", new ItemComponentType<>(ThrowableItemComponent.CODEC)); public static final ItemComponentType PROJECTILE = register("projectile", new ItemComponentType<>(ProjectileItemComponent.CODEC)); @@ -63,6 +62,7 @@ public class ItemComponentTypes { public static final ItemComponentType CASTABLE = register("castable", new ItemComponentType<>(CastableItemComponent.CODEC)); public static final ItemComponentType STACKABLE = register("stackable", new ItemComponentType<>(StackableItemComponent.CODEC)); public static final ItemComponentType ATTRIBUTE_MODIFIERS = register("attribute_modifiers", new ItemComponentType<>(AttributeModifiersItemComponent.CODEC)); + public static final ItemComponentType OMINOUS_EFFECT_PROVIDER = register("ominous_effect_provider", new ItemComponentType<>(OminousEffectProviderItemComponent.CODEC)); private ItemComponentTypes() {} diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/CastableItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/CastableItemComponent.java index da16e48f..e13f890d 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/CastableItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/CastableItemComponent.java @@ -61,8 +61,10 @@ private boolean tryRetract(World world, PlayerEntity user, ItemStack stack, Item private void cast(World world, PlayerEntity user, ItemStack stack) { world.playSound(null, user.getX(), user.getY(), user.getZ(), SoundEvents.ENTITY_FISHING_BOBBER_THROW, SoundCategory.NEUTRAL, 0.5F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F)); - if (!world.isClient()) { - world.spawnEntity(new FishingBobberEntity(user, world, EnchantmentHelper.getLuckOfTheSea(stack), EnchantmentHelper.getLure(stack))); + if (world instanceof ServerWorld serverWorld) { + int luck = EnchantmentHelper.getFishingLuckBonus(serverWorld, stack, user); + int speed = (int) (EnchantmentHelper.getFishingTimeReduction(serverWorld, stack, user) * 20); + world.spawnEntity(new FishingBobberEntity(user, world, luck, speed)); } user.incrementStat(Stats.USED.itematic$getOrCreateStat(stack.getRegistryEntry())); diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/ConsumableItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/ConsumableItemComponent.java index 19ed1a48..785adc8f 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/ConsumableItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/ConsumableItemComponent.java @@ -10,27 +10,52 @@ import net.errorcraft.itematic.world.action.context.ActionContext; import net.errorcraft.itematic.world.action.context.parameter.ActionContextParameter; import net.minecraft.advancement.criterion.Criteria; +import net.minecraft.component.type.FoodComponent; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUsage; +import net.minecraft.registry.Registries; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.registry.entry.RegistryFixedCodec; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; +import net.minecraft.sound.SoundEvent; +import net.minecraft.sound.SoundEvents; import net.minecraft.stat.Stats; import net.minecraft.util.Hand; +import net.minecraft.util.UseAction; import net.minecraft.world.World; +import java.util.HashSet; +import java.util.Objects; import java.util.Optional; +import java.util.Set; -public record ConsumableItemComponent(Optional> resultItem) implements ItemComponent { +public record ConsumableItemComponent(Optional> resultItem, boolean hasConsumeParticles, RegistryEntry sound) implements ItemComponent { + private static final RegistryEntry DEFAULT_SOUND = Registries.SOUND_EVENT.getEntry(SoundEvents.ENTITY_GENERIC_EAT); public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - RegistryFixedCodec.of(RegistryKeys.ITEM).optionalFieldOf("result_item").forGetter(ConsumableItemComponent::resultItem) + RegistryFixedCodec.of(RegistryKeys.ITEM).optionalFieldOf("result_item").forGetter(ConsumableItemComponent::resultItem), + Codec.BOOL.optionalFieldOf("has_consume_particles", true).forGetter(ConsumableItemComponent::hasConsumeParticles), + SoundEvent.ENTRY_CODEC.optionalFieldOf("sound", DEFAULT_SOUND).forGetter(ConsumableItemComponent::sound) ).apply(instance, ConsumableItemComponent::new)); + public static ConsumableItemComponent of(RegistryEntry resultItem, boolean hasConsumeParticles, RegistryEntry sound) { + return new ConsumableItemComponent(Optional.ofNullable(resultItem), hasConsumeParticles, sound); + } + + public static Builder builder(int useDuration) { + return new Builder(useDuration); + } + + public static Builder builder(FoodComponent food) { + return new Builder(food.getEatTicks()) + .food(food) + .useAnimation(UseAction.EAT); + } + @Override public ItemComponentType type() { return ItemComponentTypes.CONSUMABLE; @@ -62,7 +87,56 @@ public void consume(LivingEntity user, ItemStack stack, ItemStackConsumer result player.incrementStat(Stats.USED.itematic$getOrCreateStat(stack.getRegistryEntry())); } - public static ConsumableItemComponent of(RegistryEntry resultItem) { - return new ConsumableItemComponent(Optional.ofNullable(resultItem)); + public static class Builder { + private final int useDuration; + private UseAction useAnimation; + private FoodItemComponent food; + private RegistryEntry resultItem; + private boolean hasConsumeParticles = true; + private RegistryEntry consumeSound = DEFAULT_SOUND; + + private Builder(int useDuration) { + this.useDuration = useDuration; + } + + public ItemComponent[] build() { + Set> behavior = new HashSet<>(); + behavior.add(UseableItemComponent.builder() + .ticks(this.useDuration) + .animation(this.useAnimation) + .build() + ); + behavior.add(ConsumableItemComponent.of(this.resultItem, this.hasConsumeParticles, this.consumeSound)); + if (this.food != null) { + behavior.add(this.food); + } + + return behavior.toArray(ItemComponent[]::new); + } + + public Builder food(FoodComponent food) { + this.food = FoodItemComponent.of(food); + return this; + } + + public Builder useAnimation(UseAction animation) { + this.useAnimation = animation; + return this; + } + + public Builder resultItem(RegistryEntry resultItem) { + this.resultItem = Objects.requireNonNull(resultItem); + return this; + } + + public Builder noConsumeParticles() { + this.hasConsumeParticles = false; + return this; + } + + public Builder consumeSound(RegistryEntry consumeSound) { + this.consumeSound = Objects.requireNonNull(consumeSound); + return this; + } } } diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/DamageableItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/DamageableItemComponent.java index 10821a61..9b04a728 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/DamageableItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/DamageableItemComponent.java @@ -3,7 +3,6 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.errorcraft.itematic.component.type.WeaponAttackDamageDataComponent; -import net.errorcraft.itematic.enchantment.EnchantmentTags; import net.errorcraft.itematic.item.component.ItemComponent; import net.errorcraft.itematic.item.component.ItemComponentType; import net.errorcraft.itematic.item.component.ItemComponentTypes; @@ -12,7 +11,6 @@ import net.minecraft.component.ComponentMap; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.ToolComponent; -import net.minecraft.enchantment.Enchantment; import net.minecraft.entity.EntityType; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -64,30 +62,29 @@ public static ItemComponent[] sword(ToolMaterial material, TagKey repai .map(proficientEntityTypeTag -> WeaponAttackDamageDataComponent.Rule.addsToBase(proficientEntityTypeTag, attackDamage - 1.0d)) .toArray(WeaponAttackDamageDataComponent.Rule[]::new) ), - EnchantableItemComponent.enchants(material, EnchantmentTags.SWORD_ENCHANTING), - ForgeableItemComponent.of(EnchantmentTags.SWORD_FORGING), + EnchantableItemComponent.of(material), RepairableItemComponent.of(repairItemsTag) }; } @SafeVarargs public static ItemComponent[] shovel(ToolMaterial material, TagKey repairItemsTag, TagKey>... proficientEntityTypeTags) { - return tool(material, 2.5d, 0.25d, BlockTags.SHOVEL_MINEABLE, EnchantmentTags.SHOVEL_ENCHANTING, EnchantmentTags.SHOVEL_FORGING, repairItemsTag, proficientEntityTypeTags); + return tool(material, 2.5d, 0.25d, BlockTags.SHOVEL_MINEABLE, repairItemsTag, proficientEntityTypeTags); } @SafeVarargs public static ItemComponent[] pickaxe(ToolMaterial material, TagKey repairItemsTag, TagKey>... proficientEntityTypeTags) { - return tool(material, 2.0d, 0.3d, BlockTags.PICKAXE_MINEABLE, EnchantmentTags.PICKAXE_ENCHANTING, EnchantmentTags.PICKAXE_FORGING, repairItemsTag, proficientEntityTypeTags); + return tool(material, 2.0d, 0.3d, BlockTags.PICKAXE_MINEABLE, repairItemsTag, proficientEntityTypeTags); } @SafeVarargs public static ItemComponent[] axe(ToolMaterial material, double attackDamage, double attackSpeed, TagKey repairItemsTag, TagKey>... proficientEntityTypeTags) { - return tool(material, attackDamage, attackSpeed, BlockTags.AXE_MINEABLE, EnchantmentTags.AXE_ENCHANTING, EnchantmentTags.AXE_FORGING, repairItemsTag, proficientEntityTypeTags); + return tool(material, attackDamage, attackSpeed, BlockTags.AXE_MINEABLE, repairItemsTag, proficientEntityTypeTags); } @SafeVarargs public static ItemComponent[] hoe(ToolMaterial material, double attackDamage, double attackSpeed, TagKey repairItemsTag, TagKey>... proficientEntityTypeTags) { - return tool(material, attackDamage, attackSpeed, BlockTags.HOE_MINEABLE, EnchantmentTags.HOE_ENCHANTING, EnchantmentTags.HOE_FORGING, repairItemsTag, proficientEntityTypeTags); + return tool(material, attackDamage, attackSpeed, BlockTags.HOE_MINEABLE, repairItemsTag, proficientEntityTypeTags); } @Override @@ -96,7 +93,7 @@ public ItemComponentType type() { } @SafeVarargs - private static ItemComponent[] tool(ToolMaterial material, double attackDamage, double attackSpeed, TagKey mineableBlocks, TagKey toolEnchantingTag, TagKey toolForgingTag, TagKey repairItemsTag, TagKey>... proficientEntityTypeTags) { + private static ItemComponent[] tool(ToolMaterial material, double attackDamage, double attackSpeed, TagKey mineableBlocks, TagKey repairItemsTag, TagKey>... proficientEntityTypeTags) { double realAttackDamage = attackDamage + material.getAttackDamage(); return new ItemComponent[] { StackableItemComponent.of(1), @@ -110,8 +107,7 @@ private static ItemComponent[] tool(ToolMaterial material, double attackDamag .map(proficientEntityTypeTag -> WeaponAttackDamageDataComponent.Rule.addsToBase(proficientEntityTypeTag, realAttackDamage - 1.0d)) .toArray(WeaponAttackDamageDataComponent.Rule[]::new) ), - EnchantableItemComponent.enchants(material, toolEnchantingTag), - ForgeableItemComponent.of(toolForgingTag), + EnchantableItemComponent.of(material), RepairableItemComponent.of(repairItemsTag) }; } diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/DecoratedPotPatternItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/DecoratedPotPatternItemComponent.java index b5a3cb4f..50bcbffa 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/DecoratedPotPatternItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/DecoratedPotPatternItemComponent.java @@ -14,6 +14,13 @@ public record DecoratedPotPatternItemComponent(RegistryEntry pattern) im RegistryFixedCodec.of(RegistryKeys.DECORATED_POT_PATTERN).fieldOf("pattern").forGetter(DecoratedPotPatternItemComponent::pattern) ).apply(instance, DecoratedPotPatternItemComponent::new)); + public static ItemComponent[] of(RegistryEntry pattern) { + return new ItemComponent[] { + StackableItemComponent.of(64), + new DecoratedPotPatternItemComponent(pattern) + }; + } + @Override public ItemComponentType type() { return ItemComponentTypes.DECORATED_POT_PATTERN; @@ -23,8 +30,4 @@ public ItemComponentType type() { public Codec codec() { return CODEC; } - - public static DecoratedPotPatternItemComponent of(RegistryEntry pattern) { - return new DecoratedPotPatternItemComponent(pattern); - } } diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/EnchantableItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/EnchantableItemComponent.java index 57252f2c..11561677 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/EnchantableItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/EnchantableItemComponent.java @@ -5,48 +5,45 @@ import net.errorcraft.itematic.item.component.ItemComponent; import net.errorcraft.itematic.item.component.ItemComponentType; import net.errorcraft.itematic.item.component.ItemComponentTypes; -import net.minecraft.enchantment.Enchantment; import net.minecraft.item.ArmorMaterial; import net.minecraft.item.Item; import net.minecraft.item.ToolMaterial; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.registry.entry.RegistryFixedCodec; -import net.minecraft.registry.tag.TagKey; import net.minecraft.util.dynamic.Codecs; import java.util.Optional; -public record EnchantableItemComponent(int enchantability, Optional> enchantments, Optional> transformsInto) implements ItemComponent { +public record EnchantableItemComponent(int enchantability, Optional> transformsInto) implements ItemComponent { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( Codecs.POSITIVE_INT.fieldOf("enchantability").forGetter(EnchantableItemComponent::enchantability), - TagKey.unprefixedCodec(RegistryKeys.ENCHANTMENT).optionalFieldOf("enchantments").forGetter(EnchantableItemComponent::enchantments), RegistryFixedCodec.of(RegistryKeys.ITEM).optionalFieldOf("transforms_into").forGetter(EnchantableItemComponent::transformsInto) ).apply(instance, EnchantableItemComponent::new)); - @Override - public ItemComponentType type() { - return ItemComponentTypes.ENCHANTABLE; + public static EnchantableItemComponent of(RegistryEntry material) { + return of(material.value().enchantability()); } - @Override - public Codec codec() { - return CODEC; + public static EnchantableItemComponent of(ToolMaterial material) { + return of(material.getEnchantability()); } - public static EnchantableItemComponent enchants(RegistryEntry material, TagKey enchantments) { - return enchants(material.value().enchantability(), enchantments); + public static EnchantableItemComponent of(int enchantability) { + return new EnchantableItemComponent(enchantability, Optional.empty()); } - public static EnchantableItemComponent enchants(ToolMaterial material, TagKey enchantments) { - return enchants(material.getEnchantability(), enchantments); + public static EnchantableItemComponent ofTransforming(int enchantability, RegistryEntry item) { + return new EnchantableItemComponent(enchantability, Optional.of(item)); } - public static EnchantableItemComponent enchants(int enchantability, TagKey enchantments) { - return new EnchantableItemComponent(enchantability, Optional.of(enchantments), Optional.empty()); + @Override + public ItemComponentType type() { + return ItemComponentTypes.ENCHANTABLE; } - public static EnchantableItemComponent transforms(int enchantability, RegistryEntry item) { - return new EnchantableItemComponent(enchantability, Optional.empty(), Optional.of(item)); + @Override + public Codec codec() { + return CODEC; } } diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/EntityItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/EntityItemComponent.java index db0c14ed..3685065b 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/EntityItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/EntityItemComponent.java @@ -22,11 +22,12 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUsageContext; +import net.minecraft.nbt.NbtOps; import net.minecraft.registry.RegistryEntryLookup; +import net.minecraft.registry.RegistryWrapper; import net.minecraft.text.Text; import net.minecraft.util.ActionResult; import net.minecraft.util.Formatting; -import net.minecraft.util.math.MathHelper; import java.util.List; import java.util.Optional; @@ -54,20 +55,27 @@ public void appendTooltip(ItemStack stack, Item.TooltipContext context, List { variant.getKey().ifPresent((key) -> { tooltip.add(Text.translatable(key.getValue().toTranslationKey("painting", "title")).formatted(Formatting.YELLOW)); tooltip.add(Text.translatable(key.getValue().toTranslationKey("painting", "author")).formatted(Formatting.GRAY)); }); - tooltip.add(Text.translatable("painting.dimensions", MathHelper.ceilDiv(variant.value().getWidth(), 16), MathHelper.ceilDiv(variant.value().getHeight(), 16))); + tooltip.add(Text.translatable("painting.dimensions", variant.value().width(), variant.value().height())); }, () -> tooltip.add(RANDOM_TEXT) ); return; } + if (type.isCreative()) { tooltip.add(RANDOM_TEXT); } diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/FoodItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/FoodItemComponent.java index 405a91ff..8b88d0a4 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/FoodItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/FoodItemComponent.java @@ -6,16 +6,12 @@ import net.errorcraft.itematic.item.component.ItemComponent; import net.errorcraft.itematic.item.component.ItemComponentType; import net.errorcraft.itematic.item.component.ItemComponentTypes; -import net.minecraft.SharedConstants; import net.minecraft.component.ComponentMap; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.FoodComponent; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.registry.entry.RegistryEntry; -import net.minecraft.util.UseAction; import net.minecraft.util.dynamic.Codecs; import net.minecraft.world.World; @@ -29,27 +25,8 @@ public record FoodItemComponent(int nutrition, float saturation, boolean alwaysE FoodComponent.StatusEffectEntry.CODEC.listOf().optionalFieldOf("effects", List.of()).forGetter(FoodItemComponent::effects) ).apply(instance, FoodItemComponent::new)); - public static FoodItemComponent of(int nutrition, float saturation, boolean alwaysEdible, List effects) { - return new FoodItemComponent(nutrition, saturation, alwaysEdible, effects); - } - - public static ItemComponent[] from(FoodComponent component) { - return from(component, null); - } - - public static ItemComponent[] from(FoodComponent component, RegistryEntry resultItem) { - return from(component, (int)(component.eatSeconds() * SharedConstants.TICKS_PER_SECOND), UseAction.EAT, resultItem); - } - - public static ItemComponent[] from(FoodComponent component, int eatTicks, UseAction useAction, RegistryEntry resultItem) { - return new ItemComponent[] { - UseableItemComponent.builder() - .ticks(eatTicks) - .animation(useAction) - .build(), - of(component.nutrition(), component.saturation(), component.canAlwaysEat(), component.effects()), - ConsumableItemComponent.of(resultItem) - }; + public static FoodItemComponent of(FoodComponent food) { + return new FoodItemComponent(food.nutrition(), food.saturation(), food.canAlwaysEat(), food.effects()); } @Override diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/ForgeableItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/ForgeableItemComponent.java deleted file mode 100644 index 002d91c3..00000000 --- a/src/main/java/net/errorcraft/itematic/item/component/components/ForgeableItemComponent.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.errorcraft.itematic.item.component.components; - -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.errorcraft.itematic.item.component.ItemComponent; -import net.errorcraft.itematic.item.component.ItemComponentType; -import net.errorcraft.itematic.item.component.ItemComponentTypes; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.registry.tag.TagKey; - -import java.util.Optional; - -public record ForgeableItemComponent(Optional> enchantments) implements ItemComponent { - public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - TagKey.unprefixedCodec(RegistryKeys.ENCHANTMENT).optionalFieldOf("enchantments").forGetter(ForgeableItemComponent::enchantments) - ).apply(instance, ForgeableItemComponent::new)); - - @Override - public ItemComponentType type() { - return ItemComponentTypes.FORGEABLE; - } - - @Override - public Codec codec() { - return CODEC; - } - - public static ForgeableItemComponent of(TagKey enchantments) { - return new ForgeableItemComponent(Optional.of(enchantments)); - } -} diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/OminousEffectProviderItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/OminousEffectProviderItemComponent.java new file mode 100644 index 00000000..189e87eb --- /dev/null +++ b/src/main/java/net/errorcraft/itematic/item/component/components/OminousEffectProviderItemComponent.java @@ -0,0 +1,59 @@ +package net.errorcraft.itematic.item.component.components; + +import com.mojang.serialization.Codec; +import net.errorcraft.itematic.item.ItemStackConsumer; +import net.errorcraft.itematic.item.component.ItemComponent; +import net.errorcraft.itematic.item.component.ItemComponentType; +import net.errorcraft.itematic.item.component.ItemComponentTypes; +import net.minecraft.client.item.TooltipType; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.PotionContentsComponent; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.entity.effect.StatusEffects; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.OminousBottleItem; +import net.minecraft.text.Text; +import net.minecraft.world.World; + +import java.util.List; + +public class OminousEffectProviderItemComponent implements ItemComponent { + public static final OminousEffectProviderItemComponent INSTANCE = new OminousEffectProviderItemComponent(); + public static final Codec CODEC = Codec.unit(INSTANCE); + + private OminousEffectProviderItemComponent() {} + + @Override + public ItemComponentType type() { + return ItemComponentTypes.OMINOUS_EFFECT_PROVIDER; + } + + @Override + public Codec codec() { + return CODEC; + } + + @Override + public void finishUsing(World world, LivingEntity user, ItemStack stack, int usedTicks, ItemStackConsumer resultStackConsumer) { + if (world.isClient()) { + return; + } + + user.removeStatusEffect(StatusEffects.BAD_OMEN); + int ominousAmplifier = stack.getOrDefault(DataComponentTypes.OMINOUS_BOTTLE_AMPLIFIER, 0); + user.addStatusEffect(createEffect(ominousAmplifier)); + } + + @Override + public void appendTooltip(ItemStack stack, Item.TooltipContext context, List tooltip, TooltipType type) { + int ominousAmplifier = stack.getOrDefault(DataComponentTypes.OMINOUS_BOTTLE_AMPLIFIER, 0); + List effects = List.of(createEffect(ominousAmplifier)); + PotionContentsComponent.buildTooltip(effects, tooltip::add, 1.0f, context.getUpdateTickRate()); + } + + private static StatusEffectInstance createEffect(int ominousAmplifier) { + return new StatusEffectInstance(StatusEffects.BAD_OMEN, OminousBottleItem.BAD_OMEN_LENGTH, ominousAmplifier, false, false, true); + } +} diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/ProjectileItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/ProjectileItemComponent.java index ca2ac7ad..35ce3b47 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/ProjectileItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/ProjectileItemComponent.java @@ -9,8 +9,6 @@ import net.errorcraft.itematic.item.component.ItemComponent; import net.errorcraft.itematic.item.component.ItemComponentType; import net.errorcraft.itematic.item.component.ItemComponentTypes; -import net.errorcraft.itematic.mixin.item.CrossbowItemAccessor; -import net.errorcraft.itematic.serialization.ItematicCodecs; import net.errorcraft.itematic.world.action.context.ActionContext; import net.errorcraft.itematic.world.action.context.parameter.ActionContextParameter; import net.minecraft.entity.Entity; @@ -23,32 +21,25 @@ import net.minecraft.item.ItemStack; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.dynamic.Codecs; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Position; import net.minecraft.world.World; -public record ProjectileItemComponent(EntityInitializer entity, int damage, float chargedSpeed) implements ItemComponent { +public record ProjectileItemComponent(EntityInitializer entity) implements ItemComponent { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - EntityInitializer.CODEC.fieldOf("entity").forGetter(ProjectileItemComponent::entity), - Codecs.NONNEGATIVE_INT.optionalFieldOf("damage", 0).forGetter(ProjectileItemComponent::damage), - ItematicCodecs.NON_NEGATIVE_FLOAT.optionalFieldOf("charged_speed", CrossbowItemAccessor.defaultSpeed()).forGetter(ProjectileItemComponent::chargedSpeed) + EntityInitializer.CODEC.fieldOf("entity").forGetter(ProjectileItemComponent::entity) ).apply(instance, ProjectileItemComponent::new)); - public static ProjectileItemComponent of(EntityInitializer entity, int damage, float chargedSpeed) { - return new ProjectileItemComponent(entity, damage, chargedSpeed); - } - - public static ProjectileItemComponent of(EntityInitializer entity, int damage) { - return of(entity, damage, CrossbowItemAccessor.defaultSpeed()); + public static ProjectileItemComponent of(EntityInitializer entity) { + return new ProjectileItemComponent(entity); } public static ProjectileItemComponent of(RegistryEntry> entity) { - return of(SimpleEntityInitializer.of(entity.value()), 0); + return of(SimpleEntityInitializer.of(entity.value())); } public static ProjectileItemComponent persistentProjectile(EntityType entityType, PersistentProjectileEntityInitializer.OwnerCreator ownerCreator, PersistentProjectileEntityInitializer.SimpleCreator simpleCreator) { - return of(new PersistentProjectileEntityInitializer<>(entityType, ownerCreator, simpleCreator), 1); + return of(new PersistentProjectileEntityInitializer<>(entityType, ownerCreator, simpleCreator)); } @Override @@ -65,6 +56,7 @@ public Entity createEntity(World world, Entity user, ItemStack stack, float angl if (world.isClient()) { return null; } + return this.createEntity((ServerWorld) world, user, stack, ItemStackConsumer.EMPTY, angleOffset, speed, 1.0f); } @@ -80,6 +72,7 @@ public Entity createEntity(World world, Position position, ItemStack stack, floa if (world.isClient()) { return null; } + ActionContext context = ActionContext.builder((ServerWorld) world, stack, ItemStackConsumer.EMPTY) .position(ActionContextParameter.TARGET, position) .build(); @@ -91,13 +84,16 @@ public Entity createEntity(ActionContext context, ActionContextParameter positio if (entity == null) { return null; } + entity.refreshPositionAfterTeleport(context.position(position)); if (entity instanceof ThrownItemEntity thrownItemEntity) { thrownItemEntity.setItem(context.stack()); } + if (entity instanceof ProjectileEntity projectileEntity) { this.initializeProjectile(context, projectileEntity, angleOffset, speed, uncertainty); } + return entity; } @@ -108,21 +104,24 @@ private void initializeProjectile(ActionContext context, ProjectileEntity projec ); } - private void initializeProjectile(ProjectileEntity entity, Direction side, float speed, float uncertainty) { - if (entity instanceof ExplosiveProjectileEntity) { - return; - } - entity.setVelocity(side.getOffsetX(), side.getOffsetY(), side.getOffsetZ(), speed, uncertainty); - } - private void initializeProjectile(ProjectileEntity entity, Entity user, float angleOffset, float speed, float uncertainty) { entity.setOwner(user); if (entity instanceof PersistentProjectileEntity persistentProjectileEntity && user instanceof PlayerEntity player && player.isInCreativeMode()) { persistentProjectileEntity.pickupType = PersistentProjectileEntity.PickupPermission.CREATIVE_ONLY; } + if (entity instanceof ExplosiveProjectileEntity) { return; } + entity.setVelocity(user, user.getPitch(), user.getYaw(), angleOffset, speed, uncertainty); } + + private void initializeProjectile(ProjectileEntity entity, Direction side, float speed, float uncertainty) { + if (entity instanceof ExplosiveProjectileEntity) { + return; + } + + entity.setVelocity(side.getOffsetX(), side.getOffsetY(), side.getOffsetZ(), speed, uncertainty); + } } diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/ShooterItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/ShooterItemComponent.java index f44eee33..3ab04895 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/ShooterItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/ShooterItemComponent.java @@ -3,37 +3,28 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.errorcraft.itematic.component.ItematicDataComponentTypes; +import net.errorcraft.itematic.component.type.ItemDamageRulesDataComponent; import net.errorcraft.itematic.component.type.ItemListDataComponent; -import net.errorcraft.itematic.item.ItemKeys; import net.errorcraft.itematic.item.ItemStackConsumer; import net.errorcraft.itematic.item.component.ItemComponent; import net.errorcraft.itematic.item.component.ItemComponentType; import net.errorcraft.itematic.item.component.ItemComponentTypes; +import net.errorcraft.itematic.item.shooter.method.ShooterMethod; import net.errorcraft.itematic.item.use.provider.providers.ShooterIntegerProvider; -import net.errorcraft.itematic.mixin.item.CrossbowItemAccessor; import net.errorcraft.itematic.world.action.context.ActionContext; import net.errorcraft.itematic.world.action.context.parameter.ActionContextParameter; import net.minecraft.component.ComponentMap; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.component.type.ChargedProjectilesComponent; import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.projectile.PersistentProjectileEntity; -import net.minecraft.item.BowItem; -import net.minecraft.item.CrossbowItem; +import net.minecraft.entity.projectile.ProjectileEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.registry.RegistryCodecs; import net.minecraft.registry.RegistryKeys; -import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.registry.entry.RegistryEntryList; import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvent; -import net.minecraft.sound.SoundEvents; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; import net.minecraft.util.UseAction; @@ -43,39 +34,30 @@ import java.util.List; import java.util.Optional; +import java.util.OptionalInt; -public record ShooterItemComponent(RegistryEntryList heldAmmunition, RegistryEntryList ammunition, int range, Optional chargeable) implements ItemComponent { +public record ShooterItemComponent(RegistryEntryList heldAmmunition, RegistryEntryList ammunition, int range, ShooterMethod method, ItemDamageRulesDataComponent itemDamage) implements ItemComponent { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( RegistryCodecs.entryList(RegistryKeys.ITEM).fieldOf("held_ammunition").forGetter(ShooterItemComponent::heldAmmunition), RegistryCodecs.entryList(RegistryKeys.ITEM).fieldOf("ammunition").forGetter(ShooterItemComponent::ammunition), Codecs.POSITIVE_INT.fieldOf("range").forGetter(ShooterItemComponent::range), - Chargeable.CODEC.optionalFieldOf("chargeable").forGetter(ShooterItemComponent::chargeable) + ShooterMethod.CODEC.fieldOf("method").forGetter(ShooterItemComponent::method), + ItemDamageRulesDataComponent.CODEC.fieldOf("item_damage").forGetter(ShooterItemComponent::itemDamage) ).apply(instance, ShooterItemComponent::new)); - private static final float CHARGE_PROGRESS = CrossbowItemAccessor.chargeProgress(); - private static final float LOAD_PROGRESS = CrossbowItemAccessor.loadProgress(); - private static final int DEFAULT_CHARGE_TIME = CrossbowItemAccessor.defaultPullTime(); - private static final int EXTRA_USE_TIME = 3; - private static final int CHARGE_TIME_PER_QUICK_CHARGE_LEVEL = 5; - private static final CrossbowItem DUMMY = new CrossbowItem(new Item.Settings()); - public static ItemComponent[] of(RegistryEntryList heldAmmunition, RegistryEntryList ammunition, int range) { + public static ItemComponent[] of(UseAction animation, RegistryEntryList heldAmmunition, RegistryEntryList ammunition, int range, ShooterMethod method, ItemDamageRulesDataComponent.Rule... rules) { return new ItemComponent[] { UseableItemComponent.builder() .ticks(ShooterIntegerProvider.INSTANCE) - .animation(UseAction.BOW) + .animation(animation) .build(), - new ShooterItemComponent(heldAmmunition, ammunition, range, Optional.empty()) - }; - } - - @SafeVarargs - public static ItemComponent[] of(RegistryEntryList heldAmmunition, RegistryEntryList ammunition, int range, RegistryEntry defaultSound, RegistryEntry... levelSounds) { - return new ItemComponent[] { - UseableItemComponent.builder() - .ticks(ShooterIntegerProvider.INSTANCE) - .animation(UseAction.CROSSBOW) - .build(), - new ShooterItemComponent(heldAmmunition, ammunition, range, Optional.of(Chargeable.of(QuickChargeSounds.of(defaultSound, levelSounds)))) + new ShooterItemComponent( + heldAmmunition, + ammunition, + range, + method, + new ItemDamageRulesDataComponent(List.of(rules), 1) + ) }; } @@ -91,189 +73,86 @@ public Codec codec() { @Override public ActionResult use(World world, PlayerEntity user, Hand hand, ItemStack stack, ItemStackConsumer resultStackConsumer) { - if (!this.isCharged(stack)) { - return ActionResult.PASS; + if (this.method.tryShoot(this, stack, world, user, hand)) { + return ActionResult.CONSUME; } - float chargedSpeed = stack.getOrDefault(DataComponentTypes.CHARGED_PROJECTILES, ChargedProjectilesComponent.DEFAULT) - .itematic$getChargedSpeed(); - DUMMY.shootAll(world, user, hand, stack, chargedSpeed, 1.0f, null); - return ActionResult.CONSUME; + + return ActionResult.PASS; } @Override public void using(ItemStack stack, World world, LivingEntity user, int usedTicks, int remainingUseTicks) { - this.chargeable.ifPresent(chargeable -> this.tryLoad(stack, world, user, usedTicks, chargeable)); + this.method.hold(this, stack, world, user, usedTicks); } @Override public void stopUsing(ItemStack stack, World world, LivingEntity user, int usedTicks, int remainingUseTicks, ItemStackConsumer resultStackConsumer) { - float pullProgress = this.getPullProgress(stack, usedTicks); - if (this.isChargeable()) { - this.charge(stack, world, user, pullProgress); - return; - } - if (!(user instanceof PlayerEntity player)) { - return; - } - this.shoot(stack, world, player, pullProgress, resultStackConsumer); + this.method.stop(this, stack, world, user, usedTicks); } @Override public void addComponents(ComponentMap.Builder builder) { builder.add(ItematicDataComponentTypes.SHOOTER_AMMUNITION, new ItemListDataComponent(this.ammunition)); builder.add(ItematicDataComponentTypes.SHOOTER_HELD_AMMUNITION, new ItemListDataComponent(this.heldAmmunition)); - if (this.isChargeable()) { - builder.add(DataComponentTypes.CHARGED_PROJECTILES, ChargedProjectilesComponent.DEFAULT); - } - } - - public static int useDuration(ItemStack stack) { - return getPullTime(stack) + EXTRA_USE_TIME; - } - - public static int getPullTime(ItemStack stack) { - int quickChargeLevel = EnchantmentHelper.getLevel(Enchantments.QUICK_CHARGE, stack); - return DEFAULT_CHARGE_TIME - CHARGE_TIME_PER_QUICK_CHARGE_LEVEL * quickChargeLevel; - } - - public void shootAll(World world, LivingEntity shooter, Hand hand, ItemStack stack, float speed, float divergence, @Nullable LivingEntity target) { - DUMMY.shootAll(world, shooter, hand, stack, speed, divergence, target); - } + builder.add(ItematicDataComponentTypes.SHOOTER_DAMAGE_RULES, this.itemDamage); + this.method.addComponents(builder); + } + + public void shoot(ServerWorld world, LivingEntity shooter, Hand hand, ItemStack shooterStack, List projectiles, float power, float divergence, boolean critical, @Nullable LivingEntity target) { + float maxAngle = EnchantmentHelper.getProjectileSpread(world, shooterStack, shooter, 0.0f); + float angleStep = projectiles.size() == 1 ? + 0.0f : + 2.0f * maxAngle / (projectiles.size() - 1); + float angleOffset = ((projectiles.size() - 1) % 2.0f) * angleStep / 2.0f; + float direction = 1.0f; + for (int i = 0; i < projectiles.size(); i++) { + ItemStack projectile = projectiles.get(i); + if (projectile.isEmpty()) { + continue; + } - public float getPullProgress(ItemStack stack, int usedTicks) { - if (this.isChargeable()) { - float progress = (float)usedTicks / getPullTime(stack); - return Math.min(progress, 1.0f); + float angle = angleOffset + direction * ((i + 1) / 2.0f) * angleStep; + direction *= -1; + this.damageItem(shooterStack, world, hand, shooter); + this.createProjectile(projectile, world, shooter, power, divergence, angle, i, critical, target); } - return BowItem.getPullProgress(usedTicks); - } - - public boolean isChargeable() { - return this.chargeable.isPresent(); } - public boolean isCharged(ItemStack stack) { - return this.isChargeable() && !stack.getOrDefault(DataComponentTypes.CHARGED_PROJECTILES, ChargedProjectilesComponent.DEFAULT).isEmpty(); + public OptionalInt useDuration(ItemStack stack, LivingEntity user) { + return this.method.useDuration(stack, user); } - private void tryLoad(ItemStack stack, World world, LivingEntity user, int usedTicks, Chargeable chargeable) { - if (world.isClient()) { + private void damageItem(ItemStack stack, ServerWorld world, Hand hand, LivingEntity shooter) { + ItemDamageRulesDataComponent rules = stack.get(ItematicDataComponentTypes.SHOOTER_DAMAGE_RULES); + if (rules == null) { return; } - int pullTime = getPullTime(stack); - if (usedTicks >= pullTime) { - return; - } - int quickChargeLevel = EnchantmentHelper.getLevel(Enchantments.QUICK_CHARGE, stack); - if (usedTicks == getPullTimeAt(pullTime, CHARGE_PROGRESS)) { - world.playSound(null, user.getX(), user.getY(), user.getZ(), chargeable.quickChargeSounds.get(quickChargeLevel).value(), SoundCategory.PLAYERS, 0.5f, 1.0f); - return; - } - if (usedTicks == getPullTimeAt(pullTime, LOAD_PROGRESS) && quickChargeLevel == 0) { - world.playSound(null, user.getX(), user.getY(), user.getZ(), SoundEvents.ITEM_CROSSBOW_LOADING_MIDDLE, SoundCategory.PLAYERS, 0.5f, 1.0f); - } - } - private void charge(ItemStack stack, World world, LivingEntity user, float pullProgress) { - if (pullProgress == 1.0f && !this.isCharged(stack) && CrossbowItemAccessor.loadProjectiles(user, stack)) { - SoundCategory soundCategory = user instanceof PlayerEntity ? SoundCategory.PLAYERS : SoundCategory.HOSTILE; - world.playSound(null, user.getX(), user.getY(), user.getZ(), SoundEvents.ITEM_CROSSBOW_LOADING_END, soundCategory, 1.0f, 1.0f / (world.getRandom().nextFloat() * 0.5f + 1.0f) + 0.2f); - } - } - - private void shoot(ItemStack stack, World world, PlayerEntity player, float pullProgress, ItemStackConsumer resultStackConsumer) { - if (pullProgress < 0.1f) { - return; - } - ItemStack ammunition = player.itematic$getAmmunition(stack); - if (ammunition.isEmpty()) { - return; - } - boolean disallowPickup = EnchantmentHelper.getLevel(Enchantments.INFINITY, stack) > 0 && ammunition.itematic$isOf(ItemKeys.ARROW); - if (!world.isClient()) { - this.createProjectile(stack, ammunition, (ServerWorld) world, player, pullProgress, disallowPickup, resultStackConsumer); - } - world.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.ENTITY_ARROW_SHOOT, SoundCategory.PLAYERS, 1.0f, 1.0f / (world.getRandom().nextFloat() * 0.4f + 1.2f) + pullProgress * 0.5f); - if (player.getAbilities().creativeMode || disallowPickup) { + int damage = rules.damage(stack); + if (damage == 0) { return; } - ammunition.decrement(1); - if (ammunition.isEmpty()) { - player.getInventory().removeOne(ammunition); - } - } - private void createProjectile(ItemStack stack, ItemStack ammunition, ServerWorld world, PlayerEntity player, float pullProgress, boolean disallowPickup, ItemStackConsumer resultStackConsumer) { - Optional optionalEntity = ammunition.itematic$getComponent(ItemComponentTypes.PROJECTILE) - .map(c -> c.createEntity(world, player, ammunition, 0.0f, pullProgress * 3.0f)); + ActionContext context = ActionContext.builder(world) + .stack(stack) + .hand(hand) + .entityPosition(ActionContextParameter.THIS, shooter) + .build(); + stack.itematic$damage(damage, context); + } + private void createProjectile(ItemStack projectile, ServerWorld world, LivingEntity shooter, float power, float divergence, float angle, int index, boolean critical, @Nullable LivingEntity target) { + Optional optionalEntity = projectile.itematic$getComponent(ItemComponentTypes.PROJECTILE) + .map(projectileComponent -> projectileComponent.createEntity(world, shooter, projectile, 0.0f, power)); if (optionalEntity.isEmpty()) { return; } Entity entity = optionalEntity.get(); - if (entity instanceof PersistentProjectileEntity persistentProjectileEntity) { - this.initProjectile(persistentProjectileEntity, stack, pullProgress); - - ActionContext context = ActionContext.builder(world, stack, resultStackConsumer, player.getActiveHand()) - .entityPosition(ActionContextParameter.THIS, player) - .build(); - stack.itematic$damage(1, context); - if (disallowPickup) { - persistentProjectileEntity.pickupType = PersistentProjectileEntity.PickupPermission.CREATIVE_ONLY; - } + if (entity instanceof ProjectileEntity projectileEntity) { + this.method.initializeProjectile(shooter, projectileEntity, index, power, divergence, angle, critical, target); } world.spawnEntity(entity); } - - private void initProjectile(PersistentProjectileEntity entity, ItemStack stack, float pullProgress) { - if (pullProgress == 1.0f) { - entity.setCritical(true); - } - int powerLevel = EnchantmentHelper.getLevel(Enchantments.POWER, stack); - if (powerLevel > 0) { - entity.setDamage(entity.getDamage() + powerLevel * 0.5d + 0.5d); - } - int punchLevel = EnchantmentHelper.getLevel(Enchantments.PUNCH, stack); - if (punchLevel > 0) { - entity.setPunch(punchLevel); - } - if (EnchantmentHelper.getLevel(Enchantments.FLAME, stack) > 0) { - entity.setOnFireFor(100); - } - } - - private static int getPullTimeAt(int pullTime, float progress) { - return (int)(progress * pullTime); - } - - public record Chargeable(QuickChargeSounds quickChargeSounds) { - public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - QuickChargeSounds.CODEC.fieldOf("quick_charge_sounds").forGetter(Chargeable::quickChargeSounds) - ).apply(instance, Chargeable::new)); - - public static Chargeable of(QuickChargeSounds quickChargeSounds) { - return new Chargeable(quickChargeSounds); - } - } - - public record QuickChargeSounds(List> levels, RegistryEntry defaultSound) { - public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - SoundEvent.ENTRY_CODEC.listOf().fieldOf("levels").forGetter(QuickChargeSounds::levels), - SoundEvent.ENTRY_CODEC.fieldOf("default").forGetter(QuickChargeSounds::defaultSound) - ).apply(instance, QuickChargeSounds::new)); - - public RegistryEntry get(int level) { - if (level < 0 || level >= this.levels.size()) { - return this.defaultSound; - } - return this.levels.get(level); - } - - @SafeVarargs - public static QuickChargeSounds of(RegistryEntry defaultSound, RegistryEntry... levelSounds) { - return new QuickChargeSounds(List.of(levelSounds), defaultSound); - } - } } diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/SmithingTemplateItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/SmithingTemplateItemComponent.java index 2af3a832..da7c6996 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/SmithingTemplateItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/SmithingTemplateItemComponent.java @@ -28,6 +28,13 @@ public record SmithingTemplateItemComponent(RegistryEntry temp private static final Text APPLIES_TO_TEXT = SmithingTemplateItemAccessor.getAppliesToText(); private static final Text INGREDIENTS_TEXT = SmithingTemplateItemAccessor.getIngredientsText(); + public static ItemComponent[] of(RegistryEntry template) { + return new ItemComponent[] { + StackableItemComponent.of(64), + new SmithingTemplateItemComponent(template) + }; + } + @Override public ItemComponentType type() { return ItemComponentTypes.SMITHING_TEMPLATE; @@ -48,8 +55,4 @@ public void appendTooltip(ItemStack stack, Item.TooltipContext context, List template) { - return new SmithingTemplateItemComponent(template); - } } diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/WeaponItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/WeaponItemComponent.java index 6fa1b131..e9604181 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/WeaponItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/WeaponItemComponent.java @@ -20,6 +20,7 @@ import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.item.MaceItem; import net.minecraft.server.world.ServerWorld; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -27,18 +28,30 @@ import java.util.List; -public record WeaponItemComponent(int damagePerHit, WeaponAttackDamageDataComponent attackDamage, double attackSpeed) implements ItemComponent { +public record WeaponItemComponent(int damagePerHit, WeaponAttackDamageDataComponent attackDamage, double attackSpeed, boolean maySmash) implements ItemComponent { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( Codecs.NONNEGATIVE_INT.optionalFieldOf("damage_per_hit", 1).forGetter(WeaponItemComponent::damagePerHit), WeaponAttackDamageDataComponent.CODEC.fieldOf("attack_damage").forGetter(WeaponItemComponent::attackDamage), - ItematicCodecs.NON_NEGATIVE_DOUBLE.fieldOf("attack_speed").forGetter(WeaponItemComponent::attackSpeed) + ItematicCodecs.NON_NEGATIVE_DOUBLE.fieldOf("attack_speed").forGetter(WeaponItemComponent::attackSpeed), + Codec.BOOL.optionalFieldOf("may_smash", false).forGetter(WeaponItemComponent::maySmash) ).apply(instance, WeaponItemComponent::new)); + private static final MaceItem DUMMY = new MaceItem(new Item.Settings()); public static WeaponItemComponent of(int damagePerHit, double attackDamage, double attackSpeed, WeaponAttackDamageDataComponent.Rule... rules) { return new WeaponItemComponent( damagePerHit, new WeaponAttackDamageDataComponent(List.of(rules), attackDamage), - attackSpeed + attackSpeed, + false + ); + } + + public static WeaponItemComponent ofSmashing(int damagePerHit, double attackDamage, double attackSpeed) { + return new WeaponItemComponent( + damagePerHit, + new WeaponAttackDamageDataComponent(List.of(), attackDamage), + attackSpeed, + true ); } @@ -54,9 +67,14 @@ public Codec codec() { @Override public boolean postHit(ItemStack stack, LivingEntity target, LivingEntity attacker, ItemStackConsumer resultStackConsumer) { + if (this.maySmash && !DUMMY.postHit(stack, target, attacker)) { + return false; + } + if (!(attacker.getWorld() instanceof ServerWorld serverWorld)) { return true; } + ActionContext context = ActionContext.builder(serverWorld, stack, resultStackConsumer, EquipmentSlot.MAINHAND) .entityPosition(ActionContextParameter.THIS, attacker) .entityPosition(ActionContextParameter.TARGET, target) diff --git a/src/main/java/net/errorcraft/itematic/item/group/entry/ItemGroupEntry.java b/src/main/java/net/errorcraft/itematic/item/group/entry/ItemGroupEntry.java index a35fbd14..39f819b8 100644 --- a/src/main/java/net/errorcraft/itematic/item/group/entry/ItemGroupEntry.java +++ b/src/main/java/net/errorcraft/itematic/item/group/entry/ItemGroupEntry.java @@ -1,78 +1,37 @@ package net.errorcraft.itematic.item.group.entry; -import com.mojang.datafixers.Products; import com.mojang.datafixers.util.Either; import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; import net.errorcraft.itematic.item.group.entry.entries.StackItemGroupEntry; import net.errorcraft.itematic.item.group.entry.entries.TagItemGroupEntry; import net.minecraft.component.ComponentChanges; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; -import net.minecraft.item.ItemStack; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.registry.entry.RegistryFixedCodec; import net.minecraft.registry.tag.TagKey; import net.minecraft.util.StringIdentifiable; -import java.util.Collection; import java.util.function.Function; -public abstract class ItemGroupEntry { - public static final Codec ENTRY_CODEC = StringIdentifiable.createCodec(ItemGroupEntryType::values).dispatch(ItemGroupEntry::type, ItemGroupEntryType::codec); - public static final Codec CODEC = Codec.either(RegistryFixedCodec.of(RegistryKeys.ITEM), ENTRY_CODEC).xmap(either -> either.map(StackItemGroupEntry::new, Function.identity()), ItemGroupEntry::createEither); +public interface ItemGroupEntry { + Codec ENTRY_CODEC = StringIdentifiable.createCodec(ItemGroupEntryType::values).dispatch(ItemGroupEntry::type, ItemGroupEntryType::codec); + Codec CODEC = Codec.either(RegistryFixedCodec.of(RegistryKeys.ITEM), ENTRY_CODEC).xmap(either -> either.map(StackItemGroupEntry::new, Function.identity()), ItemGroupEntry::createEither); - private final ItemGroup.StackVisibility visibility; - private final boolean requiresPermissions; - - protected ItemGroupEntry(ItemGroup.StackVisibility visibility, boolean requiresPermissions) { - this.visibility = visibility; - this.requiresPermissions = requiresPermissions; - } - - protected ItemGroupEntry() { - this(ItemGroup.StackVisibility.PARENT_AND_SEARCH_TABS, false); - } - - protected ItemGroup.StackVisibility visibility() { - return visibility; - } - - protected boolean requiresPermissions() { - return requiresPermissions; - } - - protected abstract Collection createStacks(ItemGroup.DisplayContext context); - protected abstract ItemGroupEntryType type(); - - public final void addStacks(ItemGroup.DisplayContext context, ItemGroup.Entries entries) { - if (this.requiresPermissions && !context.hasPermissions()) { - return; - } - entries.addAll(this.createStacks(context), this.visibility); - } - - protected Either, ItemGroupEntry> createEither() { - return Either.right(this); - } - - public static ItemGroupEntry simple(RegistryEntry item) { + static ItemGroupEntry simple(RegistryEntry item) { return new StackItemGroupEntry(item); } - public static ItemGroupEntry requiresPermissions(RegistryEntry item) { + static ItemGroupEntry requiresPermissions(RegistryEntry item) { return new StackItemGroupEntry(ItemGroup.StackVisibility.PARENT_AND_SEARCH_TABS, true, item, ComponentChanges.EMPTY); } - public static ItemGroupEntry tag(TagKey tag) { + static ItemGroupEntry tag(TagKey tag) { return new TagItemGroupEntry(tag); } - protected static Products.P2, ItemGroup.StackVisibility, Boolean> createCodec(RecordCodecBuilder.Instance instance) { - return instance.group( - StringIdentifiable.createCodec(ItemGroup.StackVisibility::values).optionalFieldOf("visibility", ItemGroup.StackVisibility.PARENT_AND_SEARCH_TABS).forGetter(ItemGroupEntry::visibility), - Codec.BOOL.optionalFieldOf("requires_permissions", false).forGetter(ItemGroupEntry::requiresPermissions) - ); - } + ItemGroupEntryType type(); + void addStacks(ItemGroup.DisplayContext context, ItemGroup.Entries entries); + Either, ItemGroupEntry> createEither(); } diff --git a/src/main/java/net/errorcraft/itematic/item/group/entry/ItemGroupEntryType.java b/src/main/java/net/errorcraft/itematic/item/group/entry/ItemGroupEntryType.java index acf22661..a45bbe9b 100644 --- a/src/main/java/net/errorcraft/itematic/item/group/entry/ItemGroupEntryType.java +++ b/src/main/java/net/errorcraft/itematic/item/group/entry/ItemGroupEntryType.java @@ -10,7 +10,8 @@ public enum ItemGroupEntryType implements StringIdentifiable { PAINTING_VARIANT("painting_variant", PaintingVariantItemGroupEntry.CODEC), INSTRUMENT("instrument", InstrumentItemGroupEntry.CODEC), SUSPICIOUS_EFFECT_INGREDIENT("suspicious_effect_ingredient", SuspiciousEffectIngredientItemGroupEntry.CODEC), - POTION("potion", PotionItemGroupEntry.CODEC); + POTION("potion", PotionItemGroupEntry.CODEC), + ENCHANTMENT("enchantment", EnchantmentItemGroupEntry.CODEC); private final String name; private final MapCodec codec; diff --git a/src/main/java/net/errorcraft/itematic/item/group/entry/PossiblyHiddenItemGroupEntry.java b/src/main/java/net/errorcraft/itematic/item/group/entry/PossiblyHiddenItemGroupEntry.java new file mode 100644 index 00000000..36532e2c --- /dev/null +++ b/src/main/java/net/errorcraft/itematic/item/group/entry/PossiblyHiddenItemGroupEntry.java @@ -0,0 +1,58 @@ +package net.errorcraft.itematic.item.group.entry; + +import com.mojang.datafixers.Products; +import com.mojang.datafixers.util.Either; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.item.Item; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemStack; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.util.StringIdentifiable; + +import java.util.Collection; + +public abstract class PossiblyHiddenItemGroupEntry implements ItemGroupEntry { + private final ItemGroup.StackVisibility visibility; + private final boolean requiresPermissions; + + protected PossiblyHiddenItemGroupEntry(ItemGroup.StackVisibility visibility, boolean requiresPermissions) { + this.visibility = visibility; + this.requiresPermissions = requiresPermissions; + } + + protected PossiblyHiddenItemGroupEntry() { + this(ItemGroup.StackVisibility.PARENT_AND_SEARCH_TABS, false); + } + + @Override + public final void addStacks(ItemGroup.DisplayContext context, ItemGroup.Entries entries) { + if (this.requiresPermissions && !context.hasPermissions()) { + return; + } + + entries.addAll(this.createStacks(context), this.visibility); + } + + @Override + public Either, ItemGroupEntry> createEither() { + return Either.right(this); + } + + protected abstract Collection createStacks(ItemGroup.DisplayContext context); + + protected ItemGroup.StackVisibility visibility() { + return this.visibility; + } + + protected boolean requiresPermissions() { + return this.requiresPermissions; + } + + protected static Products.P2, ItemGroup.StackVisibility, Boolean> createCodec(RecordCodecBuilder.Instance instance) { + return instance.group( + StringIdentifiable.createCodec(ItemGroup.StackVisibility::values).optionalFieldOf("visibility", ItemGroup.StackVisibility.PARENT_AND_SEARCH_TABS).forGetter(PossiblyHiddenItemGroupEntry::visibility), + Codec.BOOL.optionalFieldOf("requires_permissions", false).forGetter(PossiblyHiddenItemGroupEntry::requiresPermissions) + ); + } +} diff --git a/src/main/java/net/errorcraft/itematic/item/group/entry/entries/EnchantmentItemGroupEntry.java b/src/main/java/net/errorcraft/itematic/item/group/entry/entries/EnchantmentItemGroupEntry.java new file mode 100644 index 00000000..b2711556 --- /dev/null +++ b/src/main/java/net/errorcraft/itematic/item/group/entry/entries/EnchantmentItemGroupEntry.java @@ -0,0 +1,61 @@ +package net.errorcraft.itematic.item.group.entry.entries; + +import com.mojang.datafixers.util.Either; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.errorcraft.itematic.item.group.entry.ItemGroupEntry; +import net.errorcraft.itematic.item.group.entry.ItemGroupEntryType; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.item.Item; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemStack; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.registry.entry.RegistryFixedCodec; + +import java.util.stream.IntStream; + +public record EnchantmentItemGroupEntry(RegistryEntry item) implements ItemGroupEntry { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + RegistryFixedCodec.of(RegistryKeys.ITEM).fieldOf("item").forGetter(EnchantmentItemGroupEntry::item) + ).apply(instance, EnchantmentItemGroupEntry::new)); + + public static EnchantmentItemGroupEntry of(RegistryEntry item) { + return new EnchantmentItemGroupEntry(item); + } + + @Override + public ItemGroupEntryType type() { + return ItemGroupEntryType.ENCHANTMENT; + } + + @Override + public void addStacks(ItemGroup.DisplayContext context, ItemGroup.Entries entries) { + context.lookup().getWrapperOrThrow(RegistryKeys.ENCHANTMENT).streamEntries() + .forEach(enchantment -> IntStream.rangeClosed(enchantment.value().getMinLevel(), enchantment.value().getMaxLevel()) + .forEach(level -> entries.add( + this.createStack(enchantment, level), + visibility(enchantment, level) + )) + ); + } + + @Override + public Either, ItemGroupEntry> createEither() { + return Either.right(this); + } + + private ItemStack createStack(RegistryEntry enchantment, int level) { + ItemStack stack = new ItemStack(this.item); + stack.addEnchantment(enchantment, level); + return stack; + } + + private static ItemGroup.StackVisibility visibility(RegistryEntry enchantment, int level) { + if (enchantment.value().getMaxLevel() == level) { + return ItemGroup.StackVisibility.PARENT_AND_SEARCH_TABS; + } + + return ItemGroup.StackVisibility.SEARCH_TAB_ONLY; + } +} diff --git a/src/main/java/net/errorcraft/itematic/item/group/entry/entries/InstrumentItemGroupEntry.java b/src/main/java/net/errorcraft/itematic/item/group/entry/entries/InstrumentItemGroupEntry.java index 496d33fa..e87885fd 100644 --- a/src/main/java/net/errorcraft/itematic/item/group/entry/entries/InstrumentItemGroupEntry.java +++ b/src/main/java/net/errorcraft/itematic/item/group/entry/entries/InstrumentItemGroupEntry.java @@ -2,8 +2,8 @@ import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.errorcraft.itematic.item.group.entry.ItemGroupEntry; import net.errorcraft.itematic.item.group.entry.ItemGroupEntryType; +import net.errorcraft.itematic.item.group.entry.PossiblyHiddenItemGroupEntry; import net.minecraft.component.DataComponentTypes; import net.minecraft.item.Instrument; import net.minecraft.item.Item; @@ -16,10 +16,10 @@ import java.util.Collection; -public class InstrumentItemGroupEntry extends ItemGroupEntry { +public class InstrumentItemGroupEntry extends PossiblyHiddenItemGroupEntry { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> createCodec(instance).and(instance.group( - RegistryFixedCodec.of(RegistryKeys.ITEM).fieldOf("item").forGetter(InstrumentItemGroupEntry::item), - TagKey.unprefixedCodec(RegistryKeys.INSTRUMENT).fieldOf("tag").forGetter(InstrumentItemGroupEntry::tag) + RegistryFixedCodec.of(RegistryKeys.ITEM).fieldOf("item").forGetter(entry -> entry.item), + TagKey.unprefixedCodec(RegistryKeys.INSTRUMENT).fieldOf("tag").forGetter(entry -> entry.tag) )).apply(instance, InstrumentItemGroupEntry::new)); private final RegistryEntry item; @@ -35,18 +35,15 @@ public InstrumentItemGroupEntry(ItemGroup.StackVisibility visibility, boolean re this.tag = tag; } - public RegistryEntry item() { - return this.item; - } - - public TagKey tag() { - return this.tag; - } - public static InstrumentItemGroupEntry of(RegistryEntry item, TagKey tag) { return new InstrumentItemGroupEntry(item, tag); } + @Override + public ItemGroupEntryType type() { + return ItemGroupEntryType.INSTRUMENT; + } + @Override protected Collection createStacks(ItemGroup.DisplayContext context) { return context.lookup() @@ -60,9 +57,4 @@ protected Collection createStacks(ItemGroup.DisplayContext context) { }) .toList(); } - - @Override - protected ItemGroupEntryType type() { - return ItemGroupEntryType.INSTRUMENT; - } } diff --git a/src/main/java/net/errorcraft/itematic/item/group/entry/entries/PaintingVariantItemGroupEntry.java b/src/main/java/net/errorcraft/itematic/item/group/entry/entries/PaintingVariantItemGroupEntry.java index 264b502b..9174877c 100644 --- a/src/main/java/net/errorcraft/itematic/item/group/entry/entries/PaintingVariantItemGroupEntry.java +++ b/src/main/java/net/errorcraft/itematic/item/group/entry/entries/PaintingVariantItemGroupEntry.java @@ -4,8 +4,8 @@ import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.errorcraft.itematic.entity.EntityTypeKeys; -import net.errorcraft.itematic.item.group.entry.ItemGroupEntry; import net.errorcraft.itematic.item.group.entry.ItemGroupEntryType; +import net.errorcraft.itematic.item.group.entry.PossiblyHiddenItemGroupEntry; import net.errorcraft.itematic.mixin.item.ItemGroupsAccessor; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.NbtComponent; @@ -15,8 +15,12 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtElement; +import net.minecraft.nbt.NbtOps; import net.minecraft.predicate.TagPredicate; import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.RegistryOps; +import net.minecraft.registry.RegistryWrapper; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.registry.entry.RegistryFixedCodec; import net.minecraft.registry.tag.TagKey; @@ -26,10 +30,10 @@ import java.util.Comparator; import java.util.Optional; -public class PaintingVariantItemGroupEntry extends ItemGroupEntry { +public class PaintingVariantItemGroupEntry extends PossiblyHiddenItemGroupEntry { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> createCodec(instance).and(instance.group( - RegistryFixedCodec.of(RegistryKeys.ITEM).fieldOf("item").forGetter(PaintingVariantItemGroupEntry::item), - TagPredicate.createCodec(RegistryKeys.PAINTING_VARIANT).fieldOf("tag").forGetter(PaintingVariantItemGroupEntry::tag) + RegistryFixedCodec.of(RegistryKeys.ITEM).fieldOf("item").forGetter(entry -> entry.item), + TagPredicate.createCodec(RegistryKeys.PAINTING_VARIANT).fieldOf("tag").forGetter(entry -> entry.tag) )).apply(instance, PaintingVariantItemGroupEntry::new)); private static final Comparator> PAINTING_VARIANT_COMPARATOR = ItemGroupsAccessor.paintingVariantComparator(); private static final Logger LOGGER = LogUtils.getLogger(); @@ -47,14 +51,6 @@ public PaintingVariantItemGroupEntry(ItemGroup.StackVisibility visibility, boole this.tag = tag; } - public RegistryEntry item() { - return this.item; - } - - public TagPredicate tag() { - return this.tag; - } - public static PaintingVariantItemGroupEntry expected(RegistryEntry item, TagKey tag) { return new PaintingVariantItemGroupEntry(false, item, TagPredicate.expected(tag)); } @@ -63,14 +59,20 @@ public static PaintingVariantItemGroupEntry unexpected(RegistryEntry item, return new PaintingVariantItemGroupEntry(true, item, TagPredicate.unexpected(tag)); } + @Override + public ItemGroupEntryType type() { + return ItemGroupEntryType.PAINTING_VARIANT; + } + @Override protected Collection createStacks(ItemGroup.DisplayContext context) { - return context.lookup() - .getWrapperOrThrow(RegistryKeys.PAINTING_VARIANT) + RegistryWrapper.WrapperLookup lookup = context.lookup(); + RegistryOps ops = lookup.getOps(NbtOps.INSTANCE); + return lookup.getWrapperOrThrow(RegistryKeys.PAINTING_VARIANT) .streamEntries() .filter(this.tag::test) .sorted(PAINTING_VARIANT_COMPARATOR) - .map(variant -> NbtComponent.DEFAULT.with(PaintingEntity.VARIANT_MAP_CODEC, variant).resultOrPartial(LOGGER::error)) + .map(variant -> NbtComponent.DEFAULT.with(ops, PaintingEntity.VARIANT_MAP_CODEC, variant).resultOrPartial(LOGGER::error)) .flatMap(Optional::stream) .map(nbt -> nbt.apply(newNbt -> newNbt.putString(Entity.ID_KEY, EntityTypeKeys.PAINTING.getValue().toString()))) .map(nbt -> { @@ -80,9 +82,4 @@ protected Collection createStacks(ItemGroup.DisplayContext context) { }) .toList(); } - - @Override - protected ItemGroupEntryType type() { - return ItemGroupEntryType.PAINTING_VARIANT; - } } diff --git a/src/main/java/net/errorcraft/itematic/item/group/entry/entries/PotionItemGroupEntry.java b/src/main/java/net/errorcraft/itematic/item/group/entry/entries/PotionItemGroupEntry.java index 4a94899d..56df6ad8 100644 --- a/src/main/java/net/errorcraft/itematic/item/group/entry/entries/PotionItemGroupEntry.java +++ b/src/main/java/net/errorcraft/itematic/item/group/entry/entries/PotionItemGroupEntry.java @@ -3,8 +3,8 @@ import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.errorcraft.itematic.component.PotionContentsComponentUtil; -import net.errorcraft.itematic.item.group.entry.ItemGroupEntry; import net.errorcraft.itematic.item.group.entry.ItemGroupEntryType; +import net.errorcraft.itematic.item.group.entry.PossiblyHiddenItemGroupEntry; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; @@ -14,9 +14,9 @@ import java.util.Collection; -public class PotionItemGroupEntry extends ItemGroupEntry { +public class PotionItemGroupEntry extends PossiblyHiddenItemGroupEntry { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> createCodec(instance).and( - RegistryFixedCodec.of(RegistryKeys.ITEM).fieldOf("item").forGetter(PotionItemGroupEntry::item) + RegistryFixedCodec.of(RegistryKeys.ITEM).fieldOf("item").forGetter(entry -> entry.item) ).apply(instance, PotionItemGroupEntry::new)); private final RegistryEntry item; @@ -30,14 +30,15 @@ public PotionItemGroupEntry(ItemGroup.StackVisibility visibility, boolean requir this.item = item; } - public RegistryEntry item() { - return this.item; - } - public static PotionItemGroupEntry of(RegistryEntry item) { return new PotionItemGroupEntry(item); } + @Override + public ItemGroupEntryType type() { + return ItemGroupEntryType.POTION; + } + @Override protected Collection createStacks(ItemGroup.DisplayContext context) { return context.lookup() @@ -46,9 +47,4 @@ protected Collection createStacks(ItemGroup.DisplayContext context) { .map(entry -> PotionContentsComponentUtil.setPotion(new ItemStack(this.item), entry)) .toList(); } - - @Override - protected ItemGroupEntryType type() { - return ItemGroupEntryType.POTION; - } } diff --git a/src/main/java/net/errorcraft/itematic/item/group/entry/entries/StackItemGroupEntry.java b/src/main/java/net/errorcraft/itematic/item/group/entry/entries/StackItemGroupEntry.java index 11291012..2a6d24f9 100644 --- a/src/main/java/net/errorcraft/itematic/item/group/entry/entries/StackItemGroupEntry.java +++ b/src/main/java/net/errorcraft/itematic/item/group/entry/entries/StackItemGroupEntry.java @@ -5,6 +5,7 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; import net.errorcraft.itematic.item.group.entry.ItemGroupEntry; import net.errorcraft.itematic.item.group.entry.ItemGroupEntryType; +import net.errorcraft.itematic.item.group.entry.PossiblyHiddenItemGroupEntry; import net.minecraft.component.ComponentChanges; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; @@ -16,10 +17,10 @@ import java.util.Collection; import java.util.List; -public final class StackItemGroupEntry extends ItemGroupEntry { +public final class StackItemGroupEntry extends PossiblyHiddenItemGroupEntry { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> createCodec(instance).and(instance.group( - RegistryFixedCodec.of(RegistryKeys.ITEM).fieldOf("item").forGetter(StackItemGroupEntry::item), - ComponentChanges.CODEC.optionalFieldOf("components", ComponentChanges.EMPTY).forGetter(StackItemGroupEntry::components) + RegistryFixedCodec.of(RegistryKeys.ITEM).fieldOf("item").forGetter(entry -> entry.item), + ComponentChanges.CODEC.optionalFieldOf("components", ComponentChanges.EMPTY).forGetter(entry -> entry.components) )).apply(instance, StackItemGroupEntry::new)); private final RegistryEntry item; @@ -40,42 +41,35 @@ public StackItemGroupEntry(ItemGroup.StackVisibility visibility, boolean require this.components = components; } - public static Builder builder(RegistryEntry item) { - return new Builder(item); - } - - private RegistryEntry item() { - return this.item; + public static StackItemGroupEntry fromStack(ItemStack stack) { + return new StackItemGroupEntry(stack.getRegistryEntry(), stack.getComponentChanges()); } - private ComponentChanges components() { - return this.components; + public static StackItemGroupEntry fromStack(ItemStack stack, boolean requiresPermissions) { + return new StackItemGroupEntry(ItemGroup.StackVisibility.PARENT_AND_SEARCH_TABS, requiresPermissions, stack.getRegistryEntry(), stack.getComponentChanges()); } - @Override - protected Collection createStacks(ItemGroup.DisplayContext context) { - return List.of(new ItemStack(this.item, 1, this.components)); + public static Builder builder(RegistryEntry item) { + return new Builder(item); } @Override - protected ItemGroupEntryType type() { + public ItemGroupEntryType type() { return ItemGroupEntryType.STACK; } @Override - protected Either, ItemGroupEntry> createEither() { + public Either, ItemGroupEntry> createEither() { if (this.isSimple()) { return Either.left(this.item); } - return super.createEither(); - } - public static ItemGroupEntry fromStack(ItemStack stack) { - return new StackItemGroupEntry(stack.getRegistryEntry(), stack.getComponentChanges()); + return super.createEither(); } - public static ItemGroupEntry fromStack(ItemStack stack, boolean requiresPermissions) { - return new StackItemGroupEntry(ItemGroup.StackVisibility.PARENT_AND_SEARCH_TABS, requiresPermissions, stack.getRegistryEntry(), stack.getComponentChanges()); + @Override + protected Collection createStacks(ItemGroup.DisplayContext context) { + return List.of(new ItemStack(this.item, 1, this.components)); } private boolean isSimple() { @@ -88,14 +82,13 @@ public static class Builder { private final RegistryEntry item; private ComponentChanges components; private ItemGroup.StackVisibility visibility = ItemGroup.StackVisibility.PARENT_AND_SEARCH_TABS; - private boolean requiresPermissions = false; public Builder(RegistryEntry item) { this.item = item; } public StackItemGroupEntry build() { - return new StackItemGroupEntry(this.visibility, this.requiresPermissions, this.item, this.components == null ? ComponentChanges.EMPTY : this.components); + return new StackItemGroupEntry(this.visibility, false, this.item, this.components == null ? ComponentChanges.EMPTY : this.components); } public Builder components(ComponentChanges.Builder builder) { @@ -107,10 +100,5 @@ public Builder visibility(ItemGroup.StackVisibility visibility) { this.visibility = visibility; return this; } - - public Builder requiresPermissions() { - this.requiresPermissions = true; - return this; - } } } diff --git a/src/main/java/net/errorcraft/itematic/item/group/entry/entries/SuspiciousEffectIngredientItemGroupEntry.java b/src/main/java/net/errorcraft/itematic/item/group/entry/entries/SuspiciousEffectIngredientItemGroupEntry.java index 918cf56b..8d102a26 100644 --- a/src/main/java/net/errorcraft/itematic/item/group/entry/entries/SuspiciousEffectIngredientItemGroupEntry.java +++ b/src/main/java/net/errorcraft/itematic/item/group/entry/entries/SuspiciousEffectIngredientItemGroupEntry.java @@ -3,8 +3,8 @@ import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.errorcraft.itematic.item.component.ItemComponentTypes; -import net.errorcraft.itematic.item.group.entry.ItemGroupEntry; import net.errorcraft.itematic.item.group.entry.ItemGroupEntryType; +import net.errorcraft.itematic.item.group.entry.PossiblyHiddenItemGroupEntry; import net.minecraft.component.DataComponentTypes; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; @@ -18,9 +18,9 @@ import java.util.Optional; import java.util.Set; -public class SuspiciousEffectIngredientItemGroupEntry extends ItemGroupEntry { +public class SuspiciousEffectIngredientItemGroupEntry extends PossiblyHiddenItemGroupEntry { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> createCodec(instance).and( - RegistryFixedCodec.of(RegistryKeys.ITEM).fieldOf("item").forGetter(SuspiciousEffectIngredientItemGroupEntry::item) + RegistryFixedCodec.of(RegistryKeys.ITEM).fieldOf("item").forGetter(entry -> entry.item) ).apply(instance, SuspiciousEffectIngredientItemGroupEntry::new)); private final RegistryEntry item; @@ -30,14 +30,15 @@ public SuspiciousEffectIngredientItemGroupEntry(ItemGroup.StackVisibility visibi this.item = item; } - public RegistryEntry item() { - return this.item; - } - public static SuspiciousEffectIngredientItemGroupEntry of(RegistryEntry item) { return new SuspiciousEffectIngredientItemGroupEntry(ItemGroup.StackVisibility.PARENT_AND_SEARCH_TABS, false, item); } + @Override + public ItemGroupEntryType type() { + return ItemGroupEntryType.SUSPICIOUS_EFFECT_INGREDIENT; + } + @Override protected Collection createStacks(ItemGroup.DisplayContext context) { Set set = ItemStackSet.create(); @@ -53,9 +54,4 @@ protected Collection createStacks(ItemGroup.DisplayContext context) { }); return set; } - - @Override - protected ItemGroupEntryType type() { - return ItemGroupEntryType.SUSPICIOUS_EFFECT_INGREDIENT; - } } diff --git a/src/main/java/net/errorcraft/itematic/item/group/entry/entries/TagItemGroupEntry.java b/src/main/java/net/errorcraft/itematic/item/group/entry/entries/TagItemGroupEntry.java index 4db32eb1..ead2d0d2 100644 --- a/src/main/java/net/errorcraft/itematic/item/group/entry/entries/TagItemGroupEntry.java +++ b/src/main/java/net/errorcraft/itematic/item/group/entry/entries/TagItemGroupEntry.java @@ -2,23 +2,22 @@ import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.errorcraft.itematic.item.group.entry.ItemGroupEntry; import net.errorcraft.itematic.item.group.entry.ItemGroupEntryType; +import net.errorcraft.itematic.item.group.entry.PossiblyHiddenItemGroupEntry; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; import net.minecraft.registry.RegistryKeys; -import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.registry.entry.RegistryEntryList; import net.minecraft.registry.tag.TagKey; -import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.stream.Stream; -public class TagItemGroupEntry extends ItemGroupEntry { +public class TagItemGroupEntry extends PossiblyHiddenItemGroupEntry { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> createCodec(instance).and( - TagKey.unprefixedCodec(RegistryKeys.ITEM).fieldOf("tag").forGetter(TagItemGroupEntry::tag) + TagKey.unprefixedCodec(RegistryKeys.ITEM).fieldOf("tag").forGetter(entry -> entry.tag) ).apply(instance, TagItemGroupEntry::new)); private final TagKey tag; @@ -32,27 +31,17 @@ public TagItemGroupEntry(ItemGroup.StackVisibility visibility, boolean requiresP this.tag = tag; } - public TagKey tag() { - return this.tag; + @Override + public ItemGroupEntryType type() { + return ItemGroupEntryType.TAG; } @Override protected Collection createStacks(ItemGroup.DisplayContext context) { return context.lookup().getWrapperOrThrow(RegistryKeys.ITEM).getOptional(this.tag) - .map(TagItemGroupEntry::createStacks) - .orElse(List.of()); - } - - @Override - protected ItemGroupEntryType type() { - return ItemGroupEntryType.TAG; - } - - private static Collection createStacks(RegistryEntryList.Named entries) { - List stacks = new ArrayList<>(entries.size()); - for (RegistryEntry entry : entries) { - stacks.add(new ItemStack(entry)); - } - return stacks; + .map(RegistryEntryList.ListBacked::stream) + .map(stream -> stream.map(ItemStack::new)) + .map(Stream::toList) + .orElseGet(List::of); } } diff --git a/src/main/java/net/errorcraft/itematic/item/group/entry/provider/ItemGroupEntryProviders.java b/src/main/java/net/errorcraft/itematic/item/group/entry/provider/ItemGroupEntryProviders.java index 5cdc76d8..16e1c7d5 100644 --- a/src/main/java/net/errorcraft/itematic/item/group/entry/provider/ItemGroupEntryProviders.java +++ b/src/main/java/net/errorcraft/itematic/item/group/entry/provider/ItemGroupEntryProviders.java @@ -1,6 +1,5 @@ package net.errorcraft.itematic.item.group.entry.provider; -import net.errorcraft.itematic.enchantment.EnchantmentKeys; import net.errorcraft.itematic.item.ItemKeys; import net.errorcraft.itematic.item.ItematicItemTags; import net.errorcraft.itematic.item.group.entry.ItemGroupEntry; @@ -11,12 +10,10 @@ import net.minecraft.component.ComponentChanges; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.FireworksComponent; -import net.minecraft.component.type.ItemEnchantmentsComponent; -import net.minecraft.enchantment.Enchantment; import net.minecraft.item.FireworkRocketItem; import net.minecraft.item.Item; -import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; +import net.minecraft.item.OminousBottleItem; import net.minecraft.registry.Registerable; import net.minecraft.registry.RegistryEntryLookup; import net.minecraft.registry.RegistryKeys; @@ -27,15 +24,12 @@ import java.util.ArrayList; import java.util.List; -import java.util.stream.IntStream; -import java.util.stream.Stream; public class ItemGroupEntryProviders { private ItemGroupEntryProviders() {} public static void bootstrap(Registerable registerable) { RegistryEntryLookup items = registerable.getRegistryLookup(RegistryKeys.ITEM); - RegistryEntryLookup enchantments = registerable.getRegistryLookup(RegistryKeys.ENCHANTMENT); RegistryEntryLookup bannerPatterns = registerable.getRegistryLookup(RegistryKeys.BANNER_PATTERN); registerable.register(ItemGroupEntryProviderKeys.BUILDING_BLOCKS, ItemGroupEntryProvider.of( @@ -167,6 +161,7 @@ public static void bootstrap(Registerable registerable) ItemGroupEntry.simple(items.getOrThrow(ItemKeys.DRAGON_EGG)), ItemGroupEntry.simple(items.getOrThrow(ItemKeys.END_PORTAL_FRAME)), ItemGroupEntry.simple(items.getOrThrow(ItemKeys.ENDER_EYE)), + ItemGroupEntry.simple(items.getOrThrow(ItemKeys.VAULT)), ItemGroupEntry.tag(ItematicItemTags.INFESTED_BLOCKS) )); registerable.register(ItemGroupEntryProviderKeys.REDSTONE_BLOCKS, ItemGroupEntryProvider.of( @@ -176,6 +171,10 @@ public static void bootstrap(Registerable registerable) ItemGroupEntry.simple(items.getOrThrow(ItemKeys.REPEATER)), ItemGroupEntry.simple(items.getOrThrow(ItemKeys.COMPARATOR)), ItemGroupEntry.simple(items.getOrThrow(ItemKeys.TARGET)), + ItemGroupEntry.simple(items.getOrThrow(ItemKeys.COPPER_BULB)), + ItemGroupEntry.simple(items.getOrThrow(ItemKeys.EXPOSED_COPPER_BULB)), + ItemGroupEntry.simple(items.getOrThrow(ItemKeys.WEATHERED_COPPER_BULB)), + ItemGroupEntry.simple(items.getOrThrow(ItemKeys.OXIDIZED_COPPER_BULB)), ItemGroupEntry.simple(items.getOrThrow(ItemKeys.LEVER)), ItemGroupEntry.simple(items.getOrThrow(ItemKeys.OAK_BUTTON)), ItemGroupEntry.simple(items.getOrThrow(ItemKeys.STONE_BUTTON)), @@ -199,6 +198,7 @@ public static void bootstrap(Registerable registerable) ItemGroupEntry.simple(items.getOrThrow(ItemKeys.HONEY_BLOCK)), ItemGroupEntry.simple(items.getOrThrow(ItemKeys.DISPENSER)), ItemGroupEntry.simple(items.getOrThrow(ItemKeys.DROPPER)), + ItemGroupEntry.simple(items.getOrThrow(ItemKeys.CRAFTER)), ItemGroupEntry.simple(items.getOrThrow(ItemKeys.HOPPER)), ItemGroupEntry.simple(items.getOrThrow(ItemKeys.CHEST)), ItemGroupEntry.simple(items.getOrThrow(ItemKeys.BARREL)), @@ -245,6 +245,7 @@ public static void bootstrap(Registerable registerable) .add(items.getOrThrow(ItemKeys.SPYGLASS)) .add(items.getOrThrow(ItemKeys.MAP)) .add(items.getOrThrow(ItemKeys.WRITABLE_BOOK)) + .add(items.getOrThrow(ItemKeys.WIND_CHARGE)) .add(items.getOrThrow(ItemKeys.ENDER_PEARL)) .add(items.getOrThrow(ItemKeys.ENDER_EYE)) .add(items.getOrThrow(ItemKeys.ELYTRA)) @@ -262,6 +263,7 @@ public static void bootstrap(Registerable registerable) .add(ItematicItemTags.SWORDS) .add(ItematicItemTags.AXES) .add(items.getOrThrow(ItemKeys.TRIDENT)) + .add(items.getOrThrow(ItemKeys.MACE)) .add(items.getOrThrow(ItemKeys.SHIELD)) .add(ItematicItemTags.ARMOR) .add(ItematicItemTags.HORSE_ARMOR) @@ -271,6 +273,7 @@ public static void bootstrap(Registerable registerable) .add(items.getOrThrow(ItemKeys.END_CRYSTAL)) .add(items.getOrThrow(ItemKeys.SNOWBALL)) .add(items.getOrThrow(ItemKeys.EGG)) + .add(items.getOrThrow(ItemKeys.WIND_CHARGE)) .add(items.getOrThrow(ItemKeys.BOW)) .add(items.getOrThrow(ItemKeys.CROSSBOW)) .add(flightDuration(items.getOrThrow(ItemKeys.FIREWORK_ROCKET))) @@ -284,6 +287,7 @@ public static void bootstrap(Registerable registerable) .add(SuspiciousEffectIngredientItemGroupEntry.of(items.getOrThrow(ItemKeys.SUSPICIOUS_STEW))) .add(items.getOrThrow(ItemKeys.MILK_BUCKET)) .add(items.getOrThrow(ItemKeys.HONEY_BOTTLE)) + .add(ominousBottles(items.getOrThrow(ItemKeys.OMINOUS_BOTTLE))) .add(PotionItemGroupEntry.of(items.getOrThrow(ItemKeys.POTION))) .add(PotionItemGroupEntry.of(items.getOrThrow(ItemKeys.SPLASH_POTION))) .add(PotionItemGroupEntry.of(items.getOrThrow(ItemKeys.LINGERING_POTION))) @@ -332,6 +336,8 @@ public static void bootstrap(Registerable registerable) .add(items.getOrThrow(ItemKeys.HEART_OF_THE_SEA)) .add(items.getOrThrow(ItemKeys.FIRE_CHARGE)) .add(items.getOrThrow(ItemKeys.BLAZE_ROD)) + .add(items.getOrThrow(ItemKeys.BREEZE_ROD)) + .add(items.getOrThrow(ItemKeys.HEAVY_CORE)) .add(items.getOrThrow(ItemKeys.NETHER_STAR)) .add(items.getOrThrow(ItemKeys.ENDER_PEARL)) .add(items.getOrThrow(ItemKeys.ENDER_EYE)) @@ -351,47 +357,9 @@ public static void bootstrap(Registerable registerable) .add(ItemTags.DECORATED_POT_SHERDS) .add(ItematicItemTags.SMITHING_TEMPLATES) .add(items.getOrThrow(ItemKeys.EXPERIENCE_BOTTLE)) - .add(enchantedBooks(items, - enchantments.getOrThrow(EnchantmentKeys.PROTECTION), - enchantments.getOrThrow(EnchantmentKeys.FIRE_PROTECTION), - enchantments.getOrThrow(EnchantmentKeys.FEATHER_FALLING), - enchantments.getOrThrow(EnchantmentKeys.BLAST_PROTECTION), - enchantments.getOrThrow(EnchantmentKeys.PROJECTILE_PROTECTION), - enchantments.getOrThrow(EnchantmentKeys.RESPIRATION), - enchantments.getOrThrow(EnchantmentKeys.AQUA_AFFINITY), - enchantments.getOrThrow(EnchantmentKeys.THORNS), - enchantments.getOrThrow(EnchantmentKeys.DEPTH_STRIDER), - enchantments.getOrThrow(EnchantmentKeys.FROST_WALKER), - enchantments.getOrThrow(EnchantmentKeys.BINDING_CURSE), - enchantments.getOrThrow(EnchantmentKeys.SOUL_SPEED), - enchantments.getOrThrow(EnchantmentKeys.SWIFT_SNEAK), - enchantments.getOrThrow(EnchantmentKeys.SHARPNESS), - enchantments.getOrThrow(EnchantmentKeys.SMITE), - enchantments.getOrThrow(EnchantmentKeys.BANE_OF_ARTHROPODS), - enchantments.getOrThrow(EnchantmentKeys.KNOCKBACK), - enchantments.getOrThrow(EnchantmentKeys.FIRE_ASPECT), - enchantments.getOrThrow(EnchantmentKeys.LOOTING), - enchantments.getOrThrow(EnchantmentKeys.SWEEPING_EDGE), - enchantments.getOrThrow(EnchantmentKeys.EFFICIENCY), - enchantments.getOrThrow(EnchantmentKeys.SILK_TOUCH), - enchantments.getOrThrow(EnchantmentKeys.UNBREAKING), - enchantments.getOrThrow(EnchantmentKeys.FORTUNE), - enchantments.getOrThrow(EnchantmentKeys.POWER), - enchantments.getOrThrow(EnchantmentKeys.PUNCH), - enchantments.getOrThrow(EnchantmentKeys.FLAME), - enchantments.getOrThrow(EnchantmentKeys.INFINITY), - enchantments.getOrThrow(EnchantmentKeys.LUCK_OF_THE_SEA), - enchantments.getOrThrow(EnchantmentKeys.LURE), - enchantments.getOrThrow(EnchantmentKeys.LOYALTY), - enchantments.getOrThrow(EnchantmentKeys.IMPALING), - enchantments.getOrThrow(EnchantmentKeys.RIPTIDE), - enchantments.getOrThrow(EnchantmentKeys.CHANNELING), - enchantments.getOrThrow(EnchantmentKeys.MULTISHOT), - enchantments.getOrThrow(EnchantmentKeys.QUICK_CHARGE), - enchantments.getOrThrow(EnchantmentKeys.PIERCING), - enchantments.getOrThrow(EnchantmentKeys.MENDING), - enchantments.getOrThrow(EnchantmentKeys.VANISHING_CURSE) - )) + .add(items.getOrThrow(ItemKeys.TRIAL_KEY)) + .add(items.getOrThrow(ItemKeys.OMINOUS_TRIAL_KEY)) + .add(EnchantmentItemGroupEntry.of(items.getOrThrow(ItemKeys.ENCHANTED_BOOK))) .build() ); registerable.register(ItemGroupEntryProviderKeys.SPAWN_EGGS, ItemGroupEntryProvider.of( @@ -402,6 +370,8 @@ public static void bootstrap(Registerable registerable) ItemGroupEntry.simple(items.getOrThrow(ItemKeys.BAT_SPAWN_EGG)), ItemGroupEntry.simple(items.getOrThrow(ItemKeys.BEE_SPAWN_EGG)), ItemGroupEntry.simple(items.getOrThrow(ItemKeys.BLAZE_SPAWN_EGG)), + ItemGroupEntry.simple(items.getOrThrow(ItemKeys.BOGGED_SPAWN_EGG)), + ItemGroupEntry.simple(items.getOrThrow(ItemKeys.BREEZE_SPAWN_EGG)), ItemGroupEntry.simple(items.getOrThrow(ItemKeys.CAMEL_SPAWN_EGG)), ItemGroupEntry.simple(items.getOrThrow(ItemKeys.CAT_SPAWN_EGG)), ItemGroupEntry.simple(items.getOrThrow(ItemKeys.CAVE_SPIDER_SPAWN_EGG)), @@ -498,31 +468,8 @@ private static ItemGroupEntry[] flightDuration(RegistryEntry item) { .build() ); } - return entries.toArray(ItemGroupEntry[]::new); - } - - @SafeVarargs - private static ItemGroupEntry[] enchantedBooks(RegistryEntryLookup items, RegistryEntry... enchantments) { - RegistryEntry.Reference enchantedBook = items.getOrThrow(ItemKeys.ENCHANTED_BOOK); - return Stream.of(enchantments).map(RegistryEntry::value) - .flatMap(enchantment -> IntStream.rangeClosed(enchantment.getMinLevel(), enchantment.getMaxLevel()) - .mapToObj(level -> { - ItemEnchantmentsComponent.Builder itemEnchantmentsBuilder = new ItemEnchantmentsComponent.Builder(ItemEnchantmentsComponent.DEFAULT); - itemEnchantmentsBuilder.add(enchantment, level); - return StackItemGroupEntry.builder(enchantedBook) - .components(ComponentChanges.builder() - .add(DataComponentTypes.ENCHANTMENTS, itemEnchantmentsBuilder.build())) - .visibility(getStackVisibility(enchantment, level)) - .build(); - })) - .toArray(ItemGroupEntry[]::new); - } - private static ItemGroup.StackVisibility getStackVisibility(Enchantment enchantment, int level) { - if (enchantment.getMaxLevel() == level) { - return ItemGroup.StackVisibility.PARENT_AND_SEARCH_TABS; - } - return ItemGroup.StackVisibility.SEARCH_TAB_ONLY; + return entries.toArray(ItemGroupEntry[]::new); } private static ItemGroupEntry[] lightBlocks(RegistryEntry item) { @@ -530,6 +477,18 @@ private static ItemGroupEntry[] lightBlocks(RegistryEntry item) { for (int level = LightBlock.field_33722; level >= 0; --level) { entries.add(StackItemGroupEntry.fromStack(LightBlock.addNbtForLevel(new ItemStack(item), level), true)); } + + return entries.toArray(ItemGroupEntry[]::new); + } + + private static ItemGroupEntry[] ominousBottles(RegistryEntry item) { + List entries = new ArrayList<>(OminousBottleItem.field_50145 - OminousBottleItem.field_50144); + for (int amplifier = OminousBottleItem.field_50144; amplifier <= OminousBottleItem.field_50145; amplifier++) { + ItemStack stack = new ItemStack(item); + stack.set(DataComponentTypes.OMINOUS_BOTTLE_AMPLIFIER, amplifier); + entries.add(StackItemGroupEntry.fromStack(stack)); + } + return entries.toArray(ItemGroupEntry[]::new); } } diff --git a/src/main/java/net/errorcraft/itematic/item/model/override/overrides/ChargedModelOverride.java b/src/main/java/net/errorcraft/itematic/item/model/override/overrides/ChargedModelOverride.java index 54a3af48..88d2be5f 100644 --- a/src/main/java/net/errorcraft/itematic/item/model/override/overrides/ChargedModelOverride.java +++ b/src/main/java/net/errorcraft/itematic/item/model/override/overrides/ChargedModelOverride.java @@ -3,6 +3,7 @@ import net.errorcraft.itematic.item.component.ItemComponentTypes; import net.errorcraft.itematic.item.model.override.ModelOverride; import net.minecraft.entity.LivingEntity; +import net.minecraft.item.CrossbowItem; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import org.jetbrains.annotations.Nullable; @@ -10,9 +11,11 @@ public class ChargedModelOverride implements ModelOverride { @Override public float apply(ItemStack stack, @Nullable World world, @Nullable LivingEntity target, int seed) { - return stack.itematic$getComponent(ItemComponentTypes.SHOOTER) - .map(c -> c.isCharged(stack) ? 1.0f : 0.0f) - .orElse(0.0f); + if (CrossbowItem.isCharged(stack)) { + return 1.0f; + } + + return 0.0f; } @Override diff --git a/src/main/java/net/errorcraft/itematic/item/model/override/overrides/PullModelOverride.java b/src/main/java/net/errorcraft/itematic/item/model/override/overrides/PullModelOverride.java index 38d9d82d..6981871e 100644 --- a/src/main/java/net/errorcraft/itematic/item/model/override/overrides/PullModelOverride.java +++ b/src/main/java/net/errorcraft/itematic/item/model/override/overrides/PullModelOverride.java @@ -13,11 +13,13 @@ public float applyUnclamped(ItemStack stack, @Nullable World world, @Nullable Li if (target == null) { return 0.0f; } + if (target.getActiveItem() != stack) { return 0.0f; } + return stack.itematic$getComponent(ItemComponentTypes.SHOOTER) - .map(c -> c.getPullProgress(stack, target.itematic$itemUsedTicks())) + .map(shooter -> shooter.method().pullProgress(stack, target, target.itematic$itemUsedTicks())) .orElse(0.0f); } diff --git a/src/main/java/net/errorcraft/itematic/item/model/override/overrides/PullingModelOverride.java b/src/main/java/net/errorcraft/itematic/item/model/override/overrides/PullingModelOverride.java index 315d2ebd..a26f5369 100644 --- a/src/main/java/net/errorcraft/itematic/item/model/override/overrides/PullingModelOverride.java +++ b/src/main/java/net/errorcraft/itematic/item/model/override/overrides/PullingModelOverride.java @@ -3,6 +3,7 @@ import net.errorcraft.itematic.item.component.ItemComponentTypes; import net.errorcraft.itematic.item.model.override.ModelOverride; import net.minecraft.entity.LivingEntity; +import net.minecraft.item.CrossbowItem; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import org.jetbrains.annotations.Nullable; @@ -13,15 +14,20 @@ public float apply(ItemStack stack, @Nullable World world, @Nullable LivingEntit if (target == null) { return 0.0f; } + if (!target.isUsingItem()) { return 0.0f; } + if (target.getActiveItem() != stack) { return 0.0f; } - return stack.itematic$getComponent(ItemComponentTypes.SHOOTER) - .map(c -> c.isCharged(stack) ? 0.0f : 1.0f) - .orElse(0.0f); + + if (CrossbowItem.isCharged(stack)) { + return 0.0f; + } + + return 1.0f; } @Override diff --git a/src/main/java/net/errorcraft/itematic/item/shooter/ChargingSoundsUtil.java b/src/main/java/net/errorcraft/itematic/item/shooter/ChargingSoundsUtil.java new file mode 100644 index 00000000..b77982a8 --- /dev/null +++ b/src/main/java/net/errorcraft/itematic/item/shooter/ChargingSoundsUtil.java @@ -0,0 +1,21 @@ +package net.errorcraft.itematic.item.shooter; + +import net.minecraft.item.CrossbowItem; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; +import net.minecraft.sound.SoundEvent; + +import java.util.Optional; + +public class ChargingSoundsUtil { + public static final CrossbowItem.LoadingSounds EMPTY = new CrossbowItem.LoadingSounds(Optional.empty(), Optional.empty(), Optional.empty()); + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + SoundEvent.ENTRY_PACKET_CODEC.collect(PacketCodecs::optional), CrossbowItem.LoadingSounds::start, + SoundEvent.ENTRY_PACKET_CODEC.collect(PacketCodecs::optional), CrossbowItem.LoadingSounds::mid, + SoundEvent.ENTRY_PACKET_CODEC.collect(PacketCodecs::optional), CrossbowItem.LoadingSounds::end, + CrossbowItem.LoadingSounds::new + ); + + private ChargingSoundsUtil() {} +} diff --git a/src/main/java/net/errorcraft/itematic/item/shooter/method/ShooterMethod.java b/src/main/java/net/errorcraft/itematic/item/shooter/method/ShooterMethod.java new file mode 100644 index 00000000..4e5bed3c --- /dev/null +++ b/src/main/java/net/errorcraft/itematic/item/shooter/method/ShooterMethod.java @@ -0,0 +1,32 @@ +package net.errorcraft.itematic.item.shooter.method; + +import com.mojang.serialization.Codec; +import net.errorcraft.itematic.item.component.components.ShooterItemComponent; +import net.errorcraft.itematic.registry.ItematicRegistries; +import net.minecraft.component.ComponentMap; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.projectile.PersistentProjectileEntity; +import net.minecraft.entity.projectile.ProjectileEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Hand; +import net.minecraft.world.World; +import org.jetbrains.annotations.Nullable; + +import java.util.OptionalInt; + +public interface ShooterMethod { + Codec CODEC = ItematicRegistries.SHOOTER_METHOD_TYPE.getCodec().dispatch(ShooterMethod::type, ShooterMethodType::codec); + + ShooterMethodType type(); + void addComponents(ComponentMap.Builder builder); + boolean tryShoot(ShooterItemComponent component, ItemStack stack, World world, LivingEntity user, Hand hand); + void hold(ShooterItemComponent shooter, ItemStack stack, World world, LivingEntity user, int usedTicks); + void stop(ShooterItemComponent shooter, ItemStack stack, World world, LivingEntity user, int usedTicks); + default void initializeProjectile(LivingEntity user, ProjectileEntity projectile, int index, float power, float uncertainty, float angle, boolean critical, @Nullable LivingEntity target) { + if (critical && projectile instanceof PersistentProjectileEntity persistentProjectile) { + persistentProjectile.setCritical(true); + } + } + OptionalInt useDuration(ItemStack stack, LivingEntity user); + float pullProgress(ItemStack stack, LivingEntity user, int usedTicks); +} diff --git a/src/main/java/net/errorcraft/itematic/item/shooter/method/ShooterMethodType.java b/src/main/java/net/errorcraft/itematic/item/shooter/method/ShooterMethodType.java new file mode 100644 index 00000000..ee69fd41 --- /dev/null +++ b/src/main/java/net/errorcraft/itematic/item/shooter/method/ShooterMethodType.java @@ -0,0 +1,6 @@ +package net.errorcraft.itematic.item.shooter.method; + +import com.mojang.serialization.MapCodec; + +public record ShooterMethodType(MapCodec codec) { +} diff --git a/src/main/java/net/errorcraft/itematic/item/shooter/method/ShooterMethodTypeKeys.java b/src/main/java/net/errorcraft/itematic/item/shooter/method/ShooterMethodTypeKeys.java new file mode 100644 index 00000000..8666761c --- /dev/null +++ b/src/main/java/net/errorcraft/itematic/item/shooter/method/ShooterMethodTypeKeys.java @@ -0,0 +1,16 @@ +package net.errorcraft.itematic.item.shooter.method; + +import net.errorcraft.itematic.registry.ItematicRegistryKeys; +import net.minecraft.registry.RegistryKey; +import net.minecraft.util.Identifier; + +public class ShooterMethodTypeKeys { + public static final RegistryKey> DIRECT = of("direct"); + public static final RegistryKey> CHARGEABLE = of("chargeable"); + + private ShooterMethodTypeKeys() {} + + private static RegistryKey> of(String id) { + return RegistryKey.of(ItematicRegistryKeys.SHOOTER_METHOD_TYPE, new Identifier(id)); + } +} diff --git a/src/main/java/net/errorcraft/itematic/item/shooter/method/ShooterMethodTypes.java b/src/main/java/net/errorcraft/itematic/item/shooter/method/ShooterMethodTypes.java new file mode 100644 index 00000000..bf9868cb --- /dev/null +++ b/src/main/java/net/errorcraft/itematic/item/shooter/method/ShooterMethodTypes.java @@ -0,0 +1,20 @@ +package net.errorcraft.itematic.item.shooter.method; + +import net.errorcraft.itematic.item.shooter.method.methods.ChargeableShooterMethod; +import net.errorcraft.itematic.item.shooter.method.methods.DirectShooterMethod; +import net.errorcraft.itematic.registry.ItematicRegistries; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; + +public class ShooterMethodTypes { + public static final ShooterMethodType DIRECT = register(ShooterMethodTypeKeys.DIRECT, new ShooterMethodType<>(DirectShooterMethod.CODEC)); + public static final ShooterMethodType CHARGEABLE = register(ShooterMethodTypeKeys.CHARGEABLE, new ShooterMethodType<>(ChargeableShooterMethod.CODEC)); + + private ShooterMethodTypes() {} + + public static void init() {} + + private static ShooterMethodType register(RegistryKey> id, ShooterMethodType type) { + return Registry.register(ItematicRegistries.SHOOTER_METHOD_TYPE, id, type); + } +} diff --git a/src/main/java/net/errorcraft/itematic/item/shooter/method/methods/ChargeableShooterMethod.java b/src/main/java/net/errorcraft/itematic/item/shooter/method/methods/ChargeableShooterMethod.java new file mode 100644 index 00000000..90b75542 --- /dev/null +++ b/src/main/java/net/errorcraft/itematic/item/shooter/method/methods/ChargeableShooterMethod.java @@ -0,0 +1,228 @@ +package net.errorcraft.itematic.item.shooter.method.methods; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.errorcraft.itematic.component.ItematicDataComponentTypes; +import net.errorcraft.itematic.item.component.components.ShooterItemComponent; +import net.errorcraft.itematic.item.shooter.ChargingSoundsUtil; +import net.errorcraft.itematic.item.shooter.method.ShooterMethod; +import net.errorcraft.itematic.item.shooter.method.ShooterMethodType; +import net.errorcraft.itematic.item.shooter.method.ShooterMethodTypes; +import net.errorcraft.itematic.mixin.item.CrossbowItemAccessor; +import net.errorcraft.itematic.mixin.item.RangedWeaponItemAccessor; +import net.errorcraft.itematic.serialization.ItematicCodecs; +import net.minecraft.advancement.criterion.Criteria; +import net.minecraft.component.ComponentMap; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.EnchantmentEffectComponentTypes; +import net.minecraft.component.type.ChargedProjectilesComponent; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.projectile.PersistentProjectileEntity; +import net.minecraft.entity.projectile.ProjectileEntity; +import net.minecraft.item.CrossbowItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; +import net.minecraft.registry.RegistryCodecs; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.entry.RegistryEntryList; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.sound.SoundEvents; +import net.minecraft.stat.Stats; +import net.minecraft.util.Hand; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.World; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Optional; +import java.util.OptionalInt; + +public record ChargeableShooterMethod(float defaultChargeTime, CrossbowItem.LoadingSounds defaultChargingSounds, ChargedPowerRules chargedPowerRules) implements ShooterMethod { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + ItematicCodecs.NON_NEGATIVE_FLOAT.fieldOf("default_charge_time").forGetter(ChargeableShooterMethod::defaultChargeTime), + CrossbowItem.LoadingSounds.CODEC.fieldOf("default_charging_sounds").forGetter(ChargeableShooterMethod::defaultChargingSounds), + ChargedPowerRules.CODEC.fieldOf("charged_power_rules").forGetter(ChargeableShooterMethod::chargedPowerRules) + ).apply(instance, ChargeableShooterMethod::new)); + private static final float START_SOUND_PROGRESS = CrossbowItemAccessor.startSoundProgress(); + private static final float MID_SOUND_PROGRESS = CrossbowItemAccessor.midSoundProgress(); + private static final int EXTRA_USE_TIME = 3; + private static final CrossbowItem DUMMY = new CrossbowItem(new Item.Settings()); + + public static ChargeableShooterMethod of(CrossbowItem.LoadingSounds defaultChargingSounds, ChargedPowerRules.Rule... chargedPowerRules) { + return new ChargeableShooterMethod(CrossbowItemAccessor.defaultChargeTime(), defaultChargingSounds, new ChargedPowerRules(List.of(chargedPowerRules), CrossbowItemAccessor.defaultPower())); + } + + @Override + public ShooterMethodType type() { + return ShooterMethodTypes.CHARGEABLE; + } + + @Override + public void addComponents(ComponentMap.Builder builder) { + builder.add(DataComponentTypes.CHARGED_PROJECTILES, ChargedProjectilesComponent.DEFAULT); + builder.add(ItematicDataComponentTypes.SHOOTER_DEFAULT_CHARGE_TIME, this.defaultChargeTime); + builder.add(ItematicDataComponentTypes.SHOOTER_DEFAULT_CHARGING_SOUNDS, this.defaultChargingSounds); + builder.add(ItematicDataComponentTypes.SHOOTER_CHARGED_POWER_RULES, this.chargedPowerRules); + } + + @Override + public boolean tryShoot(ShooterItemComponent component, ItemStack stack, World world, LivingEntity user, Hand hand) { + if (!CrossbowItem.isCharged(stack)) { + return false; + } + + ChargedPowerRules chargedPowerRules = stack.get(ItematicDataComponentTypes.SHOOTER_CHARGED_POWER_RULES); + if (chargedPowerRules == null) { + return false; + } + + this.shoot(component, world, user, hand, stack, chargedPowerRules.power(stack), 1.0f, null); + return true; + } + + @Override + public void hold(ShooterItemComponent shooter, ItemStack stack, World world, LivingEntity user, int usedTicks) { + if (world.isClient()) { + return; + } + + int chargeTime = CrossbowItem.getPullTime(stack, user); + if (usedTicks >= chargeTime) { + return; + } + + CrossbowItem.LoadingSounds chargingSounds = this.chargingSounds(stack); + if (usedTicks == getChargeTimeAt(chargeTime, START_SOUND_PROGRESS)) { + chargingSounds.start().ifPresent(sound -> world.playSound(null, user.getX(), user.getY(), user.getZ(), sound.value(), user.getSoundCategory(), 0.5f, 1.0f)); + return; + } + + if (usedTicks == getChargeTimeAt(chargeTime, MID_SOUND_PROGRESS)) { + chargingSounds.mid().ifPresent(sound -> world.playSound(null, user.getX(), user.getY(), user.getZ(), sound.value(), user.getSoundCategory(), 0.5f, 1.0f)); + } + } + + @Override + public void stop(ShooterItemComponent shooter, ItemStack stack, World world, LivingEntity user, int usedTicks) { + if (usedTicks < CrossbowItem.getPullTime(stack, user)) { + return; + } + + if (CrossbowItem.isCharged(stack) || !chargeProjectiles(user, stack)) { + return; + } + + CrossbowItem.LoadingSounds chargingSounds = this.chargingSounds(stack); + float pitch = MathHelper.lerp(world.getRandom().nextFloat(), 0.87f, 1.2f); + chargingSounds.end().ifPresent(sound -> world.playSound(null, user.getX(), user.getY(), user.getZ(), sound.value(), user.getSoundCategory(), 1.0f, pitch)); + } + + @Override + public void initializeProjectile(LivingEntity user, ProjectileEntity projectile, int index, float power, float uncertainty, float angle, boolean critical, @Nullable LivingEntity target) { + ShooterMethod.super.initializeProjectile(user, projectile, index, power, uncertainty, angle, critical, target); + if (projectile instanceof PersistentProjectileEntity persistentProjectile) { + persistentProjectile.setSound(SoundEvents.ITEM_CROSSBOW_HIT); + } + + ((RangedWeaponItemAccessor) DUMMY).shoot(user, projectile, index, power, uncertainty, angle, target); + } + + @Override + public OptionalInt useDuration(ItemStack stack, LivingEntity user) { + if (CrossbowItem.isCharged(stack)) { + return OptionalInt.empty(); + } + + return OptionalInt.of(CrossbowItem.getPullTime(stack, user) + EXTRA_USE_TIME); + } + + @Override + public float pullProgress(ItemStack stack, LivingEntity user, int usedTicks) { + return ((float)usedTicks) / CrossbowItem.getPullTime(stack, user); + } + + public void shoot(ShooterItemComponent shooter, World world, LivingEntity user, Hand hand, ItemStack stack, float power, float divergence, @Nullable LivingEntity livingEntity) { + if (!(world instanceof ServerWorld serverWorld)) { + return; + } + + ChargedProjectilesComponent chargedProjectiles = stack.set(DataComponentTypes.CHARGED_PROJECTILES, ChargedProjectilesComponent.DEFAULT); + if (chargedProjectiles == null || chargedProjectiles.isEmpty()) { + return; + } + + shooter.shoot(serverWorld, user, hand, stack, chargedProjectiles.getProjectiles(), power, divergence, user instanceof PlayerEntity, livingEntity); + if (user instanceof ServerPlayerEntity player) { + Criteria.SHOT_CROSSBOW.trigger(player, stack); + player.incrementStat(Stats.USED.itematic$getOrCreateStat(stack.getRegistryEntry())); + } + } + + private static int getChargeTimeAt(int chargeTime, float progress) { + return MathHelper.floor(progress * chargeTime); + } + + private CrossbowItem.LoadingSounds chargingSounds(ItemStack stack) { + return EnchantmentHelper.getEffect(stack, EnchantmentEffectComponentTypes.CROSSBOW_CHARGING_SOUNDS) + .orElseGet(() -> stack.getOrDefault(ItematicDataComponentTypes.SHOOTER_DEFAULT_CHARGING_SOUNDS, ChargingSoundsUtil.EMPTY)); + } + + private static boolean chargeProjectiles(LivingEntity user, ItemStack stack) { + List projectiles = RangedWeaponItemAccessor.load(stack, user.itematic$getAmmunition(stack), user); + if (projectiles.isEmpty()) { + return false; + } + + stack.set(DataComponentTypes.CHARGED_PROJECTILES, ChargedProjectilesComponent.of(projectiles)); + return true; + } + + public record ChargedPowerRules(List rules, float defaultPower) { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Rule.CODEC.listOf().fieldOf("rules").forGetter(ChargedPowerRules::rules), + ItematicCodecs.NON_NEGATIVE_FLOAT.fieldOf("default_power").forGetter(ChargedPowerRules::defaultPower) + ).apply(instance, ChargedPowerRules::new)); + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + Rule.PACKET_CODEC.collect(PacketCodecs.toList()), ChargedPowerRules::rules, + PacketCodecs.FLOAT, ChargedPowerRules::defaultPower, + ChargedPowerRules::new + ); + + public float power(ItemStack stack) { + for (Rule rule : this.rules) { + if (rule.power.isPresent() && rule.matches(stack)) { + return rule.power.get(); + } + } + + return this.defaultPower; + } + + public record Rule(RegistryEntryList items, Optional power) { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + RegistryCodecs.entryList(RegistryKeys.ITEM).fieldOf("items").forGetter(Rule::items), + ItematicCodecs.NON_NEGATIVE_FLOAT.optionalFieldOf("power").forGetter(Rule::power) + ).apply(instance, Rule::new)); + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + PacketCodecs.registryEntryList(RegistryKeys.ITEM), Rule::items, + PacketCodecs.FLOAT.collect(PacketCodecs::optional), Rule::power, + Rule::new + ); + + public static Rule of(RegistryEntryList items, float power) { + return new Rule(items, Optional.of(power)); + } + + public boolean matches(ItemStack stack) { + return stack.isIn(this.items); + } + } + } +} diff --git a/src/main/java/net/errorcraft/itematic/item/shooter/method/methods/DirectShooterMethod.java b/src/main/java/net/errorcraft/itematic/item/shooter/method/methods/DirectShooterMethod.java new file mode 100644 index 00000000..90b98098 --- /dev/null +++ b/src/main/java/net/errorcraft/itematic/item/shooter/method/methods/DirectShooterMethod.java @@ -0,0 +1,108 @@ +package net.errorcraft.itematic.item.shooter.method.methods; + +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.errorcraft.itematic.component.ItematicDataComponentTypes; +import net.errorcraft.itematic.component.type.UseDurationDataComponent; +import net.errorcraft.itematic.item.component.components.ShooterItemComponent; +import net.errorcraft.itematic.item.shooter.method.ShooterMethod; +import net.errorcraft.itematic.item.shooter.method.ShooterMethodType; +import net.errorcraft.itematic.item.shooter.method.ShooterMethodTypes; +import net.errorcraft.itematic.mixin.item.RangedWeaponItemAccessor; +import net.minecraft.component.ComponentMap; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.projectile.ProjectileEntity; +import net.minecraft.item.BowItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.registry.Registries; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvent; +import net.minecraft.sound.SoundEvents; +import net.minecraft.stat.Stats; +import net.minecraft.util.Hand; +import net.minecraft.world.World; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.OptionalInt; + +public record DirectShooterMethod(RegistryEntry shootSound) implements ShooterMethod { + private static final RegistryEntry DEFAULT_SHOOT_SOUND = Registries.SOUND_EVENT.getEntry(SoundEvents.ENTITY_ARROW_SHOOT); + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + SoundEvent.ENTRY_CODEC.optionalFieldOf("shoot_sound", DEFAULT_SHOOT_SOUND).forGetter(DirectShooterMethod::shootSound) + ).apply(instance, DirectShooterMethod::new)); + private static final BowItem DUMMY = new BowItem(new Item.Settings()); + + public static DirectShooterMethod of() { + return new DirectShooterMethod(DEFAULT_SHOOT_SOUND); + } + + @Override + public ShooterMethodType type() { + return ShooterMethodTypes.DIRECT; + } + + @Override + public void addComponents(ComponentMap.Builder builder) { + builder.add(ItematicDataComponentTypes.SHOOTER_SHOOT_SOUND, this.shootSound); + } + + @Override + public boolean tryShoot(ShooterItemComponent component, ItemStack stack, World world, LivingEntity user, Hand hand) { + return false; + } + + @Override + public void hold(ShooterItemComponent shooter, ItemStack stack, World world, LivingEntity user, int usedTicks) {} + + @Override + public void stop(ShooterItemComponent shooter, ItemStack stack, World world, LivingEntity user, int usedTicks) { + ItemStack ammunition = user.itematic$getAmmunition(stack); + if (ammunition.isEmpty()) { + return; + } + + float pullProgress = this.pullProgress(usedTicks); + if (pullProgress < 0.1f) { + return; + } + + List projectiles = RangedWeaponItemAccessor.load(stack, ammunition, user); + if (world instanceof ServerWorld serverWorld && !projectiles.isEmpty()) { + shooter.shoot(serverWorld, user, user.getActiveHand(), stack, projectiles, pullProgress * 3.0f, 1.0f, pullProgress == 1.0f, null); + } + + RegistryEntry shootSound = stack.get(ItematicDataComponentTypes.SHOOTER_SHOOT_SOUND); + if (shootSound != null) { + world.playSound(null, user.getX(), user.getY(), user.getZ(), shootSound.value(), SoundCategory.PLAYERS, 1.0f, 1.0f / (world.getRandom().nextFloat() * 0.4f + 1.2f) + pullProgress * 0.5f); + } + + if (user instanceof PlayerEntity playerEntity) { + playerEntity.incrementStat(Stats.USED.itematic$getOrCreateStat(stack.getRegistryEntry())); + } + } + + @Override + public void initializeProjectile(LivingEntity user, ProjectileEntity projectile, int index, float power, float uncertainty, float angle, boolean critical, @Nullable LivingEntity target) { + ShooterMethod.super.initializeProjectile(user, projectile, index, power, uncertainty, angle, critical, target); + ((RangedWeaponItemAccessor) DUMMY).shoot(user, projectile, index, power, uncertainty, angle, target); + } + + @Override + public OptionalInt useDuration(ItemStack stack, LivingEntity user) { + return OptionalInt.of(UseDurationDataComponent.INDEFINITE_USE_DURATION); + } + + @Override + public float pullProgress(ItemStack stack, LivingEntity user, int usedTicks) { + return this.pullProgress(usedTicks); + } + + private float pullProgress(int usedTicks) { + return BowItem.getPullProgress(usedTicks); + } +} diff --git a/src/main/java/net/errorcraft/itematic/item/smithing/template/SmithingTemplates.java b/src/main/java/net/errorcraft/itematic/item/smithing/template/SmithingTemplates.java index 9e343962..eef3f883 100644 --- a/src/main/java/net/errorcraft/itematic/item/smithing/template/SmithingTemplates.java +++ b/src/main/java/net/errorcraft/itematic/item/smithing/template/SmithingTemplates.java @@ -15,9 +15,11 @@ public class SmithingTemplates { public static final RegistryKey NETHERITE_UPGRADE = of("netherite_upgrade"); + public static final RegistryKey BOLT_PATTERN = of("bolt_pattern"); public static final RegistryKey COAST_PATTERN = of("coast_pattern"); public static final RegistryKey DUNE_PATTERN = of("dune_pattern"); public static final RegistryKey EYE_PATTERN = of("eye_pattern"); + public static final RegistryKey FLOW_PATTERN = of("flow_pattern"); public static final RegistryKey HOST_PATTERN = of("host_pattern"); public static final RegistryKey RAISER_PATTERN = of("raiser_pattern"); public static final RegistryKey RIB_PATTERN = of("rib_pattern"); @@ -39,9 +41,11 @@ public static void bootstrap(Registerable registerable) { RegistryEntryLookup trimPatterns = registerable.getRegistryLookup(RegistryKeys.TRIM_PATTERN); registerable.register(NETHERITE_UPGRADE, new ItemUpgradeSmithingTemplate(items.getOrThrow(ItemKeys.NETHERITE_INGOT), new Identifier("netherite_upgrade"))); + registerable.register(BOLT_PATTERN, new TrimPatternSmithingTemplate(trimPatterns.getOrThrow(ArmorTrimPatterns.BOLT))); registerable.register(COAST_PATTERN, new TrimPatternSmithingTemplate(trimPatterns.getOrThrow(ArmorTrimPatterns.COAST))); registerable.register(DUNE_PATTERN, new TrimPatternSmithingTemplate(trimPatterns.getOrThrow(ArmorTrimPatterns.DUNE))); registerable.register(EYE_PATTERN, new TrimPatternSmithingTemplate(trimPatterns.getOrThrow(ArmorTrimPatterns.EYE))); + registerable.register(FLOW_PATTERN, new TrimPatternSmithingTemplate(trimPatterns.getOrThrow(ArmorTrimPatterns.FLOW))); registerable.register(HOST_PATTERN, new TrimPatternSmithingTemplate(trimPatterns.getOrThrow(ArmorTrimPatterns.HOST))); registerable.register(RAISER_PATTERN, new TrimPatternSmithingTemplate(trimPatterns.getOrThrow(ArmorTrimPatterns.RAISER))); registerable.register(RIB_PATTERN, new TrimPatternSmithingTemplate(trimPatterns.getOrThrow(ArmorTrimPatterns.RIB))); diff --git a/src/main/java/net/errorcraft/itematic/item/use/provider/providers/ShooterIntegerProvider.java b/src/main/java/net/errorcraft/itematic/item/use/provider/providers/ShooterIntegerProvider.java index e5cd1c27..0be2e733 100644 --- a/src/main/java/net/errorcraft/itematic/item/use/provider/providers/ShooterIntegerProvider.java +++ b/src/main/java/net/errorcraft/itematic/item/use/provider/providers/ShooterIntegerProvider.java @@ -2,9 +2,7 @@ import com.mojang.serialization.MapCodec; import io.netty.buffer.ByteBuf; -import net.errorcraft.itematic.component.type.UseDurationDataComponent; import net.errorcraft.itematic.item.component.ItemComponentTypes; -import net.errorcraft.itematic.item.component.components.ShooterItemComponent; import net.errorcraft.itematic.item.use.provider.IntegerProvider; import net.errorcraft.itematic.item.use.provider.IntegerProviderType; import net.errorcraft.itematic.item.use.provider.IntegerProviderTypes; @@ -12,7 +10,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.network.codec.PacketCodec; -import java.util.Optional; import java.util.OptionalInt; public record ShooterIntegerProvider() implements IntegerProvider { @@ -27,16 +24,12 @@ public IntegerProviderType type() { @Override public OptionalInt get(ItemStack stack, LivingEntity user) { - Optional shooter = stack.itematic$getComponent(ItemComponentTypes.SHOOTER); - if (shooter.isEmpty()) { - return OptionalInt.empty(); - } - if (shooter.get().isCharged(stack)) { - return OptionalInt.empty(); - } if (user.itematic$getAmmunition(stack).isEmpty()) { return OptionalInt.empty(); } - return OptionalInt.of(UseDurationDataComponent.INDEFINITE_USE_DURATION); + + return stack.itematic$getComponent(ItemComponentTypes.SHOOTER) + .map(shooter -> shooter.useDuration(stack, user)) + .orElseGet(OptionalInt::empty); } } diff --git a/src/main/java/net/errorcraft/itematic/item/use/provider/providers/TridentIntegerProvider.java b/src/main/java/net/errorcraft/itematic/item/use/provider/providers/TridentIntegerProvider.java index 95bc3b51..8de6dc0b 100644 --- a/src/main/java/net/errorcraft/itematic/item/use/provider/providers/TridentIntegerProvider.java +++ b/src/main/java/net/errorcraft/itematic/item/use/provider/providers/TridentIntegerProvider.java @@ -8,10 +8,10 @@ import net.errorcraft.itematic.item.use.provider.IntegerProviderType; import net.errorcraft.itematic.item.use.provider.IntegerProviderTypes; import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; import net.minecraft.item.ItemStack; import net.minecraft.network.codec.PacketCodec; +import net.minecraft.server.world.ServerWorld; import java.util.OptionalInt; @@ -33,10 +33,11 @@ public OptionalInt get(ItemStack stack, LivingEntity user) { return OptionalInt.empty(); } - private static boolean mayStartUsing(ItemStack stack, Entity user) { - if (EnchantmentHelper.getRiptide(stack) > 0 && !user.isTouchingWaterOrRain()) { + private static boolean mayStartUsing(ItemStack stack, LivingEntity user) { + if (user.getWorld() instanceof ServerWorld serverWorld && EnchantmentHelper.getTridentSpinAttackStrength(serverWorld, stack, user) > 0.0f && !user.isTouchingWaterOrRain()) { return false; } + return stack.itematic$getComponent(ItemComponentTypes.DAMAGEABLE) .map(c -> c.isUsable(stack)) .orElse(true); diff --git a/src/main/java/net/errorcraft/itematic/mixin/block/ChiseledBookshelfBlockExtender.java b/src/main/java/net/errorcraft/itematic/mixin/block/ChiseledBookshelfBlockExtender.java index 50b25d65..01006412 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/block/ChiseledBookshelfBlockExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/block/ChiseledBookshelfBlockExtender.java @@ -15,7 +15,10 @@ @Mixin(ChiseledBookshelfBlock.class) public class ChiseledBookshelfBlockExtender { @Redirect( - method = { "tryAddBook", "tryRemoveBook" }, + method = { + "tryAddBook", + "tryRemoveBook" + }, at = @At( value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;isOf(Lnet/minecraft/item/Item;)Z" diff --git a/src/main/java/net/errorcraft/itematic/mixin/block/DecoratedPotPatternsAccessor.java b/src/main/java/net/errorcraft/itematic/mixin/block/DecoratedPotPatternsAccessor.java index 77fd801e..3216e2f5 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/block/DecoratedPotPatternsAccessor.java +++ b/src/main/java/net/errorcraft/itematic/mixin/block/DecoratedPotPatternsAccessor.java @@ -62,12 +62,24 @@ static RegistryKey explorer() { throw new AssertionError(); } + @Accessor("FLOW_POTTERY_PATTERN_KEY") + @Contract + static RegistryKey flow() { + throw new AssertionError(); + } + @Accessor("FRIEND_POTTERY_PATTERN_KEY") @Contract static RegistryKey friend() { throw new AssertionError(); } + @Accessor("GUSTER_POTTERY_PATTERN_KEY") + @Contract + static RegistryKey guster() { + throw new AssertionError(); + } + @Accessor("HEART_POTTERY_PATTERN_KEY") @Contract static RegistryKey heart() { @@ -110,6 +122,12 @@ static RegistryKey prize() { throw new AssertionError(); } + @Accessor("SCRAPE_POTTERY_PATTERN_KEY") + @Contract + static RegistryKey scrape() { + throw new AssertionError(); + } + @Accessor("SHEAF_POTTERY_PATTERN_KEY") @Contract static RegistryKey sheaf() { diff --git a/src/main/java/net/errorcraft/itematic/mixin/block/vault/VaultConfigExtender.java b/src/main/java/net/errorcraft/itematic/mixin/block/vault/VaultConfigExtender.java new file mode 100644 index 00000000..27008af0 --- /dev/null +++ b/src/main/java/net/errorcraft/itematic/mixin/block/vault/VaultConfigExtender.java @@ -0,0 +1,22 @@ +package net.errorcraft.itematic.mixin.block.vault; + +import net.minecraft.block.vault.VaultConfig; +import net.minecraft.item.ItemConvertible; +import net.minecraft.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(VaultConfig.class) +public class VaultConfigExtender { + @Redirect( + method = "()V", + at = @At( + value = "NEW", + target = "(Lnet/minecraft/item/ItemConvertible;)Lnet/minecraft/item/ItemStack;" + ) + ) + private static ItemStack newItemStackReturnEmptyStack(ItemConvertible item) { + return ItemStack.EMPTY; + } +} diff --git a/src/main/java/net/errorcraft/itematic/mixin/component/DataComponentTypesAccessor.java b/src/main/java/net/errorcraft/itematic/mixin/component/DataComponentTypesAccessor.java index 9087b790..1867fe94 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/component/DataComponentTypesAccessor.java +++ b/src/main/java/net/errorcraft/itematic/mixin/component/DataComponentTypesAccessor.java @@ -1,6 +1,6 @@ package net.errorcraft.itematic.mixin.component; -import net.minecraft.component.DataComponentType; +import net.minecraft.component.ComponentType; import net.minecraft.component.DataComponentTypes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; @@ -10,7 +10,7 @@ @Mixin(DataComponentTypes.class) public interface DataComponentTypesAccessor { @Invoker("register") - static DataComponentType register(String id, UnaryOperator> builderOperator) { + static ComponentType register(String id, UnaryOperator> builderOperator) { throw new AssertionError(); } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/component/DataComponentTypesExtender.java b/src/main/java/net/errorcraft/itematic/mixin/component/DataComponentTypesExtender.java index 9a87bdc8..7d106a98 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/component/DataComponentTypesExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/component/DataComponentTypesExtender.java @@ -1,7 +1,7 @@ package net.errorcraft.itematic.mixin.component; import net.minecraft.component.ComponentMap; -import net.minecraft.component.DataComponentType; +import net.minecraft.component.ComponentType; import net.minecraft.component.DataComponentTypes; import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; @@ -15,18 +15,18 @@ public class DataComponentTypesExtender { method = "", at = @At( value = "INVOKE", - target = "Lnet/minecraft/component/ComponentMap$Builder;add(Lnet/minecraft/component/DataComponentType;Ljava/lang/Object;)Lnet/minecraft/component/ComponentMap$Builder;", + target = "Lnet/minecraft/component/ComponentMap$Builder;add(Lnet/minecraft/component/ComponentType;Ljava/lang/Object;)Lnet/minecraft/component/ComponentMap$Builder;", ordinal = 0 ), slice = @Slice( from = @At( value = "FIELD", - target = "Lnet/minecraft/component/DataComponentTypes;MAX_STACK_SIZE:Lnet/minecraft/component/DataComponentType;", + target = "Lnet/minecraft/component/DataComponentTypes;MAX_STACK_SIZE:Lnet/minecraft/component/ComponentType;", opcode = Opcodes.GETSTATIC ) ) ) - private static ComponentMap.Builder doNotAddMaxStackSizeDataComponent(ComponentMap.Builder instance, DataComponentType type, T value) { + private static ComponentMap.Builder doNotAddMaxStackSizeDataComponent(ComponentMap.Builder instance, ComponentType type, T value) { return instance; } @@ -34,18 +34,18 @@ private static ComponentMap.Builder doNotAddMaxStackSizeDataComponent(Compon method = "", at = @At( value = "INVOKE", - target = "Lnet/minecraft/component/ComponentMap$Builder;add(Lnet/minecraft/component/DataComponentType;Ljava/lang/Object;)Lnet/minecraft/component/ComponentMap$Builder;", + target = "Lnet/minecraft/component/ComponentMap$Builder;add(Lnet/minecraft/component/ComponentType;Ljava/lang/Object;)Lnet/minecraft/component/ComponentMap$Builder;", ordinal = 0 ), slice = @Slice( from = @At( value = "FIELD", - target = "Lnet/minecraft/component/DataComponentTypes;RARITY:Lnet/minecraft/component/DataComponentType;", + target = "Lnet/minecraft/component/DataComponentTypes;RARITY:Lnet/minecraft/component/ComponentType;", opcode = Opcodes.GETSTATIC ) ) ) - private static ComponentMap.Builder doNotAddRaritySizeDataComponent(ComponentMap.Builder instance, DataComponentType type, T value) { + private static ComponentMap.Builder doNotAddRaritySizeDataComponent(ComponentMap.Builder instance, ComponentType type, T value) { return instance; } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/component/type/ChargedProjectilesComponentExtender.java b/src/main/java/net/errorcraft/itematic/mixin/component/type/ChargedProjectilesComponentExtender.java index 557dac4e..fc34e9bd 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/component/type/ChargedProjectilesComponentExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/component/type/ChargedProjectilesComponentExtender.java @@ -1,9 +1,6 @@ package net.errorcraft.itematic.mixin.component.type; import net.errorcraft.itematic.access.component.type.ChargedProjectilesComponentAccess; -import net.errorcraft.itematic.item.component.ItemComponentTypes; -import net.errorcraft.itematic.item.component.components.ProjectileItemComponent; -import net.errorcraft.itematic.mixin.item.CrossbowItemAccessor; import net.minecraft.component.type.ChargedProjectilesComponent; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -11,15 +8,11 @@ import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; import java.util.List; @Mixin(ChargedProjectilesComponent.class) public class ChargedProjectilesComponentExtender implements ChargedProjectilesComponentAccess { - @Unique - private static final float DEFAULT_CHARGED_SPEED = CrossbowItemAccessor.defaultSpeed(); - @Shadow @Final private List projectiles; @@ -33,16 +26,4 @@ public class ChargedProjectilesComponentExtender implements ChargedProjectilesCo } return false; } - - @Override - public float itematic$getChargedSpeed() { - float actualChargedSpeed = DEFAULT_CHARGED_SPEED; - for (ItemStack projectile : this.projectiles) { - float chargedSpeed = projectile.itematic$getComponent(ItemComponentTypes.PROJECTILE) - .map(ProjectileItemComponent::chargedSpeed) - .orElse(DEFAULT_CHARGED_SPEED); - actualChargedSpeed = Math.min(actualChargedSpeed, chargedSpeed); - } - return actualChargedSpeed; - } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/enchantment/EnchantmentExtender.java b/src/main/java/net/errorcraft/itematic/mixin/enchantment/EnchantmentExtender.java deleted file mode 100644 index b2a2b66f..00000000 --- a/src/main/java/net/errorcraft/itematic/mixin/enchantment/EnchantmentExtender.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.errorcraft.itematic.mixin.enchantment; - -import net.errorcraft.itematic.item.component.ItemComponentTypes; -import net.errorcraft.itematic.item.component.components.ForgeableItemComponent; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.item.ItemStack; -import net.minecraft.registry.Registries; -import net.minecraft.registry.entry.RegistryEntry; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; - -@Mixin(Enchantment.class) -public class EnchantmentExtender { - /** - * @author ErrorCraft - * @reason Uses the ItemComponent implementation for data-driven items. - */ - @Overwrite - public boolean isAcceptableItem(ItemStack stack) { - RegistryEntry enchantment = Registries.ENCHANTMENT.getEntry((Enchantment) (Object)this); - return stack.itematic$getComponent(ItemComponentTypes.FORGEABLE) - .map(ForgeableItemComponent::enchantments) - .map(tag -> tag.map(enchantment::isIn).orElse(true)) - .orElse(false); - } -} diff --git a/src/main/java/net/errorcraft/itematic/mixin/enchantment/EnchantmentHelperExtender.java b/src/main/java/net/errorcraft/itematic/mixin/enchantment/EnchantmentHelperExtender.java index 258f2dee..d1278ff2 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/enchantment/EnchantmentHelperExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/enchantment/EnchantmentHelperExtender.java @@ -5,52 +5,46 @@ import com.llamalad7.mixinextras.sugar.ref.LocalRef; import net.errorcraft.itematic.item.component.ItemComponentTypes; import net.errorcraft.itematic.item.component.components.EnchantableItemComponent; -import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.item.Item; import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; -import net.minecraft.registry.Registry; import net.minecraft.registry.entry.RegistryEntry; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; -import java.util.Iterator; import java.util.Optional; @Mixin(EnchantmentHelper.class) public class EnchantmentHelperExtender { @Redirect( - method = "getPossibleEntries", + method = "getEnchantmentsComponentType", at = @At( value = "INVOKE", - target = "Lnet/minecraft/registry/Registry;iterator()Ljava/util/Iterator;" + target = "Lnet/minecraft/item/ItemStack;isOf(Lnet/minecraft/item/Item;)Z" ) ) - private static Iterator getPossibleEntriesUseEnchantmentTag(Registry instance, @Local(argsOnly = true) int power, @Local(argsOnly = true) ItemStack stack) { - return stack.itematic$getComponent(ItemComponentTypes.ENCHANTABLE) - .flatMap(EnchantableItemComponent::enchantments) - .map(key -> instance.getOrCreateEntryList(key).stream().map(RegistryEntry::value).iterator()) - .orElse(instance.iterator()); + private static boolean isOfUseItemComponentCheck(ItemStack instance, Item item) { + return instance.itematic$hasComponent(ItemComponentTypes.ENCHANTMENT_HOLDER); } @Redirect( - method = "enchant", + method = "enchant(Lnet/minecraft/util/math/random/Random;Lnet/minecraft/item/ItemStack;ILjava/util/stream/Stream;)Lnet/minecraft/item/ItemStack;", at = @At( value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;isOf(Lnet/minecraft/item/Item;)Z" ) ) private static boolean isOfForBookUseItemComponent(ItemStack instance, Item item, @Share("transformsInto") LocalRef> transformsInto) { - Optional> optionalEntry = instance.itematic$getComponent(ItemComponentTypes.ENCHANTABLE) + Optional> optionalItem = instance.itematic$getComponent(ItemComponentTypes.ENCHANTABLE) .flatMap(EnchantableItemComponent::transformsInto); - optionalEntry.ifPresent(transformsInto::set); - return optionalEntry.isPresent(); + optionalItem.ifPresent(transformsInto::set); + return optionalItem.isPresent(); } @Redirect( - method = "enchant", + method = "enchant(Lnet/minecraft/util/math/random/Random;Lnet/minecraft/item/ItemStack;ILjava/util/stream/Stream;)Lnet/minecraft/item/ItemStack;", at = @At( value = "NEW", target = "(Lnet/minecraft/item/ItemConvertible;)Lnet/minecraft/item/ItemStack;" @@ -59,4 +53,17 @@ private static boolean isOfForBookUseItemComponent(ItemStack instance, Item item private static ItemStack newItemStackForEnchantedBookUseItemComponent(ItemConvertible item, @Local(argsOnly = true) ItemStack target, @Share("transformsInto") LocalRef> transformsInto) { return target.itematic$copyWithItem(transformsInto.get()); } + + @Redirect( + method = "getPossibleEntries", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/item/ItemStack;isOf(Lnet/minecraft/item/Item;)Z" + ) + ) + private static boolean isOfUseItemComponent(ItemStack instance, Item item) { + return instance.itematic$getComponent(ItemComponentTypes.ENCHANTABLE) + .flatMap(EnchantableItemComponent::transformsInto) + .isPresent(); + } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/CrossbowUserExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/CrossbowUserExtender.java index 8a7aeae1..5e44c114 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/CrossbowUserExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/CrossbowUserExtender.java @@ -7,6 +7,7 @@ import net.errorcraft.itematic.item.ItemKeys; import net.errorcraft.itematic.item.component.ItemComponentTypes; import net.errorcraft.itematic.item.component.components.ShooterItemComponent; +import net.errorcraft.itematic.item.shooter.method.methods.ChargeableShooterMethod; import net.minecraft.entity.CrossbowUser; import net.minecraft.entity.LivingEntity; import net.minecraft.item.CrossbowItem; @@ -41,11 +42,8 @@ private Hand getHandPossiblyHoldingForCrossbowUseRegistryKey(LivingEntity entity ) private boolean instanceOfCrossbowItemUseItemComponent(Object reference, Class clazz, @Local ItemStack heldStack, @Share("shooterItemComponent") LocalRef shooterItemComponent) { Optional optionalComponent = heldStack.itematic$getComponent(ItemComponentTypes.SHOOTER); - if (optionalComponent.map(ShooterItemComponent::isChargeable).orElse(false)) { - shooterItemComponent.set(optionalComponent.get()); - return true; - } - return false; + optionalComponent.ifPresent(shooterItemComponent::set); + return optionalComponent.isPresent(); } @ModifyVariable( @@ -65,6 +63,8 @@ private Item castToCrossbowItemUseNull(Item instance) { ) ) private void shootAllUseItemComponent(CrossbowItem instance, World world, LivingEntity shooter, Hand hand, ItemStack stack, float speed, float divergence, LivingEntity livingEntity, @Share("shooterItemComponent") LocalRef shooterItemComponent) { - shooterItemComponent.get().shootAll(world, shooter, hand, stack, speed, divergence, livingEntity); + if (shooterItemComponent.get().method() instanceof ChargeableShooterMethod chargeableShooterMethod) { + chargeableShooterMethod.shoot(shooterItemComponent.get(), world, shooter, hand, stack, speed, divergence, livingEntity); + } } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/EntityTypeExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/EntityTypeExtender.java index 94ba8b89..25fa63c9 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/EntityTypeExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/EntityTypeExtender.java @@ -33,8 +33,10 @@ public abstract class EntityTypeExtender implements EntityTypeAccess { @Unique private MapCodec> initializerCodec; + @Unique private EntityInitializer initializer; + @Unique private ActionContext actionContext; @@ -418,6 +420,25 @@ private static EntityType.Builder setSmallFireballInitializ return type; } + @ModifyArg( + method = "", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/entity/EntityType;register(Ljava/lang/String;Lnet/minecraft/entity/EntityType$Builder;)Lnet/minecraft/entity/EntityType;", + ordinal = 0 + ), + slice = @Slice( + from = @At( + value = "CONSTANT", + args = "stringValue=wind_charge" + ) + ) + ) + private static EntityType.Builder setWindChargeInitializerCodec(EntityType.Builder type) { + type.itematic$initializerCodec(WindChargeEntityInitializer.CODEC); + return type; + } + @Inject( method = "create(Lnet/minecraft/world/World;)Lnet/minecraft/entity/Entity;", at = @At( @@ -430,6 +451,7 @@ private void createUseEntityInitializerIfPresent(World world, CallbackInfoReturn if (this.initializer == null) { return; } + EntityInitializer initializer = this.initializer; // Copy to a local and set the field to null, so we don't get a StackOverflowError this.initializer = null; info.setReturnValue((T) initializer.create(this.actionContext)); diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/LivingEntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/LivingEntityExtender.java index d5407ff9..45631f5a 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/LivingEntityExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/LivingEntityExtender.java @@ -12,6 +12,7 @@ import net.errorcraft.itematic.item.ItemKeys; import net.errorcraft.itematic.item.ItemStackConsumer; import net.errorcraft.itematic.item.component.ItemComponentTypes; +import net.errorcraft.itematic.item.component.components.ConsumableItemComponent; import net.errorcraft.itematic.item.component.components.LifeSavingItemComponent; import net.errorcraft.itematic.item.event.ItemEvents; import net.errorcraft.itematic.world.action.context.ActionContext; @@ -33,6 +34,7 @@ import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.registry.tag.ItemTags; import net.minecraft.server.world.ServerWorld; +import net.minecraft.sound.SoundEvent; import net.minecraft.stat.Stat; import net.minecraft.stat.StatType; import net.minecraft.util.Hand; @@ -42,10 +44,7 @@ import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.Slice; +import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @@ -81,9 +80,14 @@ public abstract class LivingEntityExtender extends Entity implements LivingEntit @Shadow public abstract ItemStack eatFood(World world, ItemStack stack); - @Shadow public abstract AttributeContainer getAttributes(); + @Shadow + public abstract AttributeContainer getAttributes(); - @Shadow public abstract double getAttributeBaseValue(RegistryEntry attribute); + @Shadow + public abstract double getAttributeBaseValue(RegistryEntry attribute); + + @Shadow + protected abstract void spawnItemParticles(ItemStack stack, int count); @Unique private int itemUsedTicks; @@ -340,6 +344,7 @@ private int keepAtConstantWhenUseDurationIsIndefinite(int original) { if (original == -1) { return 0; } + return original; } @@ -349,11 +354,54 @@ private int keepAtConstantWhenUseDurationIsIndefinite(int original) { cancellable = true ) private void checkMaxUseTime(CallbackInfoReturnable info) { - if (this.activeItemStack.itematic$useDuration((LivingEntity)(Object) this) <= 0) { + if (this.activeItemStack.getMaxUseTime((LivingEntity)(Object) this) <= 0) { info.setReturnValue(false); } } + @Inject( + method = "spawnConsumptionEffects", + at = @At("HEAD"), + cancellable = true + ) + private void alwaysSpawnItemParticlesAndStoreConsumableSound(ItemStack stack, int particleCount, CallbackInfo info, @Share("consumeSound") LocalRef> consumeSound) { + this.spawnItemParticles(stack, particleCount); + this.activeItemStack.itematic$getComponent(ItemComponentTypes.CONSUMABLE) + .map(ConsumableItemComponent::sound) + .ifPresentOrElse(consumeSound::set, info::cancel); + } + + @Redirect( + method = "spawnConsumptionEffects", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/entity/LivingEntity;spawnItemParticles(Lnet/minecraft/item/ItemStack;I)V" + ) + ) + private void doNotSpawnItemParticlesNormally(LivingEntity instance, ItemStack stack, int count) {} + + @ModifyArg( + method = "spawnConsumptionEffects", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/entity/LivingEntity;playSound(Lnet/minecraft/sound/SoundEvent;FF)V" + ) + ) + private SoundEvent playSoundUseItemComponent(SoundEvent sound, @Share("consumeSound") LocalRef> consumeSound) { + return consumeSound.get().value(); + } + + @Inject( + method = "spawnItemParticles", + at = @At("HEAD"), + cancellable = true + ) + private void shouldSpawnParticles(ItemStack stack, int count, CallbackInfo info) { + if (!this.activeItemStack.itematic$getComponent(ItemComponentTypes.CONSUMABLE).map(ConsumableItemComponent::hasConsumeParticles).orElse(false)) { + info.cancel(); + } + } + @Redirect( method = "tickFallFlying", at = @At( @@ -384,6 +432,7 @@ private int useMaxValueWhenUseDurationIsIndefinite(int original) { if (original == -1) { return Integer.MAX_VALUE; } + return original; } @@ -450,14 +499,17 @@ private Double getBaseAttackDamage(ItemStack stack) { if (!stack.itematic$hasComponent(ItemComponentTypes.WEAPON)) { return null; } + WeaponAttackDamageDataComponent weaponAttackDamage = stack.get(ItematicDataComponentTypes.WEAPON_ATTACK_DAMAGE); if (weaponAttackDamage == null) { return null; } + double damage = weaponAttackDamage.getDamage(stack, this); if (weaponAttackDamage.shouldAddBase(stack, this)) { return damage + this.getAttributeBaseValue(EntityAttributes.GENERIC_ATTACK_DAMAGE); } + return damage; } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/decoration/LeashKnotEntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/decoration/LeashKnotEntityExtender.java index 9e5fbbf9..55d79db4 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/decoration/LeashKnotEntityExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/decoration/LeashKnotEntityExtender.java @@ -2,7 +2,7 @@ import net.errorcraft.itematic.item.ItemKeys; import net.minecraft.entity.EntityType; -import net.minecraft.entity.decoration.AbstractDecorationEntity; +import net.minecraft.entity.decoration.BlockAttachedEntity; import net.minecraft.entity.decoration.LeashKnotEntity; import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; @@ -12,8 +12,8 @@ import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(LeashKnotEntity.class) -public abstract class LeashKnotEntityExtender extends AbstractDecorationEntity { - protected LeashKnotEntityExtender(EntityType entityType, World world) { +public abstract class LeashKnotEntityExtender extends BlockAttachedEntity { + protected LeashKnotEntityExtender(EntityType entityType, World world) { super(entityType, world); } diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/mob/GuardianEntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/mob/GuardianEntityExtender.java index 90e08d76..aa801797 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/mob/GuardianEntityExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/mob/GuardianEntityExtender.java @@ -3,16 +3,12 @@ import net.errorcraft.itematic.item.ItemKeys; import net.minecraft.entity.EntityType; import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.attribute.EntityAttribute; import net.minecraft.entity.mob.GuardianEntity; import net.minecraft.item.Item; import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.world.World; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(GuardianEntity.class) public abstract class GuardianEntityExtender extends MobEntityExtender { @@ -24,18 +20,4 @@ protected GuardianEntityExtender(EntityType entityType, protected @Nullable RegistryKey pickBlockKey() { return ItemKeys.GUARDIAN_SPAWN_EGG; } - - @Mixin(targets = "net/minecraft/entity/mob/GuardianEntity$FireBeamGoal") - public static class FireBeamGoalExtender { - @Redirect( - method = "tick", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/entity/mob/GuardianEntity;getAttributeValue(Lnet/minecraft/registry/entry/RegistryEntry;)D" - ) - ) - private double useCustomAttackDamage(GuardianEntity instance, RegistryEntry attribute) { - return instance.itematic$getAttackDamage(); - } - } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/mob/HostileEntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/mob/HostileEntityExtender.java index 3091ae0e..71dde512 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/mob/HostileEntityExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/mob/HostileEntityExtender.java @@ -90,6 +90,7 @@ private ItemStack newItemStackForArrowUseCreateStack(ItemConvertible item) { if (!heldStack.isEmpty()) { return heldStack; } + return this.getWorld().itematic$createStack(ItemKeys.ARROW); } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/mob/WitchEntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/mob/WitchEntityExtender.java index b2adb6d7..ac00dcb4 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/mob/WitchEntityExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/mob/WitchEntityExtender.java @@ -44,17 +44,6 @@ private ItemStack newItemStackForPotionUseCreateStack(Item item, RegistryEntry

entityType, W super(entityType, world); } - @Redirect( - method = "tryAttack", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/entity/passive/AxolotlEntity;getAttributeValue(Lnet/minecraft/registry/entry/RegistryEntry;)D" - ) - ) - private double useCustomAttackDamage(AxolotlEntity instance, RegistryEntry attribute) { - return this.itematic$getAttackDamage(); - } - @Redirect( method = "eat", at = @At( diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/passive/CatEntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/passive/CatEntityExtender.java index 50433a73..7810544c 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/passive/CatEntityExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/passive/CatEntityExtender.java @@ -4,16 +4,12 @@ import net.errorcraft.itematic.mixin.entity.mob.MobEntityExtender; import net.minecraft.entity.EntityType; import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.attribute.EntityAttribute; import net.minecraft.entity.passive.CatEntity; import net.minecraft.item.Item; import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.world.World; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(CatEntity.class) public abstract class CatEntityExtender extends MobEntityExtender { @@ -21,17 +17,6 @@ protected CatEntityExtender(EntityType entityType, World super(entityType, world); } - @Redirect( - method = "getAttackDamage", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/entity/passive/CatEntity;getAttributeValue(Lnet/minecraft/registry/entry/RegistryEntry;)D" - ) - ) - private double useCustomAttackDamage(CatEntity instance, RegistryEntry attribute) { - return this.itematic$getAttackDamage(); - } - @Override protected @Nullable RegistryKey pickBlockKey() { return ItemKeys.CAT_SPAWN_EGG; diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/passive/DolphinEntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/passive/DolphinEntityExtender.java index e63835d4..f9be871f 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/passive/DolphinEntityExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/passive/DolphinEntityExtender.java @@ -4,16 +4,12 @@ import net.errorcraft.itematic.mixin.entity.mob.MobEntityExtender; import net.minecraft.entity.EntityType; import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.attribute.EntityAttribute; import net.minecraft.entity.passive.DolphinEntity; import net.minecraft.item.Item; import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.world.World; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(DolphinEntity.class) public abstract class DolphinEntityExtender extends MobEntityExtender { @@ -21,17 +17,6 @@ protected DolphinEntityExtender(EntityType entityType, W super(entityType, world); } - @Redirect( - method = "tryAttack", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/entity/passive/DolphinEntity;getAttributeValue(Lnet/minecraft/registry/entry/RegistryEntry;)D" - ) - ) - private double useCustomAttackDamage(DolphinEntity instance, RegistryEntry attribute) { - return this.itematic$getAttackDamage(); - } - @Override protected @Nullable RegistryKey pickBlockKey() { return ItemKeys.DOLPHIN_SPAWN_EGG; diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/passive/OcelotEntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/passive/OcelotEntityExtender.java index 7b10e5ed..82cc5940 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/passive/OcelotEntityExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/passive/OcelotEntityExtender.java @@ -4,16 +4,12 @@ import net.errorcraft.itematic.mixin.entity.mob.MobEntityExtender; import net.minecraft.entity.EntityType; import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.attribute.EntityAttribute; import net.minecraft.entity.passive.OcelotEntity; import net.minecraft.item.Item; import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.world.World; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(OcelotEntity.class) public abstract class OcelotEntityExtender extends MobEntityExtender { @@ -21,17 +17,6 @@ protected OcelotEntityExtender(EntityType entityType, Wo super(entityType, world); } - @Redirect( - method = "getAttackDamage", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/entity/passive/OcelotEntity;getAttributeValue(Lnet/minecraft/registry/entry/RegistryEntry;)D" - ) - ) - private double useCustomAttackDamage(OcelotEntity instance, RegistryEntry attribute) { - return this.itematic$getAttackDamage(); - } - @Override protected @Nullable RegistryKey pickBlockKey() { return ItemKeys.OCELOT_SPAWN_EGG; diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/passive/PolarBearEntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/passive/PolarBearEntityExtender.java index 6e37c25d..ed5d3253 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/passive/PolarBearEntityExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/passive/PolarBearEntityExtender.java @@ -4,16 +4,12 @@ import net.errorcraft.itematic.mixin.entity.mob.MobEntityExtender; import net.minecraft.entity.EntityType; import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.attribute.EntityAttribute; import net.minecraft.entity.passive.PolarBearEntity; import net.minecraft.item.Item; import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.world.World; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(PolarBearEntity.class) public abstract class PolarBearEntityExtender extends MobEntityExtender { @@ -21,17 +17,6 @@ protected PolarBearEntityExtender(EntityType entityType, super(entityType, world); } - @Redirect( - method = "tryAttack", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/entity/passive/PolarBearEntity;getAttributeValue(Lnet/minecraft/registry/entry/RegistryEntry;)D" - ) - ) - private double useCustomAttackDamage(PolarBearEntity instance, RegistryEntry attribute) { - return this.itematic$getAttackDamage(); - } - @Override protected @Nullable RegistryKey pickBlockKey() { return ItemKeys.POLAR_BEAR_SPAWN_EGG; diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/passive/SheepEntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/passive/SheepEntityExtender.java index 521162d2..1ccc5c84 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/passive/SheepEntityExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/passive/SheepEntityExtender.java @@ -1,10 +1,6 @@ package net.errorcraft.itematic.mixin.entity.passive; import com.google.common.collect.ImmutableMap; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import com.llamalad7.mixinextras.sugar.Local; -import net.errorcraft.itematic.access.util.DyeColorAccess; import net.errorcraft.itematic.item.ItemKeys; import net.errorcraft.itematic.item.component.ItemComponentTypes; import net.errorcraft.itematic.item.component.components.DyeItemComponent; @@ -12,16 +8,12 @@ import net.minecraft.entity.EntityType; import net.minecraft.entity.ItemEntity; import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.passive.AnimalEntity; import net.minecraft.entity.passive.SheepEntity; -import net.minecraft.inventory.RecipeInputInventory; import net.minecraft.item.DyeItem; import net.minecraft.item.Item; import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; -import net.minecraft.recipe.CraftingRecipe; -import net.minecraft.recipe.RecipeEntry; -import net.minecraft.recipe.RecipeType; +import net.minecraft.recipe.input.CraftingRecipeInput; import net.minecraft.registry.RegistryKey; import net.minecraft.util.DyeColor; import net.minecraft.world.World; @@ -30,20 +22,18 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.Slice; +import java.util.List; import java.util.Map; +import java.util.Optional; +import java.util.function.Function; +import java.util.function.Predicate; @Mixin(SheepEntity.class) public abstract class SheepEntityExtender extends MobEntityExtender { - @Shadow - protected abstract ItemStack method_17689(RecipeInputInventory inventory, RecipeEntry entry); - - @Shadow - protected abstract DyeColor method_17691(DyeColor par1, DyeColor par2); - @Shadow public abstract DyeColor getColor(); @@ -67,9 +57,6 @@ public abstract class SheepEntityExtender extends MobEntityExtender { .put(DyeColor.BLACK, ItemKeys.BLACK_WOOL) .build(); - @Unique - private static World world; - protected SheepEntityExtender(EntityType entityType, World world) { super(entityType, world); } @@ -96,73 +83,71 @@ private ItemEntity dropItemUseRegistryKey(SheepEntity instance, ItemConvertible return this.itematic$dropItem(DYE_TO_WOOL.get(this.getColor()), yOffset); } - @WrapOperation( + @Redirect( method = "getChildColor", at = @At( value = "INVOKE", - target = "Lnet/minecraft/entity/passive/SheepEntity;createDyeMixingCraftingInventory(Lnet/minecraft/util/DyeColor;Lnet/minecraft/util/DyeColor;)Lnet/minecraft/inventory/RecipeInputInventory;" + target = "Lnet/minecraft/entity/passive/SheepEntity;createChildColorRecipeInput(Lnet/minecraft/util/DyeColor;Lnet/minecraft/util/DyeColor;)Lnet/minecraft/recipe/input/CraftingRecipeInput;" ) ) - private RecipeInputInventory createDyeMixingCraftingInventorySetRegistryManager(DyeColor firstColor, DyeColor secondColor, Operation original) { - world = this.getWorld(); - RecipeInputInventory inventory = original.call(firstColor, secondColor); - world = null; - return inventory; - } - - @Inject( - method = "getChildColor", - at = @At( - value = "INVOKE_ASSIGN", - target = "Lnet/minecraft/entity/passive/SheepEntity;createDyeMixingCraftingInventory(Lnet/minecraft/util/DyeColor;Lnet/minecraft/util/DyeColor;)Lnet/minecraft/inventory/RecipeInputInventory;", - shift = At.Shift.AFTER - ), - cancellable = true - ) - private void getColorUseItemComponent(AnimalEntity firstParent, AnimalEntity secondParent, CallbackInfoReturnable info, @Local(ordinal = 0) DyeColor firstColor, @Local(ordinal = 1) DyeColor secondColor, @Local RecipeInputInventory inventory) { - World world = this.getWorld(); - DyeColor color = world.getRecipeManager() - .getFirstMatch(RecipeType.CRAFTING, inventory, world) - .map(entry -> this.method_17689(inventory, entry)) - .flatMap(stack -> stack.itematic$getComponent(ItemComponentTypes.DYE)) - .map(DyeItemComponent::color) - .orElseGet(() -> this.method_17691(firstColor, secondColor)); - info.setReturnValue(color); + private CraftingRecipeInput createChildColorRecipeInput(DyeColor firstColor, DyeColor secondColor) { + return CraftingRecipeInput.create( + 2, + 1, + List.of( + this.getWorld().itematic$createStack(firstColor.itematic$itemKey()), + this.getWorld().itematic$createStack(secondColor.itematic$itemKey()) + ) + ); } @Redirect( - method = "createDyeMixingCraftingInventory", + method = "getChildColor", at = @At( value = "INVOKE", - target = "Lnet/minecraft/item/DyeItem;byColor(Lnet/minecraft/util/DyeColor;)Lnet/minecraft/item/DyeItem;" + target = "Ljava/util/Optional;filter(Ljava/util/function/Predicate;)Ljava/util/Optional;" ) ) - private static DyeItem dyeItemByColorReturnNull(DyeColor color) { - return null; + @SuppressWarnings("OptionalUsedAsFieldOrParameterType") + private Optional instanceOfDyeItemUseItemComponent(Optional instance, Predicate predicate) { + return instance.flatMap(item -> item.itematic$getComponent(ItemComponentTypes.DYE)); } @Redirect( - method = "createDyeMixingCraftingInventory", + method = "getChildColor", at = @At( - value = "NEW", - target = "(Lnet/minecraft/item/ItemConvertible;)Lnet/minecraft/item/ItemStack;", + value = "INVOKE", + target = "Ljava/util/Optional;map(Ljava/util/function/Function;)Ljava/util/Optional;", ordinal = 0 + ), + slice = @Slice( + from = @At( + value = "INVOKE", + target = "Ljava/util/Optional;filter(Ljava/util/function/Predicate;)Ljava/util/Optional;" + ) ) ) - private static ItemStack newItemStackForFirstColorUseCreateStack(ItemConvertible item, DyeColor firstColor) { - return world.itematic$createStack(((DyeColorAccess)(Object) firstColor).itematic$itemKey()); + @SuppressWarnings("OptionalUsedAsFieldOrParameterType") + private Optional castToDyeItemDoNothing(Optional instance, Function mapper) { + return instance; } - @Redirect( - method = "createDyeMixingCraftingInventory", + @ModifyArg( + method = "getChildColor", at = @At( - value = "NEW", - target = "(Lnet/minecraft/item/ItemConvertible;)Lnet/minecraft/item/ItemStack;", + value = "INVOKE", + target = "Ljava/util/Optional;map(Ljava/util/function/Function;)Ljava/util/Optional;", ordinal = 1 + ), + slice = @Slice( + from = @At( + value = "INVOKE", + target = "Ljava/util/Optional;filter(Ljava/util/function/Predicate;)Ljava/util/Optional;" + ) ) ) - private static ItemStack newItemStackForSecondColorUseCreateStack(ItemConvertible item, @Local(ordinal = 1, argsOnly = true) DyeColor secondColor) { - return world.itematic$createStack(((DyeColorAccess)(Object) secondColor).itematic$itemKey()); + private Function getColorUseItemComponent(Function mapper) { + return DyeItemComponent::color; } @Override diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/passive/WolfEntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/passive/WolfEntityExtender.java index f8f40ec6..7dc1873a 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/passive/WolfEntityExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/passive/WolfEntityExtender.java @@ -4,13 +4,11 @@ import net.errorcraft.itematic.mixin.entity.mob.MobEntityExtender; import net.minecraft.entity.EntityType; import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.attribute.EntityAttribute; import net.minecraft.entity.passive.WolfEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.recipe.Ingredient; import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.world.World; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; @@ -35,17 +33,6 @@ private ItemStack getDefaultStackForArmadilloScuteUseCreateStack(Item instance) return this.getWorld().itematic$createStack(ItemKeys.ARMADILLO_SCUTE); } - @Redirect( - method = "tryAttack", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/entity/passive/WolfEntity;getAttributeValue(Lnet/minecraft/registry/entry/RegistryEntry;)D" - ) - ) - private double useCustomAttackDamage(WolfEntity instance, RegistryEntry attribute) { - return this.itematic$getAttackDamage(); - } - @Redirect( method = "interactMob", at = @At( diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/projectile/ArrowEntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/projectile/ArrowEntityExtender.java index c2f7055a..ba21dbc9 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/projectile/ArrowEntityExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/projectile/ArrowEntityExtender.java @@ -13,12 +13,15 @@ @Mixin(ArrowEntity.class) public abstract class ArrowEntityExtender extends PersistentProjectileEntity { - protected ArrowEntityExtender(EntityType type, World world, ItemStack stack) { - super(type, world, stack); + protected ArrowEntityExtender(EntityType entityType, World world) { + super(entityType, world); } @Redirect( - method = { "getDefaultItemStack", "tick" }, + method = { + "getDefaultItemStack", + "tick" + }, at = @At( value = "NEW", target = "(Lnet/minecraft/item/ItemConvertible;)Lnet/minecraft/item/ItemStack;" diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/projectile/ProjectileUtilExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/projectile/ProjectileUtilExtender.java index 772aeede..98c1a3d6 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/projectile/ProjectileUtilExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/projectile/ProjectileUtilExtender.java @@ -13,23 +13,23 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; -import java.util.Optional; - @Mixin(ProjectileUtil.class) public class ProjectileUtilExtender { @Redirect( method = "createArrowProjectile", at = @At( value = "INVOKE", - target = "Lnet/minecraft/item/ArrowItem;createArrow(Lnet/minecraft/world/World;Lnet/minecraft/item/ItemStack;Lnet/minecraft/entity/LivingEntity;)Lnet/minecraft/entity/projectile/PersistentProjectileEntity;" + target = "Lnet/minecraft/item/ArrowItem;createArrow(Lnet/minecraft/world/World;Lnet/minecraft/item/ItemStack;Lnet/minecraft/entity/LivingEntity;Lnet/minecraft/item/ItemStack;)Lnet/minecraft/entity/projectile/PersistentProjectileEntity;" ) ) - private static PersistentProjectileEntity createProjectileUseItemComponent(ArrowItem instance, World world, ItemStack projectile, LivingEntity shooter) { - Optional optionalEntity = projectile.itematic$getComponent(ItemComponentTypes.PROJECTILE) - .map(c -> c.createEntity(world, shooter, projectile, 1.0f, 1.0f)); - if (optionalEntity.orElse(null) instanceof PersistentProjectileEntity persistentProjectileEntity) { + private static PersistentProjectileEntity createProjectileUseItemComponent(ArrowItem instance, World world, ItemStack projectile, LivingEntity shooter, ItemStack shotFrom) { + Entity entity = projectile.itematic$getComponent(ItemComponentTypes.PROJECTILE) + .map(c -> c.createEntity(world, shooter, projectile, 1.0f, 1.0f)) + .orElse(null); + if (entity instanceof PersistentProjectileEntity persistentProjectileEntity) { return persistentProjectileEntity; } - return new ArrowEntity(world, shooter, projectile.copyWithCount(1)); + + return new ArrowEntity(world, shooter, projectile.copyWithCount(1), shotFrom); } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/projectile/SpectralArrowEntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/projectile/SpectralArrowEntityExtender.java index 09e86a8f..e533b859 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/projectile/SpectralArrowEntityExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/projectile/SpectralArrowEntityExtender.java @@ -13,8 +13,8 @@ @Mixin(SpectralArrowEntity.class) public abstract class SpectralArrowEntityExtender extends PersistentProjectileEntity { - protected SpectralArrowEntityExtender(EntityType type, World world, ItemStack stack) { - super(type, world, stack); + protected SpectralArrowEntityExtender(EntityType entityType, World world) { + super(entityType, world); } @Redirect( diff --git a/src/main/java/net/errorcraft/itematic/mixin/item/CrossbowItemAccessor.java b/src/main/java/net/errorcraft/itematic/mixin/item/CrossbowItemAccessor.java index a97b8793..aa24ade6 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/item/CrossbowItemAccessor.java +++ b/src/main/java/net/errorcraft/itematic/mixin/item/CrossbowItemAccessor.java @@ -1,48 +1,38 @@ package net.errorcraft.itematic.mixin.item; -import net.minecraft.entity.LivingEntity; import net.minecraft.item.CrossbowItem; -import net.minecraft.item.ItemStack; -import org.jetbrains.annotations.Contract; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -import org.spongepowered.asm.mixin.gen.Invoker; @Mixin(CrossbowItem.class) public interface CrossbowItemAccessor { @Accessor("DEFAULT_PULL_TIME") - @Contract - static int defaultPullTime() { + static float defaultChargeTime() { throw new AssertionError(); } @Accessor("CHARGE_PROGRESS") - @Contract - static float chargeProgress() { + static float startSoundProgress() { throw new AssertionError(); } @Accessor("LOAD_PROGRESS") - @Contract - static float loadProgress() { + static float midSoundProgress() { throw new AssertionError(); } @Accessor("DEFAULT_SPEED") - @Contract - static float defaultSpeed() { + static float defaultPower() { throw new AssertionError(); } @Accessor("FIREWORK_ROCKET_SPEED") - @Contract - static float fireworkRocketSpeed() { + static float fireworkRocketPower() { throw new AssertionError(); } - @Invoker("loadProjectiles") - @Contract - static boolean loadProjectiles(LivingEntity shooter, ItemStack crossbow) { + @Accessor("DEFAULT_LOADING_SOUNDS") + static CrossbowItem.LoadingSounds defaultChargingSounds() { throw new AssertionError(); } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/item/CrossbowItemExtender.java b/src/main/java/net/errorcraft/itematic/mixin/item/CrossbowItemExtender.java index 8122646b..ce42882c 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/item/CrossbowItemExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/item/CrossbowItemExtender.java @@ -1,32 +1,27 @@ package net.errorcraft.itematic.mixin.item; -import com.llamalad7.mixinextras.sugar.Local; -import net.errorcraft.itematic.entity.initializer.EntityInitializer; +import com.llamalad7.mixinextras.sugar.Share; +import com.llamalad7.mixinextras.sugar.ref.LocalFloatRef; +import net.errorcraft.itematic.component.ItematicDataComponentTypes; import net.errorcraft.itematic.item.component.ItemComponentTypes; -import net.errorcraft.itematic.item.component.components.ProjectileItemComponent; -import net.minecraft.entity.EntityType; import net.minecraft.entity.LivingEntity; import net.minecraft.item.CrossbowItem; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.stat.Stat; -import net.minecraft.stat.StatType; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(CrossbowItem.class) -public abstract class CrossbowItemExtender { - @Redirect( - method = "shootAll", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/stat/StatType;getOrCreateStat(Ljava/lang/Object;)Lnet/minecraft/stat/Stat;" - ) +public class CrossbowItemExtender { + @Inject( + method = "loadProjectiles", + at = @At("HEAD"), + cancellable = true ) - private Stat getOrCreateStatUseRegistryEntry(StatType instance, T key, @Local(argsOnly = true) ItemStack stack) { - return instance.itematic$getOrCreateStat(stack.getRegistryEntry()); + private static void getAmmunitionUseItemComponent(LivingEntity shooter, ItemStack crossbow, CallbackInfoReturnable info) { + if (!crossbow.itematic$hasComponent(ItemComponentTypes.SHOOTER)) { + info.setReturnValue(false); + } } @Redirect( @@ -36,36 +31,36 @@ private Stat getOrCreateStatUseRegistryEntry(StatType instance, target = "Lnet/minecraft/entity/LivingEntity;getProjectileType(Lnet/minecraft/item/ItemStack;)Lnet/minecraft/item/ItemStack;" ) ) - private static ItemStack getProjectileTypeUseItemComponent(LivingEntity instance, ItemStack stack) { + private static ItemStack getAmmunitionUseItemComponent(LivingEntity instance, ItemStack stack) { if (stack.itematic$hasComponent(ItemComponentTypes.SHOOTER)) { - return instance.itematic$getAmmunition(stack); + instance.itematic$getAmmunition(stack); } + return ItemStack.EMPTY; } - @Redirect( - method = "createArrowEntity", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/item/ItemStack;isOf(Lnet/minecraft/item/Item;)Z" - ) + @Inject( + method = "getPullTime", + at = @At("HEAD"), + cancellable = true ) - private boolean isOfForFireworkRocketUseItemComponent(ItemStack instance, Item item) { - return instance.itematic$getComponent(ItemComponentTypes.PROJECTILE) - .map(ProjectileItemComponent::entity) - .map(EntityInitializer::type) - .map(e -> e == EntityType.FIREWORK_ROCKET) - .orElse(false); + private static void checkAndStoreDefaultChargeTime(ItemStack stack, LivingEntity user, CallbackInfoReturnable info, @Share("defaultChargeTime") LocalFloatRef defaultChargeTime) { + Float possibleDefaultChargeTime = stack.get(ItematicDataComponentTypes.SHOOTER_DEFAULT_CHARGE_TIME); + if (possibleDefaultChargeTime == null) { + info.setReturnValue(0); + return; + } + + defaultChargeTime.set(possibleDefaultChargeTime); } - /** - * @author ErrorCraft - * @reason Uses the ItemComponent implementation for data-driven items. - */ - @Overwrite - public int getWeaponStackDamage(ItemStack projectile) { - return projectile.itematic$getComponent(ItemComponentTypes.PROJECTILE) - .map(ProjectileItemComponent::damage) - .orElse(0); + @ModifyConstant( + method = "getPullTime", + constant = @Constant( + floatValue = 1.25f + ) + ) + private static float defaultChargeTimeUseDataComponent(float constant, @Share("defaultChargeTime") LocalFloatRef defaultChargeTime) { + return defaultChargeTime.get(); } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/item/HoneyBottleItemAccessor.java b/src/main/java/net/errorcraft/itematic/mixin/item/HoneyBottleItemAccessor.java index d2e02804..3eb4253f 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/item/HoneyBottleItemAccessor.java +++ b/src/main/java/net/errorcraft/itematic/mixin/item/HoneyBottleItemAccessor.java @@ -7,7 +7,7 @@ @Mixin(HoneyBottleItem.class) public interface HoneyBottleItemAccessor { @Accessor("MAX_USE_TIME") - static int maxUseTime() { + static int useDuration() { throw new AssertionError(); } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/item/ItemExtender.java b/src/main/java/net/errorcraft/itematic/mixin/item/ItemExtender.java index 37190d22..c7cecc15 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/item/ItemExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/item/ItemExtender.java @@ -3,6 +3,7 @@ import com.google.common.collect.Interner; import net.errorcraft.itematic.access.item.ItemAccess; import net.errorcraft.itematic.component.ItematicDataComponentTypes; +import net.errorcraft.itematic.component.type.UseDurationDataComponent; import net.errorcraft.itematic.inventory.StackReferenceUtil; import net.errorcraft.itematic.item.ItemBase; import net.errorcraft.itematic.item.ItemUtil; @@ -22,7 +23,7 @@ import net.minecraft.client.item.TooltipData; import net.minecraft.client.item.TooltipType; import net.minecraft.component.ComponentMap; -import net.minecraft.component.DataComponentType; +import net.minecraft.component.ComponentType; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.AttributeModifiersComponent; import net.minecraft.component.type.ToolComponent; @@ -349,10 +350,21 @@ public void appendTooltip(ItemStack stack, Item.TooltipContext context, List type) { + public int getMaxCountUseStackCount(ItemStack instance) { + return instance.getCount(); + } + + @Redirect( + method = "isEnchantable", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/item/ItemStack;contains(Lnet/minecraft/component/ComponentType;)Z" + ) + ) + public boolean containsMaxDamageUseItemComponentCheck(ItemStack instance, ComponentType type) { return instance.itematic$hasComponent(ItemComponentTypes.ENCHANTABLE); } @@ -476,16 +488,26 @@ public void getUseActionUseItemComponent(ItemStack stack, CallbackInfoReturnable info.setReturnValue(UseAction.NONE); return; } + info.setReturnValue(stack.getOrDefault(ItematicDataComponentTypes.USE_ANIMATION, UseAction.NONE)); } - @Inject( - method = "getMaxUseTime", - at = @At("HEAD"), - cancellable = true - ) - public void getMaxUseTimeUseItemComponent(ItemStack stack, CallbackInfoReturnable info) { - info.setReturnValue(0); + /** + * @author ErrorCraft + * @reason Uses the ItemComponent implementation for data-driven items. + */ + @Overwrite + public int getMaxUseTime(ItemStack stack, LivingEntity user) { + if (!this.itematic$hasComponent(ItemComponentTypes.USEABLE)) { + return 0; + } + + UseDurationDataComponent useDuration = this.components.get(ItematicDataComponentTypes.USE_DURATION); + if (useDuration == null) { + return 0; + } + + return useDuration.ticks(stack, user); } /** @@ -613,7 +635,7 @@ public ItemStack getRecipeRemainder(ItemStack stack) { } @Override - public boolean canBeEnchantedWith(ItemStack stack, Enchantment enchantment, EnchantingContext context) { + public boolean canBeEnchantedWith(ItemStack stack, RegistryEntry enchantment, EnchantingContext context) { return true; } diff --git a/src/main/java/net/errorcraft/itematic/mixin/item/ItemGroupsAccessor.java b/src/main/java/net/errorcraft/itematic/mixin/item/ItemGroupsAccessor.java index c6688359..bec4f2d6 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/item/ItemGroupsAccessor.java +++ b/src/main/java/net/errorcraft/itematic/mixin/item/ItemGroupsAccessor.java @@ -16,11 +16,6 @@ static Comparator> paintingVariantComparator() { throw new AssertionError(); } - @Accessor("displayContext") - static ItemGroup.DisplayContext displayContext() { - throw new AssertionError(); - } - @Accessor("displayContext") static void setDisplayContext(ItemGroup.DisplayContext displayContext) {} } diff --git a/src/main/java/net/errorcraft/itematic/mixin/item/ItemStackExtender.java b/src/main/java/net/errorcraft/itematic/mixin/item/ItemStackExtender.java index aa4b3104..75e11697 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/item/ItemStackExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/item/ItemStackExtender.java @@ -8,18 +8,21 @@ import net.errorcraft.itematic.access.item.ItemStackAccess; import net.errorcraft.itematic.component.ItematicDataComponentTypes; import net.errorcraft.itematic.component.type.ImmuneToDamageComponent; -import net.errorcraft.itematic.component.type.UseDurationDataComponent; import net.errorcraft.itematic.item.ItemKeys; import net.errorcraft.itematic.item.ItemUtil; import net.errorcraft.itematic.item.ItematicItemTags; import net.errorcraft.itematic.item.component.ItemComponent; import net.errorcraft.itematic.item.component.ItemComponentType; import net.errorcraft.itematic.item.component.ItemComponentTypes; +import net.errorcraft.itematic.item.component.components.ShooterItemComponent; import net.errorcraft.itematic.item.event.ItemEvent; import net.errorcraft.itematic.item.event.ItemEvents; +import net.errorcraft.itematic.item.shooter.method.ShooterMethodTypes; import net.errorcraft.itematic.util.Util; import net.errorcraft.itematic.world.action.context.ActionContext; import net.errorcraft.itematic.world.action.context.parameter.ActionContextParameter; +import net.fabricmc.fabric.api.item.v1.EnchantingContext; +import net.fabricmc.fabric.api.item.v1.FabricItemStack; import net.minecraft.advancement.criterion.ItemDurabilityChangedCriterion; import net.minecraft.block.BlockState; import net.minecraft.client.item.TooltipType; @@ -27,6 +30,7 @@ import net.minecraft.component.ComponentHolder; import net.minecraft.component.ComponentMap; import net.minecraft.component.ComponentMapImpl; +import net.minecraft.enchantment.Enchantment; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.damage.DamageSource; @@ -45,6 +49,7 @@ import net.minecraft.registry.tag.TagKey; import net.minecraft.screen.slot.Slot; import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; import net.minecraft.stat.Stat; import net.minecraft.stat.StatType; import net.minecraft.stat.Stats; @@ -52,7 +57,6 @@ import net.minecraft.util.*; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.random.Random; import net.minecraft.world.World; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -74,7 +78,7 @@ import java.util.stream.Stream; @Mixin(ItemStack.class) -public abstract class ItemStackExtender implements ComponentHolder, ItemStackAccess { +public abstract class ItemStackExtender implements ComponentHolder, ItemStackAccess, FabricItemStack { @Shadow @Final private static Logger LOGGER; @@ -95,7 +99,7 @@ public abstract class ItemStackExtender implements ComponentHolder, ItemStackAcc public abstract boolean isEmpty(); @Shadow - public abstract void damage(int amount, Random random, @Nullable ServerPlayerEntity serverPlayerEntity, Runnable runnable); + public abstract void damage(int amount, ServerWorld serverWorld, @Nullable ServerPlayerEntity player, Runnable breakCallback); @Shadow public abstract int getDamage(); @@ -159,7 +163,11 @@ private void componentChangesConstructorSetFields(RegistryEntry item, int } @Redirect( - method = { "(Lnet/minecraft/registry/entry/RegistryEntry;)V", "(Lnet/minecraft/registry/entry/RegistryEntry;I)V", "(Lnet/minecraft/registry/entry/RegistryEntry;ILnet/minecraft/component/ComponentChanges;)V" }, + method = { + "(Lnet/minecraft/registry/entry/RegistryEntry;)V", + "(Lnet/minecraft/registry/entry/RegistryEntry;I)V", + "(Lnet/minecraft/registry/entry/RegistryEntry;ILnet/minecraft/component/ComponentChanges;)V" + }, at = @At( value = "INVOKE", target = "Lnet/minecraft/registry/entry/RegistryEntry;value()Ljava/lang/Object;" @@ -170,7 +178,7 @@ private static T registryEntryValueReturnNullToPreventUnboundRegistryEntryIs } @Redirect( - method = { "(Lnet/minecraft/item/ItemConvertible;I)V" }, + method = "(Lnet/minecraft/item/ItemConvertible;I)V", at = @At( value = "INVOKE", target = "Lnet/minecraft/item/ItemConvertible;asItem()Lnet/minecraft/item/Item;" @@ -192,7 +200,10 @@ private Item asItemReturnNullToPreventNullPointerException(ItemConvertible insta } @Redirect( - method = { "(Lnet/minecraft/item/ItemConvertible;I)V", "(Lnet/minecraft/registry/entry/RegistryEntry;ILnet/minecraft/component/ComponentChanges;)V" }, + method = { + "(Lnet/minecraft/item/ItemConvertible;I)V", + "(Lnet/minecraft/registry/entry/RegistryEntry;ILnet/minecraft/component/ComponentChanges;)V" + }, at = @At( value = "INVOKE", target = "Lnet/minecraft/item/Item;getComponents()Lnet/minecraft/component/ComponentMap;" @@ -426,7 +437,10 @@ public void isEnchantableCheckNullEntry(CallbackInfoReturnable info) { } @Inject( - method = { "areItemsEqual", "areItemsAndComponentsEqual" }, + method = { + "areItemsEqual", + "areItemsAndComponentsEqual" + }, at = @At("HEAD"), cancellable = true ) @@ -437,7 +451,10 @@ private static void checkEmptyStacksPrematurely(ItemStack stack, ItemStack other } @Redirect( - method = { "areItemsEqual", "areItemsAndComponentsEqual" }, + method = { + "areItemsEqual", + "areItemsAndComponentsEqual" + }, at = @At( value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;isOf(Lnet/minecraft/item/Item;)Z" @@ -447,6 +464,18 @@ private static boolean isOfUseRegistryEntryCheck(ItemStack instance, Item item, return instance.itemMatches(right.getRegistryEntry()); } + @Inject( + method = "isUsedOnRelease", + at = @At("HEAD"), + cancellable = true + ) + private void checkForChargeableShooter(CallbackInfoReturnable info) { + this.itematic$getComponent(ItemComponentTypes.SHOOTER) + .map(ShooterItemComponent::method) + .filter(method -> method.type() == ShooterMethodTypes.CHARGEABLE) + .ifPresent(method -> info.setReturnValue(true)); + } + @Inject( method = "hasGlint", at = @At("HEAD"), @@ -552,22 +581,23 @@ private void postMineUseRegistryEntryNullCheck(World world, BlockState state, Bl } @Inject( - method = "damage(ILnet/minecraft/util/math/random/Random;Lnet/minecraft/server/network/ServerPlayerEntity;Ljava/lang/Runnable;)V", + method = "damage(ILnet/minecraft/server/world/ServerWorld;Lnet/minecraft/server/network/ServerPlayerEntity;Ljava/lang/Runnable;)V", at = @At( value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;setDamage(I)V", shift = At.Shift.AFTER ) ) - private void invokeDamageToolEvent(int amount, Random random, ServerPlayerEntity serverPlayerEntity, Runnable breakCallback, CallbackInfo info) { + private void invokeDamageToolEvent(int amount, ServerWorld serverWorld, ServerPlayerEntity player, Runnable breakCallback, CallbackInfo info) { if (this.context == null) { return; } + this.itematic$invokeEvent(ItemEvents.DAMAGE_ITEM, this.context); } @WrapWithCondition( - method = "damage(ILnet/minecraft/util/math/random/Random;Lnet/minecraft/server/network/ServerPlayerEntity;Ljava/lang/Runnable;)V", + method = "damage(ILnet/minecraft/server/world/ServerWorld;Lnet/minecraft/server/network/ServerPlayerEntity;Ljava/lang/Runnable;)V", at = @At( value = "INVOKE", target = "Lnet/minecraft/advancement/criterion/ItemDurabilityChangedCriterion;trigger(Lnet/minecraft/server/network/ServerPlayerEntity;Lnet/minecraft/item/ItemStack;I)V" @@ -581,13 +611,13 @@ private boolean limitDamageApplied(ItemDurabilityChangedCriterion instance, Serv } @Inject( - method = "damage(ILnet/minecraft/util/math/random/Random;Lnet/minecraft/server/network/ServerPlayerEntity;Ljava/lang/Runnable;)V", + method = "damage(ILnet/minecraft/server/world/ServerWorld;Lnet/minecraft/server/network/ServerPlayerEntity;Ljava/lang/Runnable;)V", at = @At( value = "INVOKE", target = "Ljava/lang/Runnable;run()V" ) ) - private void invokeBreakToolEvent(int amount, Random random, ServerPlayerEntity serverPlayerEntity, Runnable runnable, CallbackInfo info) { + private void invokeBreakToolEvent(int amount, ServerWorld serverWorld, ServerPlayerEntity player, Runnable breakCallback, CallbackInfo info) { if (this.context == null) { return; } @@ -595,7 +625,13 @@ private void invokeBreakToolEvent(int amount, Random random, ServerPlayerEntity } @Redirect( - method = { "useOnBlock", "method_56097", "postHit", "postMine", "onCraftByPlayer" }, + method = { + "useOnBlock", + "method_56097", + "postHit", + "postMine", + "onCraftByPlayer" + }, at = @At( value = "INVOKE", target = "Lnet/minecraft/stat/StatType;getOrCreateStat(Ljava/lang/Object;)Lnet/minecraft/stat/Stat;" @@ -614,6 +650,12 @@ public String toString() { return this.count + " " + this.itematic$key().getValue().toString(); } + @Override + public boolean canBeEnchantedWith(RegistryEntry enchantment, EnchantingContext context) { + // Use the original implementation again + return enchantment.value().isAcceptableItem((ItemStack)(Object) this); + } + @Override public RegistryKey itematic$key() { if (this.entry == null) { @@ -672,7 +714,7 @@ public String toString() { } this.context = context; Entity entity = context.entity(ActionContextParameter.THIS).orElse(null); - this.damage(amount, context.world().getRandom(), entity instanceof ServerPlayerEntity player ? player : null, () -> this.onItemBroken(entity, context)); + this.damage(amount, context.world(), entity instanceof ServerPlayerEntity player ? player : null, () -> this.onItemBroken(entity, context)); this.context = null; } @@ -730,18 +772,6 @@ public String toString() { return this.entry.value().itematic$mayStartUsing(world, user, hand, stack); } - @Override - public int itematic$useDuration(LivingEntity user) { - if (!this.itematic$hasComponent(ItemComponentTypes.USEABLE)) { - return 0; - } - UseDurationDataComponent useDuration = this.get(ItematicDataComponentTypes.USE_DURATION); - if (useDuration == null) { - return 0; - } - return useDuration.ticks((ItemStack)(Object) this, user); - } - @Override public double itematic$attackSpeedMultiplier() { if (!this.itematic$hasComponent(ItemComponentTypes.WEAPON)) { diff --git a/src/main/java/net/errorcraft/itematic/mixin/item/OminousBottleItemAccessor.java b/src/main/java/net/errorcraft/itematic/mixin/item/OminousBottleItemAccessor.java new file mode 100644 index 00000000..a3cf5aa9 --- /dev/null +++ b/src/main/java/net/errorcraft/itematic/mixin/item/OminousBottleItemAccessor.java @@ -0,0 +1,13 @@ +package net.errorcraft.itematic.mixin.item; + +import net.minecraft.item.OminousBottleItem; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(OminousBottleItem.class) +public interface OminousBottleItemAccessor { + @Accessor("MAX_USE_TIME") + static int useDuration() { + throw new AssertionError(); + } +} diff --git a/src/main/java/net/errorcraft/itematic/mixin/item/RangedWeaponItemAccessor.java b/src/main/java/net/errorcraft/itematic/mixin/item/RangedWeaponItemAccessor.java new file mode 100644 index 00000000..e4bbf306 --- /dev/null +++ b/src/main/java/net/errorcraft/itematic/mixin/item/RangedWeaponItemAccessor.java @@ -0,0 +1,22 @@ +package net.errorcraft.itematic.mixin.item; + +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.projectile.ProjectileEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.RangedWeaponItem; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import java.util.List; + +@Mixin(RangedWeaponItem.class) +public interface RangedWeaponItemAccessor { + @Invoker("load") + static List load(ItemStack stack, ItemStack projectile, LivingEntity shooter) { + throw new AssertionError(); + } + + @Invoker("shoot") + void shoot(LivingEntity user, ProjectileEntity projectile, int index, float power, float uncertainty, float angle, @Nullable LivingEntity target); +} diff --git a/src/main/java/net/errorcraft/itematic/mixin/item/RangedWeaponItemExtender.java b/src/main/java/net/errorcraft/itematic/mixin/item/RangedWeaponItemExtender.java deleted file mode 100644 index 324ac6ac..00000000 --- a/src/main/java/net/errorcraft/itematic/mixin/item/RangedWeaponItemExtender.java +++ /dev/null @@ -1,60 +0,0 @@ -package net.errorcraft.itematic.mixin.item; - -import com.llamalad7.mixinextras.sugar.Local; -import net.errorcraft.itematic.item.component.ItemComponentTypes; -import net.errorcraft.itematic.item.component.components.ProjectileItemComponent; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.projectile.PersistentProjectileEntity; -import net.minecraft.entity.projectile.ProjectileEntity; -import net.minecraft.item.ArrowItem; -import net.minecraft.item.ItemStack; -import net.minecraft.item.RangedWeaponItem; -import net.minecraft.world.World; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import java.util.Optional; - -@Mixin(RangedWeaponItem.class) -public class RangedWeaponItemExtender { - @Redirect( - method = "createArrowEntity", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/item/ArrowItem;createArrow(Lnet/minecraft/world/World;Lnet/minecraft/item/ItemStack;Lnet/minecraft/entity/LivingEntity;)Lnet/minecraft/entity/projectile/PersistentProjectileEntity;" - ) - ) - private PersistentProjectileEntity createArrowUseItemComponent(ArrowItem instance, World world, ItemStack projectile, LivingEntity shooter) { - Optional component = projectile.itematic$getComponent(ItemComponentTypes.PROJECTILE); - if (component.isEmpty()) { - return null; - } - - Entity entity = component.get().createEntity(world, shooter, projectile, 0.0f, 1.0f); - if (entity instanceof PersistentProjectileEntity persistentProjectileEntity) { - return persistentProjectileEntity; - } - - world.spawnEntity(entity); - return null; - } - - @Inject( - method = "createArrowEntity", - at = @At( - value = "INVOKE_ASSIGN", - target = "Lnet/minecraft/item/ArrowItem;createArrow(Lnet/minecraft/world/World;Lnet/minecraft/item/ItemStack;Lnet/minecraft/entity/LivingEntity;)Lnet/minecraft/entity/projectile/PersistentProjectileEntity;", - shift = At.Shift.AFTER - ), - cancellable = true - ) - private void createArrowCheckNullEntity(World world, LivingEntity shooter, ItemStack weaponStack, ItemStack projectileStack, boolean critical, CallbackInfoReturnable info, @Local PersistentProjectileEntity persistentProjectileEntity) { - if (persistentProjectileEntity == null) { - info.setReturnValue(null); - } - } -} diff --git a/src/main/java/net/errorcraft/itematic/mixin/item/WindChargeItemAccessor.java b/src/main/java/net/errorcraft/itematic/mixin/item/WindChargeItemAccessor.java new file mode 100644 index 00000000..1f95eb3d --- /dev/null +++ b/src/main/java/net/errorcraft/itematic/mixin/item/WindChargeItemAccessor.java @@ -0,0 +1,13 @@ +package net.errorcraft.itematic.mixin.item; + +import net.minecraft.item.WindChargeItem; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(WindChargeItem.class) +public interface WindChargeItemAccessor { + @Accessor("COOLDOWN") + static int cooldown() { + throw new AssertionError(); + } +} diff --git a/src/main/java/net/errorcraft/itematic/mixin/loot/function/EnchantRandomlyLootFunctionExtender.java b/src/main/java/net/errorcraft/itematic/mixin/loot/function/EnchantRandomlyLootFunctionExtender.java index 4567909b..be58d180 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/loot/function/EnchantRandomlyLootFunctionExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/loot/function/EnchantRandomlyLootFunctionExtender.java @@ -4,7 +4,6 @@ import com.llamalad7.mixinextras.sugar.ref.LocalRef; import net.errorcraft.itematic.item.component.ItemComponentTypes; import net.errorcraft.itematic.item.component.components.EnchantableItemComponent; -import net.minecraft.enchantment.Enchantment; import net.minecraft.item.Item; import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; @@ -12,29 +11,23 @@ import net.minecraft.registry.entry.RegistryEntry; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.Optional; @Mixin(EnchantRandomlyLootFunction.class) public class EnchantRandomlyLootFunctionExtender { - @Inject( - method = "method_53327", + @Redirect( + method = "process", at = @At( value = "INVOKE", - target = "Lnet/minecraft/enchantment/Enchantment;isAcceptableItem(Lnet/minecraft/item/ItemStack;)Z" - ), - cancellable = true + target = "Lnet/minecraft/item/ItemStack;isOf(Lnet/minecraft/item/Item;)Z" + ) ) - private static void isValidEnchantUseItemComponent(boolean isBook, ItemStack stack, RegistryEntry.Reference enchantment, CallbackInfoReturnable info) { - info.setReturnValue(stack.itematic$getComponent(ItemComponentTypes.ENCHANTABLE) - .map(c -> c.enchantments() - .map(enchantment::isIn) - .orElse(true) - ).orElse(false) - ); + private boolean isOfForBookUseItemComponent(ItemStack instance, Item item) { + return instance.itematic$getComponent(ItemComponentTypes.ENCHANTABLE) + .flatMap(EnchantableItemComponent::transformsInto) + .isPresent(); } @Redirect( @@ -44,11 +37,11 @@ private static void isValidEnchantUseItemComponent(boolean isBook, ItemStack sta target = "Lnet/minecraft/item/ItemStack;isOf(Lnet/minecraft/item/Item;)Z" ) ) - private static boolean isOfForBookUseItemComponent(ItemStack instance, Item item, @Share("transformsInto") LocalRef> transformsInto) { - Optional> optionalEntry = instance.itematic$getComponent(ItemComponentTypes.ENCHANTABLE) + private static boolean isOfForBookUseItemComponentStatic(ItemStack instance, Item item, @Share("transformsInto") LocalRef> transformsInto) { + Optional> optionalItem = instance.itematic$getComponent(ItemComponentTypes.ENCHANTABLE) .flatMap(EnchantableItemComponent::transformsInto); - optionalEntry.ifPresent(transformsInto::set); - return optionalEntry.isPresent(); + optionalItem.ifPresent(transformsInto::set); + return optionalItem.isPresent(); } @Redirect( @@ -58,7 +51,7 @@ private static boolean isOfForBookUseItemComponent(ItemStack instance, Item item target = "(Lnet/minecraft/item/ItemConvertible;)Lnet/minecraft/item/ItemStack;" ) ) - private static ItemStack newItemStackForEnchantedBookUseItemComponent(ItemConvertible item, @Share("transformsInto") LocalRef> transformsInto) { - return new ItemStack(transformsInto.get()); + private static ItemStack newItemStackForEnchantedBookUseItemComponent(ItemConvertible item, ItemStack stack, @Share("transformsInto") LocalRef> transformsInto) { + return stack.itematic$copyWithItem(transformsInto.get()); } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/loot/function/SetEnchantmentsLootFunctionExtender.java b/src/main/java/net/errorcraft/itematic/mixin/loot/function/SetEnchantmentsLootFunctionExtender.java index 4165b839..79a66521 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/loot/function/SetEnchantmentsLootFunctionExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/loot/function/SetEnchantmentsLootFunctionExtender.java @@ -24,11 +24,11 @@ public class SetEnchantmentsLootFunctionExtender { target = "Lnet/minecraft/item/ItemStack;isOf(Lnet/minecraft/item/Item;)Z" ) ) - private boolean isOfForBookUseItemComponentCheck(ItemStack instance, Item item, @Share("transformedEntry") LocalRef> transformedEntry) { - Optional> optionalEntry = instance.itematic$getComponent(ItemComponentTypes.ENCHANTABLE) + private boolean isOfForBookUseItemComponent(ItemStack instance, Item item, @Share("transformedEntry") LocalRef> transformedEntry) { + Optional> optionalItem = instance.itematic$getComponent(ItemComponentTypes.ENCHANTABLE) .flatMap(EnchantableItemComponent::transformsInto); - optionalEntry.ifPresent(transformedEntry::set); - return optionalEntry.isPresent(); + optionalItem.ifPresent(transformedEntry::set); + return optionalItem.isPresent(); } @Redirect( @@ -38,7 +38,7 @@ private boolean isOfForBookUseItemComponentCheck(ItemStack instance, Item item, target = "Lnet/minecraft/item/ItemStack;copyComponentsToNewStack(Lnet/minecraft/item/ItemConvertible;I)Lnet/minecraft/item/ItemStack;" ) ) - private ItemStack copyComponentsToNewStackForEnchantedBookUseRegistryEntry(ItemStack instance, ItemConvertible item, int count, @Share("transformedEntry") LocalRef> transformedEntry) { + private ItemStack copyComponentsToNewStackForEnchantedBookUseItemComponent(ItemStack instance, ItemConvertible item, int count, @Share("transformedEntry") LocalRef> transformedEntry) { return instance.itematic$copyComponentsToNewStack(transformedEntry.get(), count); } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/loot/function/SetPotionLootFunctionExtender.java b/src/main/java/net/errorcraft/itematic/mixin/loot/function/SetPotionLootFunctionExtender.java index 1d6186d5..540722ab 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/loot/function/SetPotionLootFunctionExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/loot/function/SetPotionLootFunctionExtender.java @@ -1,12 +1,11 @@ package net.errorcraft.itematic.mixin.loot.function; -import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.llamalad7.mixinextras.sugar.Local; -import com.llamalad7.mixinextras.sugar.Share; -import com.llamalad7.mixinextras.sugar.ref.LocalRef; import com.mojang.serialization.Codec; import net.errorcraft.itematic.access.loot.function.SetPotionLootFunctionAccess; -import net.minecraft.component.DataComponentType; +import net.minecraft.component.ComponentType; import net.minecraft.item.ItemStack; import net.minecraft.loot.condition.LootCondition; import net.minecraft.loot.context.LootContext; @@ -24,7 +23,6 @@ import org.spongepowered.asm.mixin.injection.Redirect; import java.util.List; -import java.util.Optional; import java.util.function.BiFunction; import java.util.function.Function; @@ -72,30 +70,17 @@ private static BiFunction, RegistryEntryList, SetPot }; } - @WrapWithCondition( + @WrapOperation( method = "process", at = @At( value = "INVOKE", - target = "Lnet/minecraft/item/ItemStack;apply(Lnet/minecraft/component/DataComponentType;Ljava/lang/Object;Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;" + target = "Lnet/minecraft/item/ItemStack;apply(Lnet/minecraft/component/ComponentType;Ljava/lang/Object;Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;" ) ) - private boolean applyPotionContentComponentCheckForRegistryEntryFromRegistryEntryList(ItemStack instance, DataComponentType type, T defaultValue, U change, BiFunction applier, @Local(argsOnly = true) LootContext context, @Share("potion") LocalRef> potion) { - Optional> optionalEntry = this.potions.getRandom(context.getRandom()); - optionalEntry.ifPresent(potion::set); - return optionalEntry.isPresent(); - } - - @ModifyArg( - method = "process", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/item/ItemStack;apply(Lnet/minecraft/component/DataComponentType;Ljava/lang/Object;Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;" - ), - index = 1 - ) - @SuppressWarnings("unchecked") - private U applyPotionContentComponentUseRegistryEntryFromRegistryEntryList(U change, @Share("potion") LocalRef> potion) { - return (U) potion.get(); + private Object applyPotionContentComponentCheckForRegistryEntryFromRegistryEntryList(ItemStack instance, ComponentType type, T defaultValue, U change, BiFunction applier, Operation original, @Local(argsOnly = true) LootContext context) { + this.potions.getRandom(context.getRandom()) + .ifPresent(potion -> original.call(instance, type, defaultValue, potion, applier)); + return null; } @Override diff --git a/src/main/java/net/errorcraft/itematic/mixin/predicate/item/ItemPredicateExtender.java b/src/main/java/net/errorcraft/itematic/mixin/predicate/item/ItemPredicateExtender.java index 251b15be..42079f53 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/predicate/item/ItemPredicateExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/predicate/item/ItemPredicateExtender.java @@ -9,7 +9,7 @@ import net.errorcraft.itematic.access.predicate.item.ItemPredicateBuilderAccess; import net.errorcraft.itematic.item.component.ItemComponentType; import net.errorcraft.itematic.predicate.item.ItemPredicateExtraFields; -import net.minecraft.component.DataComponentType; +import net.minecraft.component.ComponentType; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.predicate.item.ItemPredicate; @@ -81,7 +81,7 @@ public static class BuilderExtender implements ItemPredicateBuilderAccess { private final Set> behavior = new HashSet<>(); @Unique - private final Set> dataComponents = new HashSet<>(); + private final Set> dataComponents = new HashSet<>(); @ModifyReturnValue( method = "build", @@ -105,7 +105,7 @@ private ItemPredicate setExtraFields(ItemPredicate original) { } @Override - public ItemPredicate.Builder itematic$dataComponents(DataComponentType... dataComponents) { + public ItemPredicate.Builder itematic$dataComponents(ComponentType... dataComponents) { this.dataComponents.addAll(List.of(dataComponents)); return (ItemPredicate.Builder)(Object) this; } diff --git a/src/main/java/net/errorcraft/itematic/mixin/recipe/ArmorDyeRecipeExtender.java b/src/main/java/net/errorcraft/itematic/mixin/recipe/ArmorDyeRecipeExtender.java index 39e12d13..27d546ea 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/recipe/ArmorDyeRecipeExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/recipe/ArmorDyeRecipeExtender.java @@ -18,7 +18,10 @@ @Mixin(ArmorDyeRecipe.class) public class ArmorDyeRecipeExtender { @Redirect( - method = { "matches(Lnet/minecraft/inventory/RecipeInputInventory;Lnet/minecraft/world/World;)Z", "craft(Lnet/minecraft/inventory/RecipeInputInventory;Lnet/minecraft/registry/RegistryWrapper$WrapperLookup;)Lnet/minecraft/item/ItemStack;" }, + method = { + "matches(Lnet/minecraft/recipe/input/CraftingRecipeInput;Lnet/minecraft/world/World;)Z", + "craft(Lnet/minecraft/recipe/input/CraftingRecipeInput;Lnet/minecraft/registry/RegistryWrapper$WrapperLookup;)Lnet/minecraft/item/ItemStack;" + }, at = @At( value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;isIn(Lnet/minecraft/registry/tag/TagKey;)Z" @@ -29,7 +32,10 @@ private boolean isInForDyeableUseItemComponentCheck(ItemStack instance, TagKey V getModifierUseItemComponent(Map instance, Object o, @Shar } @Redirect( - method = { "matches(Lnet/minecraft/inventory/RecipeInputInventory;Lnet/minecraft/world/World;)Z", "craft(Lnet/minecraft/inventory/RecipeInputInventory;Lnet/minecraft/registry/RegistryWrapper$WrapperLookup;)Lnet/minecraft/item/ItemStack;" }, + method = { + "matches(Lnet/minecraft/recipe/input/CraftingRecipeInput;Lnet/minecraft/world/World;)Z", + "craft(Lnet/minecraft/recipe/input/CraftingRecipeInput;Lnet/minecraft/registry/RegistryWrapper$WrapperLookup;)Lnet/minecraft/item/ItemStack;" + }, at = @At( value = "INVOKE", target = "Lnet/minecraft/recipe/Ingredient;test(Lnet/minecraft/item/ItemStack;)Z", @@ -83,7 +86,10 @@ private boolean flickerModifierUseRegistryKeyCheck(Ingredient instance, ItemStac } @Redirect( - method = { "matches(Lnet/minecraft/inventory/RecipeInputInventory;Lnet/minecraft/world/World;)Z", "craft(Lnet/minecraft/inventory/RecipeInputInventory;Lnet/minecraft/registry/RegistryWrapper$WrapperLookup;)Lnet/minecraft/item/ItemStack;" }, + method = { + "matches(Lnet/minecraft/recipe/input/CraftingRecipeInput;Lnet/minecraft/world/World;)Z", + "craft(Lnet/minecraft/recipe/input/CraftingRecipeInput;Lnet/minecraft/registry/RegistryWrapper$WrapperLookup;)Lnet/minecraft/item/ItemStack;" + }, at = @At( value = "INVOKE", target = "Lnet/minecraft/recipe/Ingredient;test(Lnet/minecraft/item/ItemStack;)Z", @@ -102,7 +108,7 @@ private boolean trailModifierUseRegistryKeyCheck(Ingredient instance, ItemStack } @Redirect( - method = "matches(Lnet/minecraft/inventory/RecipeInputInventory;Lnet/minecraft/world/World;)Z", + method = "matches(Lnet/minecraft/recipe/input/CraftingRecipeInput;Lnet/minecraft/world/World;)Z", at = @At( value = "INVOKE", target = "Lnet/minecraft/recipe/Ingredient;test(Lnet/minecraft/item/ItemStack;)Z", @@ -121,7 +127,7 @@ private boolean testGunpowderUseRegistryKeyCheck(Ingredient instance, ItemStack } @ModifyConstant( - method = "matches(Lnet/minecraft/inventory/RecipeInputInventory;Lnet/minecraft/world/World;)Z", + method = "matches(Lnet/minecraft/recipe/input/CraftingRecipeInput;Lnet/minecraft/world/World;)Z", constant = @Constant( classValue = DyeItem.class ) @@ -131,7 +137,7 @@ private boolean instanceOfDyeItemUseItemComponentCheck(Object reference, Class { +public class InputSlotFillerExtender { @Unique private ItemAccess itemAccess; @@ -24,14 +24,17 @@ public class InputSlotFillerExtender { method = "fillInputSlots(Lnet/minecraft/server/network/ServerPlayerEntity;Lnet/minecraft/recipe/RecipeEntry;Z)V", at = @At("HEAD") ) - private void setItemAccess(ServerPlayerEntity entity, @Nullable RecipeEntry> recipe, boolean craftAll, CallbackInfo info) { + private void setItemAccess(ServerPlayerEntity entity, @Nullable RecipeEntry> recipe, boolean craftAll, CallbackInfo info) { if (this.itemAccess == null) { this.itemAccess = entity.getWorld().itematic$getItemAccess(); } } @Redirect( - method = { "fillInputSlots(Lnet/minecraft/recipe/RecipeEntry;Z)V", "acceptAlignedInput" }, + method = { + "fillInputSlots(Lnet/minecraft/recipe/RecipeEntry;Z)V", + "acceptAlignedInput(Ljava/lang/Integer;IIII)V" + }, at = @At( value = "INVOKE", target = "Lnet/minecraft/recipe/RecipeMatcher;getStackFromId(I)Lnet/minecraft/item/ItemStack;" @@ -41,6 +44,7 @@ private ItemStack getStackFromIdUseItemAccess(int itemId) { if (itemId == 0) { return ItemStack.EMPTY; } + return this.itemAccess.getOptionalEntry(itemId) .map(ItemStack::new) .orElse(ItemStack.EMPTY); diff --git a/src/main/java/net/errorcraft/itematic/mixin/recipe/MapCloningRecipeExtender.java b/src/main/java/net/errorcraft/itematic/mixin/recipe/MapCloningRecipeExtender.java index 375ffb6a..d55fafc2 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/recipe/MapCloningRecipeExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/recipe/MapCloningRecipeExtender.java @@ -4,6 +4,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.recipe.MapCloningRecipe; +import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; @@ -12,7 +13,10 @@ @Mixin(MapCloningRecipe.class) public class MapCloningRecipeExtender { @Redirect( - method = { "matches(Lnet/minecraft/inventory/RecipeInputInventory;Lnet/minecraft/world/World;)Z", "craft(Lnet/minecraft/inventory/RecipeInputInventory;Lnet/minecraft/registry/RegistryWrapper$WrapperLookup;)Lnet/minecraft/item/ItemStack;" }, + method = { + "matches(Lnet/minecraft/recipe/input/CraftingRecipeInput;Lnet/minecraft/world/World;)Z", + "craft(Lnet/minecraft/recipe/input/CraftingRecipeInput;Lnet/minecraft/registry/RegistryWrapper$WrapperLookup;)Lnet/minecraft/item/ItemStack;" + }, at = @At( value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;isOf(Lnet/minecraft/item/Item;)Z", @@ -21,7 +25,8 @@ public class MapCloningRecipeExtender { slice = @Slice( from = @At( value = "FIELD", - target = "Lnet/minecraft/item/Items;FILLED_MAP:Lnet/minecraft/item/Item;" + target = "Lnet/minecraft/item/Items;FILLED_MAP:Lnet/minecraft/item/Item;", + opcode = Opcodes.GETSTATIC ) ) ) @@ -30,7 +35,10 @@ private boolean isOfForFilledMapUseRegistryKeyCheck(ItemStack instance, Item ite } @Redirect( - method = { "matches(Lnet/minecraft/inventory/RecipeInputInventory;Lnet/minecraft/world/World;)Z", "craft(Lnet/minecraft/inventory/RecipeInputInventory;Lnet/minecraft/registry/RegistryWrapper$WrapperLookup;)Lnet/minecraft/item/ItemStack;" }, + method = { + "matches(Lnet/minecraft/recipe/input/CraftingRecipeInput;Lnet/minecraft/world/World;)Z", + "craft(Lnet/minecraft/recipe/input/CraftingRecipeInput;Lnet/minecraft/registry/RegistryWrapper$WrapperLookup;)Lnet/minecraft/item/ItemStack;" + }, at = @At( value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;isOf(Lnet/minecraft/item/Item;)Z", @@ -39,7 +47,8 @@ private boolean isOfForFilledMapUseRegistryKeyCheck(ItemStack instance, Item ite slice = @Slice( from = @At( value = "FIELD", - target = "Lnet/minecraft/item/Items;MAP:Lnet/minecraft/item/Item;" + target = "Lnet/minecraft/item/Items;MAP:Lnet/minecraft/item/Item;", + opcode = Opcodes.GETSTATIC ) ) ) diff --git a/src/main/java/net/errorcraft/itematic/mixin/recipe/MapExtendingRecipeExtender.java b/src/main/java/net/errorcraft/itematic/mixin/recipe/MapExtendingRecipeExtender.java index 8797e959..8bbbf4cc 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/recipe/MapExtendingRecipeExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/recipe/MapExtendingRecipeExtender.java @@ -2,12 +2,12 @@ import net.errorcraft.itematic.item.ItemKeys; import net.errorcraft.itematic.item.component.ItemComponentTypes; -import net.minecraft.inventory.RecipeInputInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; import net.minecraft.recipe.MapExtendingRecipe; import net.minecraft.recipe.ShapedRecipe; +import net.minecraft.recipe.input.CraftingRecipeInput; import net.minecraft.world.World; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; @@ -31,19 +31,20 @@ private static ItemStack newItemStackForMapReturnEmptyStack(ItemConvertible item } @Redirect( - method = "matches(Lnet/minecraft/inventory/RecipeInputInventory;Lnet/minecraft/world/World;)Z", + method = "matches(Lnet/minecraft/recipe/input/CraftingRecipeInput;Lnet/minecraft/world/World;)Z", at = @At( value = "INVOKE", - target = "Lnet/minecraft/recipe/ShapedRecipe;matches(Lnet/minecraft/inventory/RecipeInputInventory;Lnet/minecraft/world/World;)Z" + target = "Lnet/minecraft/recipe/ShapedRecipe;matches(Lnet/minecraft/recipe/input/CraftingRecipeInput;Lnet/minecraft/world/World;)Z" ) ) - private boolean matchesUseRegistryKeyCheck(ShapedRecipe instance, RecipeInputInventory recipeInputInventory, World world) { - for (int i = 0; i < recipeInputInventory.size(); ++i) { - ItemStack stack = recipeInputInventory.getStack(i); + private boolean matchesUseRegistryKeyCheck(ShapedRecipe instance, CraftingRecipeInput input, World world) { + for (int i = 0; i < input.getStackCount(); ++i) { + ItemStack stack = input.getStackInSlot(i); if (!isValid(stack, i)) { return false; } } + return true; } @@ -63,6 +64,7 @@ private static boolean isValid(ItemStack stack, int index) { if (index == MAP_SLOT) { return stack.itematic$hasComponent(ItemComponentTypes.MAP_HOLDER); } + return stack.itematic$isOf(ItemKeys.PAPER); } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/recipe/RepairItemRecipeExtender.java b/src/main/java/net/errorcraft/itematic/mixin/recipe/RepairItemRecipeExtender.java index 7e746e7e..7f6b026b 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/recipe/RepairItemRecipeExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/recipe/RepairItemRecipeExtender.java @@ -11,7 +11,7 @@ @Mixin(RepairItemRecipe.class) public class RepairItemRecipeExtender { @Redirect( - method = "craft(Lnet/minecraft/inventory/RecipeInputInventory;Lnet/minecraft/registry/RegistryWrapper$WrapperLookup;)Lnet/minecraft/item/ItemStack;", + method = "craft(Lnet/minecraft/recipe/input/CraftingRecipeInput;Lnet/minecraft/registry/RegistryWrapper$WrapperLookup;)Lnet/minecraft/item/ItemStack;", at = @At( value = "NEW", target = "(Lnet/minecraft/item/ItemConvertible;)Lnet/minecraft/item/ItemStack;" diff --git a/src/main/java/net/errorcraft/itematic/mixin/recipe/ShieldDecorationRecipeExtender.java b/src/main/java/net/errorcraft/itematic/mixin/recipe/ShieldDecorationRecipeExtender.java index 4f7b708c..4bfe7817 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/recipe/ShieldDecorationRecipeExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/recipe/ShieldDecorationRecipeExtender.java @@ -16,7 +16,10 @@ @Mixin(ShieldDecorationRecipe.class) public class ShieldDecorationRecipeExtender { @Redirect( - method = { "matches(Lnet/minecraft/inventory/RecipeInputInventory;Lnet/minecraft/world/World;)Z", "craft(Lnet/minecraft/inventory/RecipeInputInventory;Lnet/minecraft/registry/RegistryWrapper$WrapperLookup;)Lnet/minecraft/item/ItemStack;" }, + method = { + "matches(Lnet/minecraft/recipe/input/CraftingRecipeInput;Lnet/minecraft/world/World;)Z", + "craft(Lnet/minecraft/recipe/input/CraftingRecipeInput;Lnet/minecraft/registry/RegistryWrapper$WrapperLookup;)Lnet/minecraft/item/ItemStack;" + }, at = @At( value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;isOf(Lnet/minecraft/item/Item;)Z" @@ -27,7 +30,10 @@ private boolean isOfForShieldUseRegistryKeyCheck(ItemStack instance, Item item) } @ModifyConstant( - method = { "matches(Lnet/minecraft/inventory/RecipeInputInventory;Lnet/minecraft/world/World;)Z", "craft(Lnet/minecraft/inventory/RecipeInputInventory;Lnet/minecraft/registry/RegistryWrapper$WrapperLookup;)Lnet/minecraft/item/ItemStack;" }, + method = { + "matches(Lnet/minecraft/recipe/input/CraftingRecipeInput;Lnet/minecraft/world/World;)Z", + "craft(Lnet/minecraft/recipe/input/CraftingRecipeInput;Lnet/minecraft/registry/RegistryWrapper$WrapperLookup;)Lnet/minecraft/item/ItemStack;" + }, constant = @Constant( classValue = BannerItem.class, ordinal = 0 @@ -40,7 +46,7 @@ private boolean instanceOfBannerItemUseItemComponent(Object reference, Class") + static RegistryLoader.Entry create(RegistryKey> registryKey, Codec codec) { + throw new AssertionError(); + } + } +} diff --git a/src/main/java/net/errorcraft/itematic/mixin/registry/RegistryLoaderExtender.java b/src/main/java/net/errorcraft/itematic/mixin/registry/RegistryLoaderExtender.java index a519059f..9b43815b 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/registry/RegistryLoaderExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/registry/RegistryLoaderExtender.java @@ -3,6 +3,7 @@ import com.google.common.collect.ImmutableList; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.sugar.Local; +import com.mojang.serialization.Codec; import net.errorcraft.itematic.item.ItemUtil; import net.errorcraft.itematic.item.armor.ArmorMaterial; import net.errorcraft.itematic.item.dispense.behavior.DispenseBehavior; @@ -17,6 +18,7 @@ import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.RegistryLoader; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Coerce; import org.spongepowered.asm.mixin.injection.Inject; @@ -37,13 +39,13 @@ public class RegistryLoaderExtender { private static List> addCustomEntries(List> original) { return new ImmutableList.Builder>() .addAll(original) - .add(new RegistryLoader.Entry<>(RegistryKeys.ITEM, ItemUtil.CODEC)) - .add(new RegistryLoader.Entry<>(ItematicRegistryKeys.ARMOR_MATERIAL, ArmorMaterial.CODEC)) - .add(new RegistryLoader.Entry<>(ItematicRegistryKeys.ITEM_GROUP_ENTRY_PROVIDER, ItemGroupEntryProvider.CODEC)) - .add(new RegistryLoader.Entry<>(ItematicRegistryKeys.TRADE, Trade.CODEC)) - .add(new RegistryLoader.Entry<>(ItematicRegistryKeys.ACTION, ActionEntry.CODEC)) - .add(new RegistryLoader.Entry<>(ItematicRegistryKeys.SMITHING_TEMPLATE, SmithingTemplate.CODEC)) - .add(new RegistryLoader.Entry<>(ItematicRegistryKeys.DISPENSE_BEHAVIOR, DispenseBehavior.CODEC)) + .add(createEntry(RegistryKeys.ITEM, ItemUtil.CODEC)) + .add(createEntry(ItematicRegistryKeys.ARMOR_MATERIAL, ArmorMaterial.CODEC)) + .add(createEntry(ItematicRegistryKeys.ITEM_GROUP_ENTRY_PROVIDER, ItemGroupEntryProvider.CODEC)) + .add(createEntry(ItematicRegistryKeys.TRADE, Trade.CODEC)) + .add(createEntry(ItematicRegistryKeys.ACTION, ActionEntry.CODEC)) + .add(createEntry(ItematicRegistryKeys.SMITHING_TEMPLATE, SmithingTemplate.CODEC)) + .add(createEntry(ItematicRegistryKeys.DISPENSE_BEHAVIOR, DispenseBehavior.CODEC)) .build(); } @@ -51,19 +53,19 @@ private static List> addCustomEntries(List> addCustomNetworkEntries(List> original) { return new ImmutableList.Builder>() .addAll(original) - .add(new RegistryLoader.Entry<>(RegistryKeys.ITEM, ItemUtil.CODEC)) - .add(new RegistryLoader.Entry<>(ItematicRegistryKeys.ARMOR_MATERIAL, ArmorMaterial.CODEC)) - .add(new RegistryLoader.Entry<>(ItematicRegistryKeys.ITEM_GROUP_ENTRY_PROVIDER, ItemGroupEntryProvider.CODEC)) - .add(new RegistryLoader.Entry<>(ItematicRegistryKeys.TRADE, Trade.CODEC)) - .add(new RegistryLoader.Entry<>(ItematicRegistryKeys.ACTION, ActionEntry.CODEC)) - .add(new RegistryLoader.Entry<>(ItematicRegistryKeys.SMITHING_TEMPLATE, SmithingTemplate.CODEC)) - .add(new RegistryLoader.Entry<>(ItematicRegistryKeys.DISPENSE_BEHAVIOR, DispenseBehavior.CODEC)) + .add(createEntry(RegistryKeys.ITEM, ItemUtil.CODEC)) + .add(createEntry(ItematicRegistryKeys.ARMOR_MATERIAL, ArmorMaterial.CODEC)) + .add(createEntry(ItematicRegistryKeys.ITEM_GROUP_ENTRY_PROVIDER, ItemGroupEntryProvider.CODEC)) + .add(createEntry(ItematicRegistryKeys.TRADE, Trade.CODEC)) + .add(createEntry(ItematicRegistryKeys.ACTION, ActionEntry.CODEC)) + .add(createEntry(ItematicRegistryKeys.SMITHING_TEMPLATE, SmithingTemplate.CODEC)) + .add(createEntry(ItematicRegistryKeys.DISPENSE_BEHAVIOR, DispenseBehavior.CODEC)) .build(); } @@ -82,4 +84,9 @@ private static void postValidateRegistry(Map, Exception> exceptio validator.validate(exceptions); } } + + @Unique + private static RegistryLoader.Entry createEntry(RegistryKey> registry, Codec codec) { + return RegistryLoaderAccessor.EntryAccessor.create(registry, codec); + } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/screen/AnvilScreenHandlerExtender.java b/src/main/java/net/errorcraft/itematic/mixin/screen/AnvilScreenHandlerExtender.java index b6407413..c987ae38 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/screen/AnvilScreenHandlerExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/screen/AnvilScreenHandlerExtender.java @@ -50,7 +50,7 @@ private boolean isDamageableAlwaysTrue(ItemStack instance) { ) ) ) - private boolean isOfForEnchantedBookUseComponentCheck(ItemStack instance, Item item) { + private boolean isOfForEnchantedBookUseItemComponentCheck(ItemStack instance, Item item) { return instance.itematic$hasComponent(ItemComponentTypes.ENCHANTMENT_HOLDER); } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/screen/EnchantmentScreenHandlerExtender.java b/src/main/java/net/errorcraft/itematic/mixin/screen/EnchantmentScreenHandlerExtender.java index 7fc82cae..ceb0109e 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/screen/EnchantmentScreenHandlerExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/screen/EnchantmentScreenHandlerExtender.java @@ -26,10 +26,10 @@ public class EnchantmentScreenHandlerExtender { ) ) private boolean isOfForBookUseItemComponent(ItemStack instance, Item item, @Share("transformsInto") LocalRef> transformsInto) { - Optional> optionalEntry = instance.itematic$getComponent(ItemComponentTypes.ENCHANTABLE) + Optional> optionalItem = instance.itematic$getComponent(ItemComponentTypes.ENCHANTABLE) .flatMap(EnchantableItemComponent::transformsInto); - optionalEntry.ifPresent(transformsInto::set); - return optionalEntry.isPresent(); + optionalItem.ifPresent(transformsInto::set); + return optionalItem.isPresent(); } @Redirect( diff --git a/src/main/java/net/errorcraft/itematic/mixin/screen/GrindstoneScreenHandlerExtender.java b/src/main/java/net/errorcraft/itematic/mixin/screen/GrindstoneScreenHandlerExtender.java index ea8c7751..ff2420fc 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/screen/GrindstoneScreenHandlerExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/screen/GrindstoneScreenHandlerExtender.java @@ -25,10 +25,10 @@ public class GrindstoneScreenHandlerExtender { ) ) private boolean isOfForEnchantedBookUseItemComponent(ItemStack instance, Item item, @Share("transformsInto") LocalRef> transformsInto) { - Optional> optionalEntry = instance.itematic$getComponent(ItemComponentTypes.ENCHANTMENT_HOLDER) + Optional> optionalItem = instance.itematic$getComponent(ItemComponentTypes.ENCHANTMENT_HOLDER) .map(EnchantmentHolderItemComponent::grindingTransformsInto); - optionalEntry.ifPresent(transformsInto::set); - return optionalEntry.isPresent(); + optionalItem.ifPresent(transformsInto::set); + return optionalItem.isPresent(); } @Redirect( @@ -42,7 +42,10 @@ private ItemStack copyComponentsToNewStackForBookUseItemComponent(ItemStack inst return instance.itematic$copyComponentsToNewStack(transformsInto.get(), count); } - @Mixin(targets = { "net/minecraft/screen/GrindstoneScreenHandler$2", "net/minecraft/screen/GrindstoneScreenHandler$3" }) + @Mixin(targets = { + "net/minecraft/screen/GrindstoneScreenHandler$2", + "net/minecraft/screen/GrindstoneScreenHandler$3" + }) public static class EnchantedItemSlotExtender { @Redirect( method = "canInsert", diff --git a/src/main/java/net/errorcraft/itematic/mixin/server/ServerPlayerInteractionManagerExtender.java b/src/main/java/net/errorcraft/itematic/mixin/server/ServerPlayerInteractionManagerExtender.java index 57424e6d..97a9f034 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/server/ServerPlayerInteractionManagerExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/server/ServerPlayerInteractionManagerExtender.java @@ -3,7 +3,6 @@ import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.network.ServerPlayerInteractionManager; import net.minecraft.util.math.BlockPos; @@ -30,15 +29,4 @@ public class ServerPlayerInteractionManagerExtender { private boolean tryBreakBlockCanMineUseItemStackVersion(Item instance, BlockState state, World world, BlockPos pos, PlayerEntity miner) { return this.player.getMainHandStack().itematic$canMine(state, world, pos, miner); } - - @Redirect( - method = "interactItem", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/item/ItemStack;getMaxUseTime()I" - ) - ) - private int getMaxUseTimeUseCustomImplementation(ItemStack instance) { - return instance.itematic$useDuration(this.player); - } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/village/TradeOffersExtender.java b/src/main/java/net/errorcraft/itematic/mixin/village/TradeOffersExtender.java index ff4b6f41..a0d5f031 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/village/TradeOffersExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/village/TradeOffersExtender.java @@ -1,6 +1,5 @@ package net.errorcraft.itematic.mixin.village; -import net.minecraft.enchantment.Enchantment; import net.minecraft.item.Item; import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; @@ -14,7 +13,7 @@ @Mixin(TradeOffers.class) public class TradeOffersExtender { @Redirect( - method = { "method_16929", "enchant" }, + method = "method_16929", at = @At( value = "NEW", target = "(Lnet/minecraft/item/ItemConvertible;)Lnet/minecraft/item/ItemStack;" @@ -35,19 +34,16 @@ private static ItemStack createStackForPotionReturnEmptyStack(Item item, Registr return ItemStack.EMPTY; } - @Redirect( - method = "enchant", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/item/ItemStack;addEnchantment(Lnet/minecraft/enchantment/Enchantment;I)V" - ) - ) - private static void doNotAddEnchantment(ItemStack instance, Enchantment enchantment, int level) {} - @Mixin(TradeOffers.SellItemFactory.class) public static class SellItemFactoryExtender { @Redirect( - method = { "(Lnet/minecraft/block/Block;IIII)V", "(Lnet/minecraft/item/Item;III)V", "(Lnet/minecraft/item/Item;IIII)V", "(Lnet/minecraft/item/Item;IIIIF)V" }, + method = { + "(Lnet/minecraft/block/Block;IIII)V", + "(Lnet/minecraft/item/Item;III)V", + "(Lnet/minecraft/item/Item;IIII)V", + "(Lnet/minecraft/item/Item;IIIIF)V", + "(Lnet/minecraft/item/Item;IIIIFLnet/minecraft/registry/RegistryKey;)V" + }, at = @At( value = "NEW", target = "(Lnet/minecraft/item/ItemConvertible;)Lnet/minecraft/item/ItemStack;" @@ -70,6 +66,17 @@ public static class ProcessItemFactoryExtender { private static ItemStack newItemStackReturnEmptyStack(ItemConvertible item) { return ItemStack.EMPTY; } + + @Redirect( + method = "(Lnet/minecraft/item/ItemConvertible;IILnet/minecraft/item/ItemConvertible;IIIFLnet/minecraft/registry/RegistryKey;)V", + at = @At( + value = "NEW", + target = "(Lnet/minecraft/item/ItemConvertible;I)Lnet/minecraft/item/ItemStack;" + ) + ) + private static ItemStack newItemStackReturnEmptyStack(ItemConvertible item, int count) { + return ItemStack.EMPTY; + } } @Mixin(TradeOffers.SellEnchantedToolFactory.class) diff --git a/src/main/java/net/errorcraft/itematic/network/packet/s2c/play/TwirlS2CPacket.java b/src/main/java/net/errorcraft/itematic/network/packet/s2c/play/TwirlS2CPacket.java index 5255f74d..519adbfc 100644 --- a/src/main/java/net/errorcraft/itematic/network/packet/s2c/play/TwirlS2CPacket.java +++ b/src/main/java/net/errorcraft/itematic/network/packet/s2c/play/TwirlS2CPacket.java @@ -8,9 +8,9 @@ import net.minecraft.network.packet.Packet; import net.minecraft.network.packet.PacketType; -public record TwirlS2CPacket(int riptideLevel) implements Packet { +public record TwirlS2CPacket(float spinAttackStrength) implements Packet { public static final PacketCodec CODEC = PacketCodec.tuple( - PacketCodecs.VAR_INT, TwirlS2CPacket::riptideLevel, + PacketCodecs.FLOAT, TwirlS2CPacket::spinAttackStrength, TwirlS2CPacket::new ); diff --git a/src/main/java/net/errorcraft/itematic/predicate/item/ItemPredicateExtraFields.java b/src/main/java/net/errorcraft/itematic/predicate/item/ItemPredicateExtraFields.java index 9aa7cc73..f68b28e4 100644 --- a/src/main/java/net/errorcraft/itematic/predicate/item/ItemPredicateExtraFields.java +++ b/src/main/java/net/errorcraft/itematic/predicate/item/ItemPredicateExtraFields.java @@ -7,7 +7,7 @@ import net.errorcraft.itematic.registry.ItematicRegistries; import net.errorcraft.itematic.registry.ItematicRegistryKeys; import net.errorcraft.itematic.serialization.ItematicCodecs; -import net.minecraft.component.DataComponentType; +import net.minecraft.component.ComponentType; import net.minecraft.item.ItemStack; import net.minecraft.network.RegistryByteBuf; import net.minecraft.network.codec.PacketCodec; @@ -18,7 +18,7 @@ import java.util.Optional; import java.util.Set; -public record ItemPredicateExtraFields(Optional>> behavior, Optional>> dataComponents) { +public record ItemPredicateExtraFields(Optional>> behavior, Optional>> dataComponents) { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( ItematicCodecs.setCodec(ItematicRegistries.ITEM_COMPONENT_TYPE.getCodec()).optionalFieldOf("behavior").forGetter(ItemPredicateExtraFields::behavior), ItematicCodecs.setCodec(Registries.DATA_COMPONENT_TYPE.getCodec()).optionalFieldOf("data_components").forGetter(ItemPredicateExtraFields::dataComponents) @@ -29,7 +29,7 @@ public record ItemPredicateExtraFields(Optional>> behav ItemPredicateExtraFields::new ); - public static ItemPredicateExtraFields of(Set> behavior, Set> dataComponents) { + public static ItemPredicateExtraFields of(Set> behavior, Set> dataComponents) { return new ItemPredicateExtraFields( behavior.isEmpty() ? Optional.empty() : Optional.of(behavior), dataComponents.isEmpty() ? Optional.empty() : Optional.of(dataComponents) @@ -59,11 +59,13 @@ private boolean testDataComponents(ItemStack stack) { if (this.dataComponents.isEmpty()) { return true; } - for (DataComponentType type : this.dataComponents.get()) { + + for (ComponentType type : this.dataComponents.get()) { if (!stack.contains(type)) { return false; } } + return true; } } diff --git a/src/main/java/net/errorcraft/itematic/recipe/ItemColoringRecipe.java b/src/main/java/net/errorcraft/itematic/recipe/ItemColoringRecipe.java index f51042bf..ea15cb10 100644 --- a/src/main/java/net/errorcraft/itematic/recipe/ItemColoringRecipe.java +++ b/src/main/java/net/errorcraft/itematic/recipe/ItemColoringRecipe.java @@ -5,7 +5,6 @@ import net.errorcraft.itematic.item.component.ItemComponentTypes; import net.errorcraft.itematic.item.component.components.DyeItemComponent; import net.errorcraft.itematic.network.codec.PacketCodecUtil; -import net.minecraft.inventory.RecipeInputInventory; import net.minecraft.item.ItemStack; import net.minecraft.network.RegistryByteBuf; import net.minecraft.network.codec.PacketCodec; @@ -13,6 +12,7 @@ import net.minecraft.recipe.Ingredient; import net.minecraft.recipe.RecipeSerializer; import net.minecraft.recipe.book.CraftingRecipeCategory; +import net.minecraft.recipe.input.CraftingRecipeInput; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.RegistryWrapper; import net.minecraft.registry.entry.RegistryFixedCodec; @@ -27,42 +27,50 @@ public CraftingRecipeCategory getCategory() { } @Override - public boolean matches(RecipeInputInventory inventory, World world) { + public boolean matches(CraftingRecipeInput input, World world) { boolean foundIngredient = false; boolean foundColor = false; - for (int i = 0; i < inventory.size(); i++) { - ItemStack stack = inventory.getStack(i); + for (int i = 0; i < input.getSize(); i++) { + ItemStack stack = input.getStackInSlot(i); if (stack.isEmpty()) { continue; } + if (this.ingredient.test(stack)) { if (foundIngredient) { return false; } + foundIngredient = true; continue; } + if (this.isExpectedColor(stack)) { if (foundColor) { return false; } + foundColor = true; continue; } + return false; } + return foundIngredient && foundColor; } @Override - public ItemStack craft(RecipeInputInventory inventory, RegistryWrapper.WrapperLookup lookup) { - for (int i = 0; i < inventory.size(); i++) { - ItemStack stack = inventory.getStack(i); + public ItemStack craft(CraftingRecipeInput input, RegistryWrapper.WrapperLookup lookup) { + for (int i = 0; i < input.getSize(); i++) { + ItemStack stack = input.getStackInSlot(i); if (!this.ingredient.test(stack)) { continue; } + return stack.itematic$copyComponentsToNewStack(this.result.getRegistryEntry(), 1); } + return ItemStack.EMPTY; } diff --git a/src/main/java/net/errorcraft/itematic/registry/ItematicRegistries.java b/src/main/java/net/errorcraft/itematic/registry/ItematicRegistries.java index 15390905..9408b77f 100644 --- a/src/main/java/net/errorcraft/itematic/registry/ItematicRegistries.java +++ b/src/main/java/net/errorcraft/itematic/registry/ItematicRegistries.java @@ -14,6 +14,8 @@ import net.errorcraft.itematic.item.placement.block.picker.BlockPickerTypes; import net.errorcraft.itematic.item.pointer.Pointer; import net.errorcraft.itematic.item.pointer.Pointers; +import net.errorcraft.itematic.item.shooter.method.ShooterMethodType; +import net.errorcraft.itematic.item.shooter.method.ShooterMethodTypes; import net.errorcraft.itematic.item.smithing.template.SmithingTemplateType; import net.errorcraft.itematic.item.smithing.template.SmithingTemplateTypes; import net.errorcraft.itematic.item.use.provider.IntegerProviderType; @@ -40,6 +42,7 @@ public class ItematicRegistries { public static final Registry> TRADE_MODIFIER_TYPE = RegistriesAccessor.create(ItematicRegistryKeys.TRADE_MODIFIER_TYPE, r -> TradeModifierTypes.ENCHANT_WITH_LEVELS); public static final Registry> INTEGER_PROVIDER_TYPE = RegistriesAccessor.create(ItematicRegistryKeys.INTEGER_PROVIDER_TYPE, r -> IntegerProviderTypes.CONSTANT); public static final Registry> ITEM_HOLDER_RULE_TYPE = RegistriesAccessor.create(ItematicRegistryKeys.ITEM_HOLDER_RULE_TYPE, r -> ItemHolderRuleTypes.REJECT); + public static final Registry> SHOOTER_METHOD_TYPE = RegistriesAccessor.create(ItematicRegistryKeys.SHOOTER_METHOD_TYPE, r -> ShooterMethodTypes.DIRECT); private ItematicRegistries() {} } diff --git a/src/main/java/net/errorcraft/itematic/registry/ItematicRegistryKeys.java b/src/main/java/net/errorcraft/itematic/registry/ItematicRegistryKeys.java index 8e8cf228..2e0d4ee8 100644 --- a/src/main/java/net/errorcraft/itematic/registry/ItematicRegistryKeys.java +++ b/src/main/java/net/errorcraft/itematic/registry/ItematicRegistryKeys.java @@ -10,6 +10,7 @@ import net.errorcraft.itematic.item.model.override.ModelOverride; import net.errorcraft.itematic.item.placement.block.picker.BlockPickerType; import net.errorcraft.itematic.item.pointer.Pointer; +import net.errorcraft.itematic.item.shooter.method.ShooterMethodType; import net.errorcraft.itematic.item.smithing.template.SmithingTemplate; import net.errorcraft.itematic.item.smithing.template.SmithingTemplateType; import net.errorcraft.itematic.item.use.provider.IntegerProviderType; @@ -41,6 +42,7 @@ public class ItematicRegistryKeys { public static final RegistryKey>> TRADE_MODIFIER_TYPE = RegistryKey.ofRegistry(new Identifier("trade_modifier_type")); public static final RegistryKey>> INTEGER_PROVIDER_TYPE = RegistryKey.ofRegistry(new Identifier("integer_provider_type")); public static final RegistryKey>> ITEM_HOLDER_RULE_TYPE = RegistryKey.ofRegistry(new Identifier("item_holder_rule_type")); + public static final RegistryKey>> SHOOTER_METHOD_TYPE = RegistryKey.ofRegistry(new Identifier("shooter_method_type")); private ItematicRegistryKeys() {} } diff --git a/src/main/java/net/errorcraft/itematic/sound/SoundEventKeys.java b/src/main/java/net/errorcraft/itematic/sound/SoundEventKeys.java index bb117d8b..eb979f74 100644 --- a/src/main/java/net/errorcraft/itematic/sound/SoundEventKeys.java +++ b/src/main/java/net/errorcraft/itematic/sound/SoundEventKeys.java @@ -27,17 +27,15 @@ public class SoundEventKeys { public static final RegistryKey BUNDLE_DROP_CONTENTS = of("item.bundle.drop_contents"); public static final RegistryKey BUNDLE_INSERT = of("item.bundle.insert"); public static final RegistryKey BUNDLE_REMOVE_ONE = of("item.bundle.remove_one"); - public static final RegistryKey CROSSBOW_LOADING_START = of("item.crossbow.loading_start"); - public static final RegistryKey CROSSBOW_QUICK_CHARGE_1 = of("item.crossbow.quick_charge_1"); - public static final RegistryKey CROSSBOW_QUICK_CHARGE_2 = of("item.crossbow.quick_charge_2"); - public static final RegistryKey CROSSBOW_QUICK_CHARGE_3 = of("item.crossbow.quick_charge_3"); public static final RegistryKey ENDER_EYE_LAUNCH = of("entity.ender_eye.launch"); public static final RegistryKey END_PORTAL_FRAME_FILL = of("block.end_portal_frame.fill"); public static final RegistryKey FIRE_CHARGE_USE = of("item.firecharge.use"); public static final RegistryKey FIRE_EXTINGUISH = of("block.fire.extinguish"); public static final RegistryKey FLINT_AND_STEEL_USE = of("item.flintandsteel.use"); + public static final RegistryKey GENERIC_DRINK = of("entity.generic.drink"); public static final RegistryKey GENERIC_SPLASH = of("entity.generic.splash"); public static final RegistryKey HOE_TILL = of("item.hoe.till"); + public static final RegistryKey HONEY_BOTTLE_DRINK = of("item.honey_bottle.drink"); public static final RegistryKey HORSE_SADDLE = of("entity.horse.saddle"); public static final RegistryKey MUSIC_DISC_5 = of("music_disc.5"); public static final RegistryKey MUSIC_DISC_11 = of("music_disc.11"); @@ -45,16 +43,20 @@ public class SoundEventKeys { public static final RegistryKey MUSIC_DISC_BLOCKS = of("music_disc.blocks"); public static final RegistryKey MUSIC_DISC_CAT = of("music_disc.cat"); public static final RegistryKey MUSIC_DISC_CHIRP = of("music_disc.chirp"); + public static final RegistryKey MUSIC_DISC_CREATOR = of("music_disc.creator"); + public static final RegistryKey MUSIC_DISC_CREATOR_MUSIC_BOX = of("music_disc.creator_music_box"); public static final RegistryKey MUSIC_DISC_FAR = of("music_disc.far"); public static final RegistryKey MUSIC_DISC_MALL = of("music_disc.mall"); public static final RegistryKey MUSIC_DISC_MELLOHI = of("music_disc.mellohi"); public static final RegistryKey MUSIC_DISC_OTHERSIDE = of("music_disc.otherside"); public static final RegistryKey MUSIC_DISC_PIGSTEP = of("music_disc.pigstep"); + public static final RegistryKey MUSIC_DISC_PRECIPICE = of("music_disc.precipice"); public static final RegistryKey MUSIC_DISC_RELIC = of("music_disc.relic"); public static final RegistryKey MUSIC_DISC_STAL = of("music_disc.stal"); public static final RegistryKey MUSIC_DISC_STRAD = of("music_disc.strad"); public static final RegistryKey MUSIC_DISC_WAIT = of("music_disc.wait"); public static final RegistryKey MUSIC_DISC_WARD = of("music_disc.ward"); + public static final RegistryKey OMINOUS_BOTTLE_DISPOSE = of("item.ominous_bottle.dispose"); public static final RegistryKey SHOVEL_FLATTEN = of("item.shovel.flatten"); public static final RegistryKey SPYGLASS_USE = of("item.spyglass.use"); public static final RegistryKey SPYGLASS_STOP_USING = of("item.spyglass.stop_using"); diff --git a/src/main/java/net/errorcraft/itematic/village/trade/Trades.java b/src/main/java/net/errorcraft/itematic/village/trade/Trades.java index 23b44f73..a843a5b8 100644 --- a/src/main/java/net/errorcraft/itematic/village/trade/Trades.java +++ b/src/main/java/net/errorcraft/itematic/village/trade/Trades.java @@ -1,6 +1,5 @@ package net.errorcraft.itematic.village.trade; -import net.errorcraft.itematic.enchantment.EnchantmentTags; import net.errorcraft.itematic.entity.effect.StatusEffectKeys; import net.errorcraft.itematic.item.ItemKeys; import net.errorcraft.itematic.loot.function.DyeItemModifier; @@ -28,6 +27,7 @@ import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.registry.entry.RegistryEntryList; +import net.minecraft.registry.tag.EnchantmentTags; import net.minecraft.registry.tag.StructureTags; import net.minecraft.registry.tag.TagKey; import net.minecraft.text.Text; diff --git a/src/main/java/net/errorcraft/itematic/village/trade/modifier/modifiers/EnchantWithLevelsTradeModifier.java b/src/main/java/net/errorcraft/itematic/village/trade/modifier/modifiers/EnchantWithLevelsTradeModifier.java index 6c973e2c..c82cbb86 100644 --- a/src/main/java/net/errorcraft/itematic/village/trade/modifier/modifiers/EnchantWithLevelsTradeModifier.java +++ b/src/main/java/net/errorcraft/itematic/village/trade/modifier/modifiers/EnchantWithLevelsTradeModifier.java @@ -8,10 +8,15 @@ import net.errorcraft.itematic.village.trade.modifier.TradeModifier; import net.errorcraft.itematic.village.trade.modifier.TradeModifierType; import net.errorcraft.itematic.village.trade.modifier.TradeModifierTypes; +import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.item.ItemStack; import net.minecraft.loot.context.LootContext; import net.minecraft.predicate.ComponentPredicate; +import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.entry.RegistryEntryList; +import net.minecraft.registry.tag.EnchantmentTags; import net.minecraft.util.math.random.Random; import net.minecraft.village.TradedItem; @@ -37,7 +42,10 @@ public TradeModifierType type() { public Optional apply(Trade.Input wants, ItemStack gives, LootContext context) { Random random = context.getRandom(); int level = Math.max(1, this.level.get(random)); - ItemStack givesActual = EnchantmentHelper.enchant(context.getWorld().getEnabledFeatures(), random, gives, level, this.treasure); + DynamicRegistryManager registryManager = context.getWorld().getRegistryManager(); + Optional> enchantments = registryManager.get(RegistryKeys.ENCHANTMENT) + .getEntryList(EnchantmentTags.ON_TRADED_EQUIPMENT); + ItemStack givesActual = EnchantmentHelper.enchant(random, gives, level, registryManager, enchantments); wants.getStack(this.index).itematic$tryIncrement(level); return Optional.of(new TradedItem(givesActual.getRegistryEntry(), givesActual.getCount(), ComponentPredicate.of(givesActual.getComponents()))); } diff --git a/src/main/java/net/errorcraft/itematic/village/trade/modifier/modifiers/SingleEnchantmentTradeModifier.java b/src/main/java/net/errorcraft/itematic/village/trade/modifier/modifiers/SingleEnchantmentTradeModifier.java index 863d1d18..60d5abfb 100644 --- a/src/main/java/net/errorcraft/itematic/village/trade/modifier/modifiers/SingleEnchantmentTradeModifier.java +++ b/src/main/java/net/errorcraft/itematic/village/trade/modifier/modifiers/SingleEnchantmentTradeModifier.java @@ -14,7 +14,9 @@ import net.minecraft.predicate.ComponentPredicate; import net.minecraft.registry.RegistryCodecs; import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.registry.entry.RegistryEntryList; +import net.minecraft.registry.tag.EnchantmentTags; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.random.Random; import net.minecraft.village.TradedItem; @@ -30,7 +32,6 @@ public record SingleEnchantmentTradeModifier(int index, int baseRandomCost, int RegistryCodecs.entryList(RegistryKeys.ENCHANTMENT).fieldOf("enchantments").forGetter(SingleEnchantmentTradeModifier::enchantments), Range.INT_CODEC.fieldOf("levels").forGetter(SingleEnchantmentTradeModifier::levels) ).apply(instance, SingleEnchantmentTradeModifier::new)); - private static final int TREASURE_BONUS_FACTOR = 2; public static SingleEnchantmentTradeModifier of(int index, int baseRandomCost, int perLevelRandomCost, int perLevelCost, RegistryEntryList enchantments) { return new SingleEnchantmentTradeModifier(index, baseRandomCost, perLevelRandomCost, perLevelCost, enchantments, Range.IntegerRange.atLeast(1)); @@ -45,20 +46,21 @@ public TradeModifierType type() { public Optional apply(Trade.Input wants, ItemStack gives, LootContext context) { Random random = context.getRandom(); this.enchantments.getRandom(random) - .ifPresent(entry -> this.apply(wants.getStack(this.index), gives, random, entry.value())); + .ifPresent(entry -> this.apply(wants.getStack(this.index), gives, random, entry)); return Optional.of(new TradedItem(gives.getRegistryEntry(), gives.getCount(), ComponentPredicate.of(gives.getComponents()))); } - private void apply(ItemStack wants, ItemStack gives, Random random, Enchantment enchantment) { - int minLevel = Math.max(enchantment.getMinLevel(), this.levels.min()); - int maxLevel = Math.min(enchantment.getMaxLevel(), this.levels.max()); + private void apply(ItemStack wants, ItemStack gives, Random random, RegistryEntry enchantment) { + int minLevel = Math.max(enchantment.value().getMinLevel(), this.levels.min()); + int maxLevel = Math.min(enchantment.value().getMaxLevel(), this.levels.max()); int level = MathHelper.nextInt(random, minLevel, maxLevel); gives.addEnchantment(enchantment, level); int count = random.nextInt(this.baseRandomCost + level * this.perLevelRandomCost) + level * this.perLevelCost; - if (enchantment.isTreasure()) { - count *= TREASURE_BONUS_FACTOR; + if (enchantment.isIn(EnchantmentTags.DOUBLE_TRADE_PRICE)) { + count *= 2; } + wants.itematic$tryIncrement(count); } } diff --git a/src/main/java/net/errorcraft/itematic/world/action/ActionRequirements.java b/src/main/java/net/errorcraft/itematic/world/action/ActionRequirements.java index 0d89480b..2458e382 100644 --- a/src/main/java/net/errorcraft/itematic/world/action/ActionRequirements.java +++ b/src/main/java/net/errorcraft/itematic/world/action/ActionRequirements.java @@ -5,13 +5,12 @@ import net.errorcraft.itematic.world.action.context.ActionContext; import net.errorcraft.itematic.world.action.context.parameter.ActionContextParameters; import net.minecraft.loot.condition.LootCondition; -import net.minecraft.loot.condition.LootConditionTypes; import net.minecraft.loot.context.LootContext; public record ActionRequirements(ActionContextParameters context, LootCondition conditions) { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( ActionContextParameters.CODEC.fieldOf("context").forGetter(ActionRequirements::context), - LootConditionTypes.CODEC.fieldOf("conditions").forGetter(ActionRequirements::conditions) + LootCondition.CODEC.fieldOf("conditions").forGetter(ActionRequirements::conditions) ).apply(instance, ActionRequirements::new)); public boolean test(ActionContext context) { diff --git a/src/main/java/net/errorcraft/itematic/world/action/actions/PlaySoundAction.java b/src/main/java/net/errorcraft/itematic/world/action/actions/PlaySoundAction.java index 3d0295b8..9f5de0c3 100644 --- a/src/main/java/net/errorcraft/itematic/world/action/actions/PlaySoundAction.java +++ b/src/main/java/net/errorcraft/itematic/world/action/actions/PlaySoundAction.java @@ -9,6 +9,7 @@ import net.errorcraft.itematic.world.action.ActionTypes; import net.errorcraft.itematic.world.action.context.ActionContext; import net.errorcraft.itematic.world.action.context.parameter.ActionContextParameter; +import net.minecraft.entity.Entity; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.server.world.ServerWorld; import net.minecraft.sound.SoundCategory; @@ -17,11 +18,13 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.random.Random; -public record PlaySoundAction(ActionContextParameter position, RegistryEntry sound, SoundCategory category, Range.FloatRange volume, Range.FloatRange pitch, boolean fromEntity) implements Action { +import java.util.Optional; + +public record PlaySoundAction(ActionContextParameter position, RegistryEntry sound, Optional category, Range.FloatRange volume, Range.FloatRange pitch, boolean fromEntity) implements Action { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( ActionContextParameter.CODEC.fieldOf("position").forGetter(PlaySoundAction::position), SoundEvent.ENTRY_CODEC.fieldOf("sound").forGetter(PlaySoundAction::sound), - StringIdentifiable.createCodec(SoundCategory::values).fieldOf("category").forGetter(PlaySoundAction::category), + StringIdentifiable.createCodec(SoundCategory::values).optionalFieldOf("category").forGetter(PlaySoundAction::category), Range.FLOAT_CODEC.fieldOf("volume").forGetter(PlaySoundAction::volume), Range.FLOAT_CODEC.fieldOf("pitch").forGetter(PlaySoundAction::pitch), Codec.BOOL.optionalFieldOf("from_entity", false).forGetter(PlaySoundAction::fromEntity) @@ -31,12 +34,16 @@ public static Builder builder(ActionContextParameter position, RegistryEntry sound) { + return new PlaySoundAction(position, sound, Optional.empty(), Range.FloatRange.of(1.0f), Range.FloatRange.of(1.0f), false); + } + public static PlaySoundAction of(ActionContextParameter position, RegistryEntry sound, SoundCategory category) { - return new PlaySoundAction(position, sound, category, Range.FloatRange.of(1.0f), Range.FloatRange.of(1.0f), false); + return new PlaySoundAction(position, sound, Optional.of(category), Range.FloatRange.of(1.0f), Range.FloatRange.of(1.0f), false); } public static PlaySoundAction of(ActionContextParameter position, RegistryEntry sound, SoundCategory category, float volume, float pitch) { - return new PlaySoundAction(position, sound, category, Range.FloatRange.of(volume), Range.FloatRange.of(pitch), false); + return new PlaySoundAction(position, sound, Optional.of(category), Range.FloatRange.of(volume), Range.FloatRange.of(pitch), false); } @Override @@ -46,30 +53,44 @@ public ActionType type() { @Override public boolean execute(ActionContext context) { + SoundCategory category = this.category(context.entity(ActionContextParameter.THIS).orElse(null)); + if (category == null) { + return false; + } + ServerWorld world = context.world(); Random random = world.getRandom(); float volume = this.volume.get(random); float pitch = this.pitch.get(random); - long seed = world.getRandom().nextLong(); - context.player(ActionContextParameter.THIS) - .filter(player -> this.fromEntity) + long seed = random.nextLong(); + context.entity(ActionContextParameter.THIS) + .filter(entity -> this.fromEntity) .ifPresentOrElse( - player -> world.playSoundFromEntity(null, player, this.sound, this.category, volume, pitch, seed), + entity -> world.playSoundFromEntity(null, entity, this.sound, category, volume, pitch, seed), () -> { Vec3d pos = context.position(this.position); - world.playSound(null, pos.getX(), pos.getY(), pos.getZ(), this.sound, this.category, volume, pitch, seed); + world.playSound(null, pos.getX(), pos.getY(), pos.getZ(), this.sound, category, volume, pitch, seed); } ); return true; } + private SoundCategory category(Entity entity) { + return this.category.orElseGet(() -> { + if (entity == null) { + return null; + } + + return entity.getSoundCategory(); + }); + } + public static class Builder { private final ActionContextParameter position; private final RegistryEntry sound; private final SoundCategory category; private Range.FloatRange volume = Range.FloatRange.of(1.0f); private Range.FloatRange pitch = Range.FloatRange.of(1.0f); - private boolean fromEntity = false; private Builder(ActionContextParameter position, RegistryEntry sound, SoundCategory category) { this.position = position; @@ -78,7 +99,7 @@ private Builder(ActionContextParameter position, RegistryEntry sound } public PlaySoundAction build() { - return new PlaySoundAction(this.position, this.sound, this.category, this.volume, this.pitch, this.fromEntity); + return new PlaySoundAction(this.position, this.sound, Optional.of(this.category), this.volume, this.pitch, false); } public Builder volume(float volume) { @@ -100,10 +121,5 @@ public Builder pitch(float min, float max) { this.pitch = Range.FloatRange.of(min, max); return this; } - - public Builder fromEntity() { - this.fromEntity = true; - return this; - } } } diff --git a/src/main/java/net/errorcraft/itematic/world/action/actions/TwirlPlayerAction.java b/src/main/java/net/errorcraft/itematic/world/action/actions/TwirlPlayerAction.java index c8953d24..2b0deb12 100644 --- a/src/main/java/net/errorcraft/itematic/world/action/actions/TwirlPlayerAction.java +++ b/src/main/java/net/errorcraft/itematic/world/action/actions/TwirlPlayerAction.java @@ -7,9 +7,13 @@ import net.errorcraft.itematic.world.action.ActionTypes; import net.errorcraft.itematic.world.action.context.ActionContext; import net.errorcraft.itematic.world.action.context.parameter.ActionContextParameter; +import net.minecraft.component.EnchantmentEffectComponentTypes; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.MovementType; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.TridentItem; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvent; @@ -32,37 +36,35 @@ public boolean execute(ActionContext context) { if (player == null) { return false; } - int riptideLevel = EnchantmentHelper.getRiptide(context.stack()); + + float spinAttackStrength = EnchantmentHelper.getTridentSpinAttackStrength(context.world(), context.stack(), player); + if (spinAttackStrength <= 0.0f) { + return false; + } + if (player instanceof ServerPlayerEntity serverPlayer) { - serverPlayer.networkHandler.sendPacket(new TwirlS2CPacket(riptideLevel)); + serverPlayer.networkHandler.sendPacket(new TwirlS2CPacket(spinAttackStrength)); } - execute(riptideLevel, player, context.world()); + + execute(spinAttackStrength, player, context.world(), context.stack()); return true; } - public static void execute(int riptideLevel, PlayerEntity player, World world) { - double riptideFactor = 3.0d * ((1.0d + riptideLevel) / 4.0d); + public static void execute(float spinAttackStrength, PlayerEntity player, World world, ItemStack usedStack) { float yaw = player.getYaw(); float pitch = player.getPitch(); double x = -Math.sin(yaw * (Math.PI / 180.0d)) * Math.cos(pitch * (Math.PI / 180.0d)); double y = -Math.sin(pitch * (Math.PI / 180.0d)); double z = Math.cos(yaw * (Math.PI / 180)) * Math.cos(pitch * (Math.PI / 180.0d)); double distance = Math.sqrt(x * x + y * y + z * z); - player.addVelocity(x * riptideFactor / distance, y * riptideFactor / distance, z * riptideFactor / distance); - player.useRiptide(20); + player.addVelocity(x * spinAttackStrength / distance, y * spinAttackStrength / distance, z * spinAttackStrength / distance); + player.useRiptide(20, TridentItem.ATTACK_DAMAGE, usedStack); if (player.isOnGround()) { player.move(MovementType.SELF, new Vec3d(0.0d, 1.2d, 0.0d)); } - world.playSoundFromEntity(null, player, soundEvent(riptideLevel), SoundCategory.PLAYERS, 1.0f, 1.0f); - } - private static SoundEvent soundEvent(int level) { - if (level >= 3) { - return SoundEvents.ITEM_TRIDENT_RIPTIDE_3; - } - if (level == 2) { - return SoundEvents.ITEM_TRIDENT_RIPTIDE_2; - } - return SoundEvents.ITEM_TRIDENT_RIPTIDE_1; + RegistryEntry sound = EnchantmentHelper.getEffect(usedStack, EnchantmentEffectComponentTypes.TRIDENT_SOUND) + .orElse(SoundEvents.ITEM_TRIDENT_THROW); + world.playSoundFromEntity(null, player, sound.value(), SoundCategory.PLAYERS, 1.0f, 1.0f); } } diff --git a/src/main/java/net/errorcraft/itematic/world/action/context/ActionContext.java b/src/main/java/net/errorcraft/itematic/world/action/context/ActionContext.java index 0658beae..4f38663d 100644 --- a/src/main/java/net/errorcraft/itematic/world/action/context/ActionContext.java +++ b/src/main/java/net/errorcraft/itematic/world/action/context/ActionContext.java @@ -84,7 +84,8 @@ public static Builder builder(ServerWorld world, ItemStack stack, ItemStackConsu if (hand == null) { return builder(world, stack, resultStackConsumer); } - return builder(world, stack, resultStackConsumer, hand == Hand.MAIN_HAND ? EquipmentSlot.MAINHAND : EquipmentSlot.OFFHAND); + + return builder(world, stack, resultStackConsumer, LivingEntity.getSlotForHand(hand)); } public Builder builderForCopy() { @@ -275,5 +276,10 @@ public Builder slot(EquipmentSlot slot) { this.slot = slot; return this; } + + public Builder hand(Hand hand) { + this.slot = LivingEntity.getSlotForHand(hand); + return this; + } } } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 54a5970f..0bfbe226 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -33,7 +33,7 @@ "environment": "client" } ], - "accessWidener": "itematic.accesswidener", + "accessWidener": "itematic.classtweaker", "custom": { "loom:injected_interfaces": { "net/minecraft/class_314": [ @@ -178,9 +178,9 @@ }, "depends": { - "fabricloader": ">=0.15.0", + "fabricloader": ">=0.18.4", "fabric-api": "*", - "minecraft": "~1.20.5", + "minecraft": "~1.21-", "java": ">=21" }, "suggests": { diff --git a/src/main/resources/itematic.accesswidener b/src/main/resources/itematic.classtweaker similarity index 82% rename from src/main/resources/itematic.accesswidener rename to src/main/resources/itematic.classtweaker index 3cff779e..70af94a8 100644 --- a/src/main/resources/itematic.accesswidener +++ b/src/main/resources/itematic.classtweaker @@ -1,4 +1,4 @@ -accessWidener v1 named +classTweaker v1 named accessible class net/minecraft/registry/Registries$Initializer accessible class net/minecraft/recipe/Ingredient$Entry @@ -7,3 +7,5 @@ accessible class net/minecraft/client/gui/screen/GameModeSelectionScreen$G accessible class net/minecraft/client/gui/screen/StatsScreen$ItemStatsListWidget accessible class net/minecraft/client/gui/screen/StatsScreen$ItemStatsListWidget$Entry accessible class net/minecraft/client/gui/screen/world/CustomizeFlatLevelScreen$SuperflatLayersListWidget + +inject-interface net/minecraft/util/DyeColor net/errorcraft/itematic/access/util/DyeColorAccess diff --git a/src/main/resources/itematic.mixins.json b/src/main/resources/itematic.mixins.json index 1e9df7d7..3de26d44 100644 --- a/src/main/resources/itematic.mixins.json +++ b/src/main/resources/itematic.mixins.json @@ -78,6 +78,7 @@ "block.entity.SherdsExtender", "block.entity.SignBlockEntityExtender", "block.entity.VaultBlockEntityExtender$ServerExtender", + "block.vault.VaultConfigExtender", "client.item.BundleTooltipDataExtender", "command.argument.ArgumentTypesExtender", "command.argument.ScoreboardCriterionArgumentTypeExtender", @@ -90,7 +91,6 @@ "component.type.DyedColorComponentExtender", "component.type.ToolComponentExtender", "component.type.ToolComponentExtender$RuleExtender", - "enchantment.EnchantmentExtender", "enchantment.EnchantmentHelperExtender", "entity.BucketableExtender", "entity.CrossbowUserExtender", @@ -140,7 +140,6 @@ "entity.mob.EvokerEntityExtender", "entity.mob.GhastEntityExtender", "entity.mob.GuardianEntityExtender", - "entity.mob.GuardianEntityExtender$FireBeamGoalExtender", "entity.mob.HoglinEntityExtender", "entity.mob.HoglinExtender", "entity.mob.HostileEntityExtender", @@ -280,10 +279,12 @@ "item.ItemUsageExtender", "item.KnowledgeBookItemExtender", "item.MilkBucketItemAccessor", + "item.OminousBottleItemAccessor", "item.PotionItemAccessor", - "item.RangedWeaponItemExtender", + "item.RangedWeaponItemAccessor", "item.SmithingTemplateItemAccessor", "item.SpawnEggItemAccessor", + "item.WindChargeItemAccessor", "loot.ContainerComponentModifierExtender", "loot.ContainerComponentModifiersExtender$BundleContentsExtender", "loot.condition.LootConditionTypesAccessor", @@ -344,6 +345,7 @@ "registry.BuiltinRegistriesExtender", "registry.RegistriesAccessor", "registry.RegistriesExtender", + "registry.RegistryLoaderAccessor$EntryAccessor", "registry.RegistryLoaderExtender", "registry.SimpleRegistryExtender", "registry.entry.RegistryEntryExtender", From f93dc67f0f715ba746a6ab8d7f1d394dc6a4a76d Mon Sep 17 00:00:00 2001 From: ErrorCraft Date: Tue, 20 Jan 2026 16:54:01 +0100 Subject: [PATCH 02/11] Fix Beetroot Soup not leaving a Bowl after consuming (#62) --- .../gametest/item/BeetrootSoupTestSuite.java | 30 +++++++++++++++++++ src/gametest/resources/fabric.mod.json | 1 + .../data/minecraft/item/beetroot_soup.json | 4 ++- .../errorcraft/itematic/item/ItemUtil.java | 4 ++- 4 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 src/gametest/java/net/errorcraft/itematic/gametest/item/BeetrootSoupTestSuite.java diff --git a/src/gametest/java/net/errorcraft/itematic/gametest/item/BeetrootSoupTestSuite.java b/src/gametest/java/net/errorcraft/itematic/gametest/item/BeetrootSoupTestSuite.java new file mode 100644 index 00000000..e20dc6d6 --- /dev/null +++ b/src/gametest/java/net/errorcraft/itematic/gametest/item/BeetrootSoupTestSuite.java @@ -0,0 +1,30 @@ +package net.errorcraft.itematic.gametest.item; + +import net.errorcraft.itematic.item.ItemKeys; +import net.fabricmc.fabric.api.gametest.v1.FabricGameTest; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.test.GameTest; +import net.minecraft.test.TestContext; +import net.minecraft.util.Hand; +import net.minecraft.world.GameMode; + +public class BeetrootSoupTestSuite { + @GameTest(templateName = FabricGameTest.EMPTY_STRUCTURE) + public void eatingBeetrootSoupLeavesBowlAfterConsuming(TestContext context) { + PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL); + player.getHungerManager().setFoodLevel(0); + ServerWorld world = context.getWorld(); + ItemStack stack = world.itematic$createStack(ItemKeys.BEETROOT_SOUP); + player.setStackInHand(Hand.MAIN_HAND, stack); + world.spawnEntity(player); + context.createTimedTaskRunner() + .createAndAddReported(() -> stack.use(world, player, Hand.MAIN_HAND)) + .expectMinDurationAndRun( + stack.getMaxUseTime(player), + () -> context.assertTrue(player.getInventory().contains(s -> s.itematic$isOf(ItemKeys.BOWL)), "Expected Player to have a Bowl in their inventory") + ) + .completeIfSuccessful(); + } +} diff --git a/src/gametest/resources/fabric.mod.json b/src/gametest/resources/fabric.mod.json index dbacdbc0..af8a5d42 100644 --- a/src/gametest/resources/fabric.mod.json +++ b/src/gametest/resources/fabric.mod.json @@ -27,6 +27,7 @@ "net.errorcraft.itematic.gametest.entity.passive.SheepEntityTestSuite", "net.errorcraft.itematic.gametest.entity.passive.SnifferEntityTestSuite", "net.errorcraft.itematic.gametest.entity.passive.WolfEntityTestSuite", + "net.errorcraft.itematic.gametest.item.BeetrootSoupTestSuite", "net.errorcraft.itematic.gametest.item.BowTestSuite", "net.errorcraft.itematic.gametest.item.BrushTestSuite", "net.errorcraft.itematic.gametest.item.BundleTestSuite", diff --git a/src/main/generated/data/minecraft/item/beetroot_soup.json b/src/main/generated/data/minecraft/item/beetroot_soup.json index 0c103043..096d3761 100644 --- a/src/main/generated/data/minecraft/item/beetroot_soup.json +++ b/src/main/generated/data/minecraft/item/beetroot_soup.json @@ -3,7 +3,9 @@ "translation_key": "item.minecraft.beetroot_soup" }, "components": { - "minecraft:consumable": {}, + "minecraft:consumable": { + "result_item": "minecraft:bowl" + }, "minecraft:food": { "nutrition": 6, "saturation": 7.2000003 diff --git a/src/main/java/net/errorcraft/itematic/item/ItemUtil.java b/src/main/java/net/errorcraft/itematic/item/ItemUtil.java index 6422741d..21010587 100644 --- a/src/main/java/net/errorcraft/itematic/item/ItemUtil.java +++ b/src/main/java/net/errorcraft/itematic/item/ItemUtil.java @@ -517,7 +517,9 @@ private void bootstrapFood() { ItemBase.Builder.forItem(ItemKeys.BEETROOT_SOUP).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(1)) - .with(ConsumableItemComponent.builder(FoodComponents.BEETROOT_SOUP).build()) + .with(ConsumableItemComponent.builder(FoodComponents.BEETROOT_SOUP) + .resultItem(this.items.getOrThrow(ItemKeys.BOWL)) + .build()) .build() )); this.registerable.register(ItemKeys.SUSPICIOUS_STEW, create( From ba00a999ded85e1a80afb65f52c27666b71397c3 Mon Sep 17 00:00:00 2001 From: ErrorCraft <51973682+ErrorCraft@users.noreply.github.com> Date: Tue, 20 Jan 2026 17:08:47 +0100 Subject: [PATCH 03/11] Increment version to 0.4.0-preview.1+1.21 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 58ceabfa..5bb52ff5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ org.gradle.jvmargs=-Xmx1G loader_version=0.18.4 # Mod Properties - mod_version = 0.3.0 + mod_version = 0.4.0-preview.1+1.21 maven_group = net.errorcraft archives_base_name = itematic From 649184b59643640df70020d627376063eff77d11 Mon Sep 17 00:00:00 2001 From: ErrorCraft <51973682+ErrorCraft@users.noreply.github.com> Date: Wed, 21 Jan 2026 00:23:29 +0100 Subject: [PATCH 04/11] Port to 24w19b --- gradle.properties | 6 +- ...coratedPotBlockEntityRendererExtender.java | 25 +-- .../entity/model/CrossbowPosingExtender.java | 22 +++ .../render/item/HeldItemRendererExtender.java | 13 ++ .../resources/itematic.client.mixins.json | 1 + .../minecraft/item/angler_pottery_sherd.json | 2 +- .../minecraft/item/archer_pottery_sherd.json | 2 +- .../minecraft/item/arms_up_pottery_sherd.json | 2 +- .../minecraft/item/blade_pottery_sherd.json | 2 +- .../minecraft/item/brewer_pottery_sherd.json | 2 +- .../generated/data/minecraft/item/brick.json | 2 +- .../minecraft/item/burn_pottery_sherd.json | 2 +- .../minecraft/item/danger_pottery_sherd.json | 2 +- .../item/explorer_pottery_sherd.json | 2 +- .../minecraft/item/flow_pottery_sherd.json | 2 +- .../minecraft/item/friend_pottery_sherd.json | 2 +- .../minecraft/item/guster_pottery_sherd.json | 2 +- .../minecraft/item/heart_pottery_sherd.json | 2 +- .../item/heartbreak_pottery_sherd.json | 2 +- .../minecraft/item/howl_pottery_sherd.json | 2 +- .../minecraft/item/miner_pottery_sherd.json | 2 +- .../minecraft/item/mourner_pottery_sherd.json | 2 +- .../minecraft/item/plenty_pottery_sherd.json | 2 +- .../minecraft/item/prize_pottery_sherd.json | 2 +- .../minecraft/item/scrape_pottery_sherd.json | 2 +- .../minecraft/item/sheaf_pottery_sherd.json | 2 +- .../minecraft/item/shelter_pottery_sherd.json | 2 +- .../minecraft/item/skull_pottery_sherd.json | 2 +- .../minecraft/item/snort_pottery_sherd.json | 2 +- .../minecraft/tags/{blocks => block}/air.json | 0 .../end_crystal_spawnable_on.json | 0 .../flattenable_into_dirt_path.json | 0 .../tillable_into_farmland.json | 0 .../proficient_with_golden_weapons.json | 0 .../{items => item}/banned_bundle_items.json | 0 .../tags/{items => item}/bow_ammunition.json | 0 .../{items => item}/crossbow_ammunition.json | 0 .../farmer_villager_gatherable_items.json | 0 .../furnace_minecart_fuel.json | 0 .../{items => item}/gold_overworld_ores.json | 0 .../item_group/acacia_building_blocks.json | 0 .../item_group/amethyst_blocks.json | 0 .../item_group/andesite_building_blocks.json | 0 .../{items => item}/item_group/armor.json | 0 .../tags/{items => item}/item_group/axes.json | 0 .../item_group/bamboo_building_blocks.json | 0 .../item_group/banner_patterns.json | 0 .../{items => item}/item_group/banners.json | 0 .../item_group/basalt_building_blocks.json | 0 .../tags/{items => item}/item_group/beds.json | 0 .../item_group/birch_building_blocks.json | 0 .../blackstone_building_blocks.json | 0 .../{items => item}/item_group/boats.json | 0 .../item_group/brewing_ingredients.json | 0 .../item_group/brick_building_blocks.json | 0 .../{items => item}/item_group/buckets.json | 0 .../{items => item}/item_group/candles.json | 0 .../item_group/cherry_building_blocks.json | 0 .../cobbled_deepslate_building_blocks.json | 0 .../cobblestone_building_blocks.json | 0 .../{items => item}/item_group/concrete.json | 0 .../item_group/concrete_powder.json | 0 .../item_group/copper_building_blocks.json | 0 .../copper_like_building_blocks.json | 0 .../{items => item}/item_group/coral.json | 0 .../item_group/coral_blocks.json | 0 .../item_group/coral_fans.json | 0 .../item_group/crimson_building_blocks.json | 0 .../cut_red_sandstone_building_blocks.json | 0 .../cut_sandstone_building_blocks.json | 0 .../item_group/dark_oak_building_blocks.json | 0 .../dark_prismarine_building_blocks.json | 0 .../deepslate_brick_building_blocks.json | 0 .../deepslate_tiles_building_blocks.json | 0 .../item_group/diorite_building_blocks.json | 0 .../item_group/dirt_like_blocks.json | 0 .../tags/{items => item}/item_group/dyes.json | 0 .../item_group/egg_like_blocks.json | 0 .../end_stone_brick_building_blocks.json | 0 .../exposed_copper_building_blocks.json | 0 .../tags/{items => item}/item_group/food.json | 0 .../item_group/froglights.json | 0 .../{items => item}/item_group/glass.json | 0 .../item_group/glass_panes.json | 0 .../item_group/glazed_terracotta.json | 0 .../item_group/gold_building_blocks.json | 0 .../item_group/granite_building_blocks.json | 0 .../item_group/grass_like_blocks.json | 0 .../{items => item}/item_group/heads.json | 0 .../item_group/horse_armor.json | 0 .../item_group/ice_blocks.json | 0 .../item_group/infested_blocks.json | 0 .../item_group/iron_building_blocks.json | 0 .../item_group/jungle_building_blocks.json | 0 .../{items => item}/item_group/lanterns.json | 0 .../{items => item}/item_group/leaves.json | 0 .../item_group/light_emitting_blocks.json | 0 .../item_group/log_like_blocks.json | 0 .../item_group/mangrove_building_blocks.json | 0 .../{items => item}/item_group/minecarts.json | 0 .../item_group/moss_blocks.json | 0 .../mossy_cobblestone_building_blocks.json | 0 .../mossy_stone_brick_building_blocks.json | 0 .../item_group/mud_brick_building_blocks.json | 0 .../item_group/mushroom_like_blocks.json | 0 .../item_group/music_discs.json | 0 .../item_group/nether_blocks.json | 0 .../nether_brick_building_blocks.json | 0 .../item_group/oak_building_blocks.json | 0 .../item_group/ore_like_blocks.json | 0 .../oxidized_copper_building_blocks.json | 0 .../{items => item}/item_group/plants.json | 0 .../polished_andesite_building_blocks.json | 0 ...shed_blackstone_brick_building_blocks.json | 0 .../polished_blackstone_building_blocks.json | 0 .../polished_deepslate_building_blocks.json | 0 .../polished_diorite_building_blocks.json | 0 .../polished_granite_building_blocks.json | 0 .../prismarine_brick_building_blocks.json | 0 .../prismarine_building_blocks.json | 0 .../{items => item}/item_group/pumpkins.json | 0 .../item_group/purpur_building_blocks.json | 0 .../item_group/quartz_building_blocks.json | 0 .../{items => item}/item_group/rails.json | 0 .../red_nether_brick_building_blocks.json | 0 .../red_sandstone_building_blocks.json | 0 .../item_group/sand_blocks.json | 0 .../item_group/sandstone_building_blocks.json | 0 .../{items => item}/item_group/saplings.json | 0 .../{items => item}/item_group/sculk.json | 0 .../{items => item}/item_group/seeds.json | 0 .../item_group/shulker_boxes.json | 0 .../{items => item}/item_group/signs.json | 0 .../item_group/smithing_templates.json | 0 .../smooth_quartz_building_blocks.json | 0 .../smooth_red_sandstone_building_blocks.json | 0 .../smooth_sandstone_building_blocks.json | 0 .../smooth_stone_building_blocks.json | 0 .../item_group/snow_blocks.json | 0 .../{items => item}/item_group/spawners.json | 0 .../item_group/spruce_building_blocks.json | 0 .../stone_brick_building_blocks.json | 0 .../item_group/stone_building_blocks.json | 0 .../item_group/stone_like_blocks.json | 0 .../stone_like_building_blocks.json | 0 .../{items => item}/item_group/swords.json | 0 .../item_group/terracotta.json | 0 .../{items => item}/item_group/tools.json | 0 .../{items => item}/item_group/torches.json | 0 .../item_group/tuff_building_blocks.json | 0 .../item_group/warped_building_blocks.json | 0 .../item_group/water_blocks.json | 0 .../waxed_copper_building_blocks.json | 0 .../waxed_exposed_copper_building_blocks.json | 0 ...waxed_oxidized_copper_building_blocks.json | 0 ...axed_weathered_copper_building_blocks.json | 0 .../weathered_copper_building_blocks.json | 0 .../item_group/wooden_building_blocks.json | 0 .../tags/{items => item}/item_group/wool.json | 0 .../item_group/wool_carpets.json | 0 .../tags/{items => item}/pig_tempt_items.json | 0 .../prevents_mining_in_creative.json | 0 .../prevents_taking_potted_item_out.json | 0 .../repairs_chainmail_armor.json | 0 .../repairs_diamond_armor.json | 0 .../{items => item}/repairs_diamond_tool.json | 0 .../tags/{items => item}/repairs_elytra.json | 0 .../{items => item}/repairs_golden_armor.json | 0 .../{items => item}/repairs_golden_tool.json | 0 .../{items => item}/repairs_iron_armor.json | 0 .../{items => item}/repairs_iron_tool.json | 0 .../repairs_leather_armor.json | 0 .../tags/{items => item}/repairs_mace.json | 0 .../repairs_netherite_armor.json | 0 .../repairs_netherite_tool.json | 0 .../tags/{items => item}/repairs_shield.json | 0 .../{items => item}/repairs_stone_tool.json | 0 .../{items => item}/repairs_turtle_armor.json | 0 .../{items => item}/repairs_wooden_tool.json | 0 .../tags/{items => item}/shulker_boxes.json | 0 .../villager_gatherable_items.json | 0 .../access/entity/LivingEntityAccess.java | 3 +- .../itematic/block/entity/SherdsUtil.java | 14 +- .../SmallFireballEntityInitializer.java | 5 +- .../TridentEntityInitializer.java | 2 +- .../WindChargeEntityInitializer.java | 2 +- .../errorcraft/itematic/item/ItemUtil.java | 53 +++--- .../DecoratedPotPatternItemComponent.java | 5 +- .../components/FoodItemComponent.java | 8 +- .../dispense/behavior/DispenseBehavior.java | 12 +- .../methods/ChargeableShooterMethod.java | 19 ++- .../providers/PlayableIntegerProvider.java | 4 +- .../providers/ShooterIntegerProvider.java | 4 +- .../providers/TridentIntegerProvider.java | 8 +- .../block/DecoratedPotPatternsAccessor.java | 154 ------------------ .../mixin/block/TntBlockExtender.java | 2 +- .../component/type/FoodComponentExtender.java | 24 +++ .../mixin/entity/LivingEntityExtender.java | 7 +- .../task/CrossbowAttackTaskExtender.java | 19 ++- .../ai/goal/CrossbowAttackGoalExtender.java | 14 ++ .../mixin/item/CrossbowItemExtender.java | 32 +--- .../mixin/item/KnowledgeBookItemExtender.java | 15 +- .../SetEnchantmentsLootFunctionExtender.java | 6 +- .../function/SetItemLootFunctionExtender.java | 4 +- .../EnchantmentScreenHandlerExtender.java | 6 +- .../GrindstoneScreenHandlerExtender.java | 6 +- .../ServerPlayNetworkHandlerExtender.java | 14 +- .../action/actions/TwirlPlayerAction.java | 2 +- src/main/resources/itematic.mixins.json | 2 +- 209 files changed, 231 insertions(+), 330 deletions(-) create mode 100644 src/client/java/net/errorcraft/itematic/mixin/client/render/entity/model/CrossbowPosingExtender.java rename src/main/generated/data/minecraft/tags/{blocks => block}/air.json (100%) rename src/main/generated/data/minecraft/tags/{blocks => block}/end_crystal_spawnable_on.json (100%) rename src/main/generated/data/minecraft/tags/{blocks => block}/flattenable_into_dirt_path.json (100%) rename src/main/generated/data/minecraft/tags/{blocks => block}/tillable_into_farmland.json (100%) rename src/main/generated/data/minecraft/tags/{entity_types => entity_type}/proficient_with_golden_weapons.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/banned_bundle_items.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/bow_ammunition.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/crossbow_ammunition.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/farmer_villager_gatherable_items.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/furnace_minecart_fuel.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/gold_overworld_ores.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/acacia_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/amethyst_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/andesite_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/armor.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/axes.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/bamboo_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/banner_patterns.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/banners.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/basalt_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/beds.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/birch_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/blackstone_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/boats.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/brewing_ingredients.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/brick_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/buckets.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/candles.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/cherry_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/cobbled_deepslate_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/cobblestone_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/concrete.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/concrete_powder.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/copper_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/copper_like_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/coral.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/coral_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/coral_fans.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/crimson_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/cut_red_sandstone_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/cut_sandstone_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/dark_oak_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/dark_prismarine_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/deepslate_brick_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/deepslate_tiles_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/diorite_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/dirt_like_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/dyes.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/egg_like_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/end_stone_brick_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/exposed_copper_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/food.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/froglights.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/glass.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/glass_panes.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/glazed_terracotta.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/gold_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/granite_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/grass_like_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/heads.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/horse_armor.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/ice_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/infested_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/iron_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/jungle_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/lanterns.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/leaves.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/light_emitting_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/log_like_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/mangrove_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/minecarts.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/moss_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/mossy_cobblestone_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/mossy_stone_brick_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/mud_brick_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/mushroom_like_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/music_discs.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/nether_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/nether_brick_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/oak_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/ore_like_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/oxidized_copper_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/plants.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/polished_andesite_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/polished_blackstone_brick_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/polished_blackstone_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/polished_deepslate_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/polished_diorite_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/polished_granite_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/prismarine_brick_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/prismarine_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/pumpkins.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/purpur_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/quartz_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/rails.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/red_nether_brick_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/red_sandstone_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/sand_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/sandstone_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/saplings.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/sculk.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/seeds.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/shulker_boxes.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/signs.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/smithing_templates.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/smooth_quartz_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/smooth_red_sandstone_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/smooth_sandstone_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/smooth_stone_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/snow_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/spawners.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/spruce_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/stone_brick_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/stone_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/stone_like_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/stone_like_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/swords.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/terracotta.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/tools.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/torches.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/tuff_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/warped_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/water_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/waxed_copper_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/waxed_exposed_copper_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/waxed_oxidized_copper_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/waxed_weathered_copper_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/weathered_copper_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/wooden_building_blocks.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/wool.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/item_group/wool_carpets.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/pig_tempt_items.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/prevents_mining_in_creative.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/prevents_taking_potted_item_out.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/repairs_chainmail_armor.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/repairs_diamond_armor.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/repairs_diamond_tool.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/repairs_elytra.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/repairs_golden_armor.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/repairs_golden_tool.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/repairs_iron_armor.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/repairs_iron_tool.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/repairs_leather_armor.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/repairs_mace.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/repairs_netherite_armor.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/repairs_netherite_tool.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/repairs_shield.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/repairs_stone_tool.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/repairs_turtle_armor.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/repairs_wooden_tool.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/shulker_boxes.json (100%) rename src/main/generated/data/minecraft/tags/{items => item}/villager_gatherable_items.json (100%) delete mode 100644 src/main/java/net/errorcraft/itematic/mixin/block/DecoratedPotPatternsAccessor.java create mode 100644 src/main/java/net/errorcraft/itematic/mixin/component/type/FoodComponentExtender.java diff --git a/gradle.properties b/gradle.properties index 5bb52ff5..37cf142c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,8 +3,8 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://fabricmc.net/develop - minecraft_version=24w18a - yarn_mappings=24w18a+build.4 + minecraft_version=24w19b + yarn_mappings=24w19b+build.4 loader_version=0.18.4 # Mod Properties @@ -13,4 +13,4 @@ org.gradle.jvmargs=-Xmx1G archives_base_name = itematic # Dependencies - fabric_version=0.98.0+1.21 + fabric_version=0.98.1+1.21 diff --git a/src/client/java/net/errorcraft/itematic/mixin/client/render/block/entity/DecoratedPotBlockEntityRendererExtender.java b/src/client/java/net/errorcraft/itematic/mixin/client/render/block/entity/DecoratedPotBlockEntityRendererExtender.java index bf1ce5e6..b95e8d96 100644 --- a/src/client/java/net/errorcraft/itematic/mixin/client/render/block/entity/DecoratedPotBlockEntityRendererExtender.java +++ b/src/client/java/net/errorcraft/itematic/mixin/client/render/block/entity/DecoratedPotBlockEntityRendererExtender.java @@ -2,7 +2,7 @@ import net.errorcraft.itematic.item.component.ItemComponentTypes; import net.errorcraft.itematic.item.component.components.DecoratedPotPatternItemComponent; -import net.errorcraft.itematic.mixin.block.DecoratedPotPatternsAccessor; +import net.minecraft.block.DecoratedPotPattern; import net.minecraft.client.render.block.entity.DecoratedPotBlockEntityRenderer; import net.minecraft.item.Item; import net.minecraft.registry.RegistryKey; @@ -10,7 +10,6 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.Slice; @Mixin(DecoratedPotBlockEntityRenderer.class) public class DecoratedPotBlockEntityRendererExtender { @@ -22,28 +21,10 @@ public class DecoratedPotBlockEntityRendererExtender { ordinal = 0 ) ) - private static RegistryKey fromSherdUseItemComponent(Item sherd) { + private static RegistryKey fromSherdUseItemComponent(Item sherd) { return sherd.itematic$getComponent(ItemComponentTypes.DECORATED_POT_PATTERN) .map(DecoratedPotPatternItemComponent::pattern) .flatMap(RegistryEntry::getKey) - .orElse(DecoratedPotPatternsAccessor.decoratedPotSide()); - } - - @Redirect( - method = "getTextureIdFromSherd", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/block/DecoratedPotPatterns;fromSherd(Lnet/minecraft/item/Item;)Lnet/minecraft/registry/RegistryKey;", - ordinal = 0 - ), - slice = @Slice( - from = @At( - value = "FIELD", - target = "Lnet/minecraft/item/Items;BRICK:Lnet/minecraft/item/Item;" - ) - ) - ) - private static RegistryKey fromSherdUseDefaultRegistryKey(Item sherd) { - return DecoratedPotPatternsAccessor.decoratedPotSide(); + .orElse(null); } } diff --git a/src/client/java/net/errorcraft/itematic/mixin/client/render/entity/model/CrossbowPosingExtender.java b/src/client/java/net/errorcraft/itematic/mixin/client/render/entity/model/CrossbowPosingExtender.java new file mode 100644 index 00000000..8788c775 --- /dev/null +++ b/src/client/java/net/errorcraft/itematic/mixin/client/render/entity/model/CrossbowPosingExtender.java @@ -0,0 +1,22 @@ +package net.errorcraft.itematic.mixin.client.render.entity.model; + +import net.errorcraft.itematic.item.shooter.method.methods.ChargeableShooterMethod; +import net.minecraft.client.render.entity.model.CrossbowPosing; +import net.minecraft.entity.LivingEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(CrossbowPosing.class) +public class CrossbowPosingExtender { + @Redirect( + method = "charge", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/item/CrossbowItem;getPullTime(Lnet/minecraft/entity/LivingEntity;)I" + ) + ) + private static int getPullTimeUseItemComponent(LivingEntity user) { + return ChargeableShooterMethod.getChargeTime(user.getActiveItem(), user); + } +} diff --git a/src/client/java/net/errorcraft/itematic/mixin/client/render/item/HeldItemRendererExtender.java b/src/client/java/net/errorcraft/itematic/mixin/client/render/item/HeldItemRendererExtender.java index a876a2bf..57fc9277 100644 --- a/src/client/java/net/errorcraft/itematic/mixin/client/render/item/HeldItemRendererExtender.java +++ b/src/client/java/net/errorcraft/itematic/mixin/client/render/item/HeldItemRendererExtender.java @@ -1,10 +1,12 @@ package net.errorcraft.itematic.mixin.client.render.item; +import com.llamalad7.mixinextras.sugar.Local; import com.llamalad7.mixinextras.sugar.Share; import com.llamalad7.mixinextras.sugar.ref.LocalIntRef; import net.errorcraft.itematic.item.component.ItemComponentTypes; import net.errorcraft.itematic.item.component.components.ShooterItemComponent; import net.errorcraft.itematic.item.shooter.method.ShooterMethodTypes; +import net.errorcraft.itematic.item.shooter.method.methods.ChargeableShooterMethod; import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.render.item.HeldItemRenderer; import net.minecraft.entity.LivingEntity; @@ -126,6 +128,17 @@ private int getUseTimeLeftForCrossbowUseNegatedUsedTicks(AbstractClientPlayerEnt return -instance.itematic$itemUsedTicks(); } + @Redirect( + method = "renderFirstPersonItem", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/item/CrossbowItem;getPullTime(Lnet/minecraft/entity/LivingEntity;)I" + ) + ) + private int getPullTimeUseItemComponent(LivingEntity user, @Local(argsOnly = true) ItemStack stack) { + return ChargeableShooterMethod.getChargeTime(stack, user); + } + @Redirect( method = "renderFirstPersonItem", at = @At( diff --git a/src/client/resources/itematic.client.mixins.json b/src/client/resources/itematic.client.mixins.json index e5b7fae9..dedd14e5 100644 --- a/src/client/resources/itematic.client.mixins.json +++ b/src/client/resources/itematic.client.mixins.json @@ -59,6 +59,7 @@ "render.entity.feature.PlayerHeldItemFeatureRendererExtender", "render.entity.feature.SnowGolemPumpkinFeatureRendererExtender", "render.entity.feature.WolfArmorFeatureRendererExtender", + "render.entity.model.CrossbowPosingExtender", "render.entity.model.DrownedEntityModelExtender", "render.entity.model.SkeletonEntityModelExtender", "render.feature.WitchHeldItemFeatureRendererExtender", diff --git a/src/main/generated/data/minecraft/item/angler_pottery_sherd.json b/src/main/generated/data/minecraft/item/angler_pottery_sherd.json index 08567c00..4472959e 100644 --- a/src/main/generated/data/minecraft/item/angler_pottery_sherd.json +++ b/src/main/generated/data/minecraft/item/angler_pottery_sherd.json @@ -4,7 +4,7 @@ }, "components": { "minecraft:decorated_pot_pattern": { - "pattern": "minecraft:angler_pottery_pattern" + "pattern": "minecraft:angler" }, "minecraft:stackable": 64 } diff --git a/src/main/generated/data/minecraft/item/archer_pottery_sherd.json b/src/main/generated/data/minecraft/item/archer_pottery_sherd.json index bce20623..a7884fe2 100644 --- a/src/main/generated/data/minecraft/item/archer_pottery_sherd.json +++ b/src/main/generated/data/minecraft/item/archer_pottery_sherd.json @@ -4,7 +4,7 @@ }, "components": { "minecraft:decorated_pot_pattern": { - "pattern": "minecraft:archer_pottery_pattern" + "pattern": "minecraft:archer" }, "minecraft:stackable": 64 } diff --git a/src/main/generated/data/minecraft/item/arms_up_pottery_sherd.json b/src/main/generated/data/minecraft/item/arms_up_pottery_sherd.json index d3dd5339..75ba425b 100644 --- a/src/main/generated/data/minecraft/item/arms_up_pottery_sherd.json +++ b/src/main/generated/data/minecraft/item/arms_up_pottery_sherd.json @@ -4,7 +4,7 @@ }, "components": { "minecraft:decorated_pot_pattern": { - "pattern": "minecraft:arms_up_pottery_pattern" + "pattern": "minecraft:arms_up" }, "minecraft:stackable": 64 } diff --git a/src/main/generated/data/minecraft/item/blade_pottery_sherd.json b/src/main/generated/data/minecraft/item/blade_pottery_sherd.json index 3db60df2..ca4e68fb 100644 --- a/src/main/generated/data/minecraft/item/blade_pottery_sherd.json +++ b/src/main/generated/data/minecraft/item/blade_pottery_sherd.json @@ -4,7 +4,7 @@ }, "components": { "minecraft:decorated_pot_pattern": { - "pattern": "minecraft:blade_pottery_pattern" + "pattern": "minecraft:blade" }, "minecraft:stackable": 64 } diff --git a/src/main/generated/data/minecraft/item/brewer_pottery_sherd.json b/src/main/generated/data/minecraft/item/brewer_pottery_sherd.json index e502e947..8b19b089 100644 --- a/src/main/generated/data/minecraft/item/brewer_pottery_sherd.json +++ b/src/main/generated/data/minecraft/item/brewer_pottery_sherd.json @@ -4,7 +4,7 @@ }, "components": { "minecraft:decorated_pot_pattern": { - "pattern": "minecraft:brewer_pottery_pattern" + "pattern": "minecraft:brewer" }, "minecraft:stackable": 64 } diff --git a/src/main/generated/data/minecraft/item/brick.json b/src/main/generated/data/minecraft/item/brick.json index fda64632..c7c7e772 100644 --- a/src/main/generated/data/minecraft/item/brick.json +++ b/src/main/generated/data/minecraft/item/brick.json @@ -4,7 +4,7 @@ }, "components": { "minecraft:decorated_pot_pattern": { - "pattern": "minecraft:decorated_pot_side" + "pattern": "minecraft:blank" }, "minecraft:stackable": 64 } diff --git a/src/main/generated/data/minecraft/item/burn_pottery_sherd.json b/src/main/generated/data/minecraft/item/burn_pottery_sherd.json index 1bb41e63..830aedc4 100644 --- a/src/main/generated/data/minecraft/item/burn_pottery_sherd.json +++ b/src/main/generated/data/minecraft/item/burn_pottery_sherd.json @@ -4,7 +4,7 @@ }, "components": { "minecraft:decorated_pot_pattern": { - "pattern": "minecraft:burn_pottery_pattern" + "pattern": "minecraft:burn" }, "minecraft:stackable": 64 } diff --git a/src/main/generated/data/minecraft/item/danger_pottery_sherd.json b/src/main/generated/data/minecraft/item/danger_pottery_sherd.json index e857b3c8..a3a814e5 100644 --- a/src/main/generated/data/minecraft/item/danger_pottery_sherd.json +++ b/src/main/generated/data/minecraft/item/danger_pottery_sherd.json @@ -4,7 +4,7 @@ }, "components": { "minecraft:decorated_pot_pattern": { - "pattern": "minecraft:danger_pottery_pattern" + "pattern": "minecraft:danger" }, "minecraft:stackable": 64 } diff --git a/src/main/generated/data/minecraft/item/explorer_pottery_sherd.json b/src/main/generated/data/minecraft/item/explorer_pottery_sherd.json index fed13351..8699310c 100644 --- a/src/main/generated/data/minecraft/item/explorer_pottery_sherd.json +++ b/src/main/generated/data/minecraft/item/explorer_pottery_sherd.json @@ -4,7 +4,7 @@ }, "components": { "minecraft:decorated_pot_pattern": { - "pattern": "minecraft:explorer_pottery_pattern" + "pattern": "minecraft:explorer" }, "minecraft:stackable": 64 } diff --git a/src/main/generated/data/minecraft/item/flow_pottery_sherd.json b/src/main/generated/data/minecraft/item/flow_pottery_sherd.json index 1425b5a2..71d1546b 100644 --- a/src/main/generated/data/minecraft/item/flow_pottery_sherd.json +++ b/src/main/generated/data/minecraft/item/flow_pottery_sherd.json @@ -4,7 +4,7 @@ }, "components": { "minecraft:decorated_pot_pattern": { - "pattern": "minecraft:flow_pottery_pattern" + "pattern": "minecraft:flow" }, "minecraft:stackable": 64 } diff --git a/src/main/generated/data/minecraft/item/friend_pottery_sherd.json b/src/main/generated/data/minecraft/item/friend_pottery_sherd.json index a40a5cdd..f58c0733 100644 --- a/src/main/generated/data/minecraft/item/friend_pottery_sherd.json +++ b/src/main/generated/data/minecraft/item/friend_pottery_sherd.json @@ -4,7 +4,7 @@ }, "components": { "minecraft:decorated_pot_pattern": { - "pattern": "minecraft:friend_pottery_pattern" + "pattern": "minecraft:friend" }, "minecraft:stackable": 64 } diff --git a/src/main/generated/data/minecraft/item/guster_pottery_sherd.json b/src/main/generated/data/minecraft/item/guster_pottery_sherd.json index fc7da49d..6afe3df4 100644 --- a/src/main/generated/data/minecraft/item/guster_pottery_sherd.json +++ b/src/main/generated/data/minecraft/item/guster_pottery_sherd.json @@ -4,7 +4,7 @@ }, "components": { "minecraft:decorated_pot_pattern": { - "pattern": "minecraft:guster_pottery_pattern" + "pattern": "minecraft:guster" }, "minecraft:stackable": 64 } diff --git a/src/main/generated/data/minecraft/item/heart_pottery_sherd.json b/src/main/generated/data/minecraft/item/heart_pottery_sherd.json index 42596c48..60eeca90 100644 --- a/src/main/generated/data/minecraft/item/heart_pottery_sherd.json +++ b/src/main/generated/data/minecraft/item/heart_pottery_sherd.json @@ -4,7 +4,7 @@ }, "components": { "minecraft:decorated_pot_pattern": { - "pattern": "minecraft:heart_pottery_pattern" + "pattern": "minecraft:heart" }, "minecraft:stackable": 64 } diff --git a/src/main/generated/data/minecraft/item/heartbreak_pottery_sherd.json b/src/main/generated/data/minecraft/item/heartbreak_pottery_sherd.json index f7f89623..56367694 100644 --- a/src/main/generated/data/minecraft/item/heartbreak_pottery_sherd.json +++ b/src/main/generated/data/minecraft/item/heartbreak_pottery_sherd.json @@ -4,7 +4,7 @@ }, "components": { "minecraft:decorated_pot_pattern": { - "pattern": "minecraft:heartbreak_pottery_pattern" + "pattern": "minecraft:heartbreak" }, "minecraft:stackable": 64 } diff --git a/src/main/generated/data/minecraft/item/howl_pottery_sherd.json b/src/main/generated/data/minecraft/item/howl_pottery_sherd.json index 6a9b1e72..b0c86d3e 100644 --- a/src/main/generated/data/minecraft/item/howl_pottery_sherd.json +++ b/src/main/generated/data/minecraft/item/howl_pottery_sherd.json @@ -4,7 +4,7 @@ }, "components": { "minecraft:decorated_pot_pattern": { - "pattern": "minecraft:howl_pottery_pattern" + "pattern": "minecraft:howl" }, "minecraft:stackable": 64 } diff --git a/src/main/generated/data/minecraft/item/miner_pottery_sherd.json b/src/main/generated/data/minecraft/item/miner_pottery_sherd.json index 2e4edab7..e2a472a2 100644 --- a/src/main/generated/data/minecraft/item/miner_pottery_sherd.json +++ b/src/main/generated/data/minecraft/item/miner_pottery_sherd.json @@ -4,7 +4,7 @@ }, "components": { "minecraft:decorated_pot_pattern": { - "pattern": "minecraft:miner_pottery_pattern" + "pattern": "minecraft:miner" }, "minecraft:stackable": 64 } diff --git a/src/main/generated/data/minecraft/item/mourner_pottery_sherd.json b/src/main/generated/data/minecraft/item/mourner_pottery_sherd.json index 34eeaf4c..662cf01c 100644 --- a/src/main/generated/data/minecraft/item/mourner_pottery_sherd.json +++ b/src/main/generated/data/minecraft/item/mourner_pottery_sherd.json @@ -4,7 +4,7 @@ }, "components": { "minecraft:decorated_pot_pattern": { - "pattern": "minecraft:mourner_pottery_pattern" + "pattern": "minecraft:mourner" }, "minecraft:stackable": 64 } diff --git a/src/main/generated/data/minecraft/item/plenty_pottery_sherd.json b/src/main/generated/data/minecraft/item/plenty_pottery_sherd.json index f36c9bd3..8942ef35 100644 --- a/src/main/generated/data/minecraft/item/plenty_pottery_sherd.json +++ b/src/main/generated/data/minecraft/item/plenty_pottery_sherd.json @@ -4,7 +4,7 @@ }, "components": { "minecraft:decorated_pot_pattern": { - "pattern": "minecraft:plenty_pottery_pattern" + "pattern": "minecraft:plenty" }, "minecraft:stackable": 64 } diff --git a/src/main/generated/data/minecraft/item/prize_pottery_sherd.json b/src/main/generated/data/minecraft/item/prize_pottery_sherd.json index f5c94036..35702be8 100644 --- a/src/main/generated/data/minecraft/item/prize_pottery_sherd.json +++ b/src/main/generated/data/minecraft/item/prize_pottery_sherd.json @@ -4,7 +4,7 @@ }, "components": { "minecraft:decorated_pot_pattern": { - "pattern": "minecraft:prize_pottery_pattern" + "pattern": "minecraft:prize" }, "minecraft:stackable": 64 } diff --git a/src/main/generated/data/minecraft/item/scrape_pottery_sherd.json b/src/main/generated/data/minecraft/item/scrape_pottery_sherd.json index ecf86251..dfdc9950 100644 --- a/src/main/generated/data/minecraft/item/scrape_pottery_sherd.json +++ b/src/main/generated/data/minecraft/item/scrape_pottery_sherd.json @@ -4,7 +4,7 @@ }, "components": { "minecraft:decorated_pot_pattern": { - "pattern": "minecraft:scrape_pottery_pattern" + "pattern": "minecraft:scrape" }, "minecraft:stackable": 64 } diff --git a/src/main/generated/data/minecraft/item/sheaf_pottery_sherd.json b/src/main/generated/data/minecraft/item/sheaf_pottery_sherd.json index 15a55ad2..4c211868 100644 --- a/src/main/generated/data/minecraft/item/sheaf_pottery_sherd.json +++ b/src/main/generated/data/minecraft/item/sheaf_pottery_sherd.json @@ -4,7 +4,7 @@ }, "components": { "minecraft:decorated_pot_pattern": { - "pattern": "minecraft:sheaf_pottery_pattern" + "pattern": "minecraft:sheaf" }, "minecraft:stackable": 64 } diff --git a/src/main/generated/data/minecraft/item/shelter_pottery_sherd.json b/src/main/generated/data/minecraft/item/shelter_pottery_sherd.json index f219d80b..e188f684 100644 --- a/src/main/generated/data/minecraft/item/shelter_pottery_sherd.json +++ b/src/main/generated/data/minecraft/item/shelter_pottery_sherd.json @@ -4,7 +4,7 @@ }, "components": { "minecraft:decorated_pot_pattern": { - "pattern": "minecraft:shelter_pottery_pattern" + "pattern": "minecraft:shelter" }, "minecraft:stackable": 64 } diff --git a/src/main/generated/data/minecraft/item/skull_pottery_sherd.json b/src/main/generated/data/minecraft/item/skull_pottery_sherd.json index bdc052a2..8789fe20 100644 --- a/src/main/generated/data/minecraft/item/skull_pottery_sherd.json +++ b/src/main/generated/data/minecraft/item/skull_pottery_sherd.json @@ -4,7 +4,7 @@ }, "components": { "minecraft:decorated_pot_pattern": { - "pattern": "minecraft:skull_pottery_pattern" + "pattern": "minecraft:skull" }, "minecraft:stackable": 64 } diff --git a/src/main/generated/data/minecraft/item/snort_pottery_sherd.json b/src/main/generated/data/minecraft/item/snort_pottery_sherd.json index ac283a81..45dbdb79 100644 --- a/src/main/generated/data/minecraft/item/snort_pottery_sherd.json +++ b/src/main/generated/data/minecraft/item/snort_pottery_sherd.json @@ -4,7 +4,7 @@ }, "components": { "minecraft:decorated_pot_pattern": { - "pattern": "minecraft:snort_pottery_pattern" + "pattern": "minecraft:snort" }, "minecraft:stackable": 64 } diff --git a/src/main/generated/data/minecraft/tags/blocks/air.json b/src/main/generated/data/minecraft/tags/block/air.json similarity index 100% rename from src/main/generated/data/minecraft/tags/blocks/air.json rename to src/main/generated/data/minecraft/tags/block/air.json diff --git a/src/main/generated/data/minecraft/tags/blocks/end_crystal_spawnable_on.json b/src/main/generated/data/minecraft/tags/block/end_crystal_spawnable_on.json similarity index 100% rename from src/main/generated/data/minecraft/tags/blocks/end_crystal_spawnable_on.json rename to src/main/generated/data/minecraft/tags/block/end_crystal_spawnable_on.json diff --git a/src/main/generated/data/minecraft/tags/blocks/flattenable_into_dirt_path.json b/src/main/generated/data/minecraft/tags/block/flattenable_into_dirt_path.json similarity index 100% rename from src/main/generated/data/minecraft/tags/blocks/flattenable_into_dirt_path.json rename to src/main/generated/data/minecraft/tags/block/flattenable_into_dirt_path.json diff --git a/src/main/generated/data/minecraft/tags/blocks/tillable_into_farmland.json b/src/main/generated/data/minecraft/tags/block/tillable_into_farmland.json similarity index 100% rename from src/main/generated/data/minecraft/tags/blocks/tillable_into_farmland.json rename to src/main/generated/data/minecraft/tags/block/tillable_into_farmland.json diff --git a/src/main/generated/data/minecraft/tags/entity_types/proficient_with_golden_weapons.json b/src/main/generated/data/minecraft/tags/entity_type/proficient_with_golden_weapons.json similarity index 100% rename from src/main/generated/data/minecraft/tags/entity_types/proficient_with_golden_weapons.json rename to src/main/generated/data/minecraft/tags/entity_type/proficient_with_golden_weapons.json diff --git a/src/main/generated/data/minecraft/tags/items/banned_bundle_items.json b/src/main/generated/data/minecraft/tags/item/banned_bundle_items.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/banned_bundle_items.json rename to src/main/generated/data/minecraft/tags/item/banned_bundle_items.json diff --git a/src/main/generated/data/minecraft/tags/items/bow_ammunition.json b/src/main/generated/data/minecraft/tags/item/bow_ammunition.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/bow_ammunition.json rename to src/main/generated/data/minecraft/tags/item/bow_ammunition.json diff --git a/src/main/generated/data/minecraft/tags/items/crossbow_ammunition.json b/src/main/generated/data/minecraft/tags/item/crossbow_ammunition.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/crossbow_ammunition.json rename to src/main/generated/data/minecraft/tags/item/crossbow_ammunition.json diff --git a/src/main/generated/data/minecraft/tags/items/farmer_villager_gatherable_items.json b/src/main/generated/data/minecraft/tags/item/farmer_villager_gatherable_items.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/farmer_villager_gatherable_items.json rename to src/main/generated/data/minecraft/tags/item/farmer_villager_gatherable_items.json diff --git a/src/main/generated/data/minecraft/tags/items/furnace_minecart_fuel.json b/src/main/generated/data/minecraft/tags/item/furnace_minecart_fuel.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/furnace_minecart_fuel.json rename to src/main/generated/data/minecraft/tags/item/furnace_minecart_fuel.json diff --git a/src/main/generated/data/minecraft/tags/items/gold_overworld_ores.json b/src/main/generated/data/minecraft/tags/item/gold_overworld_ores.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/gold_overworld_ores.json rename to src/main/generated/data/minecraft/tags/item/gold_overworld_ores.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/acacia_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/acacia_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/acacia_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/acacia_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/amethyst_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/amethyst_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/amethyst_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/amethyst_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/andesite_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/andesite_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/andesite_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/andesite_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/armor.json b/src/main/generated/data/minecraft/tags/item/item_group/armor.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/armor.json rename to src/main/generated/data/minecraft/tags/item/item_group/armor.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/axes.json b/src/main/generated/data/minecraft/tags/item/item_group/axes.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/axes.json rename to src/main/generated/data/minecraft/tags/item/item_group/axes.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/bamboo_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/bamboo_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/bamboo_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/bamboo_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/banner_patterns.json b/src/main/generated/data/minecraft/tags/item/item_group/banner_patterns.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/banner_patterns.json rename to src/main/generated/data/minecraft/tags/item/item_group/banner_patterns.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/banners.json b/src/main/generated/data/minecraft/tags/item/item_group/banners.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/banners.json rename to src/main/generated/data/minecraft/tags/item/item_group/banners.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/basalt_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/basalt_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/basalt_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/basalt_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/beds.json b/src/main/generated/data/minecraft/tags/item/item_group/beds.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/beds.json rename to src/main/generated/data/minecraft/tags/item/item_group/beds.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/birch_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/birch_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/birch_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/birch_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/blackstone_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/blackstone_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/blackstone_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/blackstone_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/boats.json b/src/main/generated/data/minecraft/tags/item/item_group/boats.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/boats.json rename to src/main/generated/data/minecraft/tags/item/item_group/boats.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/brewing_ingredients.json b/src/main/generated/data/minecraft/tags/item/item_group/brewing_ingredients.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/brewing_ingredients.json rename to src/main/generated/data/minecraft/tags/item/item_group/brewing_ingredients.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/brick_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/brick_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/brick_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/brick_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/buckets.json b/src/main/generated/data/minecraft/tags/item/item_group/buckets.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/buckets.json rename to src/main/generated/data/minecraft/tags/item/item_group/buckets.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/candles.json b/src/main/generated/data/minecraft/tags/item/item_group/candles.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/candles.json rename to src/main/generated/data/minecraft/tags/item/item_group/candles.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/cherry_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/cherry_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/cherry_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/cherry_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/cobbled_deepslate_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/cobbled_deepslate_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/cobbled_deepslate_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/cobbled_deepslate_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/cobblestone_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/cobblestone_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/cobblestone_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/cobblestone_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/concrete.json b/src/main/generated/data/minecraft/tags/item/item_group/concrete.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/concrete.json rename to src/main/generated/data/minecraft/tags/item/item_group/concrete.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/concrete_powder.json b/src/main/generated/data/minecraft/tags/item/item_group/concrete_powder.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/concrete_powder.json rename to src/main/generated/data/minecraft/tags/item/item_group/concrete_powder.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/copper_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/copper_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/copper_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/copper_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/copper_like_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/copper_like_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/copper_like_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/copper_like_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/coral.json b/src/main/generated/data/minecraft/tags/item/item_group/coral.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/coral.json rename to src/main/generated/data/minecraft/tags/item/item_group/coral.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/coral_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/coral_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/coral_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/coral_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/coral_fans.json b/src/main/generated/data/minecraft/tags/item/item_group/coral_fans.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/coral_fans.json rename to src/main/generated/data/minecraft/tags/item/item_group/coral_fans.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/crimson_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/crimson_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/crimson_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/crimson_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/cut_red_sandstone_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/cut_red_sandstone_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/cut_red_sandstone_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/cut_red_sandstone_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/cut_sandstone_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/cut_sandstone_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/cut_sandstone_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/cut_sandstone_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/dark_oak_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/dark_oak_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/dark_oak_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/dark_oak_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/dark_prismarine_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/dark_prismarine_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/dark_prismarine_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/dark_prismarine_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/deepslate_brick_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/deepslate_brick_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/deepslate_brick_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/deepslate_brick_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/deepslate_tiles_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/deepslate_tiles_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/deepslate_tiles_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/deepslate_tiles_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/diorite_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/diorite_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/diorite_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/diorite_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/dirt_like_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/dirt_like_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/dirt_like_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/dirt_like_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/dyes.json b/src/main/generated/data/minecraft/tags/item/item_group/dyes.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/dyes.json rename to src/main/generated/data/minecraft/tags/item/item_group/dyes.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/egg_like_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/egg_like_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/egg_like_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/egg_like_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/end_stone_brick_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/end_stone_brick_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/end_stone_brick_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/end_stone_brick_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/exposed_copper_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/exposed_copper_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/exposed_copper_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/exposed_copper_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/food.json b/src/main/generated/data/minecraft/tags/item/item_group/food.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/food.json rename to src/main/generated/data/minecraft/tags/item/item_group/food.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/froglights.json b/src/main/generated/data/minecraft/tags/item/item_group/froglights.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/froglights.json rename to src/main/generated/data/minecraft/tags/item/item_group/froglights.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/glass.json b/src/main/generated/data/minecraft/tags/item/item_group/glass.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/glass.json rename to src/main/generated/data/minecraft/tags/item/item_group/glass.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/glass_panes.json b/src/main/generated/data/minecraft/tags/item/item_group/glass_panes.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/glass_panes.json rename to src/main/generated/data/minecraft/tags/item/item_group/glass_panes.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/glazed_terracotta.json b/src/main/generated/data/minecraft/tags/item/item_group/glazed_terracotta.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/glazed_terracotta.json rename to src/main/generated/data/minecraft/tags/item/item_group/glazed_terracotta.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/gold_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/gold_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/gold_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/gold_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/granite_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/granite_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/granite_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/granite_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/grass_like_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/grass_like_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/grass_like_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/grass_like_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/heads.json b/src/main/generated/data/minecraft/tags/item/item_group/heads.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/heads.json rename to src/main/generated/data/minecraft/tags/item/item_group/heads.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/horse_armor.json b/src/main/generated/data/minecraft/tags/item/item_group/horse_armor.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/horse_armor.json rename to src/main/generated/data/minecraft/tags/item/item_group/horse_armor.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/ice_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/ice_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/ice_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/ice_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/infested_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/infested_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/infested_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/infested_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/iron_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/iron_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/iron_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/iron_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/jungle_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/jungle_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/jungle_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/jungle_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/lanterns.json b/src/main/generated/data/minecraft/tags/item/item_group/lanterns.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/lanterns.json rename to src/main/generated/data/minecraft/tags/item/item_group/lanterns.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/leaves.json b/src/main/generated/data/minecraft/tags/item/item_group/leaves.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/leaves.json rename to src/main/generated/data/minecraft/tags/item/item_group/leaves.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/light_emitting_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/light_emitting_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/light_emitting_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/light_emitting_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/log_like_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/log_like_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/log_like_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/log_like_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/mangrove_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/mangrove_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/mangrove_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/mangrove_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/minecarts.json b/src/main/generated/data/minecraft/tags/item/item_group/minecarts.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/minecarts.json rename to src/main/generated/data/minecraft/tags/item/item_group/minecarts.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/moss_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/moss_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/moss_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/moss_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/mossy_cobblestone_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/mossy_cobblestone_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/mossy_cobblestone_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/mossy_cobblestone_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/mossy_stone_brick_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/mossy_stone_brick_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/mossy_stone_brick_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/mossy_stone_brick_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/mud_brick_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/mud_brick_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/mud_brick_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/mud_brick_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/mushroom_like_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/mushroom_like_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/mushroom_like_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/mushroom_like_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/music_discs.json b/src/main/generated/data/minecraft/tags/item/item_group/music_discs.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/music_discs.json rename to src/main/generated/data/minecraft/tags/item/item_group/music_discs.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/nether_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/nether_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/nether_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/nether_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/nether_brick_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/nether_brick_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/nether_brick_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/nether_brick_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/oak_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/oak_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/oak_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/oak_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/ore_like_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/ore_like_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/ore_like_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/ore_like_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/oxidized_copper_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/oxidized_copper_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/oxidized_copper_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/oxidized_copper_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/plants.json b/src/main/generated/data/minecraft/tags/item/item_group/plants.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/plants.json rename to src/main/generated/data/minecraft/tags/item/item_group/plants.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/polished_andesite_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/polished_andesite_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/polished_andesite_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/polished_andesite_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/polished_blackstone_brick_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/polished_blackstone_brick_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/polished_blackstone_brick_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/polished_blackstone_brick_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/polished_blackstone_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/polished_blackstone_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/polished_blackstone_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/polished_blackstone_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/polished_deepslate_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/polished_deepslate_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/polished_deepslate_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/polished_deepslate_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/polished_diorite_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/polished_diorite_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/polished_diorite_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/polished_diorite_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/polished_granite_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/polished_granite_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/polished_granite_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/polished_granite_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/prismarine_brick_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/prismarine_brick_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/prismarine_brick_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/prismarine_brick_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/prismarine_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/prismarine_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/prismarine_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/prismarine_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/pumpkins.json b/src/main/generated/data/minecraft/tags/item/item_group/pumpkins.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/pumpkins.json rename to src/main/generated/data/minecraft/tags/item/item_group/pumpkins.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/purpur_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/purpur_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/purpur_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/purpur_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/quartz_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/quartz_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/quartz_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/quartz_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/rails.json b/src/main/generated/data/minecraft/tags/item/item_group/rails.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/rails.json rename to src/main/generated/data/minecraft/tags/item/item_group/rails.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/red_nether_brick_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/red_nether_brick_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/red_nether_brick_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/red_nether_brick_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/red_sandstone_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/red_sandstone_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/red_sandstone_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/red_sandstone_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/sand_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/sand_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/sand_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/sand_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/sandstone_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/sandstone_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/sandstone_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/sandstone_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/saplings.json b/src/main/generated/data/minecraft/tags/item/item_group/saplings.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/saplings.json rename to src/main/generated/data/minecraft/tags/item/item_group/saplings.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/sculk.json b/src/main/generated/data/minecraft/tags/item/item_group/sculk.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/sculk.json rename to src/main/generated/data/minecraft/tags/item/item_group/sculk.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/seeds.json b/src/main/generated/data/minecraft/tags/item/item_group/seeds.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/seeds.json rename to src/main/generated/data/minecraft/tags/item/item_group/seeds.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/shulker_boxes.json b/src/main/generated/data/minecraft/tags/item/item_group/shulker_boxes.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/shulker_boxes.json rename to src/main/generated/data/minecraft/tags/item/item_group/shulker_boxes.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/signs.json b/src/main/generated/data/minecraft/tags/item/item_group/signs.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/signs.json rename to src/main/generated/data/minecraft/tags/item/item_group/signs.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/smithing_templates.json b/src/main/generated/data/minecraft/tags/item/item_group/smithing_templates.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/smithing_templates.json rename to src/main/generated/data/minecraft/tags/item/item_group/smithing_templates.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/smooth_quartz_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/smooth_quartz_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/smooth_quartz_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/smooth_quartz_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/smooth_red_sandstone_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/smooth_red_sandstone_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/smooth_red_sandstone_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/smooth_red_sandstone_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/smooth_sandstone_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/smooth_sandstone_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/smooth_sandstone_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/smooth_sandstone_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/smooth_stone_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/smooth_stone_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/smooth_stone_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/smooth_stone_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/snow_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/snow_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/snow_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/snow_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/spawners.json b/src/main/generated/data/minecraft/tags/item/item_group/spawners.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/spawners.json rename to src/main/generated/data/minecraft/tags/item/item_group/spawners.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/spruce_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/spruce_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/spruce_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/spruce_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/stone_brick_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/stone_brick_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/stone_brick_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/stone_brick_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/stone_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/stone_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/stone_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/stone_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/stone_like_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/stone_like_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/stone_like_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/stone_like_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/stone_like_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/stone_like_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/stone_like_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/stone_like_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/swords.json b/src/main/generated/data/minecraft/tags/item/item_group/swords.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/swords.json rename to src/main/generated/data/minecraft/tags/item/item_group/swords.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/terracotta.json b/src/main/generated/data/minecraft/tags/item/item_group/terracotta.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/terracotta.json rename to src/main/generated/data/minecraft/tags/item/item_group/terracotta.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/tools.json b/src/main/generated/data/minecraft/tags/item/item_group/tools.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/tools.json rename to src/main/generated/data/minecraft/tags/item/item_group/tools.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/torches.json b/src/main/generated/data/minecraft/tags/item/item_group/torches.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/torches.json rename to src/main/generated/data/minecraft/tags/item/item_group/torches.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/tuff_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/tuff_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/tuff_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/tuff_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/warped_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/warped_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/warped_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/warped_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/water_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/water_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/water_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/water_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/waxed_copper_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/waxed_copper_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/waxed_copper_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/waxed_copper_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/waxed_exposed_copper_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/waxed_exposed_copper_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/waxed_exposed_copper_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/waxed_exposed_copper_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/waxed_oxidized_copper_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/waxed_oxidized_copper_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/waxed_oxidized_copper_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/waxed_oxidized_copper_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/waxed_weathered_copper_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/waxed_weathered_copper_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/waxed_weathered_copper_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/waxed_weathered_copper_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/weathered_copper_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/weathered_copper_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/weathered_copper_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/weathered_copper_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/wooden_building_blocks.json b/src/main/generated/data/minecraft/tags/item/item_group/wooden_building_blocks.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/wooden_building_blocks.json rename to src/main/generated/data/minecraft/tags/item/item_group/wooden_building_blocks.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/wool.json b/src/main/generated/data/minecraft/tags/item/item_group/wool.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/wool.json rename to src/main/generated/data/minecraft/tags/item/item_group/wool.json diff --git a/src/main/generated/data/minecraft/tags/items/item_group/wool_carpets.json b/src/main/generated/data/minecraft/tags/item/item_group/wool_carpets.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/item_group/wool_carpets.json rename to src/main/generated/data/minecraft/tags/item/item_group/wool_carpets.json diff --git a/src/main/generated/data/minecraft/tags/items/pig_tempt_items.json b/src/main/generated/data/minecraft/tags/item/pig_tempt_items.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/pig_tempt_items.json rename to src/main/generated/data/minecraft/tags/item/pig_tempt_items.json diff --git a/src/main/generated/data/minecraft/tags/items/prevents_mining_in_creative.json b/src/main/generated/data/minecraft/tags/item/prevents_mining_in_creative.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/prevents_mining_in_creative.json rename to src/main/generated/data/minecraft/tags/item/prevents_mining_in_creative.json diff --git a/src/main/generated/data/minecraft/tags/items/prevents_taking_potted_item_out.json b/src/main/generated/data/minecraft/tags/item/prevents_taking_potted_item_out.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/prevents_taking_potted_item_out.json rename to src/main/generated/data/minecraft/tags/item/prevents_taking_potted_item_out.json diff --git a/src/main/generated/data/minecraft/tags/items/repairs_chainmail_armor.json b/src/main/generated/data/minecraft/tags/item/repairs_chainmail_armor.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/repairs_chainmail_armor.json rename to src/main/generated/data/minecraft/tags/item/repairs_chainmail_armor.json diff --git a/src/main/generated/data/minecraft/tags/items/repairs_diamond_armor.json b/src/main/generated/data/minecraft/tags/item/repairs_diamond_armor.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/repairs_diamond_armor.json rename to src/main/generated/data/minecraft/tags/item/repairs_diamond_armor.json diff --git a/src/main/generated/data/minecraft/tags/items/repairs_diamond_tool.json b/src/main/generated/data/minecraft/tags/item/repairs_diamond_tool.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/repairs_diamond_tool.json rename to src/main/generated/data/minecraft/tags/item/repairs_diamond_tool.json diff --git a/src/main/generated/data/minecraft/tags/items/repairs_elytra.json b/src/main/generated/data/minecraft/tags/item/repairs_elytra.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/repairs_elytra.json rename to src/main/generated/data/minecraft/tags/item/repairs_elytra.json diff --git a/src/main/generated/data/minecraft/tags/items/repairs_golden_armor.json b/src/main/generated/data/minecraft/tags/item/repairs_golden_armor.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/repairs_golden_armor.json rename to src/main/generated/data/minecraft/tags/item/repairs_golden_armor.json diff --git a/src/main/generated/data/minecraft/tags/items/repairs_golden_tool.json b/src/main/generated/data/minecraft/tags/item/repairs_golden_tool.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/repairs_golden_tool.json rename to src/main/generated/data/minecraft/tags/item/repairs_golden_tool.json diff --git a/src/main/generated/data/minecraft/tags/items/repairs_iron_armor.json b/src/main/generated/data/minecraft/tags/item/repairs_iron_armor.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/repairs_iron_armor.json rename to src/main/generated/data/minecraft/tags/item/repairs_iron_armor.json diff --git a/src/main/generated/data/minecraft/tags/items/repairs_iron_tool.json b/src/main/generated/data/minecraft/tags/item/repairs_iron_tool.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/repairs_iron_tool.json rename to src/main/generated/data/minecraft/tags/item/repairs_iron_tool.json diff --git a/src/main/generated/data/minecraft/tags/items/repairs_leather_armor.json b/src/main/generated/data/minecraft/tags/item/repairs_leather_armor.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/repairs_leather_armor.json rename to src/main/generated/data/minecraft/tags/item/repairs_leather_armor.json diff --git a/src/main/generated/data/minecraft/tags/items/repairs_mace.json b/src/main/generated/data/minecraft/tags/item/repairs_mace.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/repairs_mace.json rename to src/main/generated/data/minecraft/tags/item/repairs_mace.json diff --git a/src/main/generated/data/minecraft/tags/items/repairs_netherite_armor.json b/src/main/generated/data/minecraft/tags/item/repairs_netherite_armor.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/repairs_netherite_armor.json rename to src/main/generated/data/minecraft/tags/item/repairs_netherite_armor.json diff --git a/src/main/generated/data/minecraft/tags/items/repairs_netherite_tool.json b/src/main/generated/data/minecraft/tags/item/repairs_netherite_tool.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/repairs_netherite_tool.json rename to src/main/generated/data/minecraft/tags/item/repairs_netherite_tool.json diff --git a/src/main/generated/data/minecraft/tags/items/repairs_shield.json b/src/main/generated/data/minecraft/tags/item/repairs_shield.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/repairs_shield.json rename to src/main/generated/data/minecraft/tags/item/repairs_shield.json diff --git a/src/main/generated/data/minecraft/tags/items/repairs_stone_tool.json b/src/main/generated/data/minecraft/tags/item/repairs_stone_tool.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/repairs_stone_tool.json rename to src/main/generated/data/minecraft/tags/item/repairs_stone_tool.json diff --git a/src/main/generated/data/minecraft/tags/items/repairs_turtle_armor.json b/src/main/generated/data/minecraft/tags/item/repairs_turtle_armor.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/repairs_turtle_armor.json rename to src/main/generated/data/minecraft/tags/item/repairs_turtle_armor.json diff --git a/src/main/generated/data/minecraft/tags/items/repairs_wooden_tool.json b/src/main/generated/data/minecraft/tags/item/repairs_wooden_tool.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/repairs_wooden_tool.json rename to src/main/generated/data/minecraft/tags/item/repairs_wooden_tool.json diff --git a/src/main/generated/data/minecraft/tags/items/shulker_boxes.json b/src/main/generated/data/minecraft/tags/item/shulker_boxes.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/shulker_boxes.json rename to src/main/generated/data/minecraft/tags/item/shulker_boxes.json diff --git a/src/main/generated/data/minecraft/tags/items/villager_gatherable_items.json b/src/main/generated/data/minecraft/tags/item/villager_gatherable_items.json similarity index 100% rename from src/main/generated/data/minecraft/tags/items/villager_gatherable_items.json rename to src/main/generated/data/minecraft/tags/item/villager_gatherable_items.json diff --git a/src/main/java/net/errorcraft/itematic/access/entity/LivingEntityAccess.java b/src/main/java/net/errorcraft/itematic/access/entity/LivingEntityAccess.java index c61c6cdc..f880d8a9 100644 --- a/src/main/java/net/errorcraft/itematic/access/entity/LivingEntityAccess.java +++ b/src/main/java/net/errorcraft/itematic/access/entity/LivingEntityAccess.java @@ -1,6 +1,7 @@ package net.errorcraft.itematic.access.entity; import net.errorcraft.itematic.item.ItemStackConsumer; +import net.minecraft.component.type.FoodComponent; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.registry.RegistryKey; @@ -14,7 +15,7 @@ public interface LivingEntityAccess { default ItemStack itematic$getAmmunition(ItemStack stack) { return ItemStack.EMPTY; } - default void itematic$eatFood(World world, ItemStack stack, ItemStackConsumer resultStackConsumer) {} + default void itematic$eatFood(World world, ItemStack stack, FoodComponent food, ItemStackConsumer resultStackConsumer) {} default void itematic$startUsingHand(Hand hand, int ticks) {} default int itematic$itemUsedTicks() { return 0; diff --git a/src/main/java/net/errorcraft/itematic/block/entity/SherdsUtil.java b/src/main/java/net/errorcraft/itematic/block/entity/SherdsUtil.java index 77df12e0..91e500aa 100644 --- a/src/main/java/net/errorcraft/itematic/block/entity/SherdsUtil.java +++ b/src/main/java/net/errorcraft/itematic/block/entity/SherdsUtil.java @@ -1,31 +1,19 @@ package net.errorcraft.itematic.block.entity; -import net.errorcraft.itematic.item.ItemKeys; import net.minecraft.block.entity.DecoratedPotBlockEntity; import net.minecraft.block.entity.Sherds; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtOps; -import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.RegistryWrapper; -import net.minecraft.registry.entry.RegistryEntry; public class SherdsUtil { private SherdsUtil() {} - public static ItemStack getStackWith(Sherds sherds, RegistryWrapper.WrapperLookup lookup) { - RegistryEntry.Reference entry = lookup.getWrapperOrThrow(RegistryKeys.ITEM).getOrThrow(ItemKeys.DECORATED_POT); - ItemStack stack = new ItemStack(entry); - stack.set(DataComponentTypes.POT_DECORATIONS, sherds); - return stack; - } - public static Sherds fromNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup lookup) { if (nbt == null || !nbt.contains(DecoratedPotBlockEntity.SHERDS_NBT_KEY)) { return Sherds.DEFAULT; } + return Sherds.CODEC.parse(lookup.getOps(NbtOps.INSTANCE), nbt.get(DecoratedPotBlockEntity.SHERDS_NBT_KEY)) .result() .orElse(Sherds.DEFAULT); diff --git a/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/SmallFireballEntityInitializer.java b/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/SmallFireballEntityInitializer.java index 0786f454..8dec1a12 100644 --- a/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/SmallFireballEntityInitializer.java +++ b/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/SmallFireballEntityInitializer.java @@ -31,9 +31,10 @@ public SmallFireballEntity create(ActionContext context) { double velocityY = random.nextTriangular(direction.getOffsetY(), VELOCITY_DEVIATION); double velocityZ = random.nextTriangular(direction.getOffsetZ(), VELOCITY_DEVIATION); if (context.entity(ActionContextParameter.THIS).orElse(null) instanceof LivingEntity owner) { - return new SmallFireballEntity(world, owner, velocityX, velocityY, velocityZ); + return new SmallFireballEntity(world, owner, new Vec3d(velocityX, velocityY, velocityZ)); } + Vec3d pos = context.position(ActionContextParameter.TARGET); - return new SmallFireballEntity(world, pos.getX(), pos.getY(), pos.getZ(), velocityX, velocityY, velocityZ); + return new SmallFireballEntity(world, pos.getX(), pos.getY(), pos.getZ(), new Vec3d(velocityX, velocityY, velocityZ)); } } diff --git a/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/TridentEntityInitializer.java b/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/TridentEntityInitializer.java index 489519c3..b59c0a47 100644 --- a/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/TridentEntityInitializer.java +++ b/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/TridentEntityInitializer.java @@ -28,7 +28,7 @@ public TridentEntity create(ActionContext context) { ItemStack stack = context.stack(); LivingEntity user = context.livingEntity(ActionContextParameter.THIS).orElse(null); float spinAttackStrength = user != null ? - EnchantmentHelper.getTridentSpinAttackStrength(context.world(), stack, user) : + EnchantmentHelper.getTridentSpinAttackStrength(user) : 0.0f; if (this.preventSpawnFromRiptide && spinAttackStrength > 0.0f) { return null; diff --git a/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/WindChargeEntityInitializer.java b/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/WindChargeEntityInitializer.java index d5dca7f5..7a35bf88 100644 --- a/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/WindChargeEntityInitializer.java +++ b/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/WindChargeEntityInitializer.java @@ -55,6 +55,6 @@ private static WindChargeEntity spawnFromSide(ServerWorld world, Direction direc double velocityX = random.nextTriangular(direction.getOffsetX(), VELOCITY_DEVIATION); double velocityY = random.nextTriangular(direction.getOffsetY(), VELOCITY_DEVIATION); double velocityZ = random.nextTriangular(direction.getOffsetZ(), VELOCITY_DEVIATION); - return new WindChargeEntity(world, position.getX(), position.getY(), position.getZ(), velocityX, velocityY, velocityZ); + return new WindChargeEntity(world, position.getX(), position.getY(), position.getZ(), new Vec3d(velocityX, velocityY, velocityZ)); } } diff --git a/src/main/java/net/errorcraft/itematic/item/ItemUtil.java b/src/main/java/net/errorcraft/itematic/item/ItemUtil.java index 21010587..59e1a231 100644 --- a/src/main/java/net/errorcraft/itematic/item/ItemUtil.java +++ b/src/main/java/net/errorcraft/itematic/item/ItemUtil.java @@ -32,7 +32,6 @@ import net.errorcraft.itematic.item.smithing.template.SmithingTemplate; import net.errorcraft.itematic.item.smithing.template.SmithingTemplates; import net.errorcraft.itematic.loot.predicate.SideCheckPredicate; -import net.errorcraft.itematic.mixin.block.DecoratedPotPatternsAccessor; import net.errorcraft.itematic.mixin.component.type.BundleContentsComponentAccessor; import net.errorcraft.itematic.mixin.item.*; import net.errorcraft.itematic.potion.PotionKeys; @@ -50,6 +49,8 @@ import net.errorcraft.itematic.world.action.sequence.handler.handlers.UncheckedSequenceHandler; import net.minecraft.block.Block; import net.minecraft.block.Blocks; +import net.minecraft.block.DecoratedPotPattern; +import net.minecraft.block.DecoratedPotPatterns; import net.minecraft.client.color.world.FoliageColors; import net.minecraft.component.ComponentChanges; import net.minecraft.component.DataComponentTypes; @@ -139,7 +140,7 @@ private static class Bootstrapper { private final RegistryEntryLookup pointers; private final RegistryEntryLookup actions; private final RegistryEntryLookup smithingTemplates; - private final RegistryEntryLookup decoratedPotPatterns; + private final RegistryEntryLookup decoratedPotPatterns; private final RegistryEntryLookup statusEffects; private final RegistryEntryLookup potions; private final RegistryEntryLookup enchantments; @@ -9871,145 +9872,145 @@ private void bootstrapDecoratedPotPatterns() { ItemBase.Builder.forItem(ItemKeys.BRICK).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.decoratedPotSide()))) + .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatterns.BLANK))) .build() )); this.registerable.register(ItemKeys.ANGLER_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.ANGLER_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.angler()))) + .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatterns.ANGLER))) .build() )); this.registerable.register(ItemKeys.ARCHER_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.ARCHER_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.archer()))) + .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatterns.ARCHER))) .build() )); this.registerable.register(ItemKeys.ARMS_UP_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.ARMS_UP_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.armsUp()))) + .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatterns.ARMS_UP))) .build() )); this.registerable.register(ItemKeys.BLADE_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.BLADE_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.blade()))) + .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatterns.BLADE))) .build() )); this.registerable.register(ItemKeys.BREWER_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.BREWER_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.brewer()))) + .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatterns.BREWER))) .build() )); this.registerable.register(ItemKeys.BURN_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.BURN_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.burn()))) + .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatterns.BURN))) .build() )); this.registerable.register(ItemKeys.DANGER_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.DANGER_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.danger()))) + .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatterns.DANGER))) .build() )); this.registerable.register(ItemKeys.EXPLORER_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.EXPLORER_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.explorer()))) + .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatterns.EXPLORER))) .build() )); this.registerable.register(ItemKeys.FLOW_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.FLOW_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.flow()))) + .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatterns.FLOW))) .build() )); this.registerable.register(ItemKeys.FRIEND_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.FRIEND_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.friend()))) + .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatterns.FRIEND))) .build() )); this.registerable.register(ItemKeys.GUSTER_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.GUSTER_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.guster()))) + .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatterns.GUSTER))) .build() )); this.registerable.register(ItemKeys.HEART_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.HEART_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.heart()))) + .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatterns.HEART))) .build() )); this.registerable.register(ItemKeys.HEARTBREAK_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.HEARTBREAK_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.heartbreak()))) + .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatterns.HEARTBREAK))) .build() )); this.registerable.register(ItemKeys.HOWL_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.HOWL_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.howl()))) + .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatterns.HOWL))) .build() )); this.registerable.register(ItemKeys.MINER_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.MINER_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.miner()))) + .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatterns.MINER))) .build() )); this.registerable.register(ItemKeys.MOURNER_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.MOURNER_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.mourner()))) + .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatterns.MOURNER))) .build() )); this.registerable.register(ItemKeys.PLENTY_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.PLENTY_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.plenty()))) + .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatterns.PLENTY))) .build() )); this.registerable.register(ItemKeys.PRIZE_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.PRIZE_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.prize()))) + .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatterns.PRIZE))) .build() )); this.registerable.register(ItemKeys.SCRAPE_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.SCRAPE_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.scrape()))) + .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatterns.SCRAPE))) .build() )); this.registerable.register(ItemKeys.SHEAF_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.SHEAF_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.sheaf()))) + .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatterns.SHEAF))) .build() )); this.registerable.register(ItemKeys.SHELTER_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.SHELTER_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.shelter()))) + .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatterns.SHELTER))) .build() )); this.registerable.register(ItemKeys.SKULL_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.SKULL_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.skull()))) + .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatterns.SKULL))) .build() )); this.registerable.register(ItemKeys.SNORT_POTTERY_SHERD, create( ItemBase.Builder.forItem(ItemKeys.SNORT_POTTERY_SHERD).build(), ItemComponentSet.builder() - .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatternsAccessor.snort()))) + .with(DecoratedPotPatternItemComponent.of(this.decoratedPotPatterns.getOrThrow(DecoratedPotPatterns.SNORT))) .build() )); } diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/DecoratedPotPatternItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/DecoratedPotPatternItemComponent.java index 50bcbffa..880a357c 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/DecoratedPotPatternItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/DecoratedPotPatternItemComponent.java @@ -5,16 +5,17 @@ import net.errorcraft.itematic.item.component.ItemComponent; import net.errorcraft.itematic.item.component.ItemComponentType; import net.errorcraft.itematic.item.component.ItemComponentTypes; +import net.minecraft.block.DecoratedPotPattern; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.registry.entry.RegistryFixedCodec; -public record DecoratedPotPatternItemComponent(RegistryEntry pattern) implements ItemComponent { +public record DecoratedPotPatternItemComponent(RegistryEntry pattern) implements ItemComponent { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( RegistryFixedCodec.of(RegistryKeys.DECORATED_POT_PATTERN).fieldOf("pattern").forGetter(DecoratedPotPatternItemComponent::pattern) ).apply(instance, DecoratedPotPatternItemComponent::new)); - public static ItemComponent[] of(RegistryEntry pattern) { + public static ItemComponent[] of(RegistryEntry pattern) { return new ItemComponent[] { StackableItemComponent.of(64), new DecoratedPotPatternItemComponent(pattern) diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/FoodItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/FoodItemComponent.java index 8b88d0a4..72ee669d 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/FoodItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/FoodItemComponent.java @@ -16,6 +16,7 @@ import net.minecraft.world.World; import java.util.List; +import java.util.Optional; public record FoodItemComponent(int nutrition, float saturation, boolean alwaysEdible, List effects) implements ItemComponent { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( @@ -41,12 +42,15 @@ public Codec codec() { @Override public void finishUsing(World world, LivingEntity user, ItemStack stack, int usedTicks, ItemStackConsumer resultStackConsumer) { - user.itematic$eatFood(world, stack, resultStackConsumer); + FoodComponent food = stack.get(DataComponentTypes.FOOD); + if (food != null) { + user.itematic$eatFood(world, stack, food, resultStackConsumer); + } } @Override public void addComponents(ComponentMap.Builder builder) { - builder.add(DataComponentTypes.FOOD, new FoodComponent(this.nutrition, this.saturation, false, 1.0f, this.effects)); + builder.add(DataComponentTypes.FOOD, new FoodComponent(this.nutrition, this.saturation, false, 1.0f, Optional.empty(), this.effects)); } public boolean mayStartUsing(PlayerEntity user) { diff --git a/src/main/java/net/errorcraft/itematic/item/dispense/behavior/DispenseBehavior.java b/src/main/java/net/errorcraft/itematic/item/dispense/behavior/DispenseBehavior.java index 260a2daf..4aff2f9d 100644 --- a/src/main/java/net/errorcraft/itematic/item/dispense/behavior/DispenseBehavior.java +++ b/src/main/java/net/errorcraft/itematic/item/dispense/behavior/DispenseBehavior.java @@ -67,9 +67,11 @@ protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { if (result.isEmpty()) { return super.dispenseSilently(pointer, stack); } + if (result.get()) { return this.succeed(pointer, stack, stackReference.get()); } + return this.fail(pointer, stack); } @@ -77,15 +79,20 @@ private ItemStack succeed(BlockPointer pointer, ItemStack oldStack, ItemStack ne if (oldStack == newStack) { return oldStack; } + if (newStack.isEmpty()) { return super.dispenseSilently(pointer, oldStack); } + if (oldStack.isEmpty()) { return newStack; } - if (pointer.blockEntity().addToFirstFreeSlot(newStack) < 0) { - super.dispenseSilently(pointer, newStack); + + ItemStack remainingStack = pointer.blockEntity().addToFirstFreeSlot(newStack); + if (!remainingStack.isEmpty()) { + super.dispenseSilently(pointer, remainingStack); } + return oldStack; } @@ -93,6 +100,7 @@ private ItemStack fail(BlockPointer pointer, ItemStack stack) { if (this.dispenseAsItemOnFailure) { return super.dispenseSilently(pointer, stack); } + this.setSuccess(false); return stack; } diff --git a/src/main/java/net/errorcraft/itematic/item/shooter/method/methods/ChargeableShooterMethod.java b/src/main/java/net/errorcraft/itematic/item/shooter/method/methods/ChargeableShooterMethod.java index 90b75542..58681cff 100644 --- a/src/main/java/net/errorcraft/itematic/item/shooter/method/methods/ChargeableShooterMethod.java +++ b/src/main/java/net/errorcraft/itematic/item/shooter/method/methods/ChargeableShooterMethod.java @@ -12,6 +12,7 @@ import net.errorcraft.itematic.mixin.item.CrossbowItemAccessor; import net.errorcraft.itematic.mixin.item.RangedWeaponItemAccessor; import net.errorcraft.itematic.serialization.ItematicCodecs; +import net.minecraft.SharedConstants; import net.minecraft.advancement.criterion.Criteria; import net.minecraft.component.ComponentMap; import net.minecraft.component.DataComponentTypes; @@ -93,7 +94,7 @@ public void hold(ShooterItemComponent shooter, ItemStack stack, World world, Liv return; } - int chargeTime = CrossbowItem.getPullTime(stack, user); + int chargeTime = getChargeTime(stack, user); if (usedTicks >= chargeTime) { return; } @@ -111,7 +112,7 @@ public void hold(ShooterItemComponent shooter, ItemStack stack, World world, Liv @Override public void stop(ShooterItemComponent shooter, ItemStack stack, World world, LivingEntity user, int usedTicks) { - if (usedTicks < CrossbowItem.getPullTime(stack, user)) { + if (usedTicks < getChargeTime(stack, user)) { return; } @@ -140,12 +141,12 @@ public OptionalInt useDuration(ItemStack stack, LivingEntity user) { return OptionalInt.empty(); } - return OptionalInt.of(CrossbowItem.getPullTime(stack, user) + EXTRA_USE_TIME); + return OptionalInt.of(getChargeTime(stack, user) + EXTRA_USE_TIME); } @Override public float pullProgress(ItemStack stack, LivingEntity user, int usedTicks) { - return ((float)usedTicks) / CrossbowItem.getPullTime(stack, user); + return ((float)usedTicks) / getChargeTime(stack, user); } public void shoot(ShooterItemComponent shooter, World world, LivingEntity user, Hand hand, ItemStack stack, float power, float divergence, @Nullable LivingEntity livingEntity) { @@ -165,6 +166,16 @@ public void shoot(ShooterItemComponent shooter, World world, LivingEntity user, } } + public static int getChargeTime(ItemStack stack, LivingEntity user) { + Float defaultChargeTime = stack.get(ItematicDataComponentTypes.SHOOTER_DEFAULT_CHARGE_TIME); + if (defaultChargeTime == null) { + return 0; + } + + float chargeTime = EnchantmentHelper.getCrossbowChargeTime(user, defaultChargeTime); + return MathHelper.floor(chargeTime * SharedConstants.TICKS_PER_SECOND); + } + private static int getChargeTimeAt(int chargeTime, float progress) { return MathHelper.floor(progress * chargeTime); } diff --git a/src/main/java/net/errorcraft/itematic/item/use/provider/providers/PlayableIntegerProvider.java b/src/main/java/net/errorcraft/itematic/item/use/provider/providers/PlayableIntegerProvider.java index 22aa7705..9ed17f48 100644 --- a/src/main/java/net/errorcraft/itematic/item/use/provider/providers/PlayableIntegerProvider.java +++ b/src/main/java/net/errorcraft/itematic/item/use/provider/providers/PlayableIntegerProvider.java @@ -13,11 +13,13 @@ import java.util.OptionalInt; -public record PlayableIntegerProvider() implements IntegerProvider { +public class PlayableIntegerProvider implements IntegerProvider { public static final PlayableIntegerProvider INSTANCE = new PlayableIntegerProvider(); public static final MapCodec CODEC = MapCodec.unit(INSTANCE); public static final PacketCodec PACKET_CODEC = PacketCodec.unit(INSTANCE); + private PlayableIntegerProvider() {} + @Override public IntegerProviderType type() { return IntegerProviderTypes.PLAYABLE; diff --git a/src/main/java/net/errorcraft/itematic/item/use/provider/providers/ShooterIntegerProvider.java b/src/main/java/net/errorcraft/itematic/item/use/provider/providers/ShooterIntegerProvider.java index 0be2e733..f222b9ec 100644 --- a/src/main/java/net/errorcraft/itematic/item/use/provider/providers/ShooterIntegerProvider.java +++ b/src/main/java/net/errorcraft/itematic/item/use/provider/providers/ShooterIntegerProvider.java @@ -12,11 +12,13 @@ import java.util.OptionalInt; -public record ShooterIntegerProvider() implements IntegerProvider { +public class ShooterIntegerProvider implements IntegerProvider { public static final ShooterIntegerProvider INSTANCE = new ShooterIntegerProvider(); public static final MapCodec CODEC = MapCodec.unit(INSTANCE); public static final PacketCodec PACKET_CODEC = PacketCodec.unit(INSTANCE); + private ShooterIntegerProvider() {} + @Override public IntegerProviderType type() { return IntegerProviderTypes.SHOOTER; diff --git a/src/main/java/net/errorcraft/itematic/item/use/provider/providers/TridentIntegerProvider.java b/src/main/java/net/errorcraft/itematic/item/use/provider/providers/TridentIntegerProvider.java index 8de6dc0b..00cb91aa 100644 --- a/src/main/java/net/errorcraft/itematic/item/use/provider/providers/TridentIntegerProvider.java +++ b/src/main/java/net/errorcraft/itematic/item/use/provider/providers/TridentIntegerProvider.java @@ -11,15 +11,16 @@ import net.minecraft.entity.LivingEntity; import net.minecraft.item.ItemStack; import net.minecraft.network.codec.PacketCodec; -import net.minecraft.server.world.ServerWorld; import java.util.OptionalInt; -public record TridentIntegerProvider() implements IntegerProvider { +public class TridentIntegerProvider implements IntegerProvider { public static final TridentIntegerProvider INSTANCE = new TridentIntegerProvider(); public static final MapCodec CODEC = MapCodec.unit(INSTANCE); public static final PacketCodec PACKET_CODEC = PacketCodec.unit(INSTANCE); + private TridentIntegerProvider() {} + @Override public IntegerProviderType type() { return IntegerProviderTypes.TRIDENT; @@ -30,11 +31,12 @@ public OptionalInt get(ItemStack stack, LivingEntity user) { if (mayStartUsing(stack, user)) { return OptionalInt.of(UseDurationDataComponent.INDEFINITE_USE_DURATION); } + return OptionalInt.empty(); } private static boolean mayStartUsing(ItemStack stack, LivingEntity user) { - if (user.getWorld() instanceof ServerWorld serverWorld && EnchantmentHelper.getTridentSpinAttackStrength(serverWorld, stack, user) > 0.0f && !user.isTouchingWaterOrRain()) { + if (EnchantmentHelper.getTridentSpinAttackStrength(user) > 0.0f && !user.isTouchingWaterOrRain()) { return false; } diff --git a/src/main/java/net/errorcraft/itematic/mixin/block/DecoratedPotPatternsAccessor.java b/src/main/java/net/errorcraft/itematic/mixin/block/DecoratedPotPatternsAccessor.java deleted file mode 100644 index 3216e2f5..00000000 --- a/src/main/java/net/errorcraft/itematic/mixin/block/DecoratedPotPatternsAccessor.java +++ /dev/null @@ -1,154 +0,0 @@ -package net.errorcraft.itematic.mixin.block; - -import net.minecraft.block.DecoratedPotPatterns; -import net.minecraft.registry.RegistryKey; -import org.jetbrains.annotations.Contract; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(DecoratedPotPatterns.class) -public interface DecoratedPotPatternsAccessor { - @Accessor("DECORATED_POT_SIDE_KEY") - @Contract - static RegistryKey decoratedPotSide() { - throw new AssertionError(); - } - - @Accessor("ANGLER_POTTERY_PATTERN_KEY") - @Contract - static RegistryKey angler() { - throw new AssertionError(); - } - - @Accessor("ARCHER_POTTERY_PATTERN_KEY") - @Contract - static RegistryKey archer() { - throw new AssertionError(); - } - - @Accessor("ARMS_UP_POTTERY_PATTERN_KEY") - @Contract - static RegistryKey armsUp() { - throw new AssertionError(); - } - - @Accessor("BLADE_POTTERY_PATTERN_KEY") - @Contract - static RegistryKey blade() { - throw new AssertionError(); - } - - @Accessor("BREWER_POTTERY_PATTERN_KEY") - @Contract - static RegistryKey brewer() { - throw new AssertionError(); - } - - @Accessor("BURN_POTTERY_PATTERN_KEY") - @Contract - static RegistryKey burn() { - throw new AssertionError(); - } - - @Accessor("DANGER_POTTERY_PATTERN_KEY") - @Contract - static RegistryKey danger() { - throw new AssertionError(); - } - - @Accessor("EXPLORER_POTTERY_PATTERN_KEY") - @Contract - static RegistryKey explorer() { - throw new AssertionError(); - } - - @Accessor("FLOW_POTTERY_PATTERN_KEY") - @Contract - static RegistryKey flow() { - throw new AssertionError(); - } - - @Accessor("FRIEND_POTTERY_PATTERN_KEY") - @Contract - static RegistryKey friend() { - throw new AssertionError(); - } - - @Accessor("GUSTER_POTTERY_PATTERN_KEY") - @Contract - static RegistryKey guster() { - throw new AssertionError(); - } - - @Accessor("HEART_POTTERY_PATTERN_KEY") - @Contract - static RegistryKey heart() { - throw new AssertionError(); - } - - @Accessor("HEARTBREAK_POTTERY_PATTERN_KEY") - @Contract - static RegistryKey heartbreak() { - throw new AssertionError(); - } - - @Accessor("HOWL_POTTERY_PATTERN_KEY") - @Contract - static RegistryKey howl() { - throw new AssertionError(); - } - - @Accessor("MINER_POTTERY_PATTERN_KEY") - @Contract - static RegistryKey miner() { - throw new AssertionError(); - } - - @Accessor("MOURNER_POTTERY_PATTERN_KEY") - @Contract - static RegistryKey mourner() { - throw new AssertionError(); - } - - @Accessor("PLENTY_POTTERY_PATTERN_KEY") - @Contract - static RegistryKey plenty() { - throw new AssertionError(); - } - - @Accessor("POTTERY_PATTERN_PRIZE_KEY") - @Contract - static RegistryKey prize() { - throw new AssertionError(); - } - - @Accessor("SCRAPE_POTTERY_PATTERN_KEY") - @Contract - static RegistryKey scrape() { - throw new AssertionError(); - } - - @Accessor("SHEAF_POTTERY_PATTERN_KEY") - @Contract - static RegistryKey sheaf() { - throw new AssertionError(); - } - - @Accessor("SHELTER_POTTERY_PATTERN_KEY") - @Contract - static RegistryKey shelter() { - throw new AssertionError(); - } - - @Accessor("SKULL_POTTERY_PATTERN_KEY") - @Contract - static RegistryKey skull() { - throw new AssertionError(); - } - - @Accessor("SNORT_POTTERY_PATTERN_KEY") - @Contract - static RegistryKey snort() { - throw new AssertionError(); - } -} diff --git a/src/main/java/net/errorcraft/itematic/mixin/block/TntBlockExtender.java b/src/main/java/net/errorcraft/itematic/mixin/block/TntBlockExtender.java index f3d43f89..f77d803e 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/block/TntBlockExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/block/TntBlockExtender.java @@ -20,7 +20,7 @@ public class TntBlockExtender { slice = @Slice( from = @At( value = "INVOKE", - target = "Lnet/minecraft/entity/player/PlayerEntity;isCreative()Z" + target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z" ) ) ) diff --git a/src/main/java/net/errorcraft/itematic/mixin/component/type/FoodComponentExtender.java b/src/main/java/net/errorcraft/itematic/mixin/component/type/FoodComponentExtender.java new file mode 100644 index 00000000..a0515fdf --- /dev/null +++ b/src/main/java/net/errorcraft/itematic/mixin/component/type/FoodComponentExtender.java @@ -0,0 +1,24 @@ +package net.errorcraft.itematic.mixin.component.type; + +import net.minecraft.component.type.FoodComponent; +import net.minecraft.item.ItemConvertible; +import net.minecraft.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +public class FoodComponentExtender { + @Mixin(FoodComponent.Builder.class) + public static class BuilderExtender { + @Redirect( + method = "usingConvertsTo", + at = @At( + value = "NEW", + target = "(Lnet/minecraft/item/ItemConvertible;)Lnet/minecraft/item/ItemStack;" + ) + ) + private ItemStack newItemStackReturnEmptyStack(ItemConvertible item) { + return ItemStack.EMPTY; + } + } +} diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/LivingEntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/LivingEntityExtender.java index 45631f5a..51597db8 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/LivingEntityExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/LivingEntityExtender.java @@ -17,6 +17,7 @@ import net.errorcraft.itematic.item.event.ItemEvents; import net.errorcraft.itematic.world.action.context.ActionContext; import net.errorcraft.itematic.world.action.context.parameter.ActionContextParameter; +import net.minecraft.component.type.FoodComponent; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.entity.LivingEntity; @@ -78,7 +79,7 @@ public abstract class LivingEntityExtender extends Entity implements LivingEntit public abstract boolean isUsingItem(); @Shadow - public abstract ItemStack eatFood(World world, ItemStack stack); + public abstract ItemStack eatFood(World world, ItemStack stack, FoodComponent foodComponent); @Shadow public abstract AttributeContainer getAttributes(); @@ -462,8 +463,8 @@ public boolean disablesShield() { } @Override - public void itematic$eatFood(World world, ItemStack stack, ItemStackConsumer resultStackConsumer) { - this.eatFood(world, stack); + public void itematic$eatFood(World world, ItemStack stack, FoodComponent food, ItemStackConsumer resultStackConsumer) { + this.eatFood(world, stack, food); if (world instanceof ServerWorld serverWorld) { ActionContext context = ActionContext.builder(serverWorld, stack, resultStackConsumer, this.getActiveHand()) .entityPosition(ActionContextParameter.THIS, this) diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/ai/brain/task/CrossbowAttackTaskExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/ai/brain/task/CrossbowAttackTaskExtender.java index cb8894ad..97e3f943 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/ai/brain/task/CrossbowAttackTaskExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/ai/brain/task/CrossbowAttackTaskExtender.java @@ -1,11 +1,14 @@ package net.errorcraft.itematic.mixin.entity.ai.brain.task; +import com.llamalad7.mixinextras.sugar.Local; import net.errorcraft.itematic.entity.projectile.ItematicProjectileUtil; import net.errorcraft.itematic.item.ItemKeys; +import net.errorcraft.itematic.item.shooter.method.methods.ChargeableShooterMethod; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.ai.brain.task.CrossbowAttackTask; import net.minecraft.entity.mob.MobEntity; import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.util.Hand; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -14,7 +17,10 @@ @Mixin(CrossbowAttackTask.class) public class CrossbowAttackTaskExtender { @Redirect( - method = { "shouldRun(Lnet/minecraft/server/world/ServerWorld;Lnet/minecraft/entity/mob/MobEntity;)Z", "finishRunning(Lnet/minecraft/server/world/ServerWorld;Lnet/minecraft/entity/mob/MobEntity;J)V" }, + method = { + "shouldRun(Lnet/minecraft/server/world/ServerWorld;Lnet/minecraft/entity/mob/MobEntity;)Z", + "finishRunning(Lnet/minecraft/server/world/ServerWorld;Lnet/minecraft/entity/mob/MobEntity;J)V" + }, at = @At( value = "INVOKE", target = "Lnet/minecraft/entity/mob/MobEntity;isHolding(Lnet/minecraft/item/Item;)Z" @@ -34,4 +40,15 @@ private boolean isHoldingForCrossbowUseRegistryKeyCheck(MobEntity instance, Item private Hand getHandPossiblyHoldingForCrossbowUseRegistryKey(LivingEntity entity, Item item) { return ItematicProjectileUtil.getHandPossiblyHolding(entity, ItemKeys.CROSSBOW); } + + @Redirect( + method = "tickState", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/item/CrossbowItem;getPullTime(Lnet/minecraft/entity/LivingEntity;)I" + ) + ) + private int getPullTimeUseItemComponent(LivingEntity user, @Local ItemStack usedStack) { + return ChargeableShooterMethod.getChargeTime(usedStack, user); + } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/ai/goal/CrossbowAttackGoalExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/ai/goal/CrossbowAttackGoalExtender.java index befc0fbb..6fdcb9fd 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/ai/goal/CrossbowAttackGoalExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/ai/goal/CrossbowAttackGoalExtender.java @@ -1,11 +1,14 @@ package net.errorcraft.itematic.mixin.entity.ai.goal; +import com.llamalad7.mixinextras.sugar.Local; import net.errorcraft.itematic.entity.projectile.ItematicProjectileUtil; import net.errorcraft.itematic.item.ItemKeys; +import net.errorcraft.itematic.item.shooter.method.methods.ChargeableShooterMethod; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.ai.goal.CrossbowAttackGoal; import net.minecraft.entity.mob.HostileEntity; import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.util.Hand; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -34,4 +37,15 @@ private boolean isHoldingForCrossbowUseRegistryKeyCheck(HostileEntity instance, private Hand getHandPossiblyHoldingForCrossbowUseRegistryKey(LivingEntity entity, Item item) { return ItematicProjectileUtil.getHandPossiblyHolding(entity, ItemKeys.CROSSBOW); } + + @Redirect( + method = "tick", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/item/CrossbowItem;getPullTime(Lnet/minecraft/entity/LivingEntity;)I" + ) + ) + private int getPullTimeUseItemComponent(LivingEntity user, @Local ItemStack usedStack) { + return ChargeableShooterMethod.getChargeTime(usedStack, user); + } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/item/CrossbowItemExtender.java b/src/main/java/net/errorcraft/itematic/mixin/item/CrossbowItemExtender.java index ce42882c..15676efd 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/item/CrossbowItemExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/item/CrossbowItemExtender.java @@ -1,14 +1,13 @@ package net.errorcraft.itematic.mixin.item; -import com.llamalad7.mixinextras.sugar.Share; -import com.llamalad7.mixinextras.sugar.ref.LocalFloatRef; -import net.errorcraft.itematic.component.ItematicDataComponentTypes; import net.errorcraft.itematic.item.component.ItemComponentTypes; import net.minecraft.entity.LivingEntity; import net.minecraft.item.CrossbowItem; import net.minecraft.item.ItemStack; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(CrossbowItem.class) @@ -38,29 +37,4 @@ private static ItemStack getAmmunitionUseItemComponent(LivingEntity instance, It return ItemStack.EMPTY; } - - @Inject( - method = "getPullTime", - at = @At("HEAD"), - cancellable = true - ) - private static void checkAndStoreDefaultChargeTime(ItemStack stack, LivingEntity user, CallbackInfoReturnable info, @Share("defaultChargeTime") LocalFloatRef defaultChargeTime) { - Float possibleDefaultChargeTime = stack.get(ItematicDataComponentTypes.SHOOTER_DEFAULT_CHARGE_TIME); - if (possibleDefaultChargeTime == null) { - info.setReturnValue(0); - return; - } - - defaultChargeTime.set(possibleDefaultChargeTime); - } - - @ModifyConstant( - method = "getPullTime", - constant = @Constant( - floatValue = 1.25f - ) - ) - private static float defaultChargeTimeUseDataComponent(float constant, @Share("defaultChargeTime") LocalFloatRef defaultChargeTime) { - return defaultChargeTime.get(); - } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/item/KnowledgeBookItemExtender.java b/src/main/java/net/errorcraft/itematic/mixin/item/KnowledgeBookItemExtender.java index 8ce25a40..0893ef70 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/item/KnowledgeBookItemExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/item/KnowledgeBookItemExtender.java @@ -1,13 +1,11 @@ package net.errorcraft.itematic.mixin.item; import com.llamalad7.mixinextras.sugar.Local; -import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.KnowledgeBookItem; import net.minecraft.stat.Stat; import net.minecraft.stat.StatType; -import net.minecraft.util.Hand; import net.minecraft.util.TypedActionResult; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -15,17 +13,6 @@ @Mixin(KnowledgeBookItem.class) public class KnowledgeBookItemExtender { - @Redirect( - method = "use", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/entity/player/PlayerEntity;setStackInHand(Lnet/minecraft/util/Hand;Lnet/minecraft/item/ItemStack;)V" - ) - ) - private void setStackInHandDecrementUsedStackInstead(PlayerEntity instance, Hand hand, ItemStack stack, @Local ItemStack usedStack) { - usedStack.decrement(1); - } - @Redirect( method = "use", at = @At( @@ -33,7 +20,7 @@ private void setStackInHandDecrementUsedStackInstead(PlayerEntity instance, Hand target = "Lnet/minecraft/util/TypedActionResult;fail(Ljava/lang/Object;)Lnet/minecraft/util/TypedActionResult;" ) ) - private TypedActionResult failResultPassInstead(T data, @Local ItemStack usedStack) { + private TypedActionResult failResultPassInstead(T data) { return TypedActionResult.pass(data); } diff --git a/src/main/java/net/errorcraft/itematic/mixin/loot/function/SetEnchantmentsLootFunctionExtender.java b/src/main/java/net/errorcraft/itematic/mixin/loot/function/SetEnchantmentsLootFunctionExtender.java index 79a66521..dc44adae 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/loot/function/SetEnchantmentsLootFunctionExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/loot/function/SetEnchantmentsLootFunctionExtender.java @@ -35,10 +35,10 @@ private boolean isOfForBookUseItemComponent(ItemStack instance, Item item, @Shar method = "process", at = @At( value = "INVOKE", - target = "Lnet/minecraft/item/ItemStack;copyComponentsToNewStack(Lnet/minecraft/item/ItemConvertible;I)Lnet/minecraft/item/ItemStack;" + target = "Lnet/minecraft/item/ItemStack;withItem(Lnet/minecraft/item/ItemConvertible;)Lnet/minecraft/item/ItemStack;" ) ) - private ItemStack copyComponentsToNewStackForEnchantedBookUseItemComponent(ItemStack instance, ItemConvertible item, int count, @Share("transformedEntry") LocalRef> transformedEntry) { - return instance.itematic$copyComponentsToNewStack(transformedEntry.get(), count); + private ItemStack withItemForEnchantedBookUseItemComponent(ItemStack instance, ItemConvertible item, @Share("transformedEntry") LocalRef> transformedEntry) { + return instance.itematic$copyWithItem(transformedEntry.get()); } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/loot/function/SetItemLootFunctionExtender.java b/src/main/java/net/errorcraft/itematic/mixin/loot/function/SetItemLootFunctionExtender.java index 96bd0330..b099ee12 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/loot/function/SetItemLootFunctionExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/loot/function/SetItemLootFunctionExtender.java @@ -21,10 +21,10 @@ public class SetItemLootFunctionExtender { method = "process", at = @At( value = "INVOKE", - target = "Lnet/minecraft/item/ItemStack;copyComponentsToNewStack(Lnet/minecraft/item/ItemConvertible;I)Lnet/minecraft/item/ItemStack;" + target = "Lnet/minecraft/item/ItemStack;withItem(Lnet/minecraft/item/ItemConvertible;)Lnet/minecraft/item/ItemStack;" ) ) - private ItemStack copyComponentsToNewStackUseRegistryEntry(ItemStack instance, ItemConvertible item, int count) { + private ItemStack withItemUseRegistryEntry(ItemStack instance, ItemConvertible item) { return instance.itematic$copyWithItem(this.item); } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/screen/EnchantmentScreenHandlerExtender.java b/src/main/java/net/errorcraft/itematic/mixin/screen/EnchantmentScreenHandlerExtender.java index ceb0109e..587aab7c 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/screen/EnchantmentScreenHandlerExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/screen/EnchantmentScreenHandlerExtender.java @@ -36,11 +36,11 @@ private boolean isOfForBookUseItemComponent(ItemStack instance, Item item, @Shar method = "method_17410", at = @At( value = "INVOKE", - target = "Lnet/minecraft/item/ItemStack;copyComponentsToNewStack(Lnet/minecraft/item/ItemConvertible;I)Lnet/minecraft/item/ItemStack;" + target = "Lnet/minecraft/item/ItemStack;withItem(Lnet/minecraft/item/ItemConvertible;)Lnet/minecraft/item/ItemStack;" ) ) - private ItemStack copyComponentsToNewStackForEnchantedBookUseItemComponent(ItemStack instance, ItemConvertible itemConvertible, int count, @Share("transformsInto") LocalRef> transformsInto) { - return instance.itematic$copyComponentsToNewStack(transformsInto.get(), count); + private ItemStack withItemForEnchantedBookUseItemComponent(ItemStack instance, ItemConvertible item, @Share("transformsInto") LocalRef> transformsInto) { + return instance.itematic$copyWithItem(transformsInto.get()); } @Redirect( diff --git a/src/main/java/net/errorcraft/itematic/mixin/screen/GrindstoneScreenHandlerExtender.java b/src/main/java/net/errorcraft/itematic/mixin/screen/GrindstoneScreenHandlerExtender.java index ff2420fc..ee522b38 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/screen/GrindstoneScreenHandlerExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/screen/GrindstoneScreenHandlerExtender.java @@ -35,11 +35,11 @@ private boolean isOfForEnchantedBookUseItemComponent(ItemStack instance, Item it method = "grind", at = @At( value = "INVOKE", - target = "Lnet/minecraft/item/ItemStack;copyComponentsToNewStack(Lnet/minecraft/item/ItemConvertible;I)Lnet/minecraft/item/ItemStack;" + target = "Lnet/minecraft/item/ItemStack;withItem(Lnet/minecraft/item/ItemConvertible;)Lnet/minecraft/item/ItemStack;" ) ) - private ItemStack copyComponentsToNewStackForBookUseItemComponent(ItemStack instance, ItemConvertible item, int count, @Share("transformsInto") LocalRef> transformsInto) { - return instance.itematic$copyComponentsToNewStack(transformsInto.get(), count); + private ItemStack withItemForBookUseItemComponent(ItemStack instance, ItemConvertible item, @Share("transformsInto") LocalRef> transformsInto) { + return instance.itematic$copyWithItem(transformsInto.get()); } @Mixin(targets = { diff --git a/src/main/java/net/errorcraft/itematic/mixin/server/network/ServerPlayNetworkHandlerExtender.java b/src/main/java/net/errorcraft/itematic/mixin/server/network/ServerPlayNetworkHandlerExtender.java index 1f7d65bc..ad83dd2d 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/server/network/ServerPlayNetworkHandlerExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/server/network/ServerPlayNetworkHandlerExtender.java @@ -34,20 +34,20 @@ private boolean isOfForWritableBookUseItemComponentCheck(ItemStack instance, Ite target = "Lnet/minecraft/item/ItemStack;isOf(Lnet/minecraft/item/Item;)Z" ) ) - private boolean isOfForWritableBookUseItemComponentCheck(ItemStack instance, Item item, @Share("writableItemComponent") LocalRef writableItemComponent) { - Optional optionalComponent = instance.itematic$getComponent(ItemComponentTypes.WRITABLE); - optionalComponent.ifPresent(writableItemComponent::set); - return optionalComponent.isPresent(); + private boolean isOfForWritableBookUseItemComponentCheck(ItemStack instance, Item item, @Share("writable") LocalRef writable) { + Optional optionalWritable = instance.itematic$getComponent(ItemComponentTypes.WRITABLE); + optionalWritable.ifPresent(writable::set); + return optionalWritable.isPresent(); } @Redirect( method = "addBook", at = @At( value = "INVOKE", - target = "Lnet/minecraft/item/ItemStack;copyComponentsToNewStack(Lnet/minecraft/item/ItemConvertible;I)Lnet/minecraft/item/ItemStack;" + target = "Lnet/minecraft/item/ItemStack;withItem(Lnet/minecraft/item/ItemConvertible;)Lnet/minecraft/item/ItemStack;" ) ) - private ItemStack copyComponentsToNewStackForWrittenBookUseItemComponent(ItemStack instance, ItemConvertible itemConvertible, int count, @Share("writableItemComponent") LocalRef writableItemComponent) { - return instance.itematic$copyComponentsToNewStack(writableItemComponent.get().transformsInto(), count); + private ItemStack withItemForWrittenBookUseItemComponent(ItemStack instance, ItemConvertible itemConvertible, @Share("writable") LocalRef writable) { + return instance.itematic$copyWithItem(writable.get().transformsInto()); } } diff --git a/src/main/java/net/errorcraft/itematic/world/action/actions/TwirlPlayerAction.java b/src/main/java/net/errorcraft/itematic/world/action/actions/TwirlPlayerAction.java index 2b0deb12..d4caa73c 100644 --- a/src/main/java/net/errorcraft/itematic/world/action/actions/TwirlPlayerAction.java +++ b/src/main/java/net/errorcraft/itematic/world/action/actions/TwirlPlayerAction.java @@ -37,7 +37,7 @@ public boolean execute(ActionContext context) { return false; } - float spinAttackStrength = EnchantmentHelper.getTridentSpinAttackStrength(context.world(), context.stack(), player); + float spinAttackStrength = EnchantmentHelper.getTridentSpinAttackStrength(player); if (spinAttackStrength <= 0.0f) { return false; } diff --git a/src/main/resources/itematic.mixins.json b/src/main/resources/itematic.mixins.json index 3de26d44..ab5bbb6d 100644 --- a/src/main/resources/itematic.mixins.json +++ b/src/main/resources/itematic.mixins.json @@ -32,7 +32,6 @@ "block.ComposterBlockExtender$FullComposterInventoryExtender", "block.CropBlockExtender", "block.DecoratedPotBlockExtender", - "block.DecoratedPotPatternsAccessor", "block.DispenserBlockExtender", "block.FenceBlockExtender", "block.FertilizableFlowerBlockExtender", @@ -89,6 +88,7 @@ "component.type.BundleContentsComponentExtender$BuilderExtender", "component.type.ChargedProjectilesComponentExtender", "component.type.DyedColorComponentExtender", + "component.type.FoodComponentExtender$BuilderExtender", "component.type.ToolComponentExtender", "component.type.ToolComponentExtender$RuleExtender", "enchantment.EnchantmentHelperExtender", From 5002039dbebaaca4c71b2bbbb135a777e294a749 Mon Sep 17 00:00:00 2001 From: ErrorCraft <51973682+ErrorCraft@users.noreply.github.com> Date: Wed, 21 Jan 2026 16:56:35 +0100 Subject: [PATCH 05/11] Port to 24w20a --- gradle.properties | 6 +- .../screen/ingame/SmithingScreenExtender.java | 1 - .../resources/itematic.client.mixins.json | 3 + .../resources/itematic-gametest.mixins.json | 3 + .../minecraft/trade/sell_tipped_arrow.json | 4 +- .../function/SetPotionLootFunctionAccess.java | 8 -- .../loot/function/ItemModifierUtil.java | 19 ---- .../function/ItematicItemModifierTypes.java | 1 + .../function/SetRandomPotionItemModifier.java | 52 +++++++++++ .../mixin/block/entity/SherdsAccessor.java | 2 +- .../mixin/block/entity/SherdsExtender.java | 2 +- .../component/type/ToolComponentExtender.java | 4 +- .../passive/AbstractHorseEntityExtender.java | 3 +- .../entity/passive/SheepEntityExtender.java | 2 - .../player/ServerPlayerEntityExtender.java | 25 +++++- .../mixin/item/ItemStackExtender.java | 44 +++++---- .../SetPotionLootFunctionAccessor.java | 18 ---- .../SetPotionLootFunctionExtender.java | 90 ------------------- .../mixin/predicate/NumberRangeAccessor.java | 1 - .../predicate/item/ItemPredicateExtender.java | 1 - .../recipe/BrewingRecipeRegistryExtender.java | 24 ++++- .../predicate/item/ItemPredicateUtil.java | 1 - .../itematic/village/trade/Trades.java | 4 +- .../actions/EquipEntityAtPositionAction.java | 4 +- src/main/resources/itematic.mixins.json | 5 +- 25 files changed, 153 insertions(+), 174 deletions(-) delete mode 100644 src/main/java/net/errorcraft/itematic/access/loot/function/SetPotionLootFunctionAccess.java delete mode 100644 src/main/java/net/errorcraft/itematic/loot/function/ItemModifierUtil.java create mode 100644 src/main/java/net/errorcraft/itematic/loot/function/SetRandomPotionItemModifier.java delete mode 100644 src/main/java/net/errorcraft/itematic/mixin/loot/function/SetPotionLootFunctionAccessor.java delete mode 100644 src/main/java/net/errorcraft/itematic/mixin/loot/function/SetPotionLootFunctionExtender.java diff --git a/gradle.properties b/gradle.properties index 37cf142c..1b619dd2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,8 +3,8 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://fabricmc.net/develop - minecraft_version=24w19b - yarn_mappings=24w19b+build.4 + minecraft_version=24w20a + yarn_mappings=24w20a+build.5 loader_version=0.18.4 # Mod Properties @@ -13,4 +13,4 @@ org.gradle.jvmargs=-Xmx1G archives_base_name = itematic # Dependencies - fabric_version=0.98.1+1.21 + fabric_version=0.99.0+1.21 diff --git a/src/client/java/net/errorcraft/itematic/mixin/client/gui/screen/ingame/SmithingScreenExtender.java b/src/client/java/net/errorcraft/itematic/mixin/client/gui/screen/ingame/SmithingScreenExtender.java index 0572833e..9f607a17 100644 --- a/src/client/java/net/errorcraft/itematic/mixin/client/gui/screen/ingame/SmithingScreenExtender.java +++ b/src/client/java/net/errorcraft/itematic/mixin/client/gui/screen/ingame/SmithingScreenExtender.java @@ -25,7 +25,6 @@ import java.util.function.Function; @Mixin(SmithingScreen.class) -@SuppressWarnings("OptionalUsedAsFieldOrParameterType") public abstract class SmithingScreenExtender extends ForgingScreen { public SmithingScreenExtender(SmithingScreenHandler handler, PlayerInventory playerInventory, Text title, Identifier texture) { super(handler, playerInventory, title, texture); diff --git a/src/client/resources/itematic.client.mixins.json b/src/client/resources/itematic.client.mixins.json index dedd14e5..7263f2de 100644 --- a/src/client/resources/itematic.client.mixins.json +++ b/src/client/resources/itematic.client.mixins.json @@ -2,6 +2,9 @@ "required": true, "package": "net.errorcraft.itematic.mixin.client", "compatibilityLevel": "JAVA_17", + "mixinextras": { + "minVersion": "0.5.0" + }, "client": [ "MinecraftClientExtender", "color.item.ItemColorsExtender", diff --git a/src/gametest/resources/itematic-gametest.mixins.json b/src/gametest/resources/itematic-gametest.mixins.json index 26607505..23487eb3 100644 --- a/src/gametest/resources/itematic-gametest.mixins.json +++ b/src/gametest/resources/itematic-gametest.mixins.json @@ -3,6 +3,9 @@ "minVersion": "0.8", "package": "net.errorcraft.itematic.mixin.gametest", "compatibilityLevel": "JAVA_17", + "mixinextras": { + "minVersion": "0.5.0" + }, "mixins": [ "GameTestStateExtender", "StructureTestListenerExtender", diff --git a/src/main/generated/data/minecraft/trade/sell_tipped_arrow.json b/src/main/generated/data/minecraft/trade/sell_tipped_arrow.json index f826282c..f8003acb 100644 --- a/src/main/generated/data/minecraft/trade/sell_tipped_arrow.json +++ b/src/main/generated/data/minecraft/trade/sell_tipped_arrow.json @@ -3,8 +3,8 @@ "count": 5, "item": "minecraft:tipped_arrow", "item_modifier": { - "id": "#minecraft:tradeable", - "function": "minecraft:set_potion" + "function": "minecraft:set_random_potion", + "options": "#minecraft:tradeable" } }, "max_uses": 12, diff --git a/src/main/java/net/errorcraft/itematic/access/loot/function/SetPotionLootFunctionAccess.java b/src/main/java/net/errorcraft/itematic/access/loot/function/SetPotionLootFunctionAccess.java deleted file mode 100644 index f1f6872e..00000000 --- a/src/main/java/net/errorcraft/itematic/access/loot/function/SetPotionLootFunctionAccess.java +++ /dev/null @@ -1,8 +0,0 @@ -package net.errorcraft.itematic.access.loot.function; - -import net.minecraft.potion.Potion; -import net.minecraft.registry.entry.RegistryEntryList; - -public interface SetPotionLootFunctionAccess { - void itematic$setPotions(RegistryEntryList potions); -} diff --git a/src/main/java/net/errorcraft/itematic/loot/function/ItemModifierUtil.java b/src/main/java/net/errorcraft/itematic/loot/function/ItemModifierUtil.java deleted file mode 100644 index 4eca04cb..00000000 --- a/src/main/java/net/errorcraft/itematic/loot/function/ItemModifierUtil.java +++ /dev/null @@ -1,19 +0,0 @@ -package net.errorcraft.itematic.loot.function; - -import net.errorcraft.itematic.access.loot.function.SetPotionLootFunctionAccess; -import net.errorcraft.itematic.mixin.loot.function.SetPotionLootFunctionAccessor; -import net.minecraft.loot.function.SetPotionLootFunction; -import net.minecraft.potion.Potion; -import net.minecraft.registry.entry.RegistryEntryList; - -import java.util.List; - -public class ItemModifierUtil { - private ItemModifierUtil() {} - - public static SetPotionLootFunction setPotion(RegistryEntryList potions) { - SetPotionLootFunction itemModifier = SetPotionLootFunctionAccessor.create(List.of(), null); - ((SetPotionLootFunctionAccess) itemModifier).itematic$setPotions(potions); - return itemModifier; - } -} diff --git a/src/main/java/net/errorcraft/itematic/loot/function/ItematicItemModifierTypes.java b/src/main/java/net/errorcraft/itematic/loot/function/ItematicItemModifierTypes.java index 148a409b..8dd42133 100644 --- a/src/main/java/net/errorcraft/itematic/loot/function/ItematicItemModifierTypes.java +++ b/src/main/java/net/errorcraft/itematic/loot/function/ItematicItemModifierTypes.java @@ -5,6 +5,7 @@ public class ItematicItemModifierTypes { public static final LootFunctionType DYE = LootFunctionTypesAccessor.register("dye", DyeItemModifier.CODEC); + public static final LootFunctionType SET_RANDOM_POTION = LootFunctionTypesAccessor.register("set_random_potion", SetRandomPotionItemModifier.CODEC); private ItematicItemModifierTypes() {} diff --git a/src/main/java/net/errorcraft/itematic/loot/function/SetRandomPotionItemModifier.java b/src/main/java/net/errorcraft/itematic/loot/function/SetRandomPotionItemModifier.java new file mode 100644 index 00000000..29790348 --- /dev/null +++ b/src/main/java/net/errorcraft/itematic/loot/function/SetRandomPotionItemModifier.java @@ -0,0 +1,52 @@ +package net.errorcraft.itematic.loot.function; + +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.PotionContentsComponent; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.condition.LootCondition; +import net.minecraft.loot.context.LootContext; +import net.minecraft.loot.function.ConditionalLootFunction; +import net.minecraft.loot.function.LootFunctionType; +import net.minecraft.potion.Potion; +import net.minecraft.registry.RegistryCodecs; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.registry.entry.RegistryEntryList; + +import java.util.List; +import java.util.Optional; + +public class SetRandomPotionItemModifier extends ConditionalLootFunction { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> addConditionsField(instance).and( + RegistryCodecs.entryList(RegistryKeys.POTION).optionalFieldOf("options").forGetter(modifier -> modifier.options) + ).apply(instance, SetRandomPotionItemModifier::new)); + + private final Optional> options; + + public static SetRandomPotionItemModifier of(RegistryEntryList options) { + return new SetRandomPotionItemModifier(List.of(), Optional.of(options)); + } + + public SetRandomPotionItemModifier(List conditions, Optional> options) { + super(conditions); + this.options = options; + } + + @Override + public LootFunctionType getType() { + return ItematicItemModifierTypes.SET_RANDOM_POTION; + } + + @Override + protected ItemStack process(ItemStack stack, LootContext context) { + Optional> optionalPotion = this.options.flatMap(potions -> potions.getRandom(context.getRandom())); + if (optionalPotion.isEmpty()) { + optionalPotion = context.getWorld().getRegistryManager().get(RegistryKeys.POTION).getRandom(context.getRandom()); + } + + optionalPotion.ifPresent(potion -> stack.apply(DataComponentTypes.POTION_CONTENTS, PotionContentsComponent.DEFAULT, potion, PotionContentsComponent::with)); + return stack; + } +} diff --git a/src/main/java/net/errorcraft/itematic/mixin/block/entity/SherdsAccessor.java b/src/main/java/net/errorcraft/itematic/mixin/block/entity/SherdsAccessor.java index e108d135..f238c42d 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/block/entity/SherdsAccessor.java +++ b/src/main/java/net/errorcraft/itematic/mixin/block/entity/SherdsAccessor.java @@ -15,8 +15,8 @@ public interface SherdsAccessor { static Sherds create(List>> sherds) { throw new AssertionError(); } + @Invoker("") - @SuppressWarnings("OptionalUsedAsFieldOrParameterType") static Sherds create(Optional> back, Optional> left, Optional> right, Optional> front) { throw new AssertionError(); } diff --git a/src/main/java/net/errorcraft/itematic/mixin/block/entity/SherdsExtender.java b/src/main/java/net/errorcraft/itematic/mixin/block/entity/SherdsExtender.java index a36a41a9..5a95be69 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/block/entity/SherdsExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/block/entity/SherdsExtender.java @@ -28,7 +28,6 @@ import java.util.stream.Stream; @Mixin(Sherds.class) -@SuppressWarnings("OptionalUsedAsFieldOrParameterType") public abstract class SherdsExtender implements SherdsAccess { @Shadow @Final @@ -190,6 +189,7 @@ private static Optional> optionalUseValueFromList(T valu if (this.equals(DEFAULT)) { return nbt; } + nbt.put("sherds", CODEC.encodeStart(lookup.getOps(NbtOps.INSTANCE), (Sherds)(Object) this).getOrThrow()); return nbt; } diff --git a/src/main/java/net/errorcraft/itematic/mixin/component/type/ToolComponentExtender.java b/src/main/java/net/errorcraft/itematic/mixin/component/type/ToolComponentExtender.java index b0021710..fb544e78 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/component/type/ToolComponentExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/component/type/ToolComponentExtender.java @@ -50,6 +50,7 @@ public class ToolComponentExtender implements ToolComponentAccess { return rule.speed().get(); } } + return this.defaultMiningSpeed; } @@ -60,6 +61,7 @@ public class ToolComponentExtender implements ToolComponentAccess { return rule.correctForDrops().get(); } } + return false; } @@ -204,13 +206,13 @@ private static PacketCodec createPacketCode if (this.blocks != null && !state.isIn(this.blocks)) { return false; } + return this.extraFields.item() .map(item -> item.test(stack)) .orElse(true); } @Unique - @SuppressWarnings("OptionalUsedAsFieldOrParameterType") private static ToolComponent.Rule create(Optional> blocks, Optional speed, Optional correctForDrops) { return new ToolComponent.Rule(blocks.orElse(null), speed, correctForDrops); } diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/passive/AbstractHorseEntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/passive/AbstractHorseEntityExtender.java index cbba43c4..890262af 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/passive/AbstractHorseEntityExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/passive/AbstractHorseEntityExtender.java @@ -2,6 +2,7 @@ import net.errorcraft.itematic.item.ItemKeys; import net.minecraft.entity.EntityType; +import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.passive.AbstractHorseEntity; import net.minecraft.entity.passive.AnimalEntity; import net.minecraft.item.Item; @@ -174,7 +175,7 @@ private boolean isOfForSaddleUseRegistryKeyCheck(ItemStack instance, Item item) @Override public boolean canEquip(ItemStack stack) { - return this.isTame() && this.hasArmorSlot() && this.isHorseArmor(stack) && !this.isWearingBodyArmor(); + return this.isTame() && this.canUseSlot(EquipmentSlot.BODY) && this.isHorseArmor(stack) && !this.isWearingBodyArmor(); } @Mixin(targets = "net/minecraft/entity/passive/AbstractHorseEntity$2") diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/passive/SheepEntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/passive/SheepEntityExtender.java index 1ccc5c84..8d830e67 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/passive/SheepEntityExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/passive/SheepEntityExtender.java @@ -108,7 +108,6 @@ private CraftingRecipeInput createChildColorRecipeInput(DyeColor firstColor, Dye target = "Ljava/util/Optional;filter(Ljava/util/function/Predicate;)Ljava/util/Optional;" ) ) - @SuppressWarnings("OptionalUsedAsFieldOrParameterType") private Optional instanceOfDyeItemUseItemComponent(Optional instance, Predicate predicate) { return instance.flatMap(item -> item.itematic$getComponent(ItemComponentTypes.DYE)); } @@ -127,7 +126,6 @@ private Optional instanceOfDyeItemUseItemComponent(Optional castToDyeItemDoNothing(Optional instance, Function mapper) { return instance; } diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/player/ServerPlayerEntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/player/ServerPlayerEntityExtender.java index 50d63ca9..7aef5d48 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/player/ServerPlayerEntityExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/player/ServerPlayerEntityExtender.java @@ -1,15 +1,19 @@ package net.errorcraft.itematic.mixin.entity.player; import com.llamalad7.mixinextras.sugar.Local; +import com.mojang.authlib.GameProfile; import net.errorcraft.itematic.item.component.ItemComponentTypes; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.NetworkSyncedItem; import net.minecraft.network.packet.Packet; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.stat.Stat; import net.minecraft.stat.StatType; +import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; @@ -19,7 +23,11 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(ServerPlayerEntity.class) -public class ServerPlayerEntityExtender { +public abstract class ServerPlayerEntityExtender extends PlayerEntity { + public ServerPlayerEntityExtender(World world, BlockPos pos, float yaw, GameProfile gameProfile) { + super(world, pos, yaw, gameProfile); + } + @Redirect( method = "playerTick", at = @At( @@ -88,4 +96,19 @@ private void checkNullForInvalidStat(Stat stat, int amount, CallbackInfo info private Stat getOrCreateStatUseRegistryEntry(StatType instance, T key, ItemStack stack) { return instance.itematic$getOrCreateStat(stack.getRegistryEntry()); } + + @Redirect( + method = "sendEquipmentBreakStatus", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/stat/StatType;getOrCreateStat(Ljava/lang/Object;)Lnet/minecraft/stat/Stat;" + ) + ) + private Stat getOrCreateStatUseRegistryEntry(StatType instance, T key) { + RegistryEntry itemEntry = this.getWorld() + .getRegistryManager() + .get(RegistryKeys.ITEM) + .getEntry((Item) key); + return instance.itematic$getOrCreateStat(itemEntry); + } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/item/ItemStackExtender.java b/src/main/java/net/errorcraft/itematic/mixin/item/ItemStackExtender.java index 75e11697..50517d1c 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/item/ItemStackExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/item/ItemStackExtender.java @@ -52,7 +52,6 @@ import net.minecraft.server.world.ServerWorld; import net.minecraft.stat.Stat; import net.minecraft.stat.StatType; -import net.minecraft.stat.Stats; import net.minecraft.text.Text; import net.minecraft.util.*; import net.minecraft.util.math.BlockPos; @@ -74,6 +73,7 @@ import java.util.List; import java.util.Optional; import java.util.Set; +import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Stream; @@ -99,7 +99,7 @@ public abstract class ItemStackExtender implements ComponentHolder, ItemStackAcc public abstract boolean isEmpty(); @Shadow - public abstract void damage(int amount, ServerWorld serverWorld, @Nullable ServerPlayerEntity player, Runnable breakCallback); + public abstract void damage(int amount, ServerWorld world, @Nullable ServerPlayerEntity player, Consumer breakCallback); @Shadow public abstract int getDamage(); @@ -354,6 +354,7 @@ public Stream> streamTags() { if (this.entry == null) { return Stream.empty(); } + return this.entry.streamTags(); } @@ -387,6 +388,7 @@ public boolean isIn(TagKey tag) { if (this.isEmpty()) { return false; } + return this.entry.isIn(tag); } @@ -399,6 +401,7 @@ public boolean itemMatches(Predicate> predicate) { if (this.isEmpty()) { return false; } + return predicate.test(this.entry); } @@ -411,6 +414,7 @@ public boolean itemMatches(RegistryEntry itemEntry) { if (this.isEmpty()) { return false; } + return this.entry == itemEntry; } @@ -581,14 +585,14 @@ private void postMineUseRegistryEntryNullCheck(World world, BlockState state, Bl } @Inject( - method = "damage(ILnet/minecraft/server/world/ServerWorld;Lnet/minecraft/server/network/ServerPlayerEntity;Ljava/lang/Runnable;)V", + method = "damage(ILnet/minecraft/server/world/ServerWorld;Lnet/minecraft/server/network/ServerPlayerEntity;Ljava/util/function/Consumer;)V", at = @At( value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;setDamage(I)V", shift = At.Shift.AFTER ) ) - private void invokeDamageToolEvent(int amount, ServerWorld serverWorld, ServerPlayerEntity player, Runnable breakCallback, CallbackInfo info) { + private void invokeDamageToolEvent(int amount, ServerWorld world, ServerPlayerEntity player, Consumer breakCallback, CallbackInfo info) { if (this.context == null) { return; } @@ -597,7 +601,7 @@ private void invokeDamageToolEvent(int amount, ServerWorld serverWorld, ServerPl } @WrapWithCondition( - method = "damage(ILnet/minecraft/server/world/ServerWorld;Lnet/minecraft/server/network/ServerPlayerEntity;Ljava/lang/Runnable;)V", + method = "damage(ILnet/minecraft/server/world/ServerWorld;Lnet/minecraft/server/network/ServerPlayerEntity;Ljava/util/function/Consumer;)V", at = @At( value = "INVOKE", target = "Lnet/minecraft/advancement/criterion/ItemDurabilityChangedCriterion;trigger(Lnet/minecraft/server/network/ServerPlayerEntity;Lnet/minecraft/item/ItemStack;I)V" @@ -611,23 +615,23 @@ private boolean limitDamageApplied(ItemDurabilityChangedCriterion instance, Serv } @Inject( - method = "damage(ILnet/minecraft/server/world/ServerWorld;Lnet/minecraft/server/network/ServerPlayerEntity;Ljava/lang/Runnable;)V", + method = "damage(ILnet/minecraft/server/world/ServerWorld;Lnet/minecraft/server/network/ServerPlayerEntity;Ljava/util/function/Consumer;)V", at = @At( value = "INVOKE", - target = "Ljava/lang/Runnable;run()V" + target = "Ljava/util/function/Consumer;accept(Ljava/lang/Object;)V" ) ) - private void invokeBreakToolEvent(int amount, ServerWorld serverWorld, ServerPlayerEntity player, Runnable breakCallback, CallbackInfo info) { + private void invokeBreakToolEvent(int amount, ServerWorld world, ServerPlayerEntity player, Consumer breakCallback, CallbackInfo info) { if (this.context == null) { return; } + this.itematic$invokeEvent(ItemEvents.BREAK_ITEM, this.context); } @Redirect( method = { "useOnBlock", - "method_56097", "postHit", "postMine", "onCraftByPlayer" @@ -661,6 +665,7 @@ public boolean canBeEnchantedWith(RegistryEntry enchantment, Enchan if (this.entry == null) { return ItemKeys.AIR; } + return this.entry.getKey().orElse(ItemKeys.AIR); } @@ -674,6 +679,7 @@ public boolean canBeEnchantedWith(RegistryEntry enchantment, Enchan if (this.isEmpty()) { return; } + this.count = MathHelper.clamp(this.count + count, 0, this.getMaxCount()); } @@ -694,6 +700,7 @@ public boolean canBeEnchantedWith(RegistryEntry enchantment, Enchan if (this.isEmpty()) { return EMPTY; } + return this.itematic$copyComponentsToNewStackIgnoreEmpty(item, count); } @@ -712,9 +719,10 @@ public boolean canBeEnchantedWith(RegistryEntry enchantment, Enchan if (context.player(ActionContextParameter.THIS).map(PlayerEntity::isCreative).orElse(false)) { return; } + this.context = context; Entity entity = context.entity(ActionContextParameter.THIS).orElse(null); - this.damage(amount, context.world(), entity instanceof ServerPlayerEntity player ? player : null, () -> this.onItemBroken(entity, context)); + this.damage(amount, context.world(), entity instanceof ServerPlayerEntity player ? player : null, item -> this.onItemBroken(item, entity, context)); this.context = null; } @@ -728,6 +736,7 @@ public boolean canBeEnchantedWith(RegistryEntry enchantment, Enchan if (this.entry == null) { return Optional.empty(); } + return this.entry.value().itematic$getComponent(type); } @@ -736,9 +745,11 @@ public boolean canBeEnchantedWith(RegistryEntry enchantment, Enchan if (this.entry == null) { return false; } + if (this.activeEvents.contains(event)) { return false; } + this.activeEvents.add(event); boolean result = this.entry.value().itematic$invokeEvent(event, context); this.activeEvents.remove(event); @@ -750,9 +761,11 @@ public boolean canBeEnchantedWith(RegistryEntry enchantment, Enchan if (this.entry == null) { return true; } + if (miner.isCreative() && this.isIn(ItematicItemTags.PREVENTS_MINING_IN_CREATIVE)) { return false; } + return this.entry.value().canMine(state, world, pos, miner); } @@ -761,6 +774,7 @@ public boolean canBeEnchantedWith(RegistryEntry enchantment, Enchan if (this.entry == null) { return false; } + return this.entry.value().isNetworkSynced(); } @@ -769,6 +783,7 @@ public boolean canBeEnchantedWith(RegistryEntry enchantment, Enchan if (this.entry == null) { return false; } + return this.entry.value().itematic$mayStartUsing(world, user, hand, stack); } @@ -777,6 +792,7 @@ public boolean canBeEnchantedWith(RegistryEntry enchantment, Enchan if (!this.itematic$hasComponent(ItemComponentTypes.WEAPON)) { return 1.0d; } + return this.getOrDefault(ItematicDataComponentTypes.ATTACK_SPEED_MULTIPLIER, 1.0d); } @@ -792,15 +808,13 @@ private void setFields(RegistryEntry entry) { } @Unique - private void onItemBroken(Entity entity, ActionContext context) { + private void onItemBroken(Item item, Entity entity, ActionContext context) { if (entity instanceof LivingEntity livingEntity) { - context.slot().ifPresent(livingEntity::sendEquipmentBreakStatus); + context.slot().ifPresent(slot -> livingEntity.sendEquipmentBreakStatus(item, slot)); } + this.decrement(1); this.itematic$invokeEvent(ItemEvents.BREAK_ITEM, context); - if (entity instanceof PlayerEntity player && this.entry != null) { - player.incrementStat(Stats.BROKEN.itematic$getOrCreateStat(this.entry)); - } this.setDamage(0); } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/loot/function/SetPotionLootFunctionAccessor.java b/src/main/java/net/errorcraft/itematic/mixin/loot/function/SetPotionLootFunctionAccessor.java deleted file mode 100644 index 1aed4fa8..00000000 --- a/src/main/java/net/errorcraft/itematic/mixin/loot/function/SetPotionLootFunctionAccessor.java +++ /dev/null @@ -1,18 +0,0 @@ -package net.errorcraft.itematic.mixin.loot.function; - -import net.minecraft.loot.condition.LootCondition; -import net.minecraft.loot.function.SetPotionLootFunction; -import net.minecraft.potion.Potion; -import net.minecraft.registry.entry.RegistryEntry; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -import java.util.List; - -@Mixin(SetPotionLootFunction.class) -public interface SetPotionLootFunctionAccessor { - @Invoker("") - static SetPotionLootFunction create(List conditions, RegistryEntry potion) { - throw new AssertionError(); - } -} diff --git a/src/main/java/net/errorcraft/itematic/mixin/loot/function/SetPotionLootFunctionExtender.java b/src/main/java/net/errorcraft/itematic/mixin/loot/function/SetPotionLootFunctionExtender.java deleted file mode 100644 index 540722ab..00000000 --- a/src/main/java/net/errorcraft/itematic/mixin/loot/function/SetPotionLootFunctionExtender.java +++ /dev/null @@ -1,90 +0,0 @@ -package net.errorcraft.itematic.mixin.loot.function; - -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import com.llamalad7.mixinextras.sugar.Local; -import com.mojang.serialization.Codec; -import net.errorcraft.itematic.access.loot.function.SetPotionLootFunctionAccess; -import net.minecraft.component.ComponentType; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.condition.LootCondition; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.function.SetPotionLootFunction; -import net.minecraft.potion.Potion; -import net.minecraft.registry.Registry; -import net.minecraft.registry.RegistryCodecs; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.registry.entry.RegistryEntry; -import net.minecraft.registry.entry.RegistryEntryList; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyArg; -import org.spongepowered.asm.mixin.injection.Redirect; - -import java.util.List; -import java.util.function.BiFunction; -import java.util.function.Function; - -@Mixin(SetPotionLootFunction.class) -public class SetPotionLootFunctionExtender implements SetPotionLootFunctionAccess { - @Unique - private RegistryEntryList potions; - - @Redirect( - method = "method_53394", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/registry/Registry;getEntryCodec()Lcom/mojang/serialization/Codec;" - ) - ) - private static Codec> getEntryCodecUseRegistryEntryListCodec(Registry instance) { - return RegistryCodecs.entryList(RegistryKeys.POTION); - } - - @ModifyArg( - method = "method_53394", - at = @At( - value = "INVOKE", - target = "Lcom/mojang/serialization/MapCodec;forGetter(Ljava/util/function/Function;)Lcom/mojang/serialization/codecs/RecordCodecBuilder;", - remap = false - ) - ) - private static Function> forGetterUseRegistryEntryList(Function getter) { - return itemModifier -> ((SetPotionLootFunctionExtender)(Object) itemModifier).potions; - } - - @ModifyArg( - method = "method_53394", - at = @At( - value = "INVOKE", - target = "Lcom/mojang/datafixers/Products$P2;apply(Lcom/mojang/datafixers/kinds/Applicative;Ljava/util/function/BiFunction;)Lcom/mojang/datafixers/kinds/App;", - remap = false - ) - ) - private static BiFunction, RegistryEntryList, SetPotionLootFunction> applyUseRegistryEntryItemStackConstructor(BiFunction, RegistryEntry, SetPotionLootFunction> instance) { - return (conditions, potions) -> { - SetPotionLootFunction itemModifier = instance.apply(conditions, null); - ((SetPotionLootFunctionExtender)(Object) itemModifier).potions = potions; - return itemModifier; - }; - } - - @WrapOperation( - method = "process", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/item/ItemStack;apply(Lnet/minecraft/component/ComponentType;Ljava/lang/Object;Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;" - ) - ) - private Object applyPotionContentComponentCheckForRegistryEntryFromRegistryEntryList(ItemStack instance, ComponentType type, T defaultValue, U change, BiFunction applier, Operation original, @Local(argsOnly = true) LootContext context) { - this.potions.getRandom(context.getRandom()) - .ifPresent(potion -> original.call(instance, type, defaultValue, potion, applier)); - return null; - } - - @Override - public void itematic$setPotions(RegistryEntryList potions) { - this.potions = potions; - } -} diff --git a/src/main/java/net/errorcraft/itematic/mixin/predicate/NumberRangeAccessor.java b/src/main/java/net/errorcraft/itematic/mixin/predicate/NumberRangeAccessor.java index 832bdbe1..131d589e 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/predicate/NumberRangeAccessor.java +++ b/src/main/java/net/errorcraft/itematic/mixin/predicate/NumberRangeAccessor.java @@ -10,7 +10,6 @@ public interface NumberRangeAccessor { @Mixin(NumberRange.IntRange.class) interface IntRangeAccessor { @Invoker("") - @SuppressWarnings("OptionalUsedAsFieldOrParameterType") static NumberRange.IntRange create(Optional min, Optional max) { throw new AssertionError(); } diff --git a/src/main/java/net/errorcraft/itematic/mixin/predicate/item/ItemPredicateExtender.java b/src/main/java/net/errorcraft/itematic/mixin/predicate/item/ItemPredicateExtender.java index 42079f53..0c9483c2 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/predicate/item/ItemPredicateExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/predicate/item/ItemPredicateExtender.java @@ -73,7 +73,6 @@ private boolean testExtraFields(boolean original, ItemStack stack) { @Mixin(ItemPredicate.Builder.class) public static class BuilderExtender implements ItemPredicateBuilderAccess { - @SuppressWarnings("OptionalUsedAsFieldOrParameterType") @Shadow private Optional> item; diff --git a/src/main/java/net/errorcraft/itematic/mixin/recipe/BrewingRecipeRegistryExtender.java b/src/main/java/net/errorcraft/itematic/mixin/recipe/BrewingRecipeRegistryExtender.java index 186abc25..19359b5b 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/recipe/BrewingRecipeRegistryExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/recipe/BrewingRecipeRegistryExtender.java @@ -1,5 +1,7 @@ package net.errorcraft.itematic.mixin.recipe; +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.llamalad7.mixinextras.sugar.Local; import net.errorcraft.itematic.access.recipe.BrewingRecipeRegistryAccess; @@ -34,6 +36,7 @@ public class BrewingRecipeRegistryExtender implements BrewingRecipeRegistryAccess { @Unique private List>> itemRecipes; + @Unique private List>> potionRecipes; @@ -57,6 +60,7 @@ public boolean isItemRecipeIngredient(ItemStack stack) { return true; } } + return false; } @@ -71,6 +75,7 @@ public boolean hasItemRecipe(ItemStack input, ItemStack ingredient) { return true; } } + return false; } @@ -85,18 +90,24 @@ public boolean isPotionRecipeIngredient(ItemStack stack) { return true; } } + return false; } + @Definition( + id = "iterator", + method = "Ljava/util/List;iterator()Ljava/util/Iterator;" + ) + @Expression("? = ?.iterator()") @Inject( method = "hasPotionRecipe", at = @At( - value = "INVOKE_ASSIGN", - target = "Ljava/util/List;iterator()Ljava/util/Iterator;" + value = "MIXINEXTRAS:EXPRESSION", + shift = At.Shift.AFTER ), cancellable = true ) - @SuppressWarnings({"OptionalUsedAsFieldOrParameterType", "OptionalGetWithoutIsPresent"}) + @SuppressWarnings("OptionalGetWithoutIsPresent") private void hasPotionRecipeUseItemKeys(ItemStack input, ItemStack ingredient, CallbackInfoReturnable info, @Local Optional> optional) { RegistryEntry potion = optional.get(); for (BrewingRecipe> recipe : this.potionRecipes) { @@ -105,6 +116,7 @@ private void hasPotionRecipeUseItemKeys(ItemStack input, ItemStack ingredient, C return; } } + info.setReturnValue(false); } @@ -119,6 +131,7 @@ public boolean isBrewable(RegistryEntry potion) { return true; } } + return false; } @@ -217,22 +230,26 @@ private static void registerRecipes(BrewingRecipeRegistry.Builder builder) { if (input.isEmpty()) { return input; } + Optional> optionalPotion = input.getOrDefault(DataComponentTypes.POTION_CONTENTS, PotionContentsComponent.DEFAULT) .potion(); if (optionalPotion.isEmpty()) { return input; } + RegistryEntry potion = optionalPotion.get(); for (BrewingRecipe> recipe : this.itemRecipes) { if (input.itematic$isOf(recipe.input()) && ingredient.itematic$isOf(recipe.ingredient())) { return PotionContentsComponentUtil.setPotion(world.itematic$createStack(recipe.output()), potion); } } + for (BrewingRecipe> recipe : this.potionRecipes) { if (recipe.input() == potion && ingredient.itematic$isOf(recipe.ingredient())) { return PotionContentsComponentUtil.setPotion(new ItemStack(input.getRegistryEntry()), recipe.output()); } } + return input; } @@ -240,6 +257,7 @@ private static void registerRecipes(BrewingRecipeRegistry.Builder builder) { public static class BuilderExtender implements BrewingRecipeRegistryBuilderAccess { @Unique private final List>> itemRecipes = new ArrayList<>(); + @Unique private final List>> potionRecipes = new ArrayList<>(); diff --git a/src/main/java/net/errorcraft/itematic/predicate/item/ItemPredicateUtil.java b/src/main/java/net/errorcraft/itematic/predicate/item/ItemPredicateUtil.java index 330efe95..c21293ca 100644 --- a/src/main/java/net/errorcraft/itematic/predicate/item/ItemPredicateUtil.java +++ b/src/main/java/net/errorcraft/itematic/predicate/item/ItemPredicateUtil.java @@ -32,7 +32,6 @@ public class ItemPredicateUtil { ItemPredicateUtil::create ); - @SuppressWarnings("OptionalUsedAsFieldOrParameterType") private static ItemPredicate create(Optional> items, NumberRange.IntRange count, ComponentPredicate components, Map, ItemSubPredicate> subPredicates, ItemPredicateExtraFields extraFields) { ItemPredicate predicate = new ItemPredicate(items, count, components, subPredicates); ((ItemPredicateAccess)(Object) predicate).itematic$setExtraFields(extraFields); diff --git a/src/main/java/net/errorcraft/itematic/village/trade/Trades.java b/src/main/java/net/errorcraft/itematic/village/trade/Trades.java index a843a5b8..14f76a41 100644 --- a/src/main/java/net/errorcraft/itematic/village/trade/Trades.java +++ b/src/main/java/net/errorcraft/itematic/village/trade/Trades.java @@ -3,7 +3,7 @@ import net.errorcraft.itematic.entity.effect.StatusEffectKeys; import net.errorcraft.itematic.item.ItemKeys; import net.errorcraft.itematic.loot.function.DyeItemModifier; -import net.errorcraft.itematic.loot.function.ItemModifierUtil; +import net.errorcraft.itematic.loot.function.SetRandomPotionItemModifier; import net.errorcraft.itematic.mixin.village.TradeOffersAccessor; import net.errorcraft.itematic.potion.PotionTags; import net.errorcraft.itematic.registry.ItematicRegistryKeys; @@ -779,7 +779,7 @@ private static Trade sellEnchantedItem(RegistryEntryLookup items, Registry } private static Trade sellWithPotion(RegistryEntryLookup items, RegistryEntryList potions, RegistryEntry item, RegistryEntry resultItem, int tradeExperience) { - return Trade.builder(Trade.Entry.of(resultItem, 5, ItemModifierUtil.setPotion(potions))) + return Trade.builder(Trade.Entry.of(resultItem, 5, SetRandomPotionItemModifier.of(potions))) .wants(Trade.Entry.ofEmerald(items, 2)) .wants(Trade.Entry.of(item, 5)) .tradeExperience(tradeExperience) diff --git a/src/main/java/net/errorcraft/itematic/world/action/actions/EquipEntityAtPositionAction.java b/src/main/java/net/errorcraft/itematic/world/action/actions/EquipEntityAtPositionAction.java index 8f1aad04..e0013614 100644 --- a/src/main/java/net/errorcraft/itematic/world/action/actions/EquipEntityAtPositionAction.java +++ b/src/main/java/net/errorcraft/itematic/world/action/actions/EquipEntityAtPositionAction.java @@ -37,14 +37,16 @@ public boolean execute(ActionContext context) { if (entities.isEmpty()) { return false; } + LivingEntity target = entities.getFirst(); - EquipmentSlot equipmentSlot = MobEntity.getPreferredEquipmentSlot(equipment); + EquipmentSlot equipmentSlot = target.getPreferredEquipmentSlot(equipment); ItemStack equippedStack = equipment.copyWithCount(1); target.equipStack(equipmentSlot, equippedStack); if (target instanceof MobEntity mobEntity) { mobEntity.setEquipmentDropChance(equipmentSlot, 2.0f); mobEntity.setPersistent(); } + return true; } } diff --git a/src/main/resources/itematic.mixins.json b/src/main/resources/itematic.mixins.json index ab5bbb6d..519c67ae 100644 --- a/src/main/resources/itematic.mixins.json +++ b/src/main/resources/itematic.mixins.json @@ -3,6 +3,9 @@ "minVersion": "0.8", "package": "net.errorcraft.itematic.mixin", "compatibilityLevel": "JAVA_17", + "mixinextras": { + "minVersion": "0.5.0" + }, "mixins": [ "BootstrapExtender", "block.AbstractBannerBlockExtender", @@ -298,8 +301,6 @@ "loot.function.LootFunctionTypesAccessor", "loot.function.SetEnchantmentsLootFunctionExtender", "loot.function.SetItemLootFunctionExtender", - "loot.function.SetPotionLootFunctionAccessor", - "loot.function.SetPotionLootFunctionExtender", "loot.function.SetStewEffectLootFunctionExtender", "network.PacketByteBufExtender", "network.RegistryByteBufExtender", From d6af69211ab281b902f0a5d2d21d38a39ae811c3 Mon Sep 17 00:00:00 2001 From: ErrorCraft <51973682+ErrorCraft@users.noreply.github.com> Date: Wed, 21 Jan 2026 21:22:18 +0100 Subject: [PATCH 06/11] Port to 24w21b --- gradle.properties | 6 +- .../client/item/bar/ItemBarStyles.java | 56 +++++------ .../item/bar/color/ColorProviderTypeKeys.java | 2 +- .../bar/progress/ProgressProviderKeys.java | 2 +- .../render/ItematicTexturedRenderLayers.java | 8 +- .../gui/tooltip/TooltipComponentExtender.java | 4 +- .../client/render/WorldRendererExtender.java | 98 +------------------ .../itematic/data/server/RecipeProvider.java | 32 +++--- .../data/server/tag/BlockTagProvider.java | 4 - .../data/minecraft/item/music_disc_11.json | 7 +- .../data/minecraft/item/music_disc_13.json | 7 +- .../data/minecraft/item/music_disc_5.json | 7 +- .../minecraft/item/music_disc_blocks.json | 7 +- .../data/minecraft/item/music_disc_cat.json | 7 +- .../data/minecraft/item/music_disc_chirp.json | 7 +- .../minecraft/item/music_disc_creator.json | 7 +- .../item/music_disc_creator_music_box.json | 7 +- .../data/minecraft/item/music_disc_far.json | 7 +- .../data/minecraft/item/music_disc_mall.json | 7 +- .../minecraft/item/music_disc_mellohi.json | 7 +- .../minecraft/item/music_disc_otherside.json | 7 +- .../minecraft/item/music_disc_pigstep.json | 7 +- .../minecraft/item/music_disc_precipice.json | 7 +- .../data/minecraft/item/music_disc_relic.json | 7 +- .../data/minecraft/item/music_disc_stal.json | 7 +- .../data/minecraft/item/music_disc_strad.json | 7 +- .../data/minecraft/item/music_disc_wait.json | 7 +- .../data/minecraft/item/music_disc_ward.json | 7 +- .../data/minecraft/tags/block/air.json | 7 -- .../tooltip}/BundleTooltipDataAccess.java | 2 +- .../errorcraft/itematic/block/BlockKeys.java | 5 +- .../itematic/block/ItematicBlockTags.java | 3 +- .../itematic/entity/EntityTypeKeys.java | 2 +- .../entity/ItematicEntityTypeTags.java | 2 +- .../entity/effect/StatusEffectKeys.java | 2 +- .../errorcraft/itematic/fluid/FluidKeys.java | 2 +- .../errorcraft/itematic/item/ItemAccess.java | 4 - .../itematic/item/ItemBarStyleKeys.java | 2 +- .../errorcraft/itematic/item/ItemKeys.java | 2 +- .../errorcraft/itematic/item/ItemUtil.java | 46 +++++---- .../itematic/item/ItematicItemTags.java | 2 +- .../itematic/item/armor/ArmorMaterial.java | 47 ++++++--- .../item/armor/ArmorMaterialKeys.java | 2 +- .../itematic/item/armor/ArmorMaterials.java | 16 +-- .../item/color/ItemColorTypeKeys.java | 2 +- .../item/component/ItemComponent.java | 2 +- .../item/component/ItemComponentTypes.java | 2 +- .../components/ArmorItemComponent.java | 1 + .../BannerPatternHolderItemComponent.java | 2 +- .../components/BlockItemComponent.java | 2 +- .../components/EntityItemComponent.java | 2 +- .../FireworkExplosionHolderItemComponent.java | 2 +- .../components/FireworkItemComponent.java | 2 +- .../components/ItemHolderItemComponent.java | 6 +- .../components/MapHolderItemComponent.java | 2 +- .../OminousEffectProviderItemComponent.java | 2 +- .../components/PlayableItemComponent.java | 2 +- .../components/PlayableSongItemComponent.java | 38 +++++++ .../components/PotionHolderItemComponent.java | 2 +- .../components/RecordItemComponent.java | 93 ------------------ .../SmithingTemplateItemComponent.java | 2 +- .../components/TextHolderItemComponent.java | 2 +- .../components/WeaponItemComponent.java | 2 +- .../dispense/behavior/DispenseBehaviors.java | 2 +- .../itematic/item/event/ItemEventKeys.java | 2 +- .../provider/ItemGroupEntryProviderKeys.java | 2 +- .../provider/ItemGroupEntryProviderTags.java | 2 +- .../holder/rule/ItemHolderRuleTypeKeys.java | 2 +- .../model/override/ModelOverrideKeys.java | 2 +- .../block/picker/BlockPickerTypeKeys.java | 2 +- .../itematic/item/pointer/PointerKeys.java | 2 +- .../shooter/method/ShooterMethodTypeKeys.java | 2 +- .../template/SmithingTemplateTypeKeys.java | 2 +- .../smithing/template/SmithingTemplates.java | 4 +- .../use/provider/IntegerProviderTypeKeys.java | 2 +- .../mixin/block/JukeboxBlockExtender.java | 28 ------ .../entity/JukeboxBlockEntityExtender.java | 71 -------------- .../mixin/item/ArmorItemAccessor.java | 16 --- .../itematic/mixin/item/ItemExtender.java | 4 +- .../mixin/item/ItemStackExtender.java | 12 +-- .../tooltip}/BundleTooltipDataExtender.java | 6 +- .../registry/RegistryLoaderExtender.java | 6 +- .../mixin/village/VillagerDataExtender.java | 11 ++- .../itematic/potion/PotionKeys.java | 2 +- .../itematic/potion/PotionTags.java | 2 +- .../registry/ItematicRegistryKeys.java | 38 +++---- .../itematic/sound/SoundEventKeys.java | 2 +- .../errorcraft/itematic/stat/StatUtil.java | 2 +- .../itematic/village/trade/TradeTags.java | 2 +- .../itematic/village/trade/Trades.java | 2 +- .../trade/modifier/TradeModifierTypeKeys.java | 2 +- .../itematic/world/action/ActionTags.java | 2 +- .../itematic/world/action/ActionTypeKeys.java | 2 +- .../itematic/world/action/Actions.java | 4 +- .../handler/SequenceHandlerTypeKeys.java | 2 +- src/main/resources/fabric.mod.json | 3 - src/main/resources/itematic.classtweaker | 1 + src/main/resources/itematic.mixins.json | 5 +- 98 files changed, 282 insertions(+), 628 deletions(-) delete mode 100644 src/main/generated/data/minecraft/tags/block/air.json rename src/main/java/net/errorcraft/itematic/access/{client/item => item/tooltip}/BundleTooltipDataAccess.java (80%) create mode 100644 src/main/java/net/errorcraft/itematic/item/component/components/PlayableSongItemComponent.java delete mode 100644 src/main/java/net/errorcraft/itematic/item/component/components/RecordItemComponent.java delete mode 100644 src/main/java/net/errorcraft/itematic/mixin/block/JukeboxBlockExtender.java delete mode 100644 src/main/java/net/errorcraft/itematic/mixin/block/entity/JukeboxBlockEntityExtender.java delete mode 100644 src/main/java/net/errorcraft/itematic/mixin/item/ArmorItemAccessor.java rename src/main/java/net/errorcraft/itematic/mixin/{client/item => item/tooltip}/BundleTooltipDataExtender.java (73%) diff --git a/gradle.properties b/gradle.properties index 1b619dd2..431aaf2a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,8 +3,8 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://fabricmc.net/develop - minecraft_version=24w20a - yarn_mappings=24w20a+build.5 + minecraft_version=24w21b + yarn_mappings=24w21b+build.8 loader_version=0.18.4 # Mod Properties @@ -13,4 +13,4 @@ org.gradle.jvmargs=-Xmx1G archives_base_name = itematic # Dependencies - fabric_version=0.99.0+1.21 + fabric_version=0.99.1+1.21 diff --git a/src/client/java/net/errorcraft/itematic/client/item/bar/ItemBarStyles.java b/src/client/java/net/errorcraft/itematic/client/item/bar/ItemBarStyles.java index b318287e..d7fff15a 100644 --- a/src/client/java/net/errorcraft/itematic/client/item/bar/ItemBarStyles.java +++ b/src/client/java/net/errorcraft/itematic/client/item/bar/ItemBarStyles.java @@ -18,40 +18,40 @@ public static void bootstrap(BiConsumer provider) { ProgressProvider.DAMAGE, new HueShiftColorProvider(120, 0), List.of( - new Identifier("item_bar/progress/13"), - new Identifier("item_bar/progress/12"), - new Identifier("item_bar/progress/11"), - new Identifier("item_bar/progress/10"), - new Identifier("item_bar/progress/9"), - new Identifier("item_bar/progress/8"), - new Identifier("item_bar/progress/7"), - new Identifier("item_bar/progress/6"), - new Identifier("item_bar/progress/5"), - new Identifier("item_bar/progress/4"), - new Identifier("item_bar/progress/3"), - new Identifier("item_bar/progress/2"), - new Identifier("item_bar/progress/1"), - new Identifier("item_bar/progress/0") + Identifier.ofVanilla("item_bar/progress/13"), + Identifier.ofVanilla("item_bar/progress/12"), + Identifier.ofVanilla("item_bar/progress/11"), + Identifier.ofVanilla("item_bar/progress/10"), + Identifier.ofVanilla("item_bar/progress/9"), + Identifier.ofVanilla("item_bar/progress/8"), + Identifier.ofVanilla("item_bar/progress/7"), + Identifier.ofVanilla("item_bar/progress/6"), + Identifier.ofVanilla("item_bar/progress/5"), + Identifier.ofVanilla("item_bar/progress/4"), + Identifier.ofVanilla("item_bar/progress/3"), + Identifier.ofVanilla("item_bar/progress/2"), + Identifier.ofVanilla("item_bar/progress/1"), + Identifier.ofVanilla("item_bar/progress/0") ) )); provider.accept(ItemBarStyleKeys.BUNDLE, new ItemBarStyle( ProgressProvider.ITEM_HOLDER_OCCUPANCY, new ConstantColorProvider(BundleItemAccessor.itemBarColor()), List.of( - new Identifier("item_bar/progress/0"), - new Identifier("item_bar/progress/0"), - new Identifier("item_bar/progress/1"), - new Identifier("item_bar/progress/2"), - new Identifier("item_bar/progress/3"), - new Identifier("item_bar/progress/4"), - new Identifier("item_bar/progress/5"), - new Identifier("item_bar/progress/6"), - new Identifier("item_bar/progress/7"), - new Identifier("item_bar/progress/8"), - new Identifier("item_bar/progress/9"), - new Identifier("item_bar/progress/10"), - new Identifier("item_bar/progress/11"), - new Identifier("item_bar/progress/12") + Identifier.ofVanilla("item_bar/progress/0"), + Identifier.ofVanilla("item_bar/progress/0"), + Identifier.ofVanilla("item_bar/progress/1"), + Identifier.ofVanilla("item_bar/progress/2"), + Identifier.ofVanilla("item_bar/progress/3"), + Identifier.ofVanilla("item_bar/progress/4"), + Identifier.ofVanilla("item_bar/progress/5"), + Identifier.ofVanilla("item_bar/progress/6"), + Identifier.ofVanilla("item_bar/progress/7"), + Identifier.ofVanilla("item_bar/progress/8"), + Identifier.ofVanilla("item_bar/progress/9"), + Identifier.ofVanilla("item_bar/progress/10"), + Identifier.ofVanilla("item_bar/progress/11"), + Identifier.ofVanilla("item_bar/progress/12") ) )); } diff --git a/src/client/java/net/errorcraft/itematic/client/item/bar/color/ColorProviderTypeKeys.java b/src/client/java/net/errorcraft/itematic/client/item/bar/color/ColorProviderTypeKeys.java index 84a5029a..e612b448 100644 --- a/src/client/java/net/errorcraft/itematic/client/item/bar/color/ColorProviderTypeKeys.java +++ b/src/client/java/net/errorcraft/itematic/client/item/bar/color/ColorProviderTypeKeys.java @@ -9,6 +9,6 @@ public class ColorProviderTypeKeys { private ColorProviderTypeKeys() {} private static Identifier of(String id) { - return new Identifier(id); + return Identifier.ofVanilla(id); } } diff --git a/src/client/java/net/errorcraft/itematic/client/item/bar/progress/ProgressProviderKeys.java b/src/client/java/net/errorcraft/itematic/client/item/bar/progress/ProgressProviderKeys.java index d5582ded..a1413f3a 100644 --- a/src/client/java/net/errorcraft/itematic/client/item/bar/progress/ProgressProviderKeys.java +++ b/src/client/java/net/errorcraft/itematic/client/item/bar/progress/ProgressProviderKeys.java @@ -9,6 +9,6 @@ public class ProgressProviderKeys { private ProgressProviderKeys() {} private static Identifier of(String id) { - return new Identifier(id); + return Identifier.ofVanilla(id); } } diff --git a/src/client/java/net/errorcraft/itematic/client/render/ItematicTexturedRenderLayers.java b/src/client/java/net/errorcraft/itematic/client/render/ItematicTexturedRenderLayers.java index deb12374..dfade30b 100644 --- a/src/client/java/net/errorcraft/itematic/client/render/ItematicTexturedRenderLayers.java +++ b/src/client/java/net/errorcraft/itematic/client/render/ItematicTexturedRenderLayers.java @@ -11,8 +11,8 @@ import java.util.function.BiConsumer; public class ItematicTexturedRenderLayers { - public static final Identifier ARMOR_MATERIALS_ID = new Identifier("armor_materials"); - public static final Identifier ARMOR_MATERIALS_ATLAS_TEXTURE = new Identifier("textures/atlas/armor_materials.png"); + public static final Identifier ARMOR_MATERIALS_ID = Identifier.ofVanilla("armor_materials"); + public static final Identifier ARMOR_MATERIALS_ATLAS_TEXTURE = Identifier.ofVanilla("textures/atlas/armor_materials.png"); public static final RenderLayer ARMOR_MATERIAL_RENDER_LAYER = RenderLayer.getArmorCutoutNoCull(ARMOR_MATERIALS_ATLAS_TEXTURE); private ItematicTexturedRenderLayers() {} @@ -21,8 +21,8 @@ public static void bootstrap(BiConsumer> provider) provider.accept(ARMOR_MATERIALS_ID, List.of( new DirectoryAtlasSource("models/armor", "models/armor/"), new DirectoryAtlasSource("entity/horse/armor", "entity/horse/armor/"), - new SingleAtlasSource(new Identifier("entity/wolf/wolf_armor"), Optional.empty()), - new SingleAtlasSource(new Identifier("entity/wolf/wolf_armor_overlay"), Optional.empty()) + new SingleAtlasSource(Identifier.ofVanilla("entity/wolf/wolf_armor"), Optional.empty()), + new SingleAtlasSource(Identifier.ofVanilla("entity/wolf/wolf_armor_overlay"), Optional.empty()) )); } } diff --git a/src/client/java/net/errorcraft/itematic/mixin/client/gui/tooltip/TooltipComponentExtender.java b/src/client/java/net/errorcraft/itematic/mixin/client/gui/tooltip/TooltipComponentExtender.java index be6d9695..b9fa5ba6 100644 --- a/src/client/java/net/errorcraft/itematic/mixin/client/gui/tooltip/TooltipComponentExtender.java +++ b/src/client/java/net/errorcraft/itematic/mixin/client/gui/tooltip/TooltipComponentExtender.java @@ -5,14 +5,14 @@ import net.errorcraft.itematic.access.client.gui.tooltip.BundleTooltipComponentAccess; import net.minecraft.client.gui.tooltip.BundleTooltipComponent; import net.minecraft.client.gui.tooltip.TooltipComponent; -import net.minecraft.client.item.BundleTooltipData; +import net.minecraft.item.tooltip.BundleTooltipData; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @Mixin(TooltipComponent.class) public interface TooltipComponentExtender { @ModifyExpressionValue( - method = "of(Lnet/minecraft/client/item/TooltipData;)Lnet/minecraft/client/gui/tooltip/TooltipComponent;", + method = "of(Lnet/minecraft/item/tooltip/TooltipData;)Lnet/minecraft/client/gui/tooltip/TooltipComponent;", at = @At( value = "NEW", target = "(Lnet/minecraft/component/type/BundleContentsComponent;)Lnet/minecraft/client/gui/tooltip/BundleTooltipComponent;" diff --git a/src/client/java/net/errorcraft/itematic/mixin/client/render/WorldRendererExtender.java b/src/client/java/net/errorcraft/itematic/mixin/client/render/WorldRendererExtender.java index 6955f83f..7bc8a4dc 100644 --- a/src/client/java/net/errorcraft/itematic/mixin/client/render/WorldRendererExtender.java +++ b/src/client/java/net/errorcraft/itematic/mixin/client/render/WorldRendererExtender.java @@ -1,39 +1,22 @@ package net.errorcraft.itematic.mixin.client.render; import net.errorcraft.itematic.item.ItemKeys; -import net.errorcraft.itematic.item.component.ItemComponentTypes; -import net.errorcraft.itematic.item.component.components.RecordItemComponent; -import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.WorldRenderer; import net.minecraft.client.world.ClientWorld; -import net.minecraft.item.Item; import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; -import net.minecraft.item.MusicDiscItem; -import net.minecraft.sound.SoundEvent; -import net.minecraft.util.math.BlockPos; import org.objectweb.asm.Opcodes; -import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.*; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.Optional; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.Slice; @Mixin(WorldRenderer.class) public class WorldRendererExtender { @Shadow private ClientWorld world; - @Shadow - @Final - private MinecraftClient client; - - @Unique - private RecordItemComponent recordItemComponent; - @Redirect( method = "processWorldEvent", at = @At( @@ -52,56 +35,6 @@ private ItemStack newItemStackForSplashPotionUseCreateStack(ItemConvertible item return this.world.itematic$createStack(ItemKeys.SPLASH_POTION); } - @Redirect( - method = "processWorldEvent", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/item/Item;byRawId(I)Lnet/minecraft/item/Item;" - ) - ) - private Item byRawIdUseDynamicRegistry(int id) { - return this.world.itematic$getItemAccess().get(id); - } - - @ModifyConstant( - method = "processWorldEvent", - constant = @Constant( - classValue = MusicDiscItem.class, - ordinal = 0 - ) - ) - private boolean instanceOfMusicDiscItemUseItemComponentCheck(Object reference, Class clazz) { - Optional optionalComponent = ((Item) reference).itematic$getComponent(ItemComponentTypes.RECORD); - optionalComponent.ifPresent(component -> this.recordItemComponent = component); - return optionalComponent.isPresent(); - } - - @ModifyVariable( - method = "processWorldEvent", - at = @At("LOAD"), - slice = @Slice( - from = @At( - value = "INVOKE", - target = "Lnet/minecraft/item/Item;byRawId(I)Lnet/minecraft/item/Item;" - ) - ), - ordinal = 0 - ) - private Item castToMusicDiscItemUseNull(Item instance) { - return null; - } - - @Redirect( - method = "processWorldEvent", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/item/MusicDiscItem;getSound()Lnet/minecraft/sound/SoundEvent;" - ) - ) - private SoundEvent getSoundUseItemComponent(MusicDiscItem instance) { - return this.recordItemComponent.soundEvent().value(); - } - @Redirect( method = "processWorldEvent", at = @At( @@ -121,29 +54,4 @@ private SoundEvent getSoundUseItemComponent(MusicDiscItem instance) { private ItemStack newItemStackForEnderEyeUseCreateStack(ItemConvertible item) { return this.world.itematic$createStack(ItemKeys.ENDER_EYE); } - - @Redirect( - method = "playSong", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/item/MusicDiscItem;bySound(Lnet/minecraft/sound/SoundEvent;)Lnet/minecraft/item/MusicDiscItem;" - ) - ) - private MusicDiscItem bySoundReturnNull(SoundEvent sound) { - return null; - } - - @Inject( - method = "playSong", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/sound/PositionedSoundInstance;record(Lnet/minecraft/sound/SoundEvent;Lnet/minecraft/util/math/Vec3d;)Lnet/minecraft/client/sound/PositionedSoundInstance;" - ) - ) - private void setRecordPlayingOverlay(SoundEvent song, BlockPos songPosition, CallbackInfo info) { - if (this.recordItemComponent != null) { - this.client.inGameHud.setRecordPlayingOverlay(this.recordItemComponent.getDescription()); - this.recordItemComponent = null; - } - } } diff --git a/src/datagen/java/net/errorcraft/itematic/data/server/RecipeProvider.java b/src/datagen/java/net/errorcraft/itematic/data/server/RecipeProvider.java index c4aeb043..a7c35f37 100644 --- a/src/datagen/java/net/errorcraft/itematic/data/server/RecipeProvider.java +++ b/src/datagen/java/net/errorcraft/itematic/data/server/RecipeProvider.java @@ -28,67 +28,67 @@ public RecipeProvider(FabricDataOutput dataOutput, CompletableFuture> provider, RegistryWrapper.WrapperLookup lookup) { RegistryWrapper.Impl items = lookup.getWrapperOrThrow(RegistryKeys.ITEM); - provider.accept(new Identifier("shulker_box_coloring_black"), colorShulkerBox( + provider.accept(Identifier.ofVanilla("shulker_box_coloring_black"), colorShulkerBox( DyeColor.BLACK, items.getOrThrow(ItemKeys.BLACK_SHULKER_BOX) )); - provider.accept(new Identifier("shulker_box_coloring_blue"), colorShulkerBox( + provider.accept(Identifier.ofVanilla("shulker_box_coloring_blue"), colorShulkerBox( DyeColor.BLUE, items.getOrThrow(ItemKeys.BLUE_SHULKER_BOX) )); - provider.accept(new Identifier("shulker_box_coloring_brown"), colorShulkerBox( + provider.accept(Identifier.ofVanilla("shulker_box_coloring_brown"), colorShulkerBox( DyeColor.BROWN, items.getOrThrow(ItemKeys.BROWN_SHULKER_BOX) )); - provider.accept(new Identifier("shulker_box_coloring_cyan"), colorShulkerBox( + provider.accept(Identifier.ofVanilla("shulker_box_coloring_cyan"), colorShulkerBox( DyeColor.CYAN, items.getOrThrow(ItemKeys.CYAN_SHULKER_BOX) )); - provider.accept(new Identifier("shulker_box_coloring_gray"), colorShulkerBox( + provider.accept(Identifier.ofVanilla("shulker_box_coloring_gray"), colorShulkerBox( DyeColor.GRAY, items.getOrThrow(ItemKeys.GRAY_SHULKER_BOX) )); - provider.accept(new Identifier("shulker_box_coloring_green"), colorShulkerBox( + provider.accept(Identifier.ofVanilla("shulker_box_coloring_green"), colorShulkerBox( DyeColor.GREEN, items.getOrThrow(ItemKeys.GREEN_SHULKER_BOX) )); - provider.accept(new Identifier("shulker_box_coloring_light_blue"), colorShulkerBox( + provider.accept(Identifier.ofVanilla("shulker_box_coloring_light_blue"), colorShulkerBox( DyeColor.LIGHT_BLUE, items.getOrThrow(ItemKeys.LIGHT_BLUE_SHULKER_BOX) )); - provider.accept(new Identifier("shulker_box_coloring_light_gray"), colorShulkerBox( + provider.accept(Identifier.ofVanilla("shulker_box_coloring_light_gray"), colorShulkerBox( DyeColor.LIGHT_GRAY, items.getOrThrow(ItemKeys.LIGHT_GRAY_SHULKER_BOX) )); - provider.accept(new Identifier("shulker_box_coloring_lime"), colorShulkerBox( + provider.accept(Identifier.ofVanilla("shulker_box_coloring_lime"), colorShulkerBox( DyeColor.LIME, items.getOrThrow(ItemKeys.LIME_SHULKER_BOX) )); - provider.accept(new Identifier("shulker_box_coloring_magenta"), colorShulkerBox( + provider.accept(Identifier.ofVanilla("shulker_box_coloring_magenta"), colorShulkerBox( DyeColor.MAGENTA, items.getOrThrow(ItemKeys.MAGENTA_SHULKER_BOX) )); - provider.accept(new Identifier("shulker_box_coloring_orange"), colorShulkerBox( + provider.accept(Identifier.ofVanilla("shulker_box_coloring_orange"), colorShulkerBox( DyeColor.ORANGE, items.getOrThrow(ItemKeys.ORANGE_SHULKER_BOX) )); - provider.accept(new Identifier("shulker_box_coloring_pink"), colorShulkerBox( + provider.accept(Identifier.ofVanilla("shulker_box_coloring_pink"), colorShulkerBox( DyeColor.PINK, items.getOrThrow(ItemKeys.PINK_SHULKER_BOX) )); - provider.accept(new Identifier("shulker_box_coloring_purple"), colorShulkerBox( + provider.accept(Identifier.ofVanilla("shulker_box_coloring_purple"), colorShulkerBox( DyeColor.PURPLE, items.getOrThrow(ItemKeys.PURPLE_SHULKER_BOX) )); - provider.accept(new Identifier("shulker_box_coloring_red"), colorShulkerBox( + provider.accept(Identifier.ofVanilla("shulker_box_coloring_red"), colorShulkerBox( DyeColor.RED, items.getOrThrow(ItemKeys.RED_SHULKER_BOX) )); - provider.accept(new Identifier("shulker_box_coloring_white"), colorShulkerBox( + provider.accept(Identifier.ofVanilla("shulker_box_coloring_white"), colorShulkerBox( DyeColor.WHITE, items.getOrThrow(ItemKeys.WHITE_SHULKER_BOX) )); - provider.accept(new Identifier("shulker_box_coloring_yellow"), colorShulkerBox( + provider.accept(Identifier.ofVanilla("shulker_box_coloring_yellow"), colorShulkerBox( DyeColor.YELLOW, items.getOrThrow(ItemKeys.YELLOW_SHULKER_BOX) )); diff --git a/src/datagen/java/net/errorcraft/itematic/data/server/tag/BlockTagProvider.java b/src/datagen/java/net/errorcraft/itematic/data/server/tag/BlockTagProvider.java index 5936f9bc..cea10cb3 100644 --- a/src/datagen/java/net/errorcraft/itematic/data/server/tag/BlockTagProvider.java +++ b/src/datagen/java/net/errorcraft/itematic/data/server/tag/BlockTagProvider.java @@ -24,10 +24,6 @@ protected void configure(RegistryWrapper.WrapperLookup arg) { .add(BlockKeys.GRASS_BLOCK) .add(BlockKeys.DIRT) .add(BlockKeys.DIRT_PATH); - this.getOrCreateTagBuilder(ItematicBlockTags.AIR) - .add(BlockKeys.AIR) - .add(BlockKeys.CAVE_AIR) - .add(BlockKeys.VOID_AIR); this.getOrCreateTagBuilder(ItematicBlockTags.FLATTENABLE_INTO_DIRT_PATH) .add(BlockKeys.GRASS_BLOCK) .add(BlockKeys.DIRT) diff --git a/src/main/generated/data/minecraft/item/music_disc_11.json b/src/main/generated/data/minecraft/item/music_disc_11.json index 3a23da98..f39cdd1b 100644 --- a/src/main/generated/data/minecraft/item/music_disc_11.json +++ b/src/main/generated/data/minecraft/item/music_disc_11.json @@ -4,12 +4,7 @@ "translation_key": "item.minecraft.music_disc_11" }, "components": { - "minecraft:record": { - "description_key": "item.minecraft.music_disc_11.desc", - "duration": 1420, - "output_signal": 11, - "sound_event": "minecraft:music_disc.11" - }, + "minecraft:playable_song": "minecraft:11", "minecraft:stackable": 1 } } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/music_disc_13.json b/src/main/generated/data/minecraft/item/music_disc_13.json index 8d78fd25..ca0b15dc 100644 --- a/src/main/generated/data/minecraft/item/music_disc_13.json +++ b/src/main/generated/data/minecraft/item/music_disc_13.json @@ -4,12 +4,7 @@ "translation_key": "item.minecraft.music_disc_13" }, "components": { - "minecraft:record": { - "description_key": "item.minecraft.music_disc_13.desc", - "duration": 3560, - "output_signal": 1, - "sound_event": "minecraft:music_disc.13" - }, + "minecraft:playable_song": "minecraft:13", "minecraft:stackable": 1 } } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/music_disc_5.json b/src/main/generated/data/minecraft/item/music_disc_5.json index 1b2477f9..fd12710f 100644 --- a/src/main/generated/data/minecraft/item/music_disc_5.json +++ b/src/main/generated/data/minecraft/item/music_disc_5.json @@ -4,12 +4,7 @@ "translation_key": "item.minecraft.music_disc_5" }, "components": { - "minecraft:record": { - "description_key": "item.minecraft.music_disc_5.desc", - "duration": 3560, - "output_signal": 15, - "sound_event": "minecraft:music_disc.5" - }, + "minecraft:playable_song": "minecraft:5", "minecraft:stackable": 1 } } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/music_disc_blocks.json b/src/main/generated/data/minecraft/item/music_disc_blocks.json index 22ce9da9..b27c5e5e 100644 --- a/src/main/generated/data/minecraft/item/music_disc_blocks.json +++ b/src/main/generated/data/minecraft/item/music_disc_blocks.json @@ -4,12 +4,7 @@ "translation_key": "item.minecraft.music_disc_blocks" }, "components": { - "minecraft:record": { - "description_key": "item.minecraft.music_disc_blocks.desc", - "duration": 6900, - "output_signal": 3, - "sound_event": "minecraft:music_disc.blocks" - }, + "minecraft:playable_song": "minecraft:blocks", "minecraft:stackable": 1 } } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/music_disc_cat.json b/src/main/generated/data/minecraft/item/music_disc_cat.json index a95b5c12..2fae73d1 100644 --- a/src/main/generated/data/minecraft/item/music_disc_cat.json +++ b/src/main/generated/data/minecraft/item/music_disc_cat.json @@ -4,12 +4,7 @@ "translation_key": "item.minecraft.music_disc_cat" }, "components": { - "minecraft:record": { - "description_key": "item.minecraft.music_disc_cat.desc", - "duration": 3700, - "output_signal": 2, - "sound_event": "minecraft:music_disc.cat" - }, + "minecraft:playable_song": "minecraft:cat", "minecraft:stackable": 1 } } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/music_disc_chirp.json b/src/main/generated/data/minecraft/item/music_disc_chirp.json index 08a3ba15..f64c6c5d 100644 --- a/src/main/generated/data/minecraft/item/music_disc_chirp.json +++ b/src/main/generated/data/minecraft/item/music_disc_chirp.json @@ -4,12 +4,7 @@ "translation_key": "item.minecraft.music_disc_chirp" }, "components": { - "minecraft:record": { - "description_key": "item.minecraft.music_disc_chirp.desc", - "duration": 3700, - "output_signal": 4, - "sound_event": "minecraft:music_disc.chirp" - }, + "minecraft:playable_song": "minecraft:chirp", "minecraft:stackable": 1 } } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/music_disc_creator.json b/src/main/generated/data/minecraft/item/music_disc_creator.json index b3fee811..4f09d315 100644 --- a/src/main/generated/data/minecraft/item/music_disc_creator.json +++ b/src/main/generated/data/minecraft/item/music_disc_creator.json @@ -4,12 +4,7 @@ "translation_key": "item.minecraft.music_disc_creator" }, "components": { - "minecraft:record": { - "description_key": "item.minecraft.music_disc_creator.desc", - "duration": 3520, - "output_signal": 12, - "sound_event": "minecraft:music_disc.creator" - }, + "minecraft:playable_song": "minecraft:creator", "minecraft:stackable": 1 } } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/music_disc_creator_music_box.json b/src/main/generated/data/minecraft/item/music_disc_creator_music_box.json index 4e1a3d95..124892c3 100644 --- a/src/main/generated/data/minecraft/item/music_disc_creator_music_box.json +++ b/src/main/generated/data/minecraft/item/music_disc_creator_music_box.json @@ -4,12 +4,7 @@ "translation_key": "item.minecraft.music_disc_creator_music_box" }, "components": { - "minecraft:record": { - "description_key": "item.minecraft.music_disc_creator_music_box.desc", - "duration": 1460, - "output_signal": 11, - "sound_event": "minecraft:music_disc.creator_music_box" - }, + "minecraft:playable_song": "minecraft:creator_music_box", "minecraft:stackable": 1 } } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/music_disc_far.json b/src/main/generated/data/minecraft/item/music_disc_far.json index 02a2090b..4a4c6d59 100644 --- a/src/main/generated/data/minecraft/item/music_disc_far.json +++ b/src/main/generated/data/minecraft/item/music_disc_far.json @@ -4,12 +4,7 @@ "translation_key": "item.minecraft.music_disc_far" }, "components": { - "minecraft:record": { - "description_key": "item.minecraft.music_disc_far.desc", - "duration": 3480, - "output_signal": 5, - "sound_event": "minecraft:music_disc.far" - }, + "minecraft:playable_song": "minecraft:far", "minecraft:stackable": 1 } } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/music_disc_mall.json b/src/main/generated/data/minecraft/item/music_disc_mall.json index 8dd07e6b..055ea3b6 100644 --- a/src/main/generated/data/minecraft/item/music_disc_mall.json +++ b/src/main/generated/data/minecraft/item/music_disc_mall.json @@ -4,12 +4,7 @@ "translation_key": "item.minecraft.music_disc_mall" }, "components": { - "minecraft:record": { - "description_key": "item.minecraft.music_disc_mall.desc", - "duration": 3940, - "output_signal": 6, - "sound_event": "minecraft:music_disc.mall" - }, + "minecraft:playable_song": "minecraft:mall", "minecraft:stackable": 1 } } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/music_disc_mellohi.json b/src/main/generated/data/minecraft/item/music_disc_mellohi.json index d2eac422..45ea00e5 100644 --- a/src/main/generated/data/minecraft/item/music_disc_mellohi.json +++ b/src/main/generated/data/minecraft/item/music_disc_mellohi.json @@ -4,12 +4,7 @@ "translation_key": "item.minecraft.music_disc_mellohi" }, "components": { - "minecraft:record": { - "description_key": "item.minecraft.music_disc_mellohi.desc", - "duration": 1920, - "output_signal": 7, - "sound_event": "minecraft:music_disc.mellohi" - }, + "minecraft:playable_song": "minecraft:mellohi", "minecraft:stackable": 1 } } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/music_disc_otherside.json b/src/main/generated/data/minecraft/item/music_disc_otherside.json index 83e4a06e..35769674 100644 --- a/src/main/generated/data/minecraft/item/music_disc_otherside.json +++ b/src/main/generated/data/minecraft/item/music_disc_otherside.json @@ -4,12 +4,7 @@ "translation_key": "item.minecraft.music_disc_otherside" }, "components": { - "minecraft:record": { - "description_key": "item.minecraft.music_disc_otherside.desc", - "duration": 3900, - "output_signal": 14, - "sound_event": "minecraft:music_disc.otherside" - }, + "minecraft:playable_song": "minecraft:otherside", "minecraft:stackable": 1 } } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/music_disc_pigstep.json b/src/main/generated/data/minecraft/item/music_disc_pigstep.json index 2a3c66a4..2136d135 100644 --- a/src/main/generated/data/minecraft/item/music_disc_pigstep.json +++ b/src/main/generated/data/minecraft/item/music_disc_pigstep.json @@ -4,12 +4,7 @@ "translation_key": "item.minecraft.music_disc_pigstep" }, "components": { - "minecraft:record": { - "description_key": "item.minecraft.music_disc_pigstep.desc", - "duration": 2980, - "output_signal": 13, - "sound_event": "minecraft:music_disc.pigstep" - }, + "minecraft:playable_song": "minecraft:pigstep", "minecraft:stackable": 1 } } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/music_disc_precipice.json b/src/main/generated/data/minecraft/item/music_disc_precipice.json index 40b2bfd1..17281f2e 100644 --- a/src/main/generated/data/minecraft/item/music_disc_precipice.json +++ b/src/main/generated/data/minecraft/item/music_disc_precipice.json @@ -4,12 +4,7 @@ "translation_key": "item.minecraft.music_disc_precipice" }, "components": { - "minecraft:record": { - "description_key": "item.minecraft.music_disc_precipice.desc", - "duration": 5980, - "output_signal": 13, - "sound_event": "minecraft:music_disc.precipice" - }, + "minecraft:playable_song": "minecraft:precipice", "minecraft:stackable": 1 } } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/music_disc_relic.json b/src/main/generated/data/minecraft/item/music_disc_relic.json index 8204bbb3..539ce384 100644 --- a/src/main/generated/data/minecraft/item/music_disc_relic.json +++ b/src/main/generated/data/minecraft/item/music_disc_relic.json @@ -4,12 +4,7 @@ "translation_key": "item.minecraft.music_disc_relic" }, "components": { - "minecraft:record": { - "description_key": "item.minecraft.music_disc_relic.desc", - "duration": 4360, - "output_signal": 14, - "sound_event": "minecraft:music_disc.relic" - }, + "minecraft:playable_song": "minecraft:relic", "minecraft:stackable": 1 } } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/music_disc_stal.json b/src/main/generated/data/minecraft/item/music_disc_stal.json index 06c3493a..cd13027f 100644 --- a/src/main/generated/data/minecraft/item/music_disc_stal.json +++ b/src/main/generated/data/minecraft/item/music_disc_stal.json @@ -4,12 +4,7 @@ "translation_key": "item.minecraft.music_disc_stal" }, "components": { - "minecraft:record": { - "description_key": "item.minecraft.music_disc_stal.desc", - "duration": 3000, - "output_signal": 8, - "sound_event": "minecraft:music_disc.stal" - }, + "minecraft:playable_song": "minecraft:stal", "minecraft:stackable": 1 } } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/music_disc_strad.json b/src/main/generated/data/minecraft/item/music_disc_strad.json index e002254e..e79d948a 100644 --- a/src/main/generated/data/minecraft/item/music_disc_strad.json +++ b/src/main/generated/data/minecraft/item/music_disc_strad.json @@ -4,12 +4,7 @@ "translation_key": "item.minecraft.music_disc_strad" }, "components": { - "minecraft:record": { - "description_key": "item.minecraft.music_disc_strad.desc", - "duration": 3760, - "output_signal": 9, - "sound_event": "minecraft:music_disc.strad" - }, + "minecraft:playable_song": "minecraft:strad", "minecraft:stackable": 1 } } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/music_disc_wait.json b/src/main/generated/data/minecraft/item/music_disc_wait.json index c2f2926d..7a6af79e 100644 --- a/src/main/generated/data/minecraft/item/music_disc_wait.json +++ b/src/main/generated/data/minecraft/item/music_disc_wait.json @@ -4,12 +4,7 @@ "translation_key": "item.minecraft.music_disc_wait" }, "components": { - "minecraft:record": { - "description_key": "item.minecraft.music_disc_wait.desc", - "duration": 4760, - "output_signal": 12, - "sound_event": "minecraft:music_disc.wait" - }, + "minecraft:playable_song": "minecraft:wait", "minecraft:stackable": 1 } } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/item/music_disc_ward.json b/src/main/generated/data/minecraft/item/music_disc_ward.json index c03a42d2..ce3e4ab6 100644 --- a/src/main/generated/data/minecraft/item/music_disc_ward.json +++ b/src/main/generated/data/minecraft/item/music_disc_ward.json @@ -4,12 +4,7 @@ "translation_key": "item.minecraft.music_disc_ward" }, "components": { - "minecraft:record": { - "description_key": "item.minecraft.music_disc_ward.desc", - "duration": 5020, - "output_signal": 10, - "sound_event": "minecraft:music_disc.ward" - }, + "minecraft:playable_song": "minecraft:ward", "minecraft:stackable": 1 } } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/block/air.json b/src/main/generated/data/minecraft/tags/block/air.json deleted file mode 100644 index 7df179d5..00000000 --- a/src/main/generated/data/minecraft/tags/block/air.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "minecraft:air", - "minecraft:cave_air", - "minecraft:void_air" - ] -} \ No newline at end of file diff --git a/src/main/java/net/errorcraft/itematic/access/client/item/BundleTooltipDataAccess.java b/src/main/java/net/errorcraft/itematic/access/item/tooltip/BundleTooltipDataAccess.java similarity index 80% rename from src/main/java/net/errorcraft/itematic/access/client/item/BundleTooltipDataAccess.java rename to src/main/java/net/errorcraft/itematic/access/item/tooltip/BundleTooltipDataAccess.java index d248a3ee..60f08226 100644 --- a/src/main/java/net/errorcraft/itematic/access/client/item/BundleTooltipDataAccess.java +++ b/src/main/java/net/errorcraft/itematic/access/item/tooltip/BundleTooltipDataAccess.java @@ -1,4 +1,4 @@ -package net.errorcraft.itematic.access.client.item; +package net.errorcraft.itematic.access.item.tooltip; import org.apache.commons.lang3.math.Fraction; diff --git a/src/main/java/net/errorcraft/itematic/block/BlockKeys.java b/src/main/java/net/errorcraft/itematic/block/BlockKeys.java index cfb8012b..7223e034 100644 --- a/src/main/java/net/errorcraft/itematic/block/BlockKeys.java +++ b/src/main/java/net/errorcraft/itematic/block/BlockKeys.java @@ -6,7 +6,6 @@ import net.minecraft.util.Identifier; public class BlockKeys { - public static final RegistryKey AIR = of("air"); public static final RegistryKey STONE = of("stone"); public static final RegistryKey GRANITE = of("granite"); public static final RegistryKey POLISHED_GRANITE = of("polished_granite"); @@ -720,8 +719,6 @@ public class BlockKeys { public static final RegistryKey CONDUIT = of("conduit"); public static final RegistryKey BAMBOO = of("bamboo"); public static final RegistryKey POTTED_BAMBOO = of("potted_bamboo"); - public static final RegistryKey VOID_AIR = of("void_air"); - public static final RegistryKey CAVE_AIR = of("cave_air"); public static final RegistryKey POLISHED_GRANITE_STAIRS = of("polished_granite_stairs"); public static final RegistryKey SMOOTH_RED_SANDSTONE_STAIRS = of("smooth_red_sandstone_stairs"); public static final RegistryKey MOSSY_STONE_BRICK_STAIRS = of("mossy_stone_brick_stairs"); @@ -1033,6 +1030,6 @@ public class BlockKeys { private BlockKeys() {} private static RegistryKey of(String id) { - return RegistryKey.of(RegistryKeys.BLOCK, new Identifier(id)); + return RegistryKey.of(RegistryKeys.BLOCK, Identifier.ofVanilla(id)); } } diff --git a/src/main/java/net/errorcraft/itematic/block/ItematicBlockTags.java b/src/main/java/net/errorcraft/itematic/block/ItematicBlockTags.java index a99950bd..b1824913 100644 --- a/src/main/java/net/errorcraft/itematic/block/ItematicBlockTags.java +++ b/src/main/java/net/errorcraft/itematic/block/ItematicBlockTags.java @@ -7,13 +7,12 @@ public class ItematicBlockTags { public static final TagKey END_CRYSTAL_SPAWNABLE_ON = of("end_crystal_spawnable_on"); - public static final TagKey AIR = of("air"); public static final TagKey TILLABLE_INTO_FARMLAND = of("tillable_into_farmland"); public static final TagKey FLATTENABLE_INTO_DIRT_PATH = of("flattenable_into_dirt_path"); private ItematicBlockTags() {} private static TagKey of(String id) { - return TagKey.of(RegistryKeys.BLOCK, new Identifier(id)); + return TagKey.of(RegistryKeys.BLOCK, Identifier.ofVanilla(id)); } } diff --git a/src/main/java/net/errorcraft/itematic/entity/EntityTypeKeys.java b/src/main/java/net/errorcraft/itematic/entity/EntityTypeKeys.java index 59febf98..4629a69b 100644 --- a/src/main/java/net/errorcraft/itematic/entity/EntityTypeKeys.java +++ b/src/main/java/net/errorcraft/itematic/entity/EntityTypeKeys.java @@ -99,6 +99,6 @@ public class EntityTypeKeys { private EntityTypeKeys() {} private static RegistryKey> of(String id) { - return RegistryKey.of(RegistryKeys.ENTITY_TYPE, new Identifier(id)); + return RegistryKey.of(RegistryKeys.ENTITY_TYPE, Identifier.ofVanilla(id)); } } diff --git a/src/main/java/net/errorcraft/itematic/entity/ItematicEntityTypeTags.java b/src/main/java/net/errorcraft/itematic/entity/ItematicEntityTypeTags.java index 00c71390..bf9dfded 100644 --- a/src/main/java/net/errorcraft/itematic/entity/ItematicEntityTypeTags.java +++ b/src/main/java/net/errorcraft/itematic/entity/ItematicEntityTypeTags.java @@ -11,6 +11,6 @@ public class ItematicEntityTypeTags { private ItematicEntityTypeTags() {} private static TagKey> of(String id) { - return TagKey.of(RegistryKeys.ENTITY_TYPE, new Identifier(id)); + return TagKey.of(RegistryKeys.ENTITY_TYPE, Identifier.ofVanilla(id)); } } diff --git a/src/main/java/net/errorcraft/itematic/entity/effect/StatusEffectKeys.java b/src/main/java/net/errorcraft/itematic/entity/effect/StatusEffectKeys.java index c310a147..d0ab3050 100644 --- a/src/main/java/net/errorcraft/itematic/entity/effect/StatusEffectKeys.java +++ b/src/main/java/net/errorcraft/itematic/entity/effect/StatusEffectKeys.java @@ -18,6 +18,6 @@ public class StatusEffectKeys { public static final RegistryKey SATURATION = of("saturation"); private static RegistryKey of(String id) { - return RegistryKey.of(RegistryKeys.STATUS_EFFECT, new Identifier(id)); + return RegistryKey.of(RegistryKeys.STATUS_EFFECT, Identifier.ofVanilla(id)); } } diff --git a/src/main/java/net/errorcraft/itematic/fluid/FluidKeys.java b/src/main/java/net/errorcraft/itematic/fluid/FluidKeys.java index 85ae5ff1..6d7fb5de 100644 --- a/src/main/java/net/errorcraft/itematic/fluid/FluidKeys.java +++ b/src/main/java/net/errorcraft/itematic/fluid/FluidKeys.java @@ -13,6 +13,6 @@ public class FluidKeys { private FluidKeys() {} private static RegistryKey of(String id) { - return RegistryKey.of(RegistryKeys.FLUID, new Identifier(id)); + return RegistryKey.of(RegistryKeys.FLUID, Identifier.ofVanilla(id)); } } diff --git a/src/main/java/net/errorcraft/itematic/item/ItemAccess.java b/src/main/java/net/errorcraft/itematic/item/ItemAccess.java index 33684475..fb7147ea 100644 --- a/src/main/java/net/errorcraft/itematic/item/ItemAccess.java +++ b/src/main/java/net/errorcraft/itematic/item/ItemAccess.java @@ -30,10 +30,6 @@ public Optional> getOptionalEntry(int id) { return this.registry.getEntry(id); } - public Item get(int id) { - return this.registry.get(id); - } - public Stream> streamEntries() { return this.registry.streamEntries(); } diff --git a/src/main/java/net/errorcraft/itematic/item/ItemBarStyleKeys.java b/src/main/java/net/errorcraft/itematic/item/ItemBarStyleKeys.java index 39303f39..1f1f16b8 100644 --- a/src/main/java/net/errorcraft/itematic/item/ItemBarStyleKeys.java +++ b/src/main/java/net/errorcraft/itematic/item/ItemBarStyleKeys.java @@ -9,6 +9,6 @@ public class ItemBarStyleKeys { private ItemBarStyleKeys() {} private static Identifier of(String name) { - return new Identifier(name); + return Identifier.ofVanilla(name); } } diff --git a/src/main/java/net/errorcraft/itematic/item/ItemKeys.java b/src/main/java/net/errorcraft/itematic/item/ItemKeys.java index cd4cc43e..217ac104 100644 --- a/src/main/java/net/errorcraft/itematic/item/ItemKeys.java +++ b/src/main/java/net/errorcraft/itematic/item/ItemKeys.java @@ -1342,6 +1342,6 @@ public class ItemKeys { private static RegistryKey register(String name) { - return RegistryKey.of(RegistryKeys.ITEM, new Identifier(name)); + return RegistryKey.of(RegistryKeys.ITEM, Identifier.ofVanilla(name)); } } diff --git a/src/main/java/net/errorcraft/itematic/item/ItemUtil.java b/src/main/java/net/errorcraft/itematic/item/ItemUtil.java index 59e1a231..337cbd5f 100644 --- a/src/main/java/net/errorcraft/itematic/item/ItemUtil.java +++ b/src/main/java/net/errorcraft/itematic/item/ItemUtil.java @@ -51,7 +51,8 @@ import net.minecraft.block.Blocks; import net.minecraft.block.DecoratedPotPattern; import net.minecraft.block.DecoratedPotPatterns; -import net.minecraft.client.color.world.FoliageColors; +import net.minecraft.block.jukebox.JukeboxSong; +import net.minecraft.block.jukebox.JukeboxSongs; import net.minecraft.component.ComponentChanges; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.*; @@ -89,6 +90,7 @@ import net.minecraft.util.math.Direction; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeKeys; +import net.minecraft.world.biome.FoliageColors; import net.minecraft.world.event.GameEvent; import org.apache.commons.lang3.math.Fraction; @@ -144,6 +146,7 @@ private static class Bootstrapper { private final RegistryEntryLookup statusEffects; private final RegistryEntryLookup potions; private final RegistryEntryLookup enchantments; + private final RegistryEntryLookup jukeboxSongs; private Bootstrapper(Registerable registerable) { this.registerable = registerable; @@ -162,6 +165,7 @@ private Bootstrapper(Registerable registerable) { this.statusEffects = registerable.getRegistryLookup(RegistryKeys.STATUS_EFFECT); this.potions = registerable.getRegistryLookup(RegistryKeys.POTION); this.enchantments = registerable.getRegistryLookup(RegistryKeys.ENCHANTMENT); + this.jukeboxSongs = registerable.getRegistryLookup(RegistryKeys.JUKEBOX_SONG); } private void bootstrap() { @@ -9319,7 +9323,7 @@ private void bootstrapRecords() { .rarity(Rarity.EPIC) .build(), ItemComponentSet.builder() - .with(RecordItemComponent.of(this.soundEvents.getOrThrow(SoundEventKeys.MUSIC_DISC_13), ItemKeys.MUSIC_DISC_13, 178 * 20, 1)) + .with(PlayableSongItemComponent.of(this.jukeboxSongs.getOrThrow(JukeboxSongs.THIRTEEN))) .build() )); this.registerable.register(ItemKeys.MUSIC_DISC_CAT, create( @@ -9327,7 +9331,7 @@ private void bootstrapRecords() { .rarity(Rarity.EPIC) .build(), ItemComponentSet.builder() - .with(RecordItemComponent.of(this.soundEvents.getOrThrow(SoundEventKeys.MUSIC_DISC_CAT), ItemKeys.MUSIC_DISC_CAT, 185 * 20, 2)) + .with(PlayableSongItemComponent.of(this.jukeboxSongs.getOrThrow(JukeboxSongs.CAT))) .build() )); this.registerable.register(ItemKeys.MUSIC_DISC_BLOCKS, create( @@ -9335,7 +9339,7 @@ private void bootstrapRecords() { .rarity(Rarity.EPIC) .build(), ItemComponentSet.builder() - .with(RecordItemComponent.of(this.soundEvents.getOrThrow(SoundEventKeys.MUSIC_DISC_BLOCKS), ItemKeys.MUSIC_DISC_BLOCKS, 345 * 20, 3)) + .with(PlayableSongItemComponent.of(this.jukeboxSongs.getOrThrow(JukeboxSongs.BLOCKS))) .build() )); this.registerable.register(ItemKeys.MUSIC_DISC_CHIRP, create( @@ -9343,7 +9347,7 @@ private void bootstrapRecords() { .rarity(Rarity.EPIC) .build(), ItemComponentSet.builder() - .with(RecordItemComponent.of(this.soundEvents.getOrThrow(SoundEventKeys.MUSIC_DISC_CHIRP), ItemKeys.MUSIC_DISC_CHIRP, 185 * 20, 4)) + .with(PlayableSongItemComponent.of(this.jukeboxSongs.getOrThrow(JukeboxSongs.CHIRP))) .build() )); this.registerable.register(ItemKeys.MUSIC_DISC_CREATOR, create( @@ -9351,7 +9355,7 @@ private void bootstrapRecords() { .rarity(Rarity.EPIC) .build(), ItemComponentSet.builder() - .with(RecordItemComponent.of(this.soundEvents.getOrThrow(SoundEventKeys.MUSIC_DISC_CREATOR), ItemKeys.MUSIC_DISC_CREATOR, 176 * 20, 12)) + .with(PlayableSongItemComponent.of(this.jukeboxSongs.getOrThrow(JukeboxSongs.CREATOR))) .build() )); this.registerable.register(ItemKeys.MUSIC_DISC_CREATOR_MUSIC_BOX, create( @@ -9359,7 +9363,7 @@ private void bootstrapRecords() { .rarity(Rarity.EPIC) .build(), ItemComponentSet.builder() - .with(RecordItemComponent.of(this.soundEvents.getOrThrow(SoundEventKeys.MUSIC_DISC_CREATOR_MUSIC_BOX), ItemKeys.MUSIC_DISC_CREATOR_MUSIC_BOX, 73 * 20, 11)) + .with(PlayableSongItemComponent.of(this.jukeboxSongs.getOrThrow(JukeboxSongs.CREATOR_MUSIC_BOX))) .build() )); @@ -9368,7 +9372,7 @@ private void bootstrapRecords() { .rarity(Rarity.EPIC) .build(), ItemComponentSet.builder() - .with(RecordItemComponent.of(this.soundEvents.getOrThrow(SoundEventKeys.MUSIC_DISC_FAR), ItemKeys.MUSIC_DISC_FAR, 174 * 20, 5)) + .with(PlayableSongItemComponent.of(this.jukeboxSongs.getOrThrow(JukeboxSongs.FAR))) .build() )); this.registerable.register(ItemKeys.MUSIC_DISC_MALL, create( @@ -9376,7 +9380,7 @@ private void bootstrapRecords() { .rarity(Rarity.EPIC) .build(), ItemComponentSet.builder() - .with(RecordItemComponent.of(this.soundEvents.getOrThrow(SoundEventKeys.MUSIC_DISC_MALL), ItemKeys.MUSIC_DISC_MALL, 197 * 20, 6)) + .with(PlayableSongItemComponent.of(this.jukeboxSongs.getOrThrow(JukeboxSongs.MALL))) .build() )); this.registerable.register(ItemKeys.MUSIC_DISC_MELLOHI, create( @@ -9384,7 +9388,7 @@ private void bootstrapRecords() { .rarity(Rarity.EPIC) .build(), ItemComponentSet.builder() - .with(RecordItemComponent.of(this.soundEvents.getOrThrow(SoundEventKeys.MUSIC_DISC_MELLOHI), ItemKeys.MUSIC_DISC_MELLOHI, 96 * 20, 7)) + .with(PlayableSongItemComponent.of(this.jukeboxSongs.getOrThrow(JukeboxSongs.MELLOHI))) .build() )); this.registerable.register(ItemKeys.MUSIC_DISC_STAL, create( @@ -9392,7 +9396,7 @@ private void bootstrapRecords() { .rarity(Rarity.EPIC) .build(), ItemComponentSet.builder() - .with(RecordItemComponent.of(this.soundEvents.getOrThrow(SoundEventKeys.MUSIC_DISC_STAL), ItemKeys.MUSIC_DISC_STAL, 150 * 20, 8)) + .with(PlayableSongItemComponent.of(this.jukeboxSongs.getOrThrow(JukeboxSongs.STAL))) .build() )); this.registerable.register(ItemKeys.MUSIC_DISC_STRAD, create( @@ -9400,7 +9404,7 @@ private void bootstrapRecords() { .rarity(Rarity.EPIC) .build(), ItemComponentSet.builder() - .with(RecordItemComponent.of(this.soundEvents.getOrThrow(SoundEventKeys.MUSIC_DISC_STRAD), ItemKeys.MUSIC_DISC_STRAD, 188 * 20, 9)) + .with(PlayableSongItemComponent.of(this.jukeboxSongs.getOrThrow(JukeboxSongs.STRAD))) .build() )); this.registerable.register(ItemKeys.MUSIC_DISC_WARD, create( @@ -9408,7 +9412,7 @@ private void bootstrapRecords() { .rarity(Rarity.EPIC) .build(), ItemComponentSet.builder() - .with(RecordItemComponent.of(this.soundEvents.getOrThrow(SoundEventKeys.MUSIC_DISC_WARD), ItemKeys.MUSIC_DISC_WARD, 251 * 20, 10)) + .with(PlayableSongItemComponent.of(this.jukeboxSongs.getOrThrow(JukeboxSongs.WARD))) .build() )); this.registerable.register(ItemKeys.MUSIC_DISC_11, create( @@ -9416,7 +9420,7 @@ private void bootstrapRecords() { .rarity(Rarity.EPIC) .build(), ItemComponentSet.builder() - .with(RecordItemComponent.of(this.soundEvents.getOrThrow(SoundEventKeys.MUSIC_DISC_11), ItemKeys.MUSIC_DISC_11, 71 * 20, 11)) + .with(PlayableSongItemComponent.of(this.jukeboxSongs.getOrThrow(JukeboxSongs.ELEVEN))) .build() )); this.registerable.register(ItemKeys.MUSIC_DISC_WAIT, create( @@ -9424,7 +9428,7 @@ private void bootstrapRecords() { .rarity(Rarity.EPIC) .build(), ItemComponentSet.builder() - .with(RecordItemComponent.of(this.soundEvents.getOrThrow(SoundEventKeys.MUSIC_DISC_WAIT), ItemKeys.MUSIC_DISC_WAIT, 238 * 20, 12)) + .with(PlayableSongItemComponent.of(this.jukeboxSongs.getOrThrow(JukeboxSongs.WAIT))) .build() )); this.registerable.register(ItemKeys.MUSIC_DISC_OTHERSIDE, create( @@ -9432,7 +9436,7 @@ private void bootstrapRecords() { .rarity(Rarity.EPIC) .build(), ItemComponentSet.builder() - .with(RecordItemComponent.of(this.soundEvents.getOrThrow(SoundEventKeys.MUSIC_DISC_OTHERSIDE), ItemKeys.MUSIC_DISC_OTHERSIDE, 195 * 20, 14)) + .with(PlayableSongItemComponent.of(this.jukeboxSongs.getOrThrow(JukeboxSongs.OTHERSIDE))) .build() )); this.registerable.register(ItemKeys.MUSIC_DISC_RELIC, create( @@ -9440,7 +9444,7 @@ private void bootstrapRecords() { .rarity(Rarity.EPIC) .build(), ItemComponentSet.builder() - .with(RecordItemComponent.of(this.soundEvents.getOrThrow(SoundEventKeys.MUSIC_DISC_RELIC), ItemKeys.MUSIC_DISC_RELIC, 218 * 20, 14)) + .with(PlayableSongItemComponent.of(this.jukeboxSongs.getOrThrow(JukeboxSongs.RELIC))) .build() )); this.registerable.register(ItemKeys.MUSIC_DISC_PIGSTEP, create( @@ -9448,7 +9452,7 @@ private void bootstrapRecords() { .rarity(Rarity.EPIC) .build(), ItemComponentSet.builder() - .with(RecordItemComponent.of(this.soundEvents.getOrThrow(SoundEventKeys.MUSIC_DISC_PIGSTEP), ItemKeys.MUSIC_DISC_PIGSTEP, 149 * 20, 13)) + .with(PlayableSongItemComponent.of(this.jukeboxSongs.getOrThrow(JukeboxSongs.PIGSTEP))) .build() )); this.registerable.register(ItemKeys.MUSIC_DISC_PRECIPICE, create( @@ -9456,7 +9460,7 @@ private void bootstrapRecords() { .rarity(Rarity.EPIC) .build(), ItemComponentSet.builder() - .with(RecordItemComponent.of(this.soundEvents.getOrThrow(SoundEventKeys.MUSIC_DISC_PRECIPICE), ItemKeys.MUSIC_DISC_PRECIPICE, 299 * 20, 13)) + .with(PlayableSongItemComponent.of(this.jukeboxSongs.getOrThrow(JukeboxSongs.PRECIPICE))) .build() )); this.registerable.register(ItemKeys.MUSIC_DISC_5, create( @@ -9464,7 +9468,7 @@ private void bootstrapRecords() { .rarity(Rarity.EPIC) .build(), ItemComponentSet.builder() - .with(RecordItemComponent.of(this.soundEvents.getOrThrow(SoundEventKeys.MUSIC_DISC_5), ItemKeys.MUSIC_DISC_5, 178 * 20, 15)) + .with(PlayableSongItemComponent.of(this.jukeboxSongs.getOrThrow(JukeboxSongs.FIVE))) .build() )); this.registerable.register(ItemKeys.DISC_FRAGMENT_5, create( @@ -10202,7 +10206,7 @@ private void bootstrapMiscellaneous() { ItemBase.Builder.forItem(ItemKeys.COMPASS).build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) - .with(PointableItemComponent.of(this.pointers.getOrThrow(PointerKeys.SPAWN_LOCATION), Util.createTranslationKey("item", new Identifier("lodestone_compass")))) + .with(PointableItemComponent.of(this.pointers.getOrThrow(PointerKeys.SPAWN_LOCATION), Util.createTranslationKey("item", Identifier.ofVanilla("lodestone_compass")))) .build(), ItemEventMap.builder() .add(ItemEvents.USE_ON_BLOCK, ActionEntry.of( diff --git a/src/main/java/net/errorcraft/itematic/item/ItematicItemTags.java b/src/main/java/net/errorcraft/itematic/item/ItematicItemTags.java index 0f06c25f..aaf2ee57 100644 --- a/src/main/java/net/errorcraft/itematic/item/ItematicItemTags.java +++ b/src/main/java/net/errorcraft/itematic/item/ItematicItemTags.java @@ -163,6 +163,6 @@ public class ItematicItemTags { private ItematicItemTags() {} private static TagKey of(String id) { - return TagKey.of(RegistryKeys.ITEM, new Identifier(id)); + return TagKey.of(RegistryKeys.ITEM, Identifier.ofVanilla(id)); } } diff --git a/src/main/java/net/errorcraft/itematic/item/armor/ArmorMaterial.java b/src/main/java/net/errorcraft/itematic/item/armor/ArmorMaterial.java index 97eab356..dfc5ebd1 100644 --- a/src/main/java/net/errorcraft/itematic/item/armor/ArmorMaterial.java +++ b/src/main/java/net/errorcraft/itematic/item/armor/ArmorMaterial.java @@ -3,7 +3,6 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.errorcraft.itematic.entity.EquipmentSlotUtil; -import net.errorcraft.itematic.mixin.item.ArmorItemAccessor; import net.minecraft.component.type.AttributeModifierSlot; import net.minecraft.component.type.AttributeModifiersComponent; import net.minecraft.entity.EquipmentSlot; @@ -15,8 +14,6 @@ import net.minecraft.util.StringIdentifiable; import java.util.Map; -import java.util.UUID; -import java.util.stream.Collectors; public record ArmorMaterial(Identifier assetId, Map defense, double toughness, double knockbackResistance) { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( @@ -25,15 +22,13 @@ public record ArmorMaterial(Identifier assetId, Map def Codec.DOUBLE.fieldOf("toughness").forGetter(ArmorMaterial::toughness), Codec.DOUBLE.fieldOf("knockback_resistance").forGetter(ArmorMaterial::knockbackResistance) ).apply(instance, ArmorMaterial::new)); - private static final Map EQUIPMENT_SLOT_ATTRIBUTE_UUIDS = ArmorItemAccessor.attributeModifiers().entrySet() - .stream() - .collect(Collectors.toMap(entry -> entry.getKey().getEquipmentSlot(), Map.Entry::getValue)); public int defense(EquipmentSlot slot) { ArmorItem.Type type = EquipmentSlotUtil.armorType(slot); if (type == null) { return 0; } + return this.defense.getOrDefault(type, 0); } @@ -41,18 +36,46 @@ public Identifier textureId(boolean secondLayer) { if (secondLayer) { this.assetId.withPath(path -> "models/armor/" + path + "_layer_2"); } + return this.assetId.withPath(path -> "models/armor/" + path + "_layer_1"); } public void addAttributes(AttributeModifiersComponent.Builder builder, EquipmentSlot slot) { - UUID uuid = EQUIPMENT_SLOT_ATTRIBUTE_UUIDS.get(slot); - int defense = this.defense(slot); - if (defense > 0) { - builder.add(EntityAttributes.GENERIC_ARMOR, new EntityAttributeModifier(uuid, "Armor modifier", defense, EntityAttributeModifier.Operation.ADD_VALUE), AttributeModifierSlot.forEquipmentSlot(slot)); + ArmorItem.Type type = EquipmentSlotUtil.armorType(slot); + if (type == null) { + return; } - builder.add(EntityAttributes.GENERIC_ARMOR_TOUGHNESS, new EntityAttributeModifier(uuid, "Armor toughness", this.toughness, EntityAttributeModifier.Operation.ADD_VALUE), AttributeModifierSlot.forEquipmentSlot(slot)); + + Identifier id = Identifier.ofVanilla("armor." + type.getName()); + AttributeModifierSlot attributeModifierSlot = AttributeModifierSlot.forEquipmentSlot(slot); + builder.add( + EntityAttributes.GENERIC_ARMOR, + new EntityAttributeModifier( + id, + this.defense(slot), + EntityAttributeModifier.Operation.ADD_VALUE + ), + attributeModifierSlot + ); + builder.add( + EntityAttributes.GENERIC_ARMOR_TOUGHNESS, + new EntityAttributeModifier( + id, + this.toughness, + EntityAttributeModifier.Operation.ADD_VALUE + ), + attributeModifierSlot + ); if (this.knockbackResistance > 0.0d) { - builder.add(EntityAttributes.GENERIC_KNOCKBACK_RESISTANCE, new EntityAttributeModifier(uuid, "Armor knockback resistance", this.knockbackResistance, EntityAttributeModifier.Operation.ADD_VALUE), AttributeModifierSlot.forEquipmentSlot(slot)); + builder.add( + EntityAttributes.GENERIC_KNOCKBACK_RESISTANCE, + new EntityAttributeModifier( + id, + this.knockbackResistance, + EntityAttributeModifier.Operation.ADD_VALUE + ), + attributeModifierSlot + ); } } diff --git a/src/main/java/net/errorcraft/itematic/item/armor/ArmorMaterialKeys.java b/src/main/java/net/errorcraft/itematic/item/armor/ArmorMaterialKeys.java index 58af0779..f1617b88 100644 --- a/src/main/java/net/errorcraft/itematic/item/armor/ArmorMaterialKeys.java +++ b/src/main/java/net/errorcraft/itematic/item/armor/ArmorMaterialKeys.java @@ -17,6 +17,6 @@ public class ArmorMaterialKeys { private ArmorMaterialKeys() {} private static RegistryKey register(String name) { - return RegistryKey.of(ItematicRegistryKeys.ARMOR_MATERIAL, new Identifier(name)); + return RegistryKey.of(ItematicRegistryKeys.ARMOR_MATERIAL, Identifier.ofVanilla(name)); } } diff --git a/src/main/java/net/errorcraft/itematic/item/armor/ArmorMaterials.java b/src/main/java/net/errorcraft/itematic/item/armor/ArmorMaterials.java index 77ec3051..a87d5029 100644 --- a/src/main/java/net/errorcraft/itematic/item/armor/ArmorMaterials.java +++ b/src/main/java/net/errorcraft/itematic/item/armor/ArmorMaterials.java @@ -7,13 +7,13 @@ public class ArmorMaterials { private ArmorMaterials() {} public static void bootstrap(Registerable registerable) { - registerable.register(ArmorMaterialKeys.LEATHER, ArmorMaterial.from(new Identifier("leather"), net.minecraft.item.ArmorMaterials.LEATHER)); - registerable.register(ArmorMaterialKeys.CHAINMAIL, ArmorMaterial.from(new Identifier("chainmail"), net.minecraft.item.ArmorMaterials.CHAIN)); - registerable.register(ArmorMaterialKeys.IRON, ArmorMaterial.from(new Identifier("iron"), net.minecraft.item.ArmorMaterials.IRON)); - registerable.register(ArmorMaterialKeys.GOLD, ArmorMaterial.from(new Identifier("gold"), net.minecraft.item.ArmorMaterials.GOLD)); - registerable.register(ArmorMaterialKeys.DIAMOND, ArmorMaterial.from(new Identifier("diamond"), net.minecraft.item.ArmorMaterials.DIAMOND)); - registerable.register(ArmorMaterialKeys.NETHERITE, ArmorMaterial.from(new Identifier("netherite"), net.minecraft.item.ArmorMaterials.NETHERITE)); - registerable.register(ArmorMaterialKeys.TURTLE, ArmorMaterial.from(new Identifier("turtle"), net.minecraft.item.ArmorMaterials.TURTLE)); - registerable.register(ArmorMaterialKeys.ARMADILLO, ArmorMaterial.from(new Identifier("armadillo"), net.minecraft.item.ArmorMaterials.ARMADILLO)); + registerable.register(ArmorMaterialKeys.LEATHER, ArmorMaterial.from(Identifier.ofVanilla("leather"), net.minecraft.item.ArmorMaterials.LEATHER)); + registerable.register(ArmorMaterialKeys.CHAINMAIL, ArmorMaterial.from(Identifier.ofVanilla("chainmail"), net.minecraft.item.ArmorMaterials.CHAIN)); + registerable.register(ArmorMaterialKeys.IRON, ArmorMaterial.from(Identifier.ofVanilla("iron"), net.minecraft.item.ArmorMaterials.IRON)); + registerable.register(ArmorMaterialKeys.GOLD, ArmorMaterial.from(Identifier.ofVanilla("gold"), net.minecraft.item.ArmorMaterials.GOLD)); + registerable.register(ArmorMaterialKeys.DIAMOND, ArmorMaterial.from(Identifier.ofVanilla("diamond"), net.minecraft.item.ArmorMaterials.DIAMOND)); + registerable.register(ArmorMaterialKeys.NETHERITE, ArmorMaterial.from(Identifier.ofVanilla("netherite"), net.minecraft.item.ArmorMaterials.NETHERITE)); + registerable.register(ArmorMaterialKeys.TURTLE, ArmorMaterial.from(Identifier.ofVanilla("turtle"), net.minecraft.item.ArmorMaterials.TURTLE)); + registerable.register(ArmorMaterialKeys.ARMADILLO, ArmorMaterial.from(Identifier.ofVanilla("armadillo"), net.minecraft.item.ArmorMaterials.ARMADILLO)); } } diff --git a/src/main/java/net/errorcraft/itematic/item/color/ItemColorTypeKeys.java b/src/main/java/net/errorcraft/itematic/item/color/ItemColorTypeKeys.java index 0f4cd48f..4f27a470 100644 --- a/src/main/java/net/errorcraft/itematic/item/color/ItemColorTypeKeys.java +++ b/src/main/java/net/errorcraft/itematic/item/color/ItemColorTypeKeys.java @@ -15,6 +15,6 @@ public class ItemColorTypeKeys { public static final RegistryKey> MAP = of("map"); private static RegistryKey> of(String id) { - return RegistryKey.of(ItematicRegistryKeys.ITEM_COLOR_TYPE, new Identifier(id)); + return RegistryKey.of(ItematicRegistryKeys.ITEM_COLOR_TYPE, Identifier.ofVanilla(id)); } } diff --git a/src/main/java/net/errorcraft/itematic/item/component/ItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/ItemComponent.java index 7b4bbd75..c5fef10c 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/ItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/ItemComponent.java @@ -5,7 +5,6 @@ import net.errorcraft.itematic.registry.ItematicRegistries; import net.errorcraft.itematic.serialization.SetMapCodec; import net.minecraft.block.BlockState; -import net.minecraft.client.item.TooltipType; import net.minecraft.component.ComponentMap; import net.minecraft.component.type.AttributeModifiersComponent; import net.minecraft.entity.Entity; @@ -14,6 +13,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUsageContext; +import net.minecraft.item.tooltip.TooltipType; import net.minecraft.screen.slot.Slot; import net.minecraft.text.Text; import net.minecraft.util.ActionResult; diff --git a/src/main/java/net/errorcraft/itematic/item/component/ItemComponentTypes.java b/src/main/java/net/errorcraft/itematic/item/component/ItemComponentTypes.java index e32d62c6..c86f5e83 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/ItemComponentTypes.java +++ b/src/main/java/net/errorcraft/itematic/item/component/ItemComponentTypes.java @@ -29,7 +29,7 @@ public class ItemComponentTypes { public static final ItemComponentType SPAWN_EGG = register("spawn_egg", new ItemComponentType<>(SpawnEggItemComponent.CODEC)); public static final ItemComponentType DISPENSABLE = register("dispensable", new ItemComponentType<>(DispensableItemComponent.CODEC)); public static final ItemComponentType SHOOTER = register("shooter", new ItemComponentType<>(ShooterItemComponent.CODEC)); - public static final ItemComponentType RECORD = register("record", new ItemComponentType<>(RecordItemComponent.CODEC)); + public static final ItemComponentType PLAYABLE_SONG = register("playable_song", new ItemComponentType<>(PlayableSongItemComponent.CODEC)); public static final ItemComponentType FIREWORK_SHAPE_MODIFIER = register("firework_shape_modifier", new ItemComponentType<>(FireworkShapeModifierItemComponent.CODEC)); public static final ItemComponentType FIREWORK_EXPLOSION_HOLDER = register("firework_explosion_holder", new ItemComponentType<>(FireworkExplosionHolderItemComponent.CODEC)); public static final ItemComponentType FIREWORK = register("firework", new ItemComponentType<>(FireworkItemComponent.CODEC)); diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/ArmorItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/ArmorItemComponent.java index b772e732..b9f53cd3 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/ArmorItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/ArmorItemComponent.java @@ -84,6 +84,7 @@ public void addAttributeModifiers(AttributeModifiersComponent.Builder builder, I if (!this.material.hasKeyAndValue()) { return; } + components.get(ItemComponentTypes.EQUIPMENT) .ifPresent(c -> this.material.value().addAttributes(builder, c.slot())); } diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/BannerPatternHolderItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/BannerPatternHolderItemComponent.java index f04e6705..bbed680d 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/BannerPatternHolderItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/BannerPatternHolderItemComponent.java @@ -5,13 +5,13 @@ import net.errorcraft.itematic.item.component.ItemComponent; import net.errorcraft.itematic.item.component.ItemComponentType; import net.errorcraft.itematic.item.component.ItemComponentTypes; -import net.minecraft.client.item.TooltipType; import net.minecraft.component.ComponentMap; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.BannerPatternsComponent; import net.minecraft.item.BannerItem; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.item.tooltip.TooltipType; import net.minecraft.text.Text; import net.minecraft.util.DyeColor; diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/BlockItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/BlockItemComponent.java index 3ef02748..0e2195bd 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/BlockItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/BlockItemComponent.java @@ -14,7 +14,6 @@ import net.errorcraft.itematic.serialization.ItematicCodecs; import net.minecraft.block.Block; import net.minecraft.block.ShulkerBoxBlock; -import net.minecraft.client.item.TooltipType; import net.minecraft.component.ComponentMap; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.ContainerComponent; @@ -24,6 +23,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUsage; import net.minecraft.item.ItemUsageContext; +import net.minecraft.item.tooltip.TooltipType; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.text.Text; import net.minecraft.util.ActionResult; diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/EntityItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/EntityItemComponent.java index 3685065b..b4f4195e 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/EntityItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/EntityItemComponent.java @@ -14,7 +14,6 @@ import net.errorcraft.itematic.item.placement.EntityPlacer; import net.errorcraft.itematic.mixin.item.DecorationItemAccessor; import net.errorcraft.itematic.mixin.item.SpawnEggItemAccessor; -import net.minecraft.client.item.TooltipType; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.NbtComponent; import net.minecraft.entity.EntityType; @@ -22,6 +21,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUsageContext; +import net.minecraft.item.tooltip.TooltipType; import net.minecraft.nbt.NbtOps; import net.minecraft.registry.RegistryEntryLookup; import net.minecraft.registry.RegistryWrapper; diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/FireworkExplosionHolderItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/FireworkExplosionHolderItemComponent.java index 989d2e6e..a24cd312 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/FireworkExplosionHolderItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/FireworkExplosionHolderItemComponent.java @@ -4,12 +4,12 @@ import net.errorcraft.itematic.item.component.ItemComponent; import net.errorcraft.itematic.item.component.ItemComponentType; import net.errorcraft.itematic.item.component.ItemComponentTypes; -import net.minecraft.client.item.TooltipType; import net.minecraft.component.ComponentMap; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.FireworkExplosionComponent; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.item.tooltip.TooltipType; import net.minecraft.text.Text; import java.util.List; diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/FireworkItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/FireworkItemComponent.java index 002ff62e..cca46301 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/FireworkItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/FireworkItemComponent.java @@ -5,7 +5,6 @@ import net.errorcraft.itematic.item.component.ItemComponent; import net.errorcraft.itematic.item.component.ItemComponentType; import net.errorcraft.itematic.item.component.ItemComponentTypes; -import net.minecraft.client.item.TooltipType; import net.minecraft.component.ComponentMap; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.FireworksComponent; @@ -15,6 +14,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUsageContext; +import net.minecraft.item.tooltip.TooltipType; import net.minecraft.stat.Stats; import net.minecraft.text.Text; import net.minecraft.util.ActionResult; diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/ItemHolderItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/ItemHolderItemComponent.java index 9ff56629..011efa95 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/ItemHolderItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/ItemHolderItemComponent.java @@ -11,9 +11,6 @@ import net.errorcraft.itematic.mixin.item.BundleItemAccessor; import net.errorcraft.itematic.serialization.ItematicCodecs; import net.errorcraft.itematic.util.Util; -import net.minecraft.client.item.BundleTooltipData; -import net.minecraft.client.item.TooltipData; -import net.minecraft.client.item.TooltipType; import net.minecraft.component.ComponentMap; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.BundleContentsComponent; @@ -23,6 +20,9 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUsage; +import net.minecraft.item.tooltip.BundleTooltipData; +import net.minecraft.item.tooltip.TooltipData; +import net.minecraft.item.tooltip.TooltipType; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.screen.slot.Slot; import net.minecraft.sound.SoundEvent; diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/MapHolderItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/MapHolderItemComponent.java index 1b6f220c..2fd2eb62 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/MapHolderItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/MapHolderItemComponent.java @@ -4,7 +4,6 @@ import net.errorcraft.itematic.item.component.ItemComponent; import net.errorcraft.itematic.item.component.ItemComponentType; import net.errorcraft.itematic.item.component.ItemComponentTypes; -import net.minecraft.client.item.TooltipType; import net.minecraft.component.ComponentMap; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.MapColorComponent; @@ -14,6 +13,7 @@ import net.minecraft.item.FilledMapItem; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.item.tooltip.TooltipType; import net.minecraft.network.packet.Packet; import net.minecraft.text.Text; import net.minecraft.world.World; diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/OminousEffectProviderItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/OminousEffectProviderItemComponent.java index 189e87eb..f835a338 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/OminousEffectProviderItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/OminousEffectProviderItemComponent.java @@ -5,7 +5,6 @@ import net.errorcraft.itematic.item.component.ItemComponent; import net.errorcraft.itematic.item.component.ItemComponentType; import net.errorcraft.itematic.item.component.ItemComponentTypes; -import net.minecraft.client.item.TooltipType; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.PotionContentsComponent; import net.minecraft.entity.LivingEntity; @@ -14,6 +13,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.OminousBottleItem; +import net.minecraft.item.tooltip.TooltipType; import net.minecraft.text.Text; import net.minecraft.world.World; diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/PlayableItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/PlayableItemComponent.java index ec5d11f7..9a94c0b4 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/PlayableItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/PlayableItemComponent.java @@ -8,12 +8,12 @@ import net.errorcraft.itematic.item.component.ItemComponentTypes; import net.errorcraft.itematic.item.use.provider.providers.PlayableIntegerProvider; import net.errorcraft.itematic.mixin.item.GoatHornItemAccessor; -import net.minecraft.client.item.TooltipType; import net.minecraft.component.DataComponentTypes; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Instrument; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.item.tooltip.TooltipType; import net.minecraft.registry.Registries; import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/PlayableSongItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/PlayableSongItemComponent.java new file mode 100644 index 00000000..bcd34972 --- /dev/null +++ b/src/main/java/net/errorcraft/itematic/item/component/components/PlayableSongItemComponent.java @@ -0,0 +1,38 @@ +package net.errorcraft.itematic.item.component.components; + +import com.mojang.serialization.Codec; +import net.errorcraft.itematic.item.component.ItemComponent; +import net.errorcraft.itematic.item.component.ItemComponentType; +import net.errorcraft.itematic.item.component.ItemComponentTypes; +import net.minecraft.block.jukebox.JukeboxSong; +import net.minecraft.component.ComponentMap; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.JukeboxPlayableComponent; +import net.minecraft.registry.RegistryPair; +import net.minecraft.registry.entry.RegistryEntry; + +public record PlayableSongItemComponent(RegistryEntry song) implements ItemComponent { + public static final Codec CODEC = JukeboxSong.ENTRY_CODEC.xmap(PlayableSongItemComponent::new, PlayableSongItemComponent::song); + + public static ItemComponent[] of(RegistryEntry song) { + return new ItemComponent[] { + StackableItemComponent.of(1), + new PlayableSongItemComponent(song) + }; + } + + @Override + public ItemComponentType type() { + return ItemComponentTypes.PLAYABLE_SONG; + } + + @Override + public Codec codec() { + return CODEC; + } + + @Override + public void addComponents(ComponentMap.Builder builder) { + builder.add(DataComponentTypes.JUKEBOX_PLAYABLE, new JukeboxPlayableComponent(new RegistryPair<>(this.song), true)); + } +} diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/PotionHolderItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/PotionHolderItemComponent.java index 0cf26574..9258dfae 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/PotionHolderItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/PotionHolderItemComponent.java @@ -5,12 +5,12 @@ import net.errorcraft.itematic.item.component.ItemComponent; import net.errorcraft.itematic.item.component.ItemComponentType; import net.errorcraft.itematic.item.component.ItemComponentTypes; -import net.minecraft.client.item.TooltipType; import net.minecraft.component.ComponentMap; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.PotionContentsComponent; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.item.tooltip.TooltipType; import net.minecraft.potion.Potion; import net.minecraft.text.Text; import net.minecraft.util.dynamic.Codecs; diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/RecordItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/RecordItemComponent.java deleted file mode 100644 index 30ade3c0..00000000 --- a/src/main/java/net/errorcraft/itematic/item/component/components/RecordItemComponent.java +++ /dev/null @@ -1,93 +0,0 @@ -package net.errorcraft.itematic.item.component.components; - -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.errorcraft.itematic.item.ItemStackConsumer; -import net.errorcraft.itematic.item.component.ItemComponent; -import net.errorcraft.itematic.item.component.ItemComponentType; -import net.errorcraft.itematic.item.component.ItemComponentTypes; -import net.errorcraft.itematic.util.IdentifierUtil; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.JukeboxBlock; -import net.minecraft.block.entity.JukeboxBlockEntity; -import net.minecraft.client.item.TooltipType; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemUsageContext; -import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.entry.RegistryEntry; -import net.minecraft.sound.SoundEvent; -import net.minecraft.stat.Stats; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Formatting; -import net.minecraft.util.dynamic.Codecs; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraft.world.event.GameEvent; - -import java.util.List; - -public record RecordItemComponent(RegistryEntry soundEvent, String descriptionKey, int duration, int outputSignal) implements ItemComponent { - public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( - SoundEvent.ENTRY_CODEC.fieldOf("sound_event").forGetter(RecordItemComponent::soundEvent), - Codec.STRING.fieldOf("description_key").forGetter(RecordItemComponent::descriptionKey), - Codecs.NONNEGATIVE_INT.fieldOf("duration").forGetter(RecordItemComponent::duration), - Codec.intRange(0, 15).fieldOf("output_signal").forGetter(RecordItemComponent::outputSignal) - ).apply(instance, RecordItemComponent::new)); - - public static ItemComponent[] of(RegistryEntry soundEvent, RegistryKey key, int duration, int outputSignal) { - return new ItemComponent[] { - StackableItemComponent.of(1), - new RecordItemComponent(soundEvent, IdentifierUtil.createTranslationKey(key, "item", "desc"), duration, outputSignal) - }; - } - - @Override - public ItemComponentType type() { - return ItemComponentTypes.RECORD; - } - - @Override - public Codec codec() { - return CODEC; - } - - @Override - public ActionResult useOnBlock(ItemUsageContext context, ItemStackConsumer resultStackConsumer) { - World world = context.getWorld(); - BlockPos pos = context.getBlockPos(); - BlockState blockState = world.getBlockState(pos); - ItemStack stack = context.getStack(); - if (!blockState.isOf(Blocks.JUKEBOX) || blockState.get(JukeboxBlock.HAS_RECORD)) { - return ActionResult.PASS; - } - - if (world.isClient()) { - return ActionResult.SUCCESS; - } - - PlayerEntity player = context.getPlayer(); - if (world.getBlockEntity(pos) instanceof JukeboxBlockEntity jukeboxBlockEntity) { - jukeboxBlockEntity.setStack(stack.split(1)); - world.emitGameEvent(GameEvent.BLOCK_CHANGE, pos, GameEvent.Emitter.of(player, blockState)); - } - - if (player != null) { - player.incrementStat(Stats.PLAY_RECORD); - } - return ActionResult.CONSUME; - } - - @Override - public void appendTooltip(ItemStack stack, Item.TooltipContext context, List tooltip, TooltipType type) { - tooltip.add(this.getDescription().formatted(Formatting.GRAY)); - } - - public MutableText getDescription() { - return Text.translatable(this.descriptionKey); - } -} diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/SmithingTemplateItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/SmithingTemplateItemComponent.java index da7c6996..a8a58b9f 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/SmithingTemplateItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/SmithingTemplateItemComponent.java @@ -8,9 +8,9 @@ import net.errorcraft.itematic.item.smithing.template.SmithingTemplate; import net.errorcraft.itematic.mixin.item.SmithingTemplateItemAccessor; import net.errorcraft.itematic.registry.ItematicRegistryKeys; -import net.minecraft.client.item.TooltipType; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.item.tooltip.TooltipType; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.registry.entry.RegistryFixedCodec; import net.minecraft.screen.ScreenTexts; diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/TextHolderItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/TextHolderItemComponent.java index 4269f816..52a84c7f 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/TextHolderItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/TextHolderItemComponent.java @@ -4,11 +4,11 @@ import net.errorcraft.itematic.item.component.ItemComponent; import net.errorcraft.itematic.item.component.ItemComponentType; import net.errorcraft.itematic.item.component.ItemComponentTypes; -import net.minecraft.client.item.TooltipType; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.WrittenBookContentComponent; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.item.tooltip.TooltipType; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.StringHelper; diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/WeaponItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/WeaponItemComponent.java index e9604181..966a008e 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/WeaponItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/WeaponItemComponent.java @@ -12,7 +12,6 @@ import net.errorcraft.itematic.serialization.ItematicCodecs; import net.errorcraft.itematic.world.action.context.ActionContext; import net.errorcraft.itematic.world.action.context.parameter.ActionContextParameter; -import net.minecraft.client.item.TooltipType; import net.minecraft.component.ComponentMap; import net.minecraft.component.type.AttributeModifiersComponent; import net.minecraft.entity.EquipmentSlot; @@ -21,6 +20,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.MaceItem; +import net.minecraft.item.tooltip.TooltipType; import net.minecraft.server.world.ServerWorld; import net.minecraft.text.Text; import net.minecraft.util.Formatting; diff --git a/src/main/java/net/errorcraft/itematic/item/dispense/behavior/DispenseBehaviors.java b/src/main/java/net/errorcraft/itematic/item/dispense/behavior/DispenseBehaviors.java index 889f56fa..9265c11a 100644 --- a/src/main/java/net/errorcraft/itematic/item/dispense/behavior/DispenseBehaviors.java +++ b/src/main/java/net/errorcraft/itematic/item/dispense/behavior/DispenseBehaviors.java @@ -194,7 +194,7 @@ public static void bootstrap(Registerable registerable) { } private static RegistryKey of(String id) { - return RegistryKey.of(ItematicRegistryKeys.DISPENSE_BEHAVIOR, new Identifier(id)); + return RegistryKey.of(ItematicRegistryKeys.DISPENSE_BEHAVIOR, Identifier.ofVanilla(id)); } private static PassingSequenceHandler.Builder shootProjectile(float power, float uncertainty) { diff --git a/src/main/java/net/errorcraft/itematic/item/event/ItemEventKeys.java b/src/main/java/net/errorcraft/itematic/item/event/ItemEventKeys.java index 0338fb48..c28fd3e3 100644 --- a/src/main/java/net/errorcraft/itematic/item/event/ItemEventKeys.java +++ b/src/main/java/net/errorcraft/itematic/item/event/ItemEventKeys.java @@ -26,6 +26,6 @@ public class ItemEventKeys { private ItemEventKeys() {} private static RegistryKey of(String id) { - return RegistryKey.of(ItematicRegistryKeys.ITEM_EVENT, new Identifier(id)); + return RegistryKey.of(ItematicRegistryKeys.ITEM_EVENT, Identifier.ofVanilla(id)); } } diff --git a/src/main/java/net/errorcraft/itematic/item/group/entry/provider/ItemGroupEntryProviderKeys.java b/src/main/java/net/errorcraft/itematic/item/group/entry/provider/ItemGroupEntryProviderKeys.java index 8b5af7b3..9afad7bf 100644 --- a/src/main/java/net/errorcraft/itematic/item/group/entry/provider/ItemGroupEntryProviderKeys.java +++ b/src/main/java/net/errorcraft/itematic/item/group/entry/provider/ItemGroupEntryProviderKeys.java @@ -20,6 +20,6 @@ public class ItemGroupEntryProviderKeys { private ItemGroupEntryProviderKeys() {} private static RegistryKey of(String id) { - return RegistryKey.of(ItematicRegistryKeys.ITEM_GROUP_ENTRY_PROVIDER, new Identifier(id)); + return RegistryKey.of(ItematicRegistryKeys.ITEM_GROUP_ENTRY_PROVIDER, Identifier.ofVanilla(id)); } } diff --git a/src/main/java/net/errorcraft/itematic/item/group/entry/provider/ItemGroupEntryProviderTags.java b/src/main/java/net/errorcraft/itematic/item/group/entry/provider/ItemGroupEntryProviderTags.java index b1a41a16..162a1193 100644 --- a/src/main/java/net/errorcraft/itematic/item/group/entry/provider/ItemGroupEntryProviderTags.java +++ b/src/main/java/net/errorcraft/itematic/item/group/entry/provider/ItemGroupEntryProviderTags.java @@ -20,6 +20,6 @@ public class ItemGroupEntryProviderTags { private ItemGroupEntryProviderTags() {} private static TagKey of(String id) { - return TagKey.of(ItematicRegistryKeys.ITEM_GROUP_ENTRY_PROVIDER, new Identifier(id)); + return TagKey.of(ItematicRegistryKeys.ITEM_GROUP_ENTRY_PROVIDER, Identifier.ofVanilla(id)); } } diff --git a/src/main/java/net/errorcraft/itematic/item/holder/rule/ItemHolderRuleTypeKeys.java b/src/main/java/net/errorcraft/itematic/item/holder/rule/ItemHolderRuleTypeKeys.java index 6277dc64..56e617b8 100644 --- a/src/main/java/net/errorcraft/itematic/item/holder/rule/ItemHolderRuleTypeKeys.java +++ b/src/main/java/net/errorcraft/itematic/item/holder/rule/ItemHolderRuleTypeKeys.java @@ -12,6 +12,6 @@ public class ItemHolderRuleTypeKeys { private ItemHolderRuleTypeKeys() {} private static RegistryKey> of(String id) { - return RegistryKey.of(ItematicRegistryKeys.ITEM_HOLDER_RULE_TYPE, new Identifier(id)); + return RegistryKey.of(ItematicRegistryKeys.ITEM_HOLDER_RULE_TYPE, Identifier.ofVanilla(id)); } } diff --git a/src/main/java/net/errorcraft/itematic/item/model/override/ModelOverrideKeys.java b/src/main/java/net/errorcraft/itematic/item/model/override/ModelOverrideKeys.java index dd731185..611007e3 100644 --- a/src/main/java/net/errorcraft/itematic/item/model/override/ModelOverrideKeys.java +++ b/src/main/java/net/errorcraft/itematic/item/model/override/ModelOverrideKeys.java @@ -27,6 +27,6 @@ public class ModelOverrideKeys { public static final RegistryKey LEVEL = of("level"); private static RegistryKey of(String id) { - return RegistryKey.of(ItematicRegistryKeys.MODEL_OVERRIDE, new Identifier(id)); + return RegistryKey.of(ItematicRegistryKeys.MODEL_OVERRIDE, Identifier.ofVanilla(id)); } } diff --git a/src/main/java/net/errorcraft/itematic/item/placement/block/picker/BlockPickerTypeKeys.java b/src/main/java/net/errorcraft/itematic/item/placement/block/picker/BlockPickerTypeKeys.java index 1e864b18..b1dbd6d3 100644 --- a/src/main/java/net/errorcraft/itematic/item/placement/block/picker/BlockPickerTypeKeys.java +++ b/src/main/java/net/errorcraft/itematic/item/placement/block/picker/BlockPickerTypeKeys.java @@ -11,6 +11,6 @@ public class BlockPickerTypeKeys { private BlockPickerTypeKeys() {} private static RegistryKey> of(String id) { - return RegistryKey.of(ItematicRegistryKeys.BLOCK_PICKER_TYPE, new Identifier(id)); + return RegistryKey.of(ItematicRegistryKeys.BLOCK_PICKER_TYPE, Identifier.ofVanilla(id)); } } diff --git a/src/main/java/net/errorcraft/itematic/item/pointer/PointerKeys.java b/src/main/java/net/errorcraft/itematic/item/pointer/PointerKeys.java index 3ceaf168..5328a84a 100644 --- a/src/main/java/net/errorcraft/itematic/item/pointer/PointerKeys.java +++ b/src/main/java/net/errorcraft/itematic/item/pointer/PointerKeys.java @@ -11,6 +11,6 @@ public class PointerKeys { private PointerKeys() {} private static RegistryKey of(String id) { - return RegistryKey.of(ItematicRegistryKeys.POINTER, new Identifier(id)); + return RegistryKey.of(ItematicRegistryKeys.POINTER, Identifier.ofVanilla(id)); } } diff --git a/src/main/java/net/errorcraft/itematic/item/shooter/method/ShooterMethodTypeKeys.java b/src/main/java/net/errorcraft/itematic/item/shooter/method/ShooterMethodTypeKeys.java index 8666761c..e922aadd 100644 --- a/src/main/java/net/errorcraft/itematic/item/shooter/method/ShooterMethodTypeKeys.java +++ b/src/main/java/net/errorcraft/itematic/item/shooter/method/ShooterMethodTypeKeys.java @@ -11,6 +11,6 @@ public class ShooterMethodTypeKeys { private ShooterMethodTypeKeys() {} private static RegistryKey> of(String id) { - return RegistryKey.of(ItematicRegistryKeys.SHOOTER_METHOD_TYPE, new Identifier(id)); + return RegistryKey.of(ItematicRegistryKeys.SHOOTER_METHOD_TYPE, Identifier.ofVanilla(id)); } } diff --git a/src/main/java/net/errorcraft/itematic/item/smithing/template/SmithingTemplateTypeKeys.java b/src/main/java/net/errorcraft/itematic/item/smithing/template/SmithingTemplateTypeKeys.java index 87f562bc..a5c57717 100644 --- a/src/main/java/net/errorcraft/itematic/item/smithing/template/SmithingTemplateTypeKeys.java +++ b/src/main/java/net/errorcraft/itematic/item/smithing/template/SmithingTemplateTypeKeys.java @@ -11,6 +11,6 @@ public class SmithingTemplateTypeKeys { private SmithingTemplateTypeKeys() {} private static RegistryKey> of(String id) { - return RegistryKey.of(ItematicRegistryKeys.SMITHING_TEMPLATE_TYPE, new Identifier(id)); + return RegistryKey.of(ItematicRegistryKeys.SMITHING_TEMPLATE_TYPE, Identifier.ofVanilla(id)); } } diff --git a/src/main/java/net/errorcraft/itematic/item/smithing/template/SmithingTemplates.java b/src/main/java/net/errorcraft/itematic/item/smithing/template/SmithingTemplates.java index eef3f883..7472ba31 100644 --- a/src/main/java/net/errorcraft/itematic/item/smithing/template/SmithingTemplates.java +++ b/src/main/java/net/errorcraft/itematic/item/smithing/template/SmithingTemplates.java @@ -40,7 +40,7 @@ public static void bootstrap(Registerable registerable) { RegistryEntryLookup items = registerable.getRegistryLookup(RegistryKeys.ITEM); RegistryEntryLookup trimPatterns = registerable.getRegistryLookup(RegistryKeys.TRIM_PATTERN); - registerable.register(NETHERITE_UPGRADE, new ItemUpgradeSmithingTemplate(items.getOrThrow(ItemKeys.NETHERITE_INGOT), new Identifier("netherite_upgrade"))); + registerable.register(NETHERITE_UPGRADE, new ItemUpgradeSmithingTemplate(items.getOrThrow(ItemKeys.NETHERITE_INGOT), Identifier.ofVanilla("netherite_upgrade"))); registerable.register(BOLT_PATTERN, new TrimPatternSmithingTemplate(trimPatterns.getOrThrow(ArmorTrimPatterns.BOLT))); registerable.register(COAST_PATTERN, new TrimPatternSmithingTemplate(trimPatterns.getOrThrow(ArmorTrimPatterns.COAST))); registerable.register(DUNE_PATTERN, new TrimPatternSmithingTemplate(trimPatterns.getOrThrow(ArmorTrimPatterns.DUNE))); @@ -62,6 +62,6 @@ public static void bootstrap(Registerable registerable) { } private static RegistryKey of(String id) { - return RegistryKey.of(ItematicRegistryKeys.SMITHING_TEMPLATE, new Identifier(id)); + return RegistryKey.of(ItematicRegistryKeys.SMITHING_TEMPLATE, Identifier.ofVanilla(id)); } } diff --git a/src/main/java/net/errorcraft/itematic/item/use/provider/IntegerProviderTypeKeys.java b/src/main/java/net/errorcraft/itematic/item/use/provider/IntegerProviderTypeKeys.java index 0f60c20e..126335a4 100644 --- a/src/main/java/net/errorcraft/itematic/item/use/provider/IntegerProviderTypeKeys.java +++ b/src/main/java/net/errorcraft/itematic/item/use/provider/IntegerProviderTypeKeys.java @@ -14,6 +14,6 @@ public class IntegerProviderTypeKeys { private IntegerProviderTypeKeys() {} private static RegistryKey> of(String id) { - return RegistryKey.of(ItematicRegistryKeys.INTEGER_PROVIDER_TYPE, new Identifier(id)); + return RegistryKey.of(ItematicRegistryKeys.INTEGER_PROVIDER_TYPE, Identifier.ofVanilla(id)); } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/block/JukeboxBlockExtender.java b/src/main/java/net/errorcraft/itematic/mixin/block/JukeboxBlockExtender.java deleted file mode 100644 index 78b4a663..00000000 --- a/src/main/java/net/errorcraft/itematic/mixin/block/JukeboxBlockExtender.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.errorcraft.itematic.mixin.block; - -import net.errorcraft.itematic.item.component.ItemComponentTypes; -import net.errorcraft.itematic.item.component.components.RecordItemComponent; -import net.minecraft.block.BlockState; -import net.minecraft.block.JukeboxBlock; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.block.entity.JukeboxBlockEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; - -@Mixin(JukeboxBlock.class) -public class JukeboxBlockExtender { - /** - * @author ErrorCraft - * @reason Uses the ItemComponent implementation for data-driven items. - */ - @Overwrite - public int getComparatorOutput(BlockState state, World world, BlockPos pos) { - return world.getBlockEntity(pos, BlockEntityType.JUKEBOX) - .map(JukeboxBlockEntity::getStack) - .flatMap(stack -> stack.itematic$getComponent(ItemComponentTypes.RECORD)) - .map(RecordItemComponent::outputSignal) - .orElse(0); - } -} diff --git a/src/main/java/net/errorcraft/itematic/mixin/block/entity/JukeboxBlockEntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/block/entity/JukeboxBlockEntityExtender.java deleted file mode 100644 index b624da77..00000000 --- a/src/main/java/net/errorcraft/itematic/mixin/block/entity/JukeboxBlockEntityExtender.java +++ /dev/null @@ -1,71 +0,0 @@ -package net.errorcraft.itematic.mixin.block.entity; - -import net.errorcraft.itematic.item.component.ItemComponentTypes; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.block.entity.JukeboxBlockEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.MusicDiscItem; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.util.math.BlockPos; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.*; - -@Mixin(JukeboxBlockEntity.class) -public abstract class JukeboxBlockEntityExtender extends BlockEntity { - @Shadow - public abstract ItemStack getStack(); - - public JukeboxBlockEntityExtender(BlockEntityType type, BlockPos pos, BlockState state) { - super(type, pos, state); - } - - @Redirect( - method = "startPlaying", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/item/Item;getRawId(Lnet/minecraft/item/Item;)I" - ) - ) - @SuppressWarnings("ConstantConditions") - private int getRawIdUseDynamicRegistry(Item item) { - return this.world.getRegistryManager().get(RegistryKeys.ITEM).getRawId(item); - } - - @ModifyConstant( - method = "tick(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;)V", - constant = @Constant( - classValue = MusicDiscItem.class, - ordinal = 0 - ) - ) - private boolean instanceOfMusicDiscItemUseItemComponentCheck(Object reference, Class clazz) { - return this.getStack().itematic$hasComponent(ItemComponentTypes.RECORD); - } - - @ModifyVariable( - method = "tick(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;)V", - at = @At("LOAD"), - ordinal = 0 - ) - private Item castToMusicDiscItemUseNull(Item instance) { - return null; - } - - @Redirect( - method = "isSongFinished", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/item/MusicDiscItem;getSongLengthInTicks()I" - ) - ) - private int getSongLengthInTicksUseItemComponent(MusicDiscItem instance) { - return this.getStack() - .itematic$getComponent(ItemComponentTypes.RECORD) - .orElseThrow() - .duration(); - } -} diff --git a/src/main/java/net/errorcraft/itematic/mixin/item/ArmorItemAccessor.java b/src/main/java/net/errorcraft/itematic/mixin/item/ArmorItemAccessor.java deleted file mode 100644 index ef13353c..00000000 --- a/src/main/java/net/errorcraft/itematic/mixin/item/ArmorItemAccessor.java +++ /dev/null @@ -1,16 +0,0 @@ -package net.errorcraft.itematic.mixin.item; - -import net.minecraft.item.ArmorItem; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.EnumMap; -import java.util.UUID; - -@Mixin(ArmorItem.class) -public interface ArmorItemAccessor { - @Accessor("MODIFIERS") - static EnumMap attributeModifiers() { - throw new AssertionError(); - } -} diff --git a/src/main/java/net/errorcraft/itematic/mixin/item/ItemExtender.java b/src/main/java/net/errorcraft/itematic/mixin/item/ItemExtender.java index c7cecc15..43e116db 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/item/ItemExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/item/ItemExtender.java @@ -20,8 +20,6 @@ import net.fabricmc.fabric.api.item.v1.EnchantingContext; import net.fabricmc.fabric.api.item.v1.FabricItem; import net.minecraft.block.BlockState; -import net.minecraft.client.item.TooltipData; -import net.minecraft.client.item.TooltipType; import net.minecraft.component.ComponentMap; import net.minecraft.component.ComponentType; import net.minecraft.component.DataComponentTypes; @@ -38,6 +36,8 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUsageContext; +import net.minecraft.item.tooltip.TooltipData; +import net.minecraft.item.tooltip.TooltipType; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.screen.slot.Slot; import net.minecraft.server.world.ServerWorld; diff --git a/src/main/java/net/errorcraft/itematic/mixin/item/ItemStackExtender.java b/src/main/java/net/errorcraft/itematic/mixin/item/ItemStackExtender.java index 50517d1c..0f596ef0 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/item/ItemStackExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/item/ItemStackExtender.java @@ -25,7 +25,6 @@ import net.fabricmc.fabric.api.item.v1.FabricItemStack; import net.minecraft.advancement.criterion.ItemDurabilityChangedCriterion; import net.minecraft.block.BlockState; -import net.minecraft.client.item.TooltipType; import net.minecraft.component.ComponentChanges; import net.minecraft.component.ComponentHolder; import net.minecraft.component.ComponentMap; @@ -40,6 +39,7 @@ import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUsageContext; +import net.minecraft.item.tooltip.TooltipType; import net.minecraft.registry.DefaultedRegistry; import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; @@ -526,17 +526,15 @@ private boolean isOfForFilledMapUseItemComponentCheck(ItemStack instance, Item i return this.itematic$hasComponent(ItemComponentTypes.MAP_HOLDER); } - @Redirect( + @WrapWithCondition( method = "getTooltip", at = @At( value = "INVOKE", - target = "Lnet/minecraft/item/Item;appendTooltip(Lnet/minecraft/item/ItemStack;Lnet/minecraft/item/Item$TooltipContext;Ljava/util/List;Lnet/minecraft/client/item/TooltipType;)V" + target = "Lnet/minecraft/item/Item;appendTooltip(Lnet/minecraft/item/ItemStack;Lnet/minecraft/item/Item$TooltipContext;Ljava/util/List;Lnet/minecraft/item/tooltip/TooltipType;)V" ) ) - private void appendTooltipUseRegistryEntry(Item instance, ItemStack stack, Item.TooltipContext context, List tooltip, TooltipType type) { - if (this.entry != null) { - this.entry.value().appendTooltip(stack, context, tooltip, type); - } + private boolean appendTooltipCheckRegistryEntry(Item instance, ItemStack stack, Item.TooltipContext context, List tooltip, TooltipType type) { + return this.entry != null; } @Redirect( diff --git a/src/main/java/net/errorcraft/itematic/mixin/client/item/BundleTooltipDataExtender.java b/src/main/java/net/errorcraft/itematic/mixin/item/tooltip/BundleTooltipDataExtender.java similarity index 73% rename from src/main/java/net/errorcraft/itematic/mixin/client/item/BundleTooltipDataExtender.java rename to src/main/java/net/errorcraft/itematic/mixin/item/tooltip/BundleTooltipDataExtender.java index cf31f9d3..168f9561 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/client/item/BundleTooltipDataExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/item/tooltip/BundleTooltipDataExtender.java @@ -1,7 +1,7 @@ -package net.errorcraft.itematic.mixin.client.item; +package net.errorcraft.itematic.mixin.item.tooltip; -import net.errorcraft.itematic.access.client.item.BundleTooltipDataAccess; -import net.minecraft.client.item.BundleTooltipData; +import net.errorcraft.itematic.access.item.tooltip.BundleTooltipDataAccess; +import net.minecraft.item.tooltip.BundleTooltipData; import org.apache.commons.lang3.math.Fraction; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; diff --git a/src/main/java/net/errorcraft/itematic/mixin/registry/RegistryLoaderExtender.java b/src/main/java/net/errorcraft/itematic/mixin/registry/RegistryLoaderExtender.java index 9b43815b..adc937e5 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/registry/RegistryLoaderExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/registry/RegistryLoaderExtender.java @@ -33,7 +33,8 @@ public class RegistryLoaderExtender { method = "", at = @At( value = "INVOKE", - target = "Ljava/util/List;of([Ljava/lang/Object;)Ljava/util/List;" + target = "Ljava/util/List;of([Ljava/lang/Object;)Ljava/util/List;", + ordinal = 0 ) ) private static List> addCustomEntries(List> original) { @@ -53,7 +54,8 @@ private static List> addCustomEntries(List> addCustomNetworkEntries(List> original) { diff --git a/src/main/java/net/errorcraft/itematic/mixin/village/VillagerDataExtender.java b/src/main/java/net/errorcraft/itematic/mixin/village/VillagerDataExtender.java index cae51dec..cc936855 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/village/VillagerDataExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/village/VillagerDataExtender.java @@ -25,13 +25,20 @@ public class VillagerDataExtender implements VillagerDataAccess { private int level; @Unique - private static final String[] LEVELS = { "novice", "apprentice", "journeyman", "expert", "master" }; + private static final String[] LEVELS = { + "novice", + "apprentice", + "journeyman", + "expert", + "master" + }; public @Nullable TagKey itematic$tradeTag() { if (this.profession.workSound() == null) { return null; } - Identifier tag = new Identifier(this.profession.id() + "_" + this.levelName()); + + Identifier tag = Identifier.ofVanilla(this.profession.id() + "_" + this.levelName()); return TagKey.of(ItematicRegistryKeys.TRADE, tag); } diff --git a/src/main/java/net/errorcraft/itematic/potion/PotionKeys.java b/src/main/java/net/errorcraft/itematic/potion/PotionKeys.java index 834ccd74..ec4ab20e 100644 --- a/src/main/java/net/errorcraft/itematic/potion/PotionKeys.java +++ b/src/main/java/net/errorcraft/itematic/potion/PotionKeys.java @@ -11,6 +11,6 @@ public class PotionKeys { private PotionKeys() {} private static RegistryKey of(String id) { - return RegistryKey.of(RegistryKeys.POTION, new Identifier(id)); + return RegistryKey.of(RegistryKeys.POTION, Identifier.ofVanilla(id)); } } diff --git a/src/main/java/net/errorcraft/itematic/potion/PotionTags.java b/src/main/java/net/errorcraft/itematic/potion/PotionTags.java index fc4d648e..7d23966a 100644 --- a/src/main/java/net/errorcraft/itematic/potion/PotionTags.java +++ b/src/main/java/net/errorcraft/itematic/potion/PotionTags.java @@ -11,6 +11,6 @@ public class PotionTags { private PotionTags() {} private static TagKey of(String id) { - return TagKey.of(RegistryKeys.POTION, new Identifier(id)); + return TagKey.of(RegistryKeys.POTION, Identifier.ofVanilla(id)); } } diff --git a/src/main/java/net/errorcraft/itematic/registry/ItematicRegistryKeys.java b/src/main/java/net/errorcraft/itematic/registry/ItematicRegistryKeys.java index 2e0d4ee8..fd9c1abf 100644 --- a/src/main/java/net/errorcraft/itematic/registry/ItematicRegistryKeys.java +++ b/src/main/java/net/errorcraft/itematic/registry/ItematicRegistryKeys.java @@ -24,25 +24,25 @@ import net.minecraft.util.Identifier; public class ItematicRegistryKeys { - public static final RegistryKey>> ITEM_COMPONENT_TYPE = RegistryKey.ofRegistry(new Identifier("item_component_type")); - public static final RegistryKey> ARMOR_MATERIAL = RegistryKey.ofRegistry(new Identifier("armor_material")); - public static final RegistryKey>> ITEM_COLOR_TYPE = RegistryKey.ofRegistry(new Identifier("item_color_type")); - public static final RegistryKey> DISPENSE_BEHAVIOR = RegistryKey.ofRegistry(new Identifier("dispense_behavior")); - public static final RegistryKey> ITEM_EVENT = RegistryKey.ofRegistry(new Identifier("item_event")); - public static final RegistryKey>> ACTION_TYPE = RegistryKey.ofRegistry(new Identifier("action_type")); - public static final RegistryKey> ITEM_GROUP_ENTRY_PROVIDER = RegistryKey.ofRegistry(new Identifier("item_group_entry_provider")); - public static final RegistryKey> MODEL_OVERRIDE = RegistryKey.ofRegistry(new Identifier("model_override")); - public static final RegistryKey> POINTER = RegistryKey.ofRegistry(new Identifier("pointer")); - public static final RegistryKey> TRADE = RegistryKey.ofRegistry(new Identifier("trade")); - public static final RegistryKey> ACTION = RegistryKey.ofRegistry(new Identifier("action")); - public static final RegistryKey>> SEQUENCE_HANDLER_TYPE = RegistryKey.ofRegistry(new Identifier("sequence_handler_type")); - public static final RegistryKey>> SMITHING_TEMPLATE_TYPE = RegistryKey.ofRegistry(new Identifier("smithing_template_type")); - public static final RegistryKey> SMITHING_TEMPLATE = RegistryKey.ofRegistry(new Identifier("smithing_template")); - public static final RegistryKey>> BLOCK_PICKER_TYPE = RegistryKey.ofRegistry(new Identifier("block_picker_type")); - public static final RegistryKey>> TRADE_MODIFIER_TYPE = RegistryKey.ofRegistry(new Identifier("trade_modifier_type")); - public static final RegistryKey>> INTEGER_PROVIDER_TYPE = RegistryKey.ofRegistry(new Identifier("integer_provider_type")); - public static final RegistryKey>> ITEM_HOLDER_RULE_TYPE = RegistryKey.ofRegistry(new Identifier("item_holder_rule_type")); - public static final RegistryKey>> SHOOTER_METHOD_TYPE = RegistryKey.ofRegistry(new Identifier("shooter_method_type")); + public static final RegistryKey>> ITEM_COMPONENT_TYPE = RegistryKey.ofRegistry(Identifier.ofVanilla("item_component_type")); + public static final RegistryKey> ARMOR_MATERIAL = RegistryKey.ofRegistry(Identifier.ofVanilla("armor_material")); + public static final RegistryKey>> ITEM_COLOR_TYPE = RegistryKey.ofRegistry(Identifier.ofVanilla("item_color_type")); + public static final RegistryKey> DISPENSE_BEHAVIOR = RegistryKey.ofRegistry(Identifier.ofVanilla("dispense_behavior")); + public static final RegistryKey> ITEM_EVENT = RegistryKey.ofRegistry(Identifier.ofVanilla("item_event")); + public static final RegistryKey>> ACTION_TYPE = RegistryKey.ofRegistry(Identifier.ofVanilla("action_type")); + public static final RegistryKey> ITEM_GROUP_ENTRY_PROVIDER = RegistryKey.ofRegistry(Identifier.ofVanilla("item_group_entry_provider")); + public static final RegistryKey> MODEL_OVERRIDE = RegistryKey.ofRegistry(Identifier.ofVanilla("model_override")); + public static final RegistryKey> POINTER = RegistryKey.ofRegistry(Identifier.ofVanilla("pointer")); + public static final RegistryKey> TRADE = RegistryKey.ofRegistry(Identifier.ofVanilla("trade")); + public static final RegistryKey> ACTION = RegistryKey.ofRegistry(Identifier.ofVanilla("action")); + public static final RegistryKey>> SEQUENCE_HANDLER_TYPE = RegistryKey.ofRegistry(Identifier.ofVanilla("sequence_handler_type")); + public static final RegistryKey>> SMITHING_TEMPLATE_TYPE = RegistryKey.ofRegistry(Identifier.ofVanilla("smithing_template_type")); + public static final RegistryKey> SMITHING_TEMPLATE = RegistryKey.ofRegistry(Identifier.ofVanilla("smithing_template")); + public static final RegistryKey>> BLOCK_PICKER_TYPE = RegistryKey.ofRegistry(Identifier.ofVanilla("block_picker_type")); + public static final RegistryKey>> TRADE_MODIFIER_TYPE = RegistryKey.ofRegistry(Identifier.ofVanilla("trade_modifier_type")); + public static final RegistryKey>> INTEGER_PROVIDER_TYPE = RegistryKey.ofRegistry(Identifier.ofVanilla("integer_provider_type")); + public static final RegistryKey>> ITEM_HOLDER_RULE_TYPE = RegistryKey.ofRegistry(Identifier.ofVanilla("item_holder_rule_type")); + public static final RegistryKey>> SHOOTER_METHOD_TYPE = RegistryKey.ofRegistry(Identifier.ofVanilla("shooter_method_type")); private ItematicRegistryKeys() {} } diff --git a/src/main/java/net/errorcraft/itematic/sound/SoundEventKeys.java b/src/main/java/net/errorcraft/itematic/sound/SoundEventKeys.java index eb979f74..bc9bee11 100644 --- a/src/main/java/net/errorcraft/itematic/sound/SoundEventKeys.java +++ b/src/main/java/net/errorcraft/itematic/sound/SoundEventKeys.java @@ -66,6 +66,6 @@ public class SoundEventKeys { private SoundEventKeys() {} private static RegistryKey of(String id) { - return RegistryKey.of(RegistryKeys.SOUND_EVENT, new Identifier(id)); + return RegistryKey.of(RegistryKeys.SOUND_EVENT, Identifier.ofVanilla(id)); } } diff --git a/src/main/java/net/errorcraft/itematic/stat/StatUtil.java b/src/main/java/net/errorcraft/itematic/stat/StatUtil.java index 35e03260..0ed6100e 100644 --- a/src/main/java/net/errorcraft/itematic/stat/StatUtil.java +++ b/src/main/java/net/errorcraft/itematic/stat/StatUtil.java @@ -12,7 +12,7 @@ public class StatUtil { public static final Codec> CODEC = Registries.STAT_TYPE.getCodec() .dispatch(Stat::getType, StatType::itematic$codec); - private static final Identifier UNKNOWN = new Identifier("unknown"); + private static final Identifier UNKNOWN = Identifier.ofVanilla("unknown"); private StatUtil() {} diff --git a/src/main/java/net/errorcraft/itematic/village/trade/TradeTags.java b/src/main/java/net/errorcraft/itematic/village/trade/TradeTags.java index 0d372450..a445a295 100644 --- a/src/main/java/net/errorcraft/itematic/village/trade/TradeTags.java +++ b/src/main/java/net/errorcraft/itematic/village/trade/TradeTags.java @@ -78,6 +78,6 @@ public class TradeTags { private TradeTags() {} private static TagKey of(String id) { - return TagKey.of(ItematicRegistryKeys.TRADE, new Identifier(id)); + return TagKey.of(ItematicRegistryKeys.TRADE, Identifier.ofVanilla(id)); } } diff --git a/src/main/java/net/errorcraft/itematic/village/trade/Trades.java b/src/main/java/net/errorcraft/itematic/village/trade/Trades.java index 14f76a41..a4433d63 100644 --- a/src/main/java/net/errorcraft/itematic/village/trade/Trades.java +++ b/src/main/java/net/errorcraft/itematic/village/trade/Trades.java @@ -824,6 +824,6 @@ private static Trade sellEnchantedBook(RegistryEntryLookup items, int trad } private static RegistryKey of(String id) { - return RegistryKey.of(ItematicRegistryKeys.TRADE, new Identifier(id)); + return RegistryKey.of(ItematicRegistryKeys.TRADE, Identifier.ofVanilla(id)); } } diff --git a/src/main/java/net/errorcraft/itematic/village/trade/modifier/TradeModifierTypeKeys.java b/src/main/java/net/errorcraft/itematic/village/trade/modifier/TradeModifierTypeKeys.java index 5549e4e1..4bcb1695 100644 --- a/src/main/java/net/errorcraft/itematic/village/trade/modifier/TradeModifierTypeKeys.java +++ b/src/main/java/net/errorcraft/itematic/village/trade/modifier/TradeModifierTypeKeys.java @@ -12,6 +12,6 @@ public class TradeModifierTypeKeys { private TradeModifierTypeKeys() {} private static RegistryKey> of(String key) { - return RegistryKey.of(ItematicRegistryKeys.TRADE_MODIFIER_TYPE, new Identifier(key)); + return RegistryKey.of(ItematicRegistryKeys.TRADE_MODIFIER_TYPE, Identifier.ofVanilla(key)); } } diff --git a/src/main/java/net/errorcraft/itematic/world/action/ActionTags.java b/src/main/java/net/errorcraft/itematic/world/action/ActionTags.java index 0d0c22a9..801bf1e6 100644 --- a/src/main/java/net/errorcraft/itematic/world/action/ActionTags.java +++ b/src/main/java/net/errorcraft/itematic/world/action/ActionTags.java @@ -11,6 +11,6 @@ public class ActionTags { private ActionTags() {} private static TagKey of(String id) { - return TagKey.of(ItematicRegistryKeys.ACTION, new Identifier(id)); + return TagKey.of(ItematicRegistryKeys.ACTION, Identifier.ofVanilla(id)); } } diff --git a/src/main/java/net/errorcraft/itematic/world/action/ActionTypeKeys.java b/src/main/java/net/errorcraft/itematic/world/action/ActionTypeKeys.java index e0ddc238..e2a3a08a 100644 --- a/src/main/java/net/errorcraft/itematic/world/action/ActionTypeKeys.java +++ b/src/main/java/net/errorcraft/itematic/world/action/ActionTypeKeys.java @@ -53,6 +53,6 @@ public class ActionTypeKeys { private ActionTypeKeys() {} private static RegistryKey> of(String id) { - return RegistryKey.of(ItematicRegistryKeys.ACTION_TYPE, new Identifier(id)); + return RegistryKey.of(ItematicRegistryKeys.ACTION_TYPE, Identifier.ofVanilla(id)); } } diff --git a/src/main/java/net/errorcraft/itematic/world/action/Actions.java b/src/main/java/net/errorcraft/itematic/world/action/Actions.java index 146318be..0632cd52 100644 --- a/src/main/java/net/errorcraft/itematic/world/action/Actions.java +++ b/src/main/java/net/errorcraft/itematic/world/action/Actions.java @@ -238,7 +238,7 @@ private static LootCondition.Builder setBlockConditions(BlockPredicate.Builder b LocationCheckLootCondition.builder( LocationPredicate.Builder.create() .block(BlockPredicate.Builder.create() - .tag(ItematicBlockTags.AIR)), + .tag(BlockTags.AIR)), new BlockPos(0, 1, 0))); } @@ -267,6 +267,6 @@ private static UncheckedSequenceHandler.Builder campfireParticles(boolean signal } private static RegistryKey of(String name) { - return RegistryKey.of(ItematicRegistryKeys.ACTION, new Identifier(name)); + return RegistryKey.of(ItematicRegistryKeys.ACTION, Identifier.ofVanilla(name)); } } diff --git a/src/main/java/net/errorcraft/itematic/world/action/sequence/handler/SequenceHandlerTypeKeys.java b/src/main/java/net/errorcraft/itematic/world/action/sequence/handler/SequenceHandlerTypeKeys.java index 0a300d9b..ad86c58d 100644 --- a/src/main/java/net/errorcraft/itematic/world/action/sequence/handler/SequenceHandlerTypeKeys.java +++ b/src/main/java/net/errorcraft/itematic/world/action/sequence/handler/SequenceHandlerTypeKeys.java @@ -14,6 +14,6 @@ public class SequenceHandlerTypeKeys { private SequenceHandlerTypeKeys() {} private static RegistryKey> of(String id) { - return RegistryKey.of(ItematicRegistryKeys.SEQUENCE_HANDLER_TYPE, new Identifier(id)); + return RegistryKey.of(ItematicRegistryKeys.SEQUENCE_HANDLER_TYPE, Identifier.ofVanilla(id)); } } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 0bfbe226..7fd35eac 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -141,9 +141,6 @@ "net/minecraft/class_5289\u0024class_5290": [ "net/errorcraft/itematic/access/client/gui/screen/GameModeSelectionScreenGameModeSelectionAccess" ], - "net/minecraft/class_5631": [ - "net/errorcraft/itematic/access/client/item/BundleTooltipDataAccess" - ], "net/minecraft/class_6880": [ "net/errorcraft/itematic/access/registry/entry/RegistryEntryAccess" ], diff --git a/src/main/resources/itematic.classtweaker b/src/main/resources/itematic.classtweaker index 70af94a8..98b60cb3 100644 --- a/src/main/resources/itematic.classtweaker +++ b/src/main/resources/itematic.classtweaker @@ -9,3 +9,4 @@ accessible class net/minecraft/client/gui/screen/StatsScreen$ItemStatsList accessible class net/minecraft/client/gui/screen/world/CustomizeFlatLevelScreen$SuperflatLayersListWidget inject-interface net/minecraft/util/DyeColor net/errorcraft/itematic/access/util/DyeColorAccess +inject-interface net/minecraft/item/tooltip/BundleTooltipData net/errorcraft/itematic/access/item/tooltip/BundleTooltipDataAccess diff --git a/src/main/resources/itematic.mixins.json b/src/main/resources/itematic.mixins.json index 519c67ae..b1e8a903 100644 --- a/src/main/resources/itematic.mixins.json +++ b/src/main/resources/itematic.mixins.json @@ -42,7 +42,6 @@ "block.FluidBlockExtender", "block.GlowLichenBlockExtender", "block.IgnitableBlockExtender", - "block.JukeboxBlockExtender", "block.KelpBlockExtender", "block.LightBlockExtender", "block.NetherWartBlockExtender", @@ -74,14 +73,12 @@ "block.entity.BlockEntityExtender", "block.entity.BrewingStandBlockEntityExtender", "block.entity.DecoratedPotBlockEntityExtender", - "block.entity.JukeboxBlockEntityExtender", "block.entity.LecternBlockEntityExtender", "block.entity.SherdsAccessor", "block.entity.SherdsExtender", "block.entity.SignBlockEntityExtender", "block.entity.VaultBlockEntityExtender$ServerExtender", "block.vault.VaultConfigExtender", - "client.item.BundleTooltipDataExtender", "command.argument.ArgumentTypesExtender", "command.argument.ScoreboardCriterionArgumentTypeExtender", "component.DataComponentTypesAccessor", @@ -255,7 +252,6 @@ "fluid.WaterFluidExtender", "inventory.SimpleInventoryExtender", "item.AnimalArmorItemExtender$TypeExtender", - "item.ArmorItemAccessor", "item.BrushItemAccessor", "item.BrushItemExtender", "item.BundleItemAccessor", @@ -288,6 +284,7 @@ "item.SmithingTemplateItemAccessor", "item.SpawnEggItemAccessor", "item.WindChargeItemAccessor", + "item.tooltip.BundleTooltipDataExtender", "loot.ContainerComponentModifierExtender", "loot.ContainerComponentModifiersExtender$BundleContentsExtender", "loot.condition.LootConditionTypesAccessor", From 71e75f443098289c408d327ade9ab3739d0956a4 Mon Sep 17 00:00:00 2001 From: ErrorCraft <51973682+ErrorCraft@users.noreply.github.com> Date: Wed, 21 Jan 2026 22:55:05 +0100 Subject: [PATCH 07/11] Port to 1.21 pre-release 1 --- build.gradle | 2 +- gradle.properties | 6 +-- .../entity/model/CrossbowPosingExtender.java | 22 -------- .../render/item/HeldItemRendererExtender.java | 13 ----- .../render/model/ModelLoaderExtender.java | 17 +++++-- .../resources/itematic.client.mixins.json | 1 - .../itematic/gametest/TestUtil.java | 5 ++ .../itematic/gametest/item/LeadTestSuite.java | 50 +++++++++++++++++++ .../block.acacia_wall_hanging_sign.snbt | 0 .../block.acacia_wall_sign.snbt | 0 .../block.anvil.snbt | 0 .../block.attached_melon_stem.snbt | 0 .../block.attached_pumpkin_stem.snbt | 0 .../block.bamboo_sapling.snbt | 0 .../block.bamboo_wall_hanging_sign.snbt | 0 .../block.bamboo_wall_sign.snbt | 0 .../block.bee_nest.snbt | 0 .../block.beehive.snbt | 0 .../block.beetroots.snbt | 0 .../block.big_dripleaf_stem.snbt | 0 .../block.birch_wall_hanging_sign.snbt | 0 .../block.birch_wall_sign.snbt | 0 .../block.black_candle_cake.snbt | 0 .../block.black_wall_banner.snbt | 0 .../block.blue_candle_cake.snbt | 0 .../block.blue_wall_banner.snbt | 0 .../block.brain_coral_wall_fan.snbt | 0 .../block.brown_candle_cake.snbt | 0 .../block.brown_wall_banner.snbt | 0 .../block.bubble_coral_wall_fan.snbt | 0 .../block.candle_cake.snbt | 0 .../block.carrots.snbt | 0 .../block.cave_vines.snbt | 0 .../block.cave_vines_plant.snbt | 0 .../block.cherry_wall_hanging_sign.snbt | 0 .../block.cherry_wall_sign.snbt | 0 .../block.cocoa.snbt | 0 .../block.composter.empty.snbt | 0 .../block.composter.full.snbt | 0 .../block.creeper_wall_head.snbt | 0 .../block.crimson_wall_hanging_sign.snbt | 0 .../block.crimson_wall_sign.snbt | 0 .../block.cyan_candle_cake.snbt | 0 .../block.cyan_wall_banner.snbt | 0 .../block.dark_oak_wall_hanging_sign.snbt | 0 .../block.dark_oak_wall_sign.snbt | 0 .../block.dead_brain_coral_wall_fan.snbt | 0 .../block.dead_bubble_coral_wall_fan.snbt | 0 .../block.dead_fire_coral_wall_fan.snbt | 0 .../block.dead_horn_coral_wall_fan.snbt | 0 .../block.dead_tube_coral_wall_fan.snbt | 0 .../block.dispenser.bedrock.snbt | 0 .../block.dispenser.beehive.snbt | 0 .../block.dispenser.copper_block.snbt | 0 .../block.dispenser.dirt.snbt | 0 .../block.dispenser.gap_below_output.snbt | 0 .../block.dispenser.grass_block.snbt | 0 .../block.dispenser.iron_golem_structure.snbt | 0 .../block.dispenser.respawn_anchor.full.snbt | 0 .../block.dispenser.respawn_anchor.snbt | 0 .../block.dispenser.snbt | 0 .../block.dispenser.water.snbt | 0 .../block.dragon_wall_head.snbt | 0 .../block.enchanting_table.snbt | 0 .../block.fire_coral_wall_fan.snbt | 0 .../block.gray_candle_cake.snbt | 0 .../block.gray_wall_banner.snbt | 0 .../block.green_candle_cake.snbt | 0 .../block.green_wall_banner.snbt | 0 .../block.grindstone.snbt | 0 .../block.horn_coral_wall_fan.snbt | 0 .../block.jungle_wall_hanging_sign.snbt | 0 .../block.jungle_wall_sign.snbt | 0 .../block.kelp_plant.snbt | 0 .../block.lava_cauldron.snbt | 0 .../block.light_blue_candle_cake.snbt | 0 .../block.light_blue_wall_banner.snbt | 0 .../block.light_gray_candle_cake.snbt | 0 .../block.light_gray_wall_banner.snbt | 0 .../block.lime_candle_cake.snbt | 0 .../block.lime_wall_banner.snbt | 0 .../block.magenta_candle_cake.snbt | 0 .../block.magenta_wall_banner.snbt | 0 .../block.mangrove_wall_hanging_sign.snbt | 0 .../block.mangrove_wall_sign.snbt | 0 .../block.melon_stem.snbt | 0 .../block.oak_wall_hanging_sign.snbt | 0 .../block.oak_wall_sign.snbt | 0 .../block.orange_candle_cake.snbt | 0 .../block.orange_wall_banner.snbt | 0 .../block.piglin_wall_head.snbt | 0 .../block.pink_candle_cake.snbt | 0 .../block.pink_wall_banner.snbt | 0 .../block.piston_head.snbt | 0 .../block.piston_head.sticky.snbt | 0 .../block.pitcher_crop.snbt | 0 .../block.player_wall_head.snbt | 0 .../block.potatoes.snbt | 0 .../block.potted_acacia_sapling.snbt | 0 .../block.potted_allium.snbt | 0 .../block.potted_azalea_bush.snbt | 0 .../block.potted_azure_bluet.snbt | 0 .../block.potted_bamboo.snbt | 0 .../block.potted_birch_sapling.snbt | 0 .../block.potted_blue_orchid.snbt | 0 .../block.potted_brown_mushroom.snbt | 0 .../block.potted_cactus.snbt | 0 .../block.potted_cherry_sapling.snbt | 0 .../block.potted_cornflower.snbt | 0 .../block.potted_crimson_fungus.snbt | 0 .../block.potted_crimson_roots.snbt | 0 .../block.potted_dandelion.snbt | 0 .../block.potted_dark_oak_sapling.snbt | 0 .../block.potted_dead_bush.snbt | 0 .../block.potted_fern.snbt | 0 .../block.potted_flowering_azalea_bush.snbt | 0 .../block.potted_jungle_sapling.snbt | 0 .../block.potted_lily_of_the_valley.snbt | 0 .../block.potted_mangrove_propagule.snbt | 0 .../block.potted_oak_sapling.snbt | 0 .../block.potted_orange_tulip.snbt | 0 .../block.potted_oxeye_daisy.snbt | 0 .../block.potted_pink_tulip.snbt | 0 .../block.potted_poppy.snbt | 0 .../block.potted_red_mushroom.snbt | 0 .../block.potted_red_tulip.snbt | 0 .../block.potted_spruce_sapling.snbt | 0 .../block.potted_torchflower.snbt | 0 .../block.potted_warped_fungus.snbt | 0 .../block.potted_warped_roots.snbt | 0 .../block.potted_white_tulip.snbt | 0 .../block.potted_wither_rose.snbt | 0 .../block.powder_snow.snbt | 0 .../block.powder_snow_cauldron.snbt | 0 .../block.pumpkin_stem.snbt | 0 .../block.purple_candle_cake.snbt | 0 .../block.purple_wall_banner.snbt | 0 .../block.red_candle_cake.snbt | 0 .../block.red_shulker_box.snbt | 0 .../block.red_wall_banner.snbt | 0 .../block.redstone_wall_torch.snbt | 0 .../block.redstone_wire.snbt | 0 .../block.shulker_box.snbt | 0 .../block.skeleton_wall_skull.snbt | 0 .../block.soul_wall_torch.snbt | 0 .../block.spruce_wall_hanging_sign.snbt | 0 .../block.spruce_wall_sign.snbt | 0 .../block.sweet_berry_bush.snbt | 0 .../block.tall_seagrass.snbt | 0 .../block.torchflower_crop.snbt | 0 .../block.tripwire.snbt | 0 .../block.tube_coral_wall_fan.snbt | 0 .../block.twisting_vines_plant.snbt | 0 .../block.wall_torch.snbt | 0 .../block.warped_wall_hanging_sign.snbt | 0 .../block.warped_wall_sign.snbt | 0 .../block.water_cauldron.snbt | 0 .../block.weeping_vines_plant.snbt | 0 .../block.white_candle.snbt | 0 .../block.white_candle_cake.snbt | 0 .../block.white_wall_banner.snbt | 0 .../block.wither_skeleton_wall_skull.snbt | 0 .../block.yellow_candle_cake.snbt | 0 .../block.yellow_wall_banner.snbt | 0 .../block.zombie_wall_head.snbt | 0 .../entity.platform.snbt | 0 .../item.bow.platform.snbt | 0 .../item.brush.platform.short_grass.snbt | 0 .../item.brush.platform.snbt | 0 .../item.brush.platform.suspicious_sand.snbt | 0 .../item.component.block.oak_slab.lower.snbt | 0 .../item.component.block.oak_slab.upper.snbt | 0 ...item.component.block.platform.ceiling.snbt | 0 ...latform.grass_block.blocked_off_above.snbt | 0 ....component.block.platform.grass_block.snbt | 0 .../item.component.block.platform.snbt | 0 .../item.component.block.platform.wall.snbt | 0 ...k.scaffolding.horizontal.max_distance.snbt | 0 ...ponent.block.scaffolding.single_block.snbt | 0 ...ock.scaffolding.vertical.max_distance.snbt | 0 ...component.bucket.platform.powder_snow.snbt | 0 .../item.component.bucket.platform.snbt | 0 .../item.component.bucket.platform.water.snbt | 0 .../item.component.throwable.platform.snbt | 0 ...component.useable_on_fluid.water_hole.snbt | 0 .../item.flower_pot.platform.flower_pot.snbt | 0 ...er_pot.platform.potted_acacia_sapling.snbt | 0 ...tem.flower_pot.platform.potted_allium.snbt | 0 ...lower_pot.platform.potted_azalea_bush.snbt | 0 ...lower_pot.platform.potted_azure_bluet.snbt | 0 ...tem.flower_pot.platform.potted_bamboo.snbt | 0 ...wer_pot.platform.potted_birch_sapling.snbt | 0 ...lower_pot.platform.potted_blue_orchid.snbt | 0 ...er_pot.platform.potted_brown_mushroom.snbt | 0 ...tem.flower_pot.platform.potted_cactus.snbt | 0 ...er_pot.platform.potted_cherry_sapling.snbt | 0 ...flower_pot.platform.potted_cornflower.snbt | 0 ...er_pot.platform.potted_crimson_fungus.snbt | 0 ...wer_pot.platform.potted_crimson_roots.snbt | 0 ....flower_pot.platform.potted_dandelion.snbt | 0 ..._pot.platform.potted_dark_oak_sapling.snbt | 0 ....flower_pot.platform.potted_dead_bush.snbt | 0 .../item.flower_pot.platform.potted_fern.snbt | 0 ...platform.potted_flowering_azalea_bush.snbt | 0 ...er_pot.platform.potted_jungle_sapling.snbt | 0 ...ot.platform.potted_lily_of_the_valley.snbt | 0 ...ot.platform.potted_mangrove_propagule.snbt | 0 ...lower_pot.platform.potted_oak_sapling.snbt | 0 ...ower_pot.platform.potted_orange_tulip.snbt | 0 ...lower_pot.platform.potted_oxeye_daisy.snbt | 0 ...flower_pot.platform.potted_pink_tulip.snbt | 0 ...item.flower_pot.platform.potted_poppy.snbt | 0 ...ower_pot.platform.potted_red_mushroom.snbt | 0 ....flower_pot.platform.potted_red_tulip.snbt | 0 ...er_pot.platform.potted_spruce_sapling.snbt | 0 ...lower_pot.platform.potted_torchflower.snbt | 0 ...wer_pot.platform.potted_warped_fungus.snbt | 0 ...ower_pot.platform.potted_warped_roots.snbt | 0 ...lower_pot.platform.potted_white_tulip.snbt | 0 ...lower_pot.platform.potted_wither_rose.snbt | 0 .../structure/item.lead.platform.snbt | 38 ++++++++++++++ .../item.sign.platform.ceiling.snbt | 0 .../item.sign.platform.snbt | 0 src/gametest/resources/fabric.mod.json | 1 + .../generated/data/minecraft/item/mace.json | 2 +- .../TridentEntityInitializer.java | 2 +- .../errorcraft/itematic/item/ItemUtil.java | 2 +- .../components/SaddleItemComponent.java | 7 ++- .../methods/ChargeableShooterMethod.java | 19 ++----- .../providers/TridentIntegerProvider.java | 2 +- .../itematic/mixin/entity/EntityExtender.java | 15 +++++- .../mixin/entity/LeashableExtender.java | 27 ++++++++++ .../task/CrossbowAttackTaskExtender.java | 14 ------ .../ai/goal/CrossbowAttackGoalExtender.java | 14 ------ .../mixin/entity/mob/MobEntityExtender.java | 14 +----- .../passive/AbstractHorseEntityExtender.java | 12 ----- .../mixin/item/CrossbowItemExtender.java | 32 ++++++++++-- .../action/actions/TwirlPlayerAction.java | 5 +- src/main/resources/itematic.mixins.json | 1 + 239 files changed, 198 insertions(+), 125 deletions(-) delete mode 100644 src/client/java/net/errorcraft/itematic/mixin/client/render/entity/model/CrossbowPosingExtender.java create mode 100644 src/gametest/java/net/errorcraft/itematic/gametest/item/LeadTestSuite.java rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.acacia_wall_hanging_sign.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.acacia_wall_sign.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.anvil.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.attached_melon_stem.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.attached_pumpkin_stem.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.bamboo_sapling.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.bamboo_wall_hanging_sign.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.bamboo_wall_sign.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.bee_nest.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.beehive.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.beetroots.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.big_dripleaf_stem.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.birch_wall_hanging_sign.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.birch_wall_sign.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.black_candle_cake.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.black_wall_banner.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.blue_candle_cake.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.blue_wall_banner.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.brain_coral_wall_fan.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.brown_candle_cake.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.brown_wall_banner.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.bubble_coral_wall_fan.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.candle_cake.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.carrots.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.cave_vines.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.cave_vines_plant.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.cherry_wall_hanging_sign.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.cherry_wall_sign.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.cocoa.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.composter.empty.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.composter.full.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.creeper_wall_head.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.crimson_wall_hanging_sign.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.crimson_wall_sign.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.cyan_candle_cake.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.cyan_wall_banner.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.dark_oak_wall_hanging_sign.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.dark_oak_wall_sign.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.dead_brain_coral_wall_fan.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.dead_bubble_coral_wall_fan.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.dead_fire_coral_wall_fan.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.dead_horn_coral_wall_fan.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.dead_tube_coral_wall_fan.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.dispenser.bedrock.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.dispenser.beehive.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.dispenser.copper_block.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.dispenser.dirt.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.dispenser.gap_below_output.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.dispenser.grass_block.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.dispenser.iron_golem_structure.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.dispenser.respawn_anchor.full.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.dispenser.respawn_anchor.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.dispenser.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.dispenser.water.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.dragon_wall_head.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.enchanting_table.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.fire_coral_wall_fan.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.gray_candle_cake.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.gray_wall_banner.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.green_candle_cake.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.green_wall_banner.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.grindstone.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.horn_coral_wall_fan.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.jungle_wall_hanging_sign.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.jungle_wall_sign.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.kelp_plant.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.lava_cauldron.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.light_blue_candle_cake.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.light_blue_wall_banner.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.light_gray_candle_cake.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.light_gray_wall_banner.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.lime_candle_cake.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.lime_wall_banner.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.magenta_candle_cake.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.magenta_wall_banner.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.mangrove_wall_hanging_sign.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.mangrove_wall_sign.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.melon_stem.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.oak_wall_hanging_sign.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.oak_wall_sign.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.orange_candle_cake.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.orange_wall_banner.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.piglin_wall_head.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.pink_candle_cake.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.pink_wall_banner.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.piston_head.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.piston_head.sticky.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.pitcher_crop.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.player_wall_head.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potatoes.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_acacia_sapling.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_allium.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_azalea_bush.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_azure_bluet.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_bamboo.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_birch_sapling.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_blue_orchid.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_brown_mushroom.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_cactus.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_cherry_sapling.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_cornflower.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_crimson_fungus.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_crimson_roots.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_dandelion.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_dark_oak_sapling.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_dead_bush.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_fern.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_flowering_azalea_bush.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_jungle_sapling.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_lily_of_the_valley.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_mangrove_propagule.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_oak_sapling.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_orange_tulip.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_oxeye_daisy.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_pink_tulip.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_poppy.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_red_mushroom.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_red_tulip.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_spruce_sapling.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_torchflower.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_warped_fungus.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_warped_roots.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_white_tulip.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.potted_wither_rose.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.powder_snow.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.powder_snow_cauldron.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.pumpkin_stem.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.purple_candle_cake.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.purple_wall_banner.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.red_candle_cake.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.red_shulker_box.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.red_wall_banner.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.redstone_wall_torch.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.redstone_wire.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.shulker_box.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.skeleton_wall_skull.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.soul_wall_torch.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.spruce_wall_hanging_sign.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.spruce_wall_sign.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.sweet_berry_bush.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.tall_seagrass.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.torchflower_crop.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.tripwire.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.tube_coral_wall_fan.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.twisting_vines_plant.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.wall_torch.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.warped_wall_hanging_sign.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.warped_wall_sign.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.water_cauldron.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.weeping_vines_plant.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.white_candle.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.white_candle_cake.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.white_wall_banner.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.wither_skeleton_wall_skull.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.yellow_candle_cake.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.yellow_wall_banner.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/block.zombie_wall_head.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/entity.platform.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.bow.platform.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.brush.platform.short_grass.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.brush.platform.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.brush.platform.suspicious_sand.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.component.block.oak_slab.lower.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.component.block.oak_slab.upper.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.component.block.platform.ceiling.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.component.block.platform.grass_block.blocked_off_above.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.component.block.platform.grass_block.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.component.block.platform.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.component.block.platform.wall.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.component.block.scaffolding.horizontal.max_distance.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.component.block.scaffolding.single_block.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.component.block.scaffolding.vertical.max_distance.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.component.bucket.platform.powder_snow.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.component.bucket.platform.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.component.bucket.platform.water.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.component.throwable.platform.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.component.useable_on_fluid.water_hole.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.flower_pot.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_acacia_sapling.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_allium.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_azalea_bush.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_azure_bluet.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_bamboo.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_birch_sapling.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_blue_orchid.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_brown_mushroom.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_cactus.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_cherry_sapling.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_cornflower.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_crimson_fungus.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_crimson_roots.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_dandelion.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_dark_oak_sapling.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_dead_bush.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_fern.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_flowering_azalea_bush.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_jungle_sapling.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_lily_of_the_valley.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_mangrove_propagule.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_oak_sapling.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_orange_tulip.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_oxeye_daisy.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_pink_tulip.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_poppy.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_red_mushroom.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_red_tulip.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_spruce_sapling.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_torchflower.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_warped_fungus.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_warped_roots.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_white_tulip.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.flower_pot.platform.potted_wither_rose.snbt (100%) create mode 100644 src/gametest/resources/data/itematic/gametest/structure/item.lead.platform.snbt rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.sign.platform.ceiling.snbt (100%) rename src/gametest/resources/data/itematic/gametest/{structures => structure}/item.sign.platform.snbt (100%) create mode 100644 src/main/java/net/errorcraft/itematic/mixin/entity/LeashableExtender.java diff --git a/build.gradle b/build.gradle index 295d0f1b..6d406b5d 100644 --- a/build.gradle +++ b/build.gradle @@ -102,7 +102,7 @@ loom { gametestClient { inherit client name "GameTest Client" - vmArg "-Dfabric-api.gametest.structures.output-dir=${file("src/gametest/resources/data/itematic/gametest/structures")}" + vmArg "-Dfabric-api.gametest.structures.output-dir=${file("src/gametest/resources/data/itematic/gametest/structure")}" runDir "run" source sourceSets.gametest diff --git a/gradle.properties b/gradle.properties index 431aaf2a..ad87eca4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,8 +3,8 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://fabricmc.net/develop - minecraft_version=24w21b - yarn_mappings=24w21b+build.8 + minecraft_version=1.21-pre1 + yarn_mappings=1.21-pre1+build.5 loader_version=0.18.4 # Mod Properties @@ -13,4 +13,4 @@ org.gradle.jvmargs=-Xmx1G archives_base_name = itematic # Dependencies - fabric_version=0.99.1+1.21 + fabric_version=0.99.4+1.21 diff --git a/src/client/java/net/errorcraft/itematic/mixin/client/render/entity/model/CrossbowPosingExtender.java b/src/client/java/net/errorcraft/itematic/mixin/client/render/entity/model/CrossbowPosingExtender.java deleted file mode 100644 index 8788c775..00000000 --- a/src/client/java/net/errorcraft/itematic/mixin/client/render/entity/model/CrossbowPosingExtender.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.errorcraft.itematic.mixin.client.render.entity.model; - -import net.errorcraft.itematic.item.shooter.method.methods.ChargeableShooterMethod; -import net.minecraft.client.render.entity.model.CrossbowPosing; -import net.minecraft.entity.LivingEntity; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -@Mixin(CrossbowPosing.class) -public class CrossbowPosingExtender { - @Redirect( - method = "charge", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/item/CrossbowItem;getPullTime(Lnet/minecraft/entity/LivingEntity;)I" - ) - ) - private static int getPullTimeUseItemComponent(LivingEntity user) { - return ChargeableShooterMethod.getChargeTime(user.getActiveItem(), user); - } -} diff --git a/src/client/java/net/errorcraft/itematic/mixin/client/render/item/HeldItemRendererExtender.java b/src/client/java/net/errorcraft/itematic/mixin/client/render/item/HeldItemRendererExtender.java index 57fc9277..a876a2bf 100644 --- a/src/client/java/net/errorcraft/itematic/mixin/client/render/item/HeldItemRendererExtender.java +++ b/src/client/java/net/errorcraft/itematic/mixin/client/render/item/HeldItemRendererExtender.java @@ -1,12 +1,10 @@ package net.errorcraft.itematic.mixin.client.render.item; -import com.llamalad7.mixinextras.sugar.Local; import com.llamalad7.mixinextras.sugar.Share; import com.llamalad7.mixinextras.sugar.ref.LocalIntRef; import net.errorcraft.itematic.item.component.ItemComponentTypes; import net.errorcraft.itematic.item.component.components.ShooterItemComponent; import net.errorcraft.itematic.item.shooter.method.ShooterMethodTypes; -import net.errorcraft.itematic.item.shooter.method.methods.ChargeableShooterMethod; import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.render.item.HeldItemRenderer; import net.minecraft.entity.LivingEntity; @@ -128,17 +126,6 @@ private int getUseTimeLeftForCrossbowUseNegatedUsedTicks(AbstractClientPlayerEnt return -instance.itematic$itemUsedTicks(); } - @Redirect( - method = "renderFirstPersonItem", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/item/CrossbowItem;getPullTime(Lnet/minecraft/entity/LivingEntity;)I" - ) - ) - private int getPullTimeUseItemComponent(LivingEntity user, @Local(argsOnly = true) ItemStack stack) { - return ChargeableShooterMethod.getChargeTime(stack, user); - } - @Redirect( method = "renderFirstPersonItem", at = @At( diff --git a/src/client/java/net/errorcraft/itematic/mixin/client/render/model/ModelLoaderExtender.java b/src/client/java/net/errorcraft/itematic/mixin/client/render/model/ModelLoaderExtender.java index 25ef3024..f8be3bda 100644 --- a/src/client/java/net/errorcraft/itematic/mixin/client/render/model/ModelLoaderExtender.java +++ b/src/client/java/net/errorcraft/itematic/mixin/client/render/model/ModelLoaderExtender.java @@ -1,7 +1,9 @@ package net.errorcraft.itematic.mixin.client.render.model; import net.minecraft.client.color.block.BlockColors; +import net.minecraft.client.render.model.BlockStatesLoader; import net.minecraft.client.render.model.ModelLoader; +import net.minecraft.client.render.model.UnbakedModel; import net.minecraft.client.render.model.json.JsonUnbakedModel; import net.minecraft.client.util.ModelIdentifier; import net.minecraft.item.Item; @@ -23,16 +25,21 @@ @Mixin(ModelLoader.class) public abstract class ModelLoaderExtender { + @Shadow + protected abstract void addModelToBake(ModelIdentifier id, UnbakedModel model); + + @Shadow + protected abstract void loadInventoryVariantItemModel(Identifier id); + @Unique private static final String ITEM_MODEL_PREFIX = "models/item/"; + @Unique private static final int ITEM_MODEL_PREFIX_LENGTH = ITEM_MODEL_PREFIX.length(); + @Unique private static final int FILE_SUFFIX_LENGTH = ".json".length(); - @Shadow - protected abstract void addModel(ModelIdentifier modelId); - @Redirect( method = "", at = @At( @@ -59,11 +66,11 @@ private Set getIdsForItemsReturnEmptySet(DefaultedRegistry ins ) ) ) - private void addAllLoadedItemModels(BlockColors blockColors, Profiler profiler, Map jsonUnbakedModels, Map> blockStates, CallbackInfo info) { + private void addAllLoadedItemModels(BlockColors blockColors, Profiler profiler, Map jsonUnbakedModels, Map> blockStates, CallbackInfo info) { for (Identifier identifier : jsonUnbakedModels.keySet()) { if (identifier.getPath().startsWith(ITEM_MODEL_PREFIX)) { Identifier actualId = identifier.withPath(path -> path.substring(ITEM_MODEL_PREFIX_LENGTH, path.length() - FILE_SUFFIX_LENGTH)); - this.addModel(new ModelIdentifier(actualId, "inventory")); + this.loadInventoryVariantItemModel(actualId); } } } diff --git a/src/client/resources/itematic.client.mixins.json b/src/client/resources/itematic.client.mixins.json index 7263f2de..d4a3394c 100644 --- a/src/client/resources/itematic.client.mixins.json +++ b/src/client/resources/itematic.client.mixins.json @@ -62,7 +62,6 @@ "render.entity.feature.PlayerHeldItemFeatureRendererExtender", "render.entity.feature.SnowGolemPumpkinFeatureRendererExtender", "render.entity.feature.WolfArmorFeatureRendererExtender", - "render.entity.model.CrossbowPosingExtender", "render.entity.model.DrownedEntityModelExtender", "render.entity.model.SkeletonEntityModelExtender", "render.feature.WitchHeldItemFeatureRendererExtender", diff --git a/src/gametest/java/net/errorcraft/itematic/gametest/TestUtil.java b/src/gametest/java/net/errorcraft/itematic/gametest/TestUtil.java index 0a88bd5c..76275396 100644 --- a/src/gametest/java/net/errorcraft/itematic/gametest/TestUtil.java +++ b/src/gametest/java/net/errorcraft/itematic/gametest/TestUtil.java @@ -81,11 +81,16 @@ public static PlayerEntity createMockPlayer(TestContext context, GameMode gameMo } public static T createEntity(TestContext context, EntityType type, Consumer initializer) { + return createEntityAt(context, type, BlockPos.ORIGIN, initializer); + } + + public static T createEntityAt(TestContext context, EntityType type, BlockPos pos, Consumer initializer) { T entity = type.create(context.getWorld()); if (entity == null) { throw new GameTestException("Entity is null"); } + setEntityPos(context, entity, pos); initializer.accept(entity); return entity; } diff --git a/src/gametest/java/net/errorcraft/itematic/gametest/item/LeadTestSuite.java b/src/gametest/java/net/errorcraft/itematic/gametest/item/LeadTestSuite.java new file mode 100644 index 00000000..f38ae275 --- /dev/null +++ b/src/gametest/java/net/errorcraft/itematic/gametest/item/LeadTestSuite.java @@ -0,0 +1,50 @@ +package net.errorcraft.itematic.gametest.item; + +import net.errorcraft.itematic.gametest.TestUtil; +import net.errorcraft.itematic.item.ItemKeys; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.passive.HorseEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.vehicle.BoatEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.test.GameTest; +import net.minecraft.test.TestContext; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.GameMode; + +public class LeadTestSuite { + private static final BlockPos PLACED_ENTITY_POSITION = new BlockPos(1, 2, 0); + + @GameTest(templateName = "itematic:item.lead.platform") + public void usingLeadOnHorseLeashesHorse(TestContext context) { + ServerWorld world = context.getWorld(); + ItemStack stack = world.itematic$createStack(ItemKeys.LEAD); + PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL); + player.setStackInHand(Hand.MAIN_HAND, stack); + world.spawnEntity(player); + HorseEntity horse = TestUtil.createEntityAt(context, EntityType.HORSE, PLACED_ENTITY_POSITION, entity -> {}); + context.addInstantFinalTask(() -> { + ActionResult result = horse.interact(player, Hand.MAIN_HAND); + context.assertTrue(result.isAccepted(), "Expected interaction with Horse to be successful"); + context.assertTrue(horse.isLeashed(), "Expected Horse to be leashed"); + }); + } + + @GameTest(templateName = "itematic:item.lead.platform") + public void usingLeadOnBoatLeashesBoat(TestContext context) { + ServerWorld world = context.getWorld(); + ItemStack stack = world.itematic$createStack(ItemKeys.LEAD); + PlayerEntity player = context.createMockPlayer(GameMode.SURVIVAL); + player.setStackInHand(Hand.MAIN_HAND, stack); + world.spawnEntity(player); + BoatEntity boat = TestUtil.createEntityAt(context, EntityType.BOAT, PLACED_ENTITY_POSITION, entity -> {}); + context.addInstantFinalTask(() -> { + ActionResult result = boat.interact(player, Hand.MAIN_HAND); + context.assertTrue(result.isAccepted(), "Expected interaction with Boat to be successful"); + context.assertTrue(boat.isLeashed(), "Expected Boat to be leashed"); + }); + } +} diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.acacia_wall_hanging_sign.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.acacia_wall_hanging_sign.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.acacia_wall_hanging_sign.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.acacia_wall_hanging_sign.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.acacia_wall_sign.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.acacia_wall_sign.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.acacia_wall_sign.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.acacia_wall_sign.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.anvil.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.anvil.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.anvil.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.anvil.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.attached_melon_stem.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.attached_melon_stem.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.attached_melon_stem.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.attached_melon_stem.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.attached_pumpkin_stem.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.attached_pumpkin_stem.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.attached_pumpkin_stem.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.attached_pumpkin_stem.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.bamboo_sapling.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.bamboo_sapling.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.bamboo_sapling.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.bamboo_sapling.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.bamboo_wall_hanging_sign.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.bamboo_wall_hanging_sign.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.bamboo_wall_hanging_sign.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.bamboo_wall_hanging_sign.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.bamboo_wall_sign.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.bamboo_wall_sign.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.bamboo_wall_sign.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.bamboo_wall_sign.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.bee_nest.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.bee_nest.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.bee_nest.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.bee_nest.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.beehive.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.beehive.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.beehive.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.beehive.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.beetroots.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.beetroots.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.beetroots.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.beetroots.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.big_dripleaf_stem.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.big_dripleaf_stem.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.big_dripleaf_stem.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.big_dripleaf_stem.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.birch_wall_hanging_sign.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.birch_wall_hanging_sign.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.birch_wall_hanging_sign.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.birch_wall_hanging_sign.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.birch_wall_sign.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.birch_wall_sign.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.birch_wall_sign.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.birch_wall_sign.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.black_candle_cake.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.black_candle_cake.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.black_candle_cake.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.black_candle_cake.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.black_wall_banner.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.black_wall_banner.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.black_wall_banner.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.black_wall_banner.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.blue_candle_cake.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.blue_candle_cake.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.blue_candle_cake.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.blue_candle_cake.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.blue_wall_banner.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.blue_wall_banner.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.blue_wall_banner.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.blue_wall_banner.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.brain_coral_wall_fan.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.brain_coral_wall_fan.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.brain_coral_wall_fan.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.brain_coral_wall_fan.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.brown_candle_cake.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.brown_candle_cake.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.brown_candle_cake.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.brown_candle_cake.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.brown_wall_banner.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.brown_wall_banner.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.brown_wall_banner.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.brown_wall_banner.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.bubble_coral_wall_fan.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.bubble_coral_wall_fan.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.bubble_coral_wall_fan.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.bubble_coral_wall_fan.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.candle_cake.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.candle_cake.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.candle_cake.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.candle_cake.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.carrots.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.carrots.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.carrots.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.carrots.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.cave_vines.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.cave_vines.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.cave_vines.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.cave_vines.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.cave_vines_plant.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.cave_vines_plant.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.cave_vines_plant.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.cave_vines_plant.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.cherry_wall_hanging_sign.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.cherry_wall_hanging_sign.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.cherry_wall_hanging_sign.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.cherry_wall_hanging_sign.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.cherry_wall_sign.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.cherry_wall_sign.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.cherry_wall_sign.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.cherry_wall_sign.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.cocoa.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.cocoa.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.cocoa.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.cocoa.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.composter.empty.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.composter.empty.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.composter.empty.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.composter.empty.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.composter.full.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.composter.full.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.composter.full.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.composter.full.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.creeper_wall_head.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.creeper_wall_head.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.creeper_wall_head.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.creeper_wall_head.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.crimson_wall_hanging_sign.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.crimson_wall_hanging_sign.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.crimson_wall_hanging_sign.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.crimson_wall_hanging_sign.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.crimson_wall_sign.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.crimson_wall_sign.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.crimson_wall_sign.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.crimson_wall_sign.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.cyan_candle_cake.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.cyan_candle_cake.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.cyan_candle_cake.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.cyan_candle_cake.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.cyan_wall_banner.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.cyan_wall_banner.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.cyan_wall_banner.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.cyan_wall_banner.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.dark_oak_wall_hanging_sign.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.dark_oak_wall_hanging_sign.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.dark_oak_wall_hanging_sign.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.dark_oak_wall_hanging_sign.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.dark_oak_wall_sign.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.dark_oak_wall_sign.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.dark_oak_wall_sign.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.dark_oak_wall_sign.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.dead_brain_coral_wall_fan.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.dead_brain_coral_wall_fan.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.dead_brain_coral_wall_fan.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.dead_brain_coral_wall_fan.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.dead_bubble_coral_wall_fan.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.dead_bubble_coral_wall_fan.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.dead_bubble_coral_wall_fan.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.dead_bubble_coral_wall_fan.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.dead_fire_coral_wall_fan.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.dead_fire_coral_wall_fan.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.dead_fire_coral_wall_fan.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.dead_fire_coral_wall_fan.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.dead_horn_coral_wall_fan.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.dead_horn_coral_wall_fan.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.dead_horn_coral_wall_fan.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.dead_horn_coral_wall_fan.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.dead_tube_coral_wall_fan.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.dead_tube_coral_wall_fan.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.dead_tube_coral_wall_fan.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.dead_tube_coral_wall_fan.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.dispenser.bedrock.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.dispenser.bedrock.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.dispenser.bedrock.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.dispenser.bedrock.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.dispenser.beehive.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.dispenser.beehive.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.dispenser.beehive.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.dispenser.beehive.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.dispenser.copper_block.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.dispenser.copper_block.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.dispenser.copper_block.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.dispenser.copper_block.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.dispenser.dirt.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.dispenser.dirt.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.dispenser.dirt.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.dispenser.dirt.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.dispenser.gap_below_output.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.dispenser.gap_below_output.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.dispenser.gap_below_output.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.dispenser.gap_below_output.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.dispenser.grass_block.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.dispenser.grass_block.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.dispenser.grass_block.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.dispenser.grass_block.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.dispenser.iron_golem_structure.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.dispenser.iron_golem_structure.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.dispenser.iron_golem_structure.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.dispenser.iron_golem_structure.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.dispenser.respawn_anchor.full.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.dispenser.respawn_anchor.full.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.dispenser.respawn_anchor.full.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.dispenser.respawn_anchor.full.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.dispenser.respawn_anchor.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.dispenser.respawn_anchor.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.dispenser.respawn_anchor.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.dispenser.respawn_anchor.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.dispenser.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.dispenser.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.dispenser.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.dispenser.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.dispenser.water.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.dispenser.water.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.dispenser.water.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.dispenser.water.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.dragon_wall_head.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.dragon_wall_head.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.dragon_wall_head.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.dragon_wall_head.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.enchanting_table.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.enchanting_table.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.enchanting_table.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.enchanting_table.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.fire_coral_wall_fan.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.fire_coral_wall_fan.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.fire_coral_wall_fan.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.fire_coral_wall_fan.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.gray_candle_cake.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.gray_candle_cake.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.gray_candle_cake.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.gray_candle_cake.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.gray_wall_banner.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.gray_wall_banner.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.gray_wall_banner.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.gray_wall_banner.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.green_candle_cake.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.green_candle_cake.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.green_candle_cake.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.green_candle_cake.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.green_wall_banner.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.green_wall_banner.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.green_wall_banner.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.green_wall_banner.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.grindstone.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.grindstone.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.grindstone.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.grindstone.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.horn_coral_wall_fan.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.horn_coral_wall_fan.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.horn_coral_wall_fan.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.horn_coral_wall_fan.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.jungle_wall_hanging_sign.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.jungle_wall_hanging_sign.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.jungle_wall_hanging_sign.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.jungle_wall_hanging_sign.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.jungle_wall_sign.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.jungle_wall_sign.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.jungle_wall_sign.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.jungle_wall_sign.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.kelp_plant.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.kelp_plant.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.kelp_plant.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.kelp_plant.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.lava_cauldron.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.lava_cauldron.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.lava_cauldron.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.lava_cauldron.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.light_blue_candle_cake.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.light_blue_candle_cake.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.light_blue_candle_cake.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.light_blue_candle_cake.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.light_blue_wall_banner.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.light_blue_wall_banner.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.light_blue_wall_banner.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.light_blue_wall_banner.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.light_gray_candle_cake.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.light_gray_candle_cake.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.light_gray_candle_cake.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.light_gray_candle_cake.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.light_gray_wall_banner.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.light_gray_wall_banner.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.light_gray_wall_banner.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.light_gray_wall_banner.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.lime_candle_cake.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.lime_candle_cake.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.lime_candle_cake.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.lime_candle_cake.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.lime_wall_banner.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.lime_wall_banner.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.lime_wall_banner.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.lime_wall_banner.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.magenta_candle_cake.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.magenta_candle_cake.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.magenta_candle_cake.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.magenta_candle_cake.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.magenta_wall_banner.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.magenta_wall_banner.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.magenta_wall_banner.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.magenta_wall_banner.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.mangrove_wall_hanging_sign.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.mangrove_wall_hanging_sign.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.mangrove_wall_hanging_sign.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.mangrove_wall_hanging_sign.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.mangrove_wall_sign.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.mangrove_wall_sign.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.mangrove_wall_sign.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.mangrove_wall_sign.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.melon_stem.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.melon_stem.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.melon_stem.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.melon_stem.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.oak_wall_hanging_sign.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.oak_wall_hanging_sign.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.oak_wall_hanging_sign.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.oak_wall_hanging_sign.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.oak_wall_sign.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.oak_wall_sign.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.oak_wall_sign.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.oak_wall_sign.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.orange_candle_cake.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.orange_candle_cake.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.orange_candle_cake.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.orange_candle_cake.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.orange_wall_banner.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.orange_wall_banner.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.orange_wall_banner.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.orange_wall_banner.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.piglin_wall_head.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.piglin_wall_head.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.piglin_wall_head.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.piglin_wall_head.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.pink_candle_cake.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.pink_candle_cake.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.pink_candle_cake.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.pink_candle_cake.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.pink_wall_banner.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.pink_wall_banner.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.pink_wall_banner.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.pink_wall_banner.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.piston_head.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.piston_head.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.piston_head.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.piston_head.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.piston_head.sticky.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.piston_head.sticky.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.piston_head.sticky.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.piston_head.sticky.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.pitcher_crop.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.pitcher_crop.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.pitcher_crop.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.pitcher_crop.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.player_wall_head.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.player_wall_head.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.player_wall_head.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.player_wall_head.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potatoes.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potatoes.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potatoes.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potatoes.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_acacia_sapling.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_acacia_sapling.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_acacia_sapling.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_acacia_sapling.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_allium.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_allium.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_allium.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_allium.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_azalea_bush.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_azalea_bush.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_azalea_bush.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_azalea_bush.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_azure_bluet.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_azure_bluet.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_azure_bluet.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_azure_bluet.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_bamboo.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_bamboo.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_bamboo.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_bamboo.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_birch_sapling.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_birch_sapling.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_birch_sapling.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_birch_sapling.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_blue_orchid.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_blue_orchid.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_blue_orchid.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_blue_orchid.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_brown_mushroom.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_brown_mushroom.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_brown_mushroom.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_brown_mushroom.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_cactus.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_cactus.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_cactus.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_cactus.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_cherry_sapling.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_cherry_sapling.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_cherry_sapling.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_cherry_sapling.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_cornflower.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_cornflower.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_cornflower.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_cornflower.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_crimson_fungus.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_crimson_fungus.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_crimson_fungus.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_crimson_fungus.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_crimson_roots.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_crimson_roots.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_crimson_roots.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_crimson_roots.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_dandelion.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_dandelion.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_dandelion.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_dandelion.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_dark_oak_sapling.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_dark_oak_sapling.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_dark_oak_sapling.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_dark_oak_sapling.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_dead_bush.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_dead_bush.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_dead_bush.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_dead_bush.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_fern.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_fern.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_fern.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_fern.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_flowering_azalea_bush.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_flowering_azalea_bush.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_flowering_azalea_bush.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_flowering_azalea_bush.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_jungle_sapling.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_jungle_sapling.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_jungle_sapling.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_jungle_sapling.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_lily_of_the_valley.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_lily_of_the_valley.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_lily_of_the_valley.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_lily_of_the_valley.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_mangrove_propagule.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_mangrove_propagule.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_mangrove_propagule.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_mangrove_propagule.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_oak_sapling.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_oak_sapling.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_oak_sapling.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_oak_sapling.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_orange_tulip.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_orange_tulip.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_orange_tulip.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_orange_tulip.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_oxeye_daisy.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_oxeye_daisy.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_oxeye_daisy.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_oxeye_daisy.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_pink_tulip.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_pink_tulip.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_pink_tulip.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_pink_tulip.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_poppy.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_poppy.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_poppy.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_poppy.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_red_mushroom.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_red_mushroom.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_red_mushroom.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_red_mushroom.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_red_tulip.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_red_tulip.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_red_tulip.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_red_tulip.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_spruce_sapling.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_spruce_sapling.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_spruce_sapling.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_spruce_sapling.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_torchflower.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_torchflower.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_torchflower.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_torchflower.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_warped_fungus.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_warped_fungus.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_warped_fungus.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_warped_fungus.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_warped_roots.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_warped_roots.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_warped_roots.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_warped_roots.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_white_tulip.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_white_tulip.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_white_tulip.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_white_tulip.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.potted_wither_rose.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.potted_wither_rose.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.potted_wither_rose.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.potted_wither_rose.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.powder_snow.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.powder_snow.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.powder_snow.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.powder_snow.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.powder_snow_cauldron.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.powder_snow_cauldron.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.powder_snow_cauldron.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.powder_snow_cauldron.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.pumpkin_stem.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.pumpkin_stem.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.pumpkin_stem.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.pumpkin_stem.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.purple_candle_cake.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.purple_candle_cake.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.purple_candle_cake.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.purple_candle_cake.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.purple_wall_banner.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.purple_wall_banner.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.purple_wall_banner.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.purple_wall_banner.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.red_candle_cake.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.red_candle_cake.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.red_candle_cake.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.red_candle_cake.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.red_shulker_box.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.red_shulker_box.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.red_shulker_box.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.red_shulker_box.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.red_wall_banner.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.red_wall_banner.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.red_wall_banner.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.red_wall_banner.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.redstone_wall_torch.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.redstone_wall_torch.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.redstone_wall_torch.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.redstone_wall_torch.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.redstone_wire.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.redstone_wire.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.redstone_wire.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.redstone_wire.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.shulker_box.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.shulker_box.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.shulker_box.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.shulker_box.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.skeleton_wall_skull.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.skeleton_wall_skull.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.skeleton_wall_skull.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.skeleton_wall_skull.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.soul_wall_torch.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.soul_wall_torch.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.soul_wall_torch.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.soul_wall_torch.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.spruce_wall_hanging_sign.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.spruce_wall_hanging_sign.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.spruce_wall_hanging_sign.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.spruce_wall_hanging_sign.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.spruce_wall_sign.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.spruce_wall_sign.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.spruce_wall_sign.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.spruce_wall_sign.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.sweet_berry_bush.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.sweet_berry_bush.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.sweet_berry_bush.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.sweet_berry_bush.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.tall_seagrass.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.tall_seagrass.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.tall_seagrass.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.tall_seagrass.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.torchflower_crop.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.torchflower_crop.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.torchflower_crop.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.torchflower_crop.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.tripwire.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.tripwire.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.tripwire.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.tripwire.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.tube_coral_wall_fan.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.tube_coral_wall_fan.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.tube_coral_wall_fan.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.tube_coral_wall_fan.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.twisting_vines_plant.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.twisting_vines_plant.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.twisting_vines_plant.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.twisting_vines_plant.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.wall_torch.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.wall_torch.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.wall_torch.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.wall_torch.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.warped_wall_hanging_sign.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.warped_wall_hanging_sign.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.warped_wall_hanging_sign.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.warped_wall_hanging_sign.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.warped_wall_sign.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.warped_wall_sign.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.warped_wall_sign.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.warped_wall_sign.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.water_cauldron.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.water_cauldron.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.water_cauldron.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.water_cauldron.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.weeping_vines_plant.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.weeping_vines_plant.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.weeping_vines_plant.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.weeping_vines_plant.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.white_candle.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.white_candle.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.white_candle.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.white_candle.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.white_candle_cake.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.white_candle_cake.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.white_candle_cake.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.white_candle_cake.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.white_wall_banner.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.white_wall_banner.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.white_wall_banner.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.white_wall_banner.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.wither_skeleton_wall_skull.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.wither_skeleton_wall_skull.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.wither_skeleton_wall_skull.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.wither_skeleton_wall_skull.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.yellow_candle_cake.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.yellow_candle_cake.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.yellow_candle_cake.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.yellow_candle_cake.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.yellow_wall_banner.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.yellow_wall_banner.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.yellow_wall_banner.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.yellow_wall_banner.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/block.zombie_wall_head.snbt b/src/gametest/resources/data/itematic/gametest/structure/block.zombie_wall_head.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/block.zombie_wall_head.snbt rename to src/gametest/resources/data/itematic/gametest/structure/block.zombie_wall_head.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/entity.platform.snbt b/src/gametest/resources/data/itematic/gametest/structure/entity.platform.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/entity.platform.snbt rename to src/gametest/resources/data/itematic/gametest/structure/entity.platform.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.bow.platform.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.bow.platform.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.bow.platform.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.bow.platform.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.brush.platform.short_grass.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.brush.platform.short_grass.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.brush.platform.short_grass.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.brush.platform.short_grass.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.brush.platform.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.brush.platform.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.brush.platform.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.brush.platform.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.brush.platform.suspicious_sand.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.brush.platform.suspicious_sand.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.brush.platform.suspicious_sand.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.brush.platform.suspicious_sand.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.component.block.oak_slab.lower.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.component.block.oak_slab.lower.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.component.block.oak_slab.lower.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.component.block.oak_slab.lower.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.component.block.oak_slab.upper.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.component.block.oak_slab.upper.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.component.block.oak_slab.upper.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.component.block.oak_slab.upper.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.component.block.platform.ceiling.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.component.block.platform.ceiling.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.component.block.platform.ceiling.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.component.block.platform.ceiling.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.component.block.platform.grass_block.blocked_off_above.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.component.block.platform.grass_block.blocked_off_above.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.component.block.platform.grass_block.blocked_off_above.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.component.block.platform.grass_block.blocked_off_above.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.component.block.platform.grass_block.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.component.block.platform.grass_block.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.component.block.platform.grass_block.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.component.block.platform.grass_block.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.component.block.platform.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.component.block.platform.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.component.block.platform.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.component.block.platform.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.component.block.platform.wall.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.component.block.platform.wall.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.component.block.platform.wall.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.component.block.platform.wall.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.component.block.scaffolding.horizontal.max_distance.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.component.block.scaffolding.horizontal.max_distance.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.component.block.scaffolding.horizontal.max_distance.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.component.block.scaffolding.horizontal.max_distance.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.component.block.scaffolding.single_block.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.component.block.scaffolding.single_block.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.component.block.scaffolding.single_block.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.component.block.scaffolding.single_block.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.component.block.scaffolding.vertical.max_distance.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.component.block.scaffolding.vertical.max_distance.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.component.block.scaffolding.vertical.max_distance.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.component.block.scaffolding.vertical.max_distance.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.component.bucket.platform.powder_snow.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.component.bucket.platform.powder_snow.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.component.bucket.platform.powder_snow.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.component.bucket.platform.powder_snow.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.component.bucket.platform.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.component.bucket.platform.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.component.bucket.platform.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.component.bucket.platform.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.component.bucket.platform.water.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.component.bucket.platform.water.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.component.bucket.platform.water.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.component.bucket.platform.water.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.component.throwable.platform.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.component.throwable.platform.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.component.throwable.platform.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.component.throwable.platform.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.component.useable_on_fluid.water_hole.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.component.useable_on_fluid.water_hole.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.component.useable_on_fluid.water_hole.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.component.useable_on_fluid.water_hole.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.flower_pot.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.flower_pot.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.flower_pot.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.flower_pot.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_acacia_sapling.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_acacia_sapling.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_acacia_sapling.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_acacia_sapling.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_allium.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_allium.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_allium.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_allium.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_azalea_bush.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_azalea_bush.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_azalea_bush.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_azalea_bush.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_azure_bluet.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_azure_bluet.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_azure_bluet.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_azure_bluet.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_bamboo.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_bamboo.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_bamboo.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_bamboo.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_birch_sapling.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_birch_sapling.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_birch_sapling.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_birch_sapling.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_blue_orchid.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_blue_orchid.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_blue_orchid.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_blue_orchid.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_brown_mushroom.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_brown_mushroom.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_brown_mushroom.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_brown_mushroom.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_cactus.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_cactus.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_cactus.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_cactus.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_cherry_sapling.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_cherry_sapling.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_cherry_sapling.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_cherry_sapling.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_cornflower.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_cornflower.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_cornflower.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_cornflower.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_crimson_fungus.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_crimson_fungus.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_crimson_fungus.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_crimson_fungus.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_crimson_roots.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_crimson_roots.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_crimson_roots.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_crimson_roots.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_dandelion.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_dandelion.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_dandelion.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_dandelion.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_dark_oak_sapling.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_dark_oak_sapling.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_dark_oak_sapling.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_dark_oak_sapling.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_dead_bush.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_dead_bush.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_dead_bush.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_dead_bush.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_fern.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_fern.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_fern.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_fern.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_flowering_azalea_bush.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_flowering_azalea_bush.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_flowering_azalea_bush.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_flowering_azalea_bush.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_jungle_sapling.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_jungle_sapling.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_jungle_sapling.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_jungle_sapling.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_lily_of_the_valley.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_lily_of_the_valley.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_lily_of_the_valley.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_lily_of_the_valley.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_mangrove_propagule.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_mangrove_propagule.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_mangrove_propagule.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_mangrove_propagule.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_oak_sapling.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_oak_sapling.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_oak_sapling.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_oak_sapling.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_orange_tulip.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_orange_tulip.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_orange_tulip.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_orange_tulip.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_oxeye_daisy.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_oxeye_daisy.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_oxeye_daisy.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_oxeye_daisy.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_pink_tulip.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_pink_tulip.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_pink_tulip.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_pink_tulip.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_poppy.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_poppy.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_poppy.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_poppy.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_red_mushroom.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_red_mushroom.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_red_mushroom.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_red_mushroom.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_red_tulip.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_red_tulip.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_red_tulip.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_red_tulip.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_spruce_sapling.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_spruce_sapling.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_spruce_sapling.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_spruce_sapling.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_torchflower.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_torchflower.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_torchflower.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_torchflower.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_warped_fungus.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_warped_fungus.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_warped_fungus.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_warped_fungus.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_warped_roots.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_warped_roots.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_warped_roots.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_warped_roots.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_white_tulip.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_white_tulip.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_white_tulip.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_white_tulip.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_wither_rose.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_wither_rose.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.flower_pot.platform.potted_wither_rose.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.flower_pot.platform.potted_wither_rose.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structure/item.lead.platform.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.lead.platform.snbt new file mode 100644 index 00000000..241bee82 --- /dev/null +++ b/src/gametest/resources/data/itematic/gametest/structure/item.lead.platform.snbt @@ -0,0 +1,38 @@ +{ + DataVersion: 3948, + size: [3, 3, 3], + data: [ + {pos: [0, 0, 0], state: "minecraft:bedrock"}, + {pos: [0, 0, 1], state: "minecraft:bedrock"}, + {pos: [0, 0, 2], state: "minecraft:bedrock"}, + {pos: [1, 0, 0], state: "minecraft:bedrock"}, + {pos: [1, 0, 1], state: "minecraft:bedrock"}, + {pos: [1, 0, 2], state: "minecraft:bedrock"}, + {pos: [2, 0, 0], state: "minecraft:bedrock"}, + {pos: [2, 0, 1], state: "minecraft:bedrock"}, + {pos: [2, 0, 2], state: "minecraft:bedrock"}, + {pos: [0, 1, 0], state: "minecraft:air"}, + {pos: [0, 1, 1], state: "minecraft:air"}, + {pos: [0, 1, 2], state: "minecraft:air"}, + {pos: [1, 1, 0], state: "minecraft:air"}, + {pos: [1, 1, 1], state: "minecraft:air"}, + {pos: [1, 1, 2], state: "minecraft:air"}, + {pos: [2, 1, 0], state: "minecraft:air"}, + {pos: [2, 1, 1], state: "minecraft:air"}, + {pos: [2, 1, 2], state: "minecraft:air"}, + {pos: [0, 2, 0], state: "minecraft:air"}, + {pos: [0, 2, 1], state: "minecraft:air"}, + {pos: [0, 2, 2], state: "minecraft:air"}, + {pos: [1, 2, 0], state: "minecraft:air"}, + {pos: [1, 2, 1], state: "minecraft:air"}, + {pos: [1, 2, 2], state: "minecraft:air"}, + {pos: [2, 2, 0], state: "minecraft:air"}, + {pos: [2, 2, 1], state: "minecraft:air"}, + {pos: [2, 2, 2], state: "minecraft:air"} + ], + entities: [], + palette: [ + "minecraft:bedrock", + "minecraft:air" + ] +} diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.sign.platform.ceiling.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.sign.platform.ceiling.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.sign.platform.ceiling.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.sign.platform.ceiling.snbt diff --git a/src/gametest/resources/data/itematic/gametest/structures/item.sign.platform.snbt b/src/gametest/resources/data/itematic/gametest/structure/item.sign.platform.snbt similarity index 100% rename from src/gametest/resources/data/itematic/gametest/structures/item.sign.platform.snbt rename to src/gametest/resources/data/itematic/gametest/structure/item.sign.platform.snbt diff --git a/src/gametest/resources/fabric.mod.json b/src/gametest/resources/fabric.mod.json index af8a5d42..40887825 100644 --- a/src/gametest/resources/fabric.mod.json +++ b/src/gametest/resources/fabric.mod.json @@ -35,6 +35,7 @@ "net.errorcraft.itematic.gametest.item.FishingRodTestSuite", "net.errorcraft.itematic.gametest.item.FlowerPotItemTestSuite", "net.errorcraft.itematic.gametest.item.HoneyBottleTestSuite", + "net.errorcraft.itematic.gametest.item.LeadTestSuite", "net.errorcraft.itematic.gametest.item.SignTestSuite", "net.errorcraft.itematic.gametest.item.component.BlockItemComponentTestSuite", "net.errorcraft.itematic.gametest.item.component.ConsumableItemComponentTestSuite", diff --git a/src/main/generated/data/minecraft/item/mace.json b/src/main/generated/data/minecraft/item/mace.json index a4253174..1505c02c 100644 --- a/src/main/generated/data/minecraft/item/mace.json +++ b/src/main/generated/data/minecraft/item/mace.json @@ -22,7 +22,7 @@ "default_damage": 6.0, "rules": [] }, - "attack_speed": 0.125, + "attack_speed": 0.15, "may_smash": true } } diff --git a/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/TridentEntityInitializer.java b/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/TridentEntityInitializer.java index b59c0a47..cb02db9d 100644 --- a/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/TridentEntityInitializer.java +++ b/src/main/java/net/errorcraft/itematic/entity/initializer/initializers/TridentEntityInitializer.java @@ -28,7 +28,7 @@ public TridentEntity create(ActionContext context) { ItemStack stack = context.stack(); LivingEntity user = context.livingEntity(ActionContextParameter.THIS).orElse(null); float spinAttackStrength = user != null ? - EnchantmentHelper.getTridentSpinAttackStrength(user) : + EnchantmentHelper.getTridentSpinAttackStrength(stack, user) : 0.0f; if (this.preventSpawnFromRiptide && spinAttackStrength > 0.0f) { return null; diff --git a/src/main/java/net/errorcraft/itematic/item/ItemUtil.java b/src/main/java/net/errorcraft/itematic/item/ItemUtil.java index 337cbd5f..4fe13dbd 100644 --- a/src/main/java/net/errorcraft/itematic/item/ItemUtil.java +++ b/src/main/java/net/errorcraft/itematic/item/ItemUtil.java @@ -5395,7 +5395,7 @@ private void bootstrapToolsAndWeapons() { .with(StackableItemComponent.of(1)) .with(DamageableItemComponent.of(500)) .with(ToolItemComponent.builder(2).build()) - .with(WeaponItemComponent.ofSmashing(1, 6.0d, 0.125d)) + .with(WeaponItemComponent.ofSmashing(1, 6.0d, 0.15d)) .with(EnchantableItemComponent.of(15)) .with(RepairableItemComponent.of(ItematicItemTags.REPAIRS_MACE)) .build() diff --git a/src/main/java/net/errorcraft/itematic/item/component/components/SaddleItemComponent.java b/src/main/java/net/errorcraft/itematic/item/component/components/SaddleItemComponent.java index c7c3c46e..933e862d 100644 --- a/src/main/java/net/errorcraft/itematic/item/component/components/SaddleItemComponent.java +++ b/src/main/java/net/errorcraft/itematic/item/component/components/SaddleItemComponent.java @@ -34,6 +34,7 @@ public ActionResult useOnEntity(PlayerEntity user, LivingEntity target, Hand han if (this.trySaddle(target, user.getWorld(), stack, SoundCategory.NEUTRAL)) { return ActionResult.success(user.getWorld().isClient()); } + return ActionResult.PASS; } @@ -41,14 +42,16 @@ public boolean trySaddle(LivingEntity target, World world, ItemStack stack, Soun if (!(target instanceof Saddleable saddleable)) { return false; } + if (!target.isAlive() || saddleable.isSaddled() || !saddleable.canBeSaddled()) { return false; } + if (!world.isClient()) { - saddleable.saddle(soundCategory); + saddleable.saddle(stack.split(1), soundCategory); target.getWorld().emitGameEvent(target, GameEvent.EQUIP, target.getPos()); - stack.decrement(1); } + return true; } } diff --git a/src/main/java/net/errorcraft/itematic/item/shooter/method/methods/ChargeableShooterMethod.java b/src/main/java/net/errorcraft/itematic/item/shooter/method/methods/ChargeableShooterMethod.java index 58681cff..90b75542 100644 --- a/src/main/java/net/errorcraft/itematic/item/shooter/method/methods/ChargeableShooterMethod.java +++ b/src/main/java/net/errorcraft/itematic/item/shooter/method/methods/ChargeableShooterMethod.java @@ -12,7 +12,6 @@ import net.errorcraft.itematic.mixin.item.CrossbowItemAccessor; import net.errorcraft.itematic.mixin.item.RangedWeaponItemAccessor; import net.errorcraft.itematic.serialization.ItematicCodecs; -import net.minecraft.SharedConstants; import net.minecraft.advancement.criterion.Criteria; import net.minecraft.component.ComponentMap; import net.minecraft.component.DataComponentTypes; @@ -94,7 +93,7 @@ public void hold(ShooterItemComponent shooter, ItemStack stack, World world, Liv return; } - int chargeTime = getChargeTime(stack, user); + int chargeTime = CrossbowItem.getPullTime(stack, user); if (usedTicks >= chargeTime) { return; } @@ -112,7 +111,7 @@ public void hold(ShooterItemComponent shooter, ItemStack stack, World world, Liv @Override public void stop(ShooterItemComponent shooter, ItemStack stack, World world, LivingEntity user, int usedTicks) { - if (usedTicks < getChargeTime(stack, user)) { + if (usedTicks < CrossbowItem.getPullTime(stack, user)) { return; } @@ -141,12 +140,12 @@ public OptionalInt useDuration(ItemStack stack, LivingEntity user) { return OptionalInt.empty(); } - return OptionalInt.of(getChargeTime(stack, user) + EXTRA_USE_TIME); + return OptionalInt.of(CrossbowItem.getPullTime(stack, user) + EXTRA_USE_TIME); } @Override public float pullProgress(ItemStack stack, LivingEntity user, int usedTicks) { - return ((float)usedTicks) / getChargeTime(stack, user); + return ((float)usedTicks) / CrossbowItem.getPullTime(stack, user); } public void shoot(ShooterItemComponent shooter, World world, LivingEntity user, Hand hand, ItemStack stack, float power, float divergence, @Nullable LivingEntity livingEntity) { @@ -166,16 +165,6 @@ public void shoot(ShooterItemComponent shooter, World world, LivingEntity user, } } - public static int getChargeTime(ItemStack stack, LivingEntity user) { - Float defaultChargeTime = stack.get(ItematicDataComponentTypes.SHOOTER_DEFAULT_CHARGE_TIME); - if (defaultChargeTime == null) { - return 0; - } - - float chargeTime = EnchantmentHelper.getCrossbowChargeTime(user, defaultChargeTime); - return MathHelper.floor(chargeTime * SharedConstants.TICKS_PER_SECOND); - } - private static int getChargeTimeAt(int chargeTime, float progress) { return MathHelper.floor(progress * chargeTime); } diff --git a/src/main/java/net/errorcraft/itematic/item/use/provider/providers/TridentIntegerProvider.java b/src/main/java/net/errorcraft/itematic/item/use/provider/providers/TridentIntegerProvider.java index 00cb91aa..36925997 100644 --- a/src/main/java/net/errorcraft/itematic/item/use/provider/providers/TridentIntegerProvider.java +++ b/src/main/java/net/errorcraft/itematic/item/use/provider/providers/TridentIntegerProvider.java @@ -36,7 +36,7 @@ public OptionalInt get(ItemStack stack, LivingEntity user) { } private static boolean mayStartUsing(ItemStack stack, LivingEntity user) { - if (EnchantmentHelper.getTridentSpinAttackStrength(user) > 0.0f && !user.isTouchingWaterOrRain()) { + if (EnchantmentHelper.getTridentSpinAttackStrength(stack, user) > 0.0f && !user.isTouchingWaterOrRain()) { return false; } diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/EntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/EntityExtender.java index 0254e942..337c35ca 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/EntityExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/EntityExtender.java @@ -1,6 +1,7 @@ package net.errorcraft.itematic.mixin.entity; import net.errorcraft.itematic.access.entity.EntityAccess; +import net.errorcraft.itematic.item.ItemKeys; import net.minecraft.entity.Entity; import net.minecraft.entity.ItemEntity; import net.minecraft.item.Item; @@ -11,6 +12,8 @@ import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(Entity.class) public abstract class EntityExtender implements EntityAccess { @@ -25,8 +28,16 @@ public abstract class EntityExtender implements EntityAccess { @Nullable public abstract ItemEntity dropStack(ItemStack stack, float yOffset); - @Shadow - public abstract World getWorld(); + @Redirect( + method = "interact", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/item/ItemStack;isOf(Lnet/minecraft/item/Item;)Z" + ) + ) + private boolean isOfForLeadUseRegistryKeyCheck(ItemStack instance, Item item) { + return instance.itematic$isOf(ItemKeys.LEAD); + } @Override public ItemEntity itematic$dropItem(RegistryKey key) { diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/LeashableExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/LeashableExtender.java new file mode 100644 index 00000000..9edc4c42 --- /dev/null +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/LeashableExtender.java @@ -0,0 +1,27 @@ +package net.errorcraft.itematic.mixin.entity; + +import net.errorcraft.itematic.item.ItemKeys; +import net.minecraft.entity.Entity; +import net.minecraft.entity.ItemEntity; +import net.minecraft.entity.Leashable; +import net.minecraft.item.ItemConvertible; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(Leashable.class) +public interface LeashableExtender { + @Redirect( + method = { + "resolveLeashData", + "detachLeash(Lnet/minecraft/entity/Entity;ZZ)V" + }, + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/entity/Entity;dropItem(Lnet/minecraft/item/ItemConvertible;)Lnet/minecraft/entity/ItemEntity;" + ) + ) + private static ItemEntity dropItemForLeadUseRegistryKey(Entity instance, ItemConvertible item) { + return instance.itematic$dropItem(ItemKeys.LEAD); + } +} diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/ai/brain/task/CrossbowAttackTaskExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/ai/brain/task/CrossbowAttackTaskExtender.java index 97e3f943..efb3828a 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/ai/brain/task/CrossbowAttackTaskExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/ai/brain/task/CrossbowAttackTaskExtender.java @@ -1,14 +1,11 @@ package net.errorcraft.itematic.mixin.entity.ai.brain.task; -import com.llamalad7.mixinextras.sugar.Local; import net.errorcraft.itematic.entity.projectile.ItematicProjectileUtil; import net.errorcraft.itematic.item.ItemKeys; -import net.errorcraft.itematic.item.shooter.method.methods.ChargeableShooterMethod; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.ai.brain.task.CrossbowAttackTask; import net.minecraft.entity.mob.MobEntity; import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; import net.minecraft.util.Hand; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -40,15 +37,4 @@ private boolean isHoldingForCrossbowUseRegistryKeyCheck(MobEntity instance, Item private Hand getHandPossiblyHoldingForCrossbowUseRegistryKey(LivingEntity entity, Item item) { return ItematicProjectileUtil.getHandPossiblyHolding(entity, ItemKeys.CROSSBOW); } - - @Redirect( - method = "tickState", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/item/CrossbowItem;getPullTime(Lnet/minecraft/entity/LivingEntity;)I" - ) - ) - private int getPullTimeUseItemComponent(LivingEntity user, @Local ItemStack usedStack) { - return ChargeableShooterMethod.getChargeTime(usedStack, user); - } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/ai/goal/CrossbowAttackGoalExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/ai/goal/CrossbowAttackGoalExtender.java index 6fdcb9fd..befc0fbb 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/ai/goal/CrossbowAttackGoalExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/ai/goal/CrossbowAttackGoalExtender.java @@ -1,14 +1,11 @@ package net.errorcraft.itematic.mixin.entity.ai.goal; -import com.llamalad7.mixinextras.sugar.Local; import net.errorcraft.itematic.entity.projectile.ItematicProjectileUtil; import net.errorcraft.itematic.item.ItemKeys; -import net.errorcraft.itematic.item.shooter.method.methods.ChargeableShooterMethod; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.ai.goal.CrossbowAttackGoal; import net.minecraft.entity.mob.HostileEntity; import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; import net.minecraft.util.Hand; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -37,15 +34,4 @@ private boolean isHoldingForCrossbowUseRegistryKeyCheck(HostileEntity instance, private Hand getHandPossiblyHoldingForCrossbowUseRegistryKey(LivingEntity entity, Item item) { return ItematicProjectileUtil.getHandPossiblyHolding(entity, ItemKeys.CROSSBOW); } - - @Redirect( - method = "tick", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/item/CrossbowItem;getPullTime(Lnet/minecraft/entity/LivingEntity;)I" - ) - ) - private int getPullTimeUseItemComponent(LivingEntity user, @Local ItemStack usedStack) { - return ChargeableShooterMethod.getChargeTime(usedStack, user); - } } diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/mob/MobEntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/mob/MobEntityExtender.java index 2cb49d20..0be65a52 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/mob/MobEntityExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/mob/MobEntityExtender.java @@ -11,7 +11,6 @@ import net.errorcraft.itematic.item.component.components.SpawnEggItemComponent; import net.minecraft.entity.EntityType; import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.ItemEntity; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.attribute.EntityAttribute; import net.minecraft.entity.mob.MobEntity; @@ -129,17 +128,6 @@ private boolean isOfForLeadUseRegistryKeyCheck(ItemStack instance, Item item) { return instance.itematic$isOf(ItemKeys.LEAD); } - @Redirect( - method = { "detachLeash", "readLeashNbt" }, - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/entity/mob/MobEntity;dropItem(Lnet/minecraft/item/ItemConvertible;)Lnet/minecraft/entity/ItemEntity;" - ) - ) - private ItemEntity dropItemForLeadUseRegistryKey(MobEntity instance, ItemConvertible itemConvertible) { - return this.itematic$dropItem(ItemKeys.LEAD); - } - @Redirect( method = "initEquipment", at = @At( @@ -153,6 +141,7 @@ private Item getEquipmentForSlotUseRegistryKey(EquipmentSlot equipmentSlot, int if (optionalEntry.isEmpty()) { return null; } + item.set(optionalEntry.get()); return optionalEntry.get().value(); } @@ -198,6 +187,7 @@ public ItemStack getPickBlockStack() { if (key == null) { return null; } + return this.getWorld().itematic$createStack(key); } diff --git a/src/main/java/net/errorcraft/itematic/mixin/entity/passive/AbstractHorseEntityExtender.java b/src/main/java/net/errorcraft/itematic/mixin/entity/passive/AbstractHorseEntityExtender.java index 890262af..fe71da38 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/entity/passive/AbstractHorseEntityExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/entity/passive/AbstractHorseEntityExtender.java @@ -6,7 +6,6 @@ import net.minecraft.entity.passive.AbstractHorseEntity; import net.minecraft.entity.passive.AnimalEntity; import net.minecraft.item.Item; -import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import org.objectweb.asm.Opcodes; @@ -151,17 +150,6 @@ private boolean isOfForEnchantedGoldenAppleUseRegistryKeyCheck(ItemStack instanc return instance.itematic$isOf(ItemKeys.ENCHANTED_GOLDEN_APPLE); } - @Redirect( - method = "saddle", - at = @At( - value = "NEW", - target = "(Lnet/minecraft/item/ItemConvertible;)Lnet/minecraft/item/ItemStack;" - ) - ) - private ItemStack newItemStackForSaddleUseCreateStack(ItemConvertible item) { - return this.getWorld().itematic$createStack(ItemKeys.SADDLE); - } - @Redirect( method = "readCustomDataFromNbt", at = @At( diff --git a/src/main/java/net/errorcraft/itematic/mixin/item/CrossbowItemExtender.java b/src/main/java/net/errorcraft/itematic/mixin/item/CrossbowItemExtender.java index 15676efd..ce42882c 100644 --- a/src/main/java/net/errorcraft/itematic/mixin/item/CrossbowItemExtender.java +++ b/src/main/java/net/errorcraft/itematic/mixin/item/CrossbowItemExtender.java @@ -1,13 +1,14 @@ package net.errorcraft.itematic.mixin.item; +import com.llamalad7.mixinextras.sugar.Share; +import com.llamalad7.mixinextras.sugar.ref.LocalFloatRef; +import net.errorcraft.itematic.component.ItematicDataComponentTypes; import net.errorcraft.itematic.item.component.ItemComponentTypes; import net.minecraft.entity.LivingEntity; import net.minecraft.item.CrossbowItem; import net.minecraft.item.ItemStack; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(CrossbowItem.class) @@ -37,4 +38,29 @@ private static ItemStack getAmmunitionUseItemComponent(LivingEntity instance, It return ItemStack.EMPTY; } + + @Inject( + method = "getPullTime", + at = @At("HEAD"), + cancellable = true + ) + private static void checkAndStoreDefaultChargeTime(ItemStack stack, LivingEntity user, CallbackInfoReturnable info, @Share("defaultChargeTime") LocalFloatRef defaultChargeTime) { + Float possibleDefaultChargeTime = stack.get(ItematicDataComponentTypes.SHOOTER_DEFAULT_CHARGE_TIME); + if (possibleDefaultChargeTime == null) { + info.setReturnValue(0); + return; + } + + defaultChargeTime.set(possibleDefaultChargeTime); + } + + @ModifyConstant( + method = "getPullTime", + constant = @Constant( + floatValue = 1.25f + ) + ) + private static float defaultChargeTimeUseDataComponent(float constant, @Share("defaultChargeTime") LocalFloatRef defaultChargeTime) { + return defaultChargeTime.get(); + } } diff --git a/src/main/java/net/errorcraft/itematic/world/action/actions/TwirlPlayerAction.java b/src/main/java/net/errorcraft/itematic/world/action/actions/TwirlPlayerAction.java index d4caa73c..714f84aa 100644 --- a/src/main/java/net/errorcraft/itematic/world/action/actions/TwirlPlayerAction.java +++ b/src/main/java/net/errorcraft/itematic/world/action/actions/TwirlPlayerAction.java @@ -37,7 +37,8 @@ public boolean execute(ActionContext context) { return false; } - float spinAttackStrength = EnchantmentHelper.getTridentSpinAttackStrength(player); + ItemStack stack = context.stack(); + float spinAttackStrength = EnchantmentHelper.getTridentSpinAttackStrength(stack, player); if (spinAttackStrength <= 0.0f) { return false; } @@ -46,7 +47,7 @@ public boolean execute(ActionContext context) { serverPlayer.networkHandler.sendPacket(new TwirlS2CPacket(spinAttackStrength)); } - execute(spinAttackStrength, player, context.world(), context.stack()); + execute(spinAttackStrength, player, context.world(), stack); return true; } diff --git a/src/main/resources/itematic.mixins.json b/src/main/resources/itematic.mixins.json index b1e8a903..609acb75 100644 --- a/src/main/resources/itematic.mixins.json +++ b/src/main/resources/itematic.mixins.json @@ -100,6 +100,7 @@ "entity.EyeOfEnderEntityExtender", "entity.FallingBlockEntityExtender", "entity.ItemEntityExtender", + "entity.LeashableExtender", "entity.LivingEntityExtender", "entity.ai.brain.task.BoneMealTaskExtender", "entity.ai.brain.task.CelebrateRaidWinTaskExtender", From 1712b1ded2185f0405449f4873ac709108fca5cf Mon Sep 17 00:00:00 2001 From: ErrorCraft <51973682+ErrorCraft@users.noreply.github.com> Date: Thu, 22 Jan 2026 00:27:27 +0100 Subject: [PATCH 08/11] Port to 1.21 pre-release 2 --- gradle.properties | 4 +-- .../minecraft/item/flow_banner_pattern.json | 1 + .../minecraft/item/guster_banner_pattern.json | 1 + .../data/minecraft/item/heavy_core.json | 1 + .../generated/data/minecraft/item/mace.json | 1 + .../minecraft/item/piglin_banner_pattern.json | 1 + .../data/minecraft/item/trident.json | 1 + .../errorcraft/itematic/item/ItemUtil.java | 35 ++++++++++++++----- 8 files changed, 35 insertions(+), 10 deletions(-) diff --git a/gradle.properties b/gradle.properties index ad87eca4..a333b91a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,8 +3,8 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://fabricmc.net/develop - minecraft_version=1.21-pre1 - yarn_mappings=1.21-pre1+build.5 + minecraft_version=1.21-pre2 + yarn_mappings=1.21-pre2+build.2 loader_version=0.18.4 # Mod Properties diff --git a/src/main/generated/data/minecraft/item/flow_banner_pattern.json b/src/main/generated/data/minecraft/item/flow_banner_pattern.json index 1067a601..72af906a 100644 --- a/src/main/generated/data/minecraft/item/flow_banner_pattern.json +++ b/src/main/generated/data/minecraft/item/flow_banner_pattern.json @@ -1,5 +1,6 @@ { "base": { + "rarity": "rare", "tooltip": [ { "color": "gray", diff --git a/src/main/generated/data/minecraft/item/guster_banner_pattern.json b/src/main/generated/data/minecraft/item/guster_banner_pattern.json index 03291cf8..794d08e4 100644 --- a/src/main/generated/data/minecraft/item/guster_banner_pattern.json +++ b/src/main/generated/data/minecraft/item/guster_banner_pattern.json @@ -1,5 +1,6 @@ { "base": { + "rarity": "rare", "tooltip": [ { "color": "gray", diff --git a/src/main/generated/data/minecraft/item/heavy_core.json b/src/main/generated/data/minecraft/item/heavy_core.json index 26b57d83..34efb13f 100644 --- a/src/main/generated/data/minecraft/item/heavy_core.json +++ b/src/main/generated/data/minecraft/item/heavy_core.json @@ -1,5 +1,6 @@ { "base": { + "rarity": "epic", "translation_key": "block.minecraft.heavy_core" }, "components": { diff --git a/src/main/generated/data/minecraft/item/mace.json b/src/main/generated/data/minecraft/item/mace.json index 1505c02c..ed40aff6 100644 --- a/src/main/generated/data/minecraft/item/mace.json +++ b/src/main/generated/data/minecraft/item/mace.json @@ -1,5 +1,6 @@ { "base": { + "rarity": "epic", "translation_key": "item.minecraft.mace" }, "components": { diff --git a/src/main/generated/data/minecraft/item/piglin_banner_pattern.json b/src/main/generated/data/minecraft/item/piglin_banner_pattern.json index d6a0589f..e01e794a 100644 --- a/src/main/generated/data/minecraft/item/piglin_banner_pattern.json +++ b/src/main/generated/data/minecraft/item/piglin_banner_pattern.json @@ -1,5 +1,6 @@ { "base": { + "rarity": "uncommon", "tooltip": [ { "color": "gray", diff --git a/src/main/generated/data/minecraft/item/trident.json b/src/main/generated/data/minecraft/item/trident.json index ab9febd1..f479dd04 100644 --- a/src/main/generated/data/minecraft/item/trident.json +++ b/src/main/generated/data/minecraft/item/trident.json @@ -1,5 +1,6 @@ { "base": { + "rarity": "epic", "translation_key": "item.minecraft.trident" }, "components": { diff --git a/src/main/java/net/errorcraft/itematic/item/ItemUtil.java b/src/main/java/net/errorcraft/itematic/item/ItemUtil.java index 4fe13dbd..52acf641 100644 --- a/src/main/java/net/errorcraft/itematic/item/ItemUtil.java +++ b/src/main/java/net/errorcraft/itematic/item/ItemUtil.java @@ -1077,7 +1077,9 @@ private void bootstrapBlocks() { .build() )); this.registerable.register(ItemKeys.HEAVY_CORE, create( - ItemBase.Builder.forBlock(ItemKeys.HEAVY_CORE).build(), + ItemBase.Builder.forBlock(ItemKeys.HEAVY_CORE) + .rarity(Rarity.EPIC) + .build(), ItemComponentSet.builder() .with(StackableItemComponent.of(64)) .with(BlockItemComponent.of(this.blocks.getOrThrow(BlockKeys.HEAVY_CORE))) @@ -5305,7 +5307,9 @@ private void bootstrapToolsAndWeapons() { .build() )); this.registerable.register(ItemKeys.TRIDENT, create( - ItemBase.Builder.forItem(ItemKeys.TRIDENT).build(), + ItemBase.Builder.forItem(ItemKeys.TRIDENT) + .rarity(Rarity.EPIC) + .build(), ItemComponentSet.builder() .with(StackableItemComponent.of(1)) .with(DamageableItemComponent.ofPreserved(250)) @@ -5390,7 +5394,9 @@ private void bootstrapToolsAndWeapons() { .build() )); this.registerable.register(ItemKeys.MACE, create( - ItemBase.Builder.forItem(ItemKeys.MACE).build(), + ItemBase.Builder.forItem(ItemKeys.MACE) + .rarity(Rarity.EPIC) + .build(), ItemComponentSet.builder() .with(StackableItemComponent.of(1)) .with(DamageableItemComponent.of(500)) @@ -9813,7 +9819,9 @@ private void bootstrapBanners() { private void bootstrapBannerPatterns() { this.registerable.register(ItemKeys.FLOWER_BANNER_PATTERN, create( - ItemBase.Builder.forItem(ItemKeys.FLOWER_BANNER_PATTERN).tooltip(ItemKeys.FLOWER_BANNER_PATTERN).build(), + ItemBase.Builder.forItem(ItemKeys.FLOWER_BANNER_PATTERN) + .tooltip(ItemKeys.FLOWER_BANNER_PATTERN) + .build(), ItemComponentSet.builder() .with(BannerPatternItemComponent.of(BannerPatternTags.FLOWER_PATTERN_ITEM)) .build() @@ -9846,25 +9854,36 @@ private void bootstrapBannerPatterns() { .build() )); this.registerable.register(ItemKeys.GLOBE_BANNER_PATTERN, create( - ItemBase.Builder.forItem(ItemKeys.GLOBE_BANNER_PATTERN).tooltip(ItemKeys.GLOBE_BANNER_PATTERN).build(), + ItemBase.Builder.forItem(ItemKeys.GLOBE_BANNER_PATTERN) + .tooltip(ItemKeys.GLOBE_BANNER_PATTERN) + .build(), ItemComponentSet.builder() .with(BannerPatternItemComponent.of(BannerPatternTags.GLOBE_PATTERN_ITEM)) .build() )); this.registerable.register(ItemKeys.PIGLIN_BANNER_PATTERN, create( - ItemBase.Builder.forItem(ItemKeys.PIGLIN_BANNER_PATTERN).tooltip(ItemKeys.PIGLIN_BANNER_PATTERN).build(), + ItemBase.Builder.forItem(ItemKeys.PIGLIN_BANNER_PATTERN) + .rarity(Rarity.UNCOMMON) + .tooltip(ItemKeys.PIGLIN_BANNER_PATTERN) + .build(), ItemComponentSet.builder() .with(BannerPatternItemComponent.of(BannerPatternTags.PIGLIN_PATTERN_ITEM)) .build() )); this.registerable.register(ItemKeys.FLOW_BANNER_PATTERN, create( - ItemBase.Builder.forItem(ItemKeys.FLOW_BANNER_PATTERN).tooltip(ItemKeys.FLOW_BANNER_PATTERN).build(), + ItemBase.Builder.forItem(ItemKeys.FLOW_BANNER_PATTERN) + .rarity(Rarity.RARE) + .tooltip(ItemKeys.FLOW_BANNER_PATTERN) + .build(), ItemComponentSet.builder() .with(BannerPatternItemComponent.of(BannerPatternTags.FLOW_PATTERN_ITEM)) .build() )); this.registerable.register(ItemKeys.GUSTER_BANNER_PATTERN, create( - ItemBase.Builder.forItem(ItemKeys.GUSTER_BANNER_PATTERN).tooltip(ItemKeys.GUSTER_BANNER_PATTERN).build(), + ItemBase.Builder.forItem(ItemKeys.GUSTER_BANNER_PATTERN) + .rarity(Rarity.RARE) + .tooltip(ItemKeys.GUSTER_BANNER_PATTERN) + .build(), ItemComponentSet.builder() .with(BannerPatternItemComponent.of(BannerPatternTags.GUSTER_PATTERN_ITEM)) .build() From 6f87b03d392067ee140249630627e7baae32d705 Mon Sep 17 00:00:00 2001 From: ErrorCraft <51973682+ErrorCraft@users.noreply.github.com> Date: Thu, 22 Jan 2026 00:53:30 +0100 Subject: [PATCH 09/11] Update to 1.21.1 --- gradle.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index a333b91a..9e0ffdef 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,8 +3,8 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://fabricmc.net/develop - minecraft_version=1.21-pre2 - yarn_mappings=1.21-pre2+build.2 + minecraft_version=1.21.1 + yarn_mappings=1.21.1+build.3 loader_version=0.18.4 # Mod Properties @@ -13,4 +13,4 @@ org.gradle.jvmargs=-Xmx1G archives_base_name = itematic # Dependencies - fabric_version=0.99.4+1.21 + fabric_version=0.116.7+1.21.1 From d62f471ea62c32ad15ca3421d77296354428e4ed Mon Sep 17 00:00:00 2001 From: ErrorCraft <51973682+ErrorCraft@users.noreply.github.com> Date: Thu, 22 Jan 2026 01:32:41 +0100 Subject: [PATCH 10/11] Increment version to 0.4.0-preview.2+1.21.1 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 9e0ffdef..25b341a5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ org.gradle.jvmargs=-Xmx1G loader_version=0.18.4 # Mod Properties - mod_version = 0.4.0-preview.1+1.21 + mod_version = 0.4.0-preview.2+1.21.1 maven_group = net.errorcraft archives_base_name = itematic From 5745d1aed879a178369ce66893508d87d1d7deb1 Mon Sep 17 00:00:00 2001 From: ErrorCraft <51973682+ErrorCraft@users.noreply.github.com> Date: Sun, 25 Jan 2026 17:33:37 +0100 Subject: [PATCH 11/11] Increment version to 0.4.0+1.21.1 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 25b341a5..35aa8830 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ org.gradle.jvmargs=-Xmx1G loader_version=0.18.4 # Mod Properties - mod_version = 0.4.0-preview.2+1.21.1 + mod_version = 0.4.0+1.21.1 maven_group = net.errorcraft archives_base_name = itematic