From 983962f6cddf7e7f8589855ee9e8e0eb7baa0326 Mon Sep 17 00:00:00 2001 From: Sirttas Date: Sat, 9 May 2026 10:41:30 +0200 Subject: [PATCH 1/3] Use ItemStack sensitive getCraftingRemainder in vanilla code --- .../minecraft/world/item/crafting/Ingredient.java.patch | 9 +++++++++ .../block/entity/AbstractFurnaceBlockEntity.java.patch | 9 +++++++++ .../block/entity/BrewingStandBlockEntity.java.patch | 7 +++++-- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/patches/net/minecraft/world/item/crafting/Ingredient.java.patch b/patches/net/minecraft/world/item/crafting/Ingredient.java.patch index 2b8d67e8d96..fcd222ad87b 100644 --- a/patches/net/minecraft/world/item/crafting/Ingredient.java.patch +++ b/patches/net/minecraft/world/item/crafting/Ingredient.java.patch @@ -135,3 +135,12 @@ return (SlotDisplay)this.values .unwrap() .map(SlotDisplay.TagSlotDisplay::new, l -> new SlotDisplay.Composite(l.stream().map(Ingredient::displayForSingleItem).toList())); +@@ -99,7 +_,7 @@ + + public static SlotDisplay displayForSingleItem(Holder item) { + SlotDisplay inputDisplay = new SlotDisplay.ItemSlotDisplay(item); +- ItemStackTemplate remainderStack = item.value().getCraftingRemainder(); ++ ItemStackTemplate remainderStack = new ItemStack(item).getCraftingRemainder(); + if (remainderStack != null) { + SlotDisplay remainderDisplay = new SlotDisplay.ItemStackSlotDisplay(remainderStack); + return new SlotDisplay.WithRemainder(inputDisplay, remainderDisplay); diff --git a/patches/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java.patch b/patches/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java.patch index 354583ddd14..9a5f84e0339 100644 --- a/patches/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java.patch +++ b/patches/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java.patch @@ -61,6 +61,15 @@ ContainerHelper.saveAllItems(output, this.items); output.store("RecipesUsed", RECIPES_USED_CODEC, this.recipesUsed); } +@@ -214,7 +_,7 @@ + Item fuelItem = fuel.getItem(); + fuel.shrink(1); + if (fuel.isEmpty()) { +- ItemStackTemplate remainder = fuelItem.getCraftingRemainder(); ++ ItemStackTemplate remainder = fuel.getCraftingRemainder(); + items.set(1, remainder != null ? remainder.create() : ItemStack.EMPTY); + } + } @@ -248,7 +_,7 @@ } diff --git a/patches/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java.patch b/patches/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java.patch index 8f342ddeed6..b62f68f5057 100644 --- a/patches/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java.patch +++ b/patches/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java.patch @@ -8,14 +8,17 @@ ItemStack ingredient = items.get(3); PotionBrewing potionBrewing = level.potionBrewing(); -@@ -181,6 +_,7 @@ +@@ -181,8 +_,9 @@ items.set(dest, potionBrewing.mix(ingredient, items.get(dest))); } + net.neoforged.neoforge.event.EventHooks.onPotionBrewed(items); ingredient.shrink(1); - ItemStackTemplate remainder = ingredient.getItem().getCraftingRemainder(); +- ItemStackTemplate remainder = ingredient.getItem().getCraftingRemainder(); ++ ItemStackTemplate remainder = ingredient.getCraftingRemainder(); if (remainder != null) { + if (ingredient.isEmpty()) { + ingredient = remainder.create(); @@ -218,13 +_,13 @@ @Override From 137aba3ce02266b94aa6bf39ee2c61ad176f7dfd Mon Sep 17 00:00:00 2001 From: Sirttas Date: Thu, 14 May 2026 10:15:44 +0200 Subject: [PATCH 2/3] Fix Ingredient crafting remainder --- .../world/item/crafting/Ingredient.java.patch | 2 +- .../common/extensions/IItemStackExtension.java | 11 ----------- .../common/extensions/ItemInstanceExtension.java | 13 +++++++++++++ 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/patches/net/minecraft/world/item/crafting/Ingredient.java.patch b/patches/net/minecraft/world/item/crafting/Ingredient.java.patch index fcd222ad87b..2a64d89653d 100644 --- a/patches/net/minecraft/world/item/crafting/Ingredient.java.patch +++ b/patches/net/minecraft/world/item/crafting/Ingredient.java.patch @@ -140,7 +140,7 @@ public static SlotDisplay displayForSingleItem(Holder item) { SlotDisplay inputDisplay = new SlotDisplay.ItemSlotDisplay(item); - ItemStackTemplate remainderStack = item.value().getCraftingRemainder(); -+ ItemStackTemplate remainderStack = new ItemStack(item).getCraftingRemainder(); ++ ItemStackTemplate remainderStack = new ItemStackTemplate(item).getCraftingRemainder(); if (remainderStack != null) { SlotDisplay remainderDisplay = new SlotDisplay.ItemStackSlotDisplay(remainderStack); return new SlotDisplay.WithRemainder(inputDisplay, remainderDisplay); diff --git a/src/main/java/net/neoforged/neoforge/common/extensions/IItemStackExtension.java b/src/main/java/net/neoforged/neoforge/common/extensions/IItemStackExtension.java index ce83389b347..c827f48d8ae 100644 --- a/src/main/java/net/neoforged/neoforge/common/extensions/IItemStackExtension.java +++ b/src/main/java/net/neoforged/neoforge/common/extensions/IItemStackExtension.java @@ -25,7 +25,6 @@ import net.minecraft.world.item.AdventureModePredicate; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.ItemStackTemplate; import net.minecraft.world.item.component.ItemAttributeModifiers; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.item.crafting.RecipeType; @@ -51,16 +50,6 @@ private ItemStack self() { return (ItemStack) this; } - /** - * ItemStack sensitive version of {@link Item#getCraftingRemainder()}. - * Returns a full ItemStack instance of the result. - * - * @return The resulting ItemStack - */ - default @Nullable ItemStackTemplate getCraftingRemainder() { - return self().getItem().getCraftingRemainder(self()); - } - /** * Returns the fuel burn time for this item stack. If it is zero, this item is not a fuel. *

diff --git a/src/main/java/net/neoforged/neoforge/common/extensions/ItemInstanceExtension.java b/src/main/java/net/neoforged/neoforge/common/extensions/ItemInstanceExtension.java index 94c7da44141..c33956132bd 100644 --- a/src/main/java/net/neoforged/neoforge/common/extensions/ItemInstanceExtension.java +++ b/src/main/java/net/neoforged/neoforge/common/extensions/ItemInstanceExtension.java @@ -7,14 +7,17 @@ import net.minecraft.core.Holder; import net.minecraft.core.component.DataComponents; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemInstance; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ItemStackTemplate; import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.ItemEnchantments; import net.neoforged.neoforge.common.ItemAbilities; import net.neoforged.neoforge.common.ItemAbility; import net.neoforged.neoforge.event.EventHooks; +import org.jspecify.annotations.Nullable; public interface ItemInstanceExtension { private ItemInstance self() { @@ -54,4 +57,14 @@ default int getEnchantmentLevel(Holder enchantment) { int level = self().typeHolder().value().getEnchantmentLevel(self(), enchantment); return EventHooks.getEnchantmentLevelSpecific(level, self(), enchantment); } + + /** + * ItemInstance sensitive version of {@link Item#getCraftingRemainder()}. + * Returns a full ItemStackTemplate instance of the result. + * + * @return The resulting ItemStackTemplate + */ + default @Nullable ItemStackTemplate getCraftingRemainder() { + return self().typeHolder().value().getCraftingRemainder(self()); + } } From 174393ff7e48d30e7994046340fd367a5f3519ca Mon Sep 17 00:00:00 2001 From: Sirttas Date: Thu, 14 May 2026 17:12:59 +0200 Subject: [PATCH 3/3] Rever Ingredient change --- .../minecraft/world/item/crafting/Ingredient.java.patch | 9 --------- 1 file changed, 9 deletions(-) diff --git a/patches/net/minecraft/world/item/crafting/Ingredient.java.patch b/patches/net/minecraft/world/item/crafting/Ingredient.java.patch index 2a64d89653d..2b8d67e8d96 100644 --- a/patches/net/minecraft/world/item/crafting/Ingredient.java.patch +++ b/patches/net/minecraft/world/item/crafting/Ingredient.java.patch @@ -135,12 +135,3 @@ return (SlotDisplay)this.values .unwrap() .map(SlotDisplay.TagSlotDisplay::new, l -> new SlotDisplay.Composite(l.stream().map(Ingredient::displayForSingleItem).toList())); -@@ -99,7 +_,7 @@ - - public static SlotDisplay displayForSingleItem(Holder item) { - SlotDisplay inputDisplay = new SlotDisplay.ItemSlotDisplay(item); -- ItemStackTemplate remainderStack = item.value().getCraftingRemainder(); -+ ItemStackTemplate remainderStack = new ItemStackTemplate(item).getCraftingRemainder(); - if (remainderStack != null) { - SlotDisplay remainderDisplay = new SlotDisplay.ItemStackSlotDisplay(remainderStack); - return new SlotDisplay.WithRemainder(inputDisplay, remainderDisplay);