From 5efb8d3f127544f21c8c66c067bb427e43d1794c Mon Sep 17 00:00:00 2001 From: LexManos Date: Thu, 21 Nov 2024 09:52:32 -0800 Subject: [PATCH] Pass the Holder to Item.canApplyAtEnchantingTable. Closes #10181 --- .../enchantment/EnchantmentHelper.java.patch | 2 +- .../common/extensions/IForgeItem.java | 21 +++++++++++++++++++ .../common/extensions/IForgeItemStack.java | 21 +++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/patches/minecraft/net/minecraft/world/item/enchantment/EnchantmentHelper.java.patch b/patches/minecraft/net/minecraft/world/item/enchantment/EnchantmentHelper.java.patch index d82727647d..14206b9dc4 100644 --- a/patches/minecraft/net/minecraft/world/item/enchantment/EnchantmentHelper.java.patch +++ b/patches/minecraft/net/minecraft/world/item/enchantment/EnchantmentHelper.java.patch @@ -5,7 +5,7 @@ List list = Lists.newArrayList(); boolean flag = p_44819_.is(Items.BOOK); - p_342857_.filter(p_341799_ -> p_341799_.value().isPrimaryItem(p_44819_) || flag).forEach(p_341708_ -> { -+ p_342857_.filter(p_341799_ -> p_44819_.canApplyAtEnchantingTable(p_341799_.value()) || flag).forEach(p_341708_ -> { ++ p_342857_.filter(p_341799_ -> p_44819_.canApplyAtEnchantingTable(p_341799_) || flag).forEach(p_341708_ -> { Enchantment enchantment = p_341708_.value(); for (int i = enchantment.getMaxLevel(); i >= enchantment.getMinLevel(); i--) { diff --git a/src/main/java/net/minecraftforge/common/extensions/IForgeItem.java b/src/main/java/net/minecraftforge/common/extensions/IForgeItem.java index 3ee2a78acb..c7362ed2f9 100644 --- a/src/main/java/net/minecraftforge/common/extensions/IForgeItem.java +++ b/src/main/java/net/minecraftforge/common/extensions/IForgeItem.java @@ -24,6 +24,7 @@ import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.InteractionResult; import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; import net.minecraft.network.chat.Component; import net.minecraft.tags.ItemTags; import net.minecraft.world.level.Level; @@ -333,11 +334,31 @@ public interface IForgeItem { * @param stack the item stack to be enchanted * @param enchantment the enchantment to be applied * @return true if the enchantment can be applied to this item + * + * @deprecated Use {@link IForgeItemStack#canApplyAtEnchantingTable(Holder)} */ + @Deprecated(forRemoval = true, since = "1.21.3") default boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { return enchantment.isPrimaryItem(stack); } + /** + * Checks whether an item can be enchanted with a certain enchantment. This + * applies specifically to enchanting an item in the enchanting table and is + * called when retrieving the list of possible enchantments for an item. + * Enchantments may additionally (or exclusively) be doing their own checks in + * {@link Enchantment#canApplyAtEnchantingTable(ItemStack)}; + * check the individual implementation for reference. By default this will check + * if the enchantment type is valid for this item type. + * + * @param stack the item stack to be enchanted + * @param enchantment the enchantment to be applied + * @return true if the enchantment can be applied to this item + */ + default boolean canApplyAtEnchantingTable(ItemStack stack, Holder enchantment) { + return canApplyAtEnchantingTable(stack, enchantment.value()); + } + /** * Determine if the player switching between these two item stacks * diff --git a/src/main/java/net/minecraftforge/common/extensions/IForgeItemStack.java b/src/main/java/net/minecraftforge/common/extensions/IForgeItemStack.java index 82feb71bd3..77cb69d3b2 100644 --- a/src/main/java/net/minecraftforge/common/extensions/IForgeItemStack.java +++ b/src/main/java/net/minecraftforge/common/extensions/IForgeItemStack.java @@ -24,6 +24,7 @@ import net.minecraft.world.item.context.UseOnContext; import net.minecraft.stats.Stats; import net.minecraft.world.InteractionResult; import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; import net.minecraft.network.chat.Component; import net.minecraft.world.level.Level; import net.minecraftforge.common.ToolAction; @@ -123,11 +124,31 @@ public interface IForgeItemStack { * * @param enchantment the enchantment to be applied * @return true if the enchantment can be applied to this item + * + * @deprecated Use {@link #canApplyAtEnchantingTable(Holder)} */ + @Deprecated(forRemoval = true, since = "1.21.3") default boolean canApplyAtEnchantingTable(Enchantment enchantment) { return self().getItem().canApplyAtEnchantingTable(self(), enchantment); } + /** + * Checks whether an item can be enchanted with a certain enchantment. This + * applies specifically to enchanting an item in the enchanting table and is + * called when retrieving the list of possible enchantments for an item. + * Enchantments may additionally (or exclusively) be doing their own checks in + * {@link Enchantment#canApplyAtEnchantingTable(ItemStack)}; + * check the individual implementation for reference. By default this will check + * if the enchantment type is valid for this item type. + * + * @param enchantment the enchantment to be applied + * @return true if the enchantment can be applied to this item + */ + default boolean canApplyAtEnchantingTable(Holder enchantment) { + return self().getItem().canApplyAtEnchantingTable(self(), enchantment); + } + + /** * Override this to set a non-default armor slot for an ItemStack, but do * not use this to get the armor slot of said stack; for that, use