Skip to content

Commit e011d14

Browse files
authored
Query crafting remainders prior to shrinkage to fix bug caused by querying the empty stack's remainder (#3179)
1 parent 9ca0a34 commit e011d14

3 files changed

Lines changed: 54 additions & 4 deletions

File tree

patches/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java.patch

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,15 @@
6161
ContainerHelper.saveAllItems(output, this.items);
6262
output.store("RecipesUsed", RECIPES_USED_CODEC, this.recipesUsed);
6363
}
64-
@@ -214,7 +_,7 @@
64+
@@ -212,9 +_,10 @@
65+
66+
private static void consumeFuel(NonNullList<ItemStack> items, ItemStack fuel) {
6567
Item fuelItem = fuel.getItem();
68+
+ // Neo: Query the crafting remainder prior to stack mutation (shrink) in order to grab the correct value
69+
+ ItemStackTemplate remainder = fuel.getCraftingRemainder();
6670
fuel.shrink(1);
6771
if (fuel.isEmpty()) {
6872
- ItemStackTemplate remainder = fuelItem.getCraftingRemainder();
69-
+ ItemStackTemplate remainder = fuel.getCraftingRemainder();
7073
items.set(1, remainder != null ? remainder.create() : ItemStack.EMPTY);
7174
}
7275
}

patches/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java.patch

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@
88
ItemStack ingredient = items.get(3);
99
PotionBrewing potionBrewing = level.potionBrewing();
1010

11-
@@ -181,8 +_,9 @@
11+
@@ -181,8 +_,10 @@
1212
items.set(dest, potionBrewing.mix(ingredient, items.get(dest)));
1313
}
1414

1515
+ net.neoforged.neoforge.event.EventHooks.onPotionBrewed(items);
16+
+ // Neo: Query the crafting remainder prior to stack mutation (shrink) in order to grab the correct value
17+
+ ItemStackTemplate remainder = ingredient.getCraftingRemainder();
1618
ingredient.shrink(1);
1719
- ItemStackTemplate remainder = ingredient.getItem().getCraftingRemainder();
18-
+ ItemStackTemplate remainder = ingredient.getCraftingRemainder();
1920
if (remainder != null) {
2021
if (ingredient.isEmpty()) {
2122
ingredient = remainder.create();
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
* Copyright (c) NeoForged and contributors
3+
* SPDX-License-Identifier: LGPL-2.1-only
4+
*/
5+
6+
package net.neoforged.neoforge.debug.crafting;
7+
8+
import net.minecraft.core.BlockPos;
9+
import net.minecraft.world.item.Item;
10+
import net.minecraft.world.item.ItemStack;
11+
import net.minecraft.world.item.Items;
12+
import net.minecraft.world.level.block.Blocks;
13+
import net.minecraft.world.level.block.entity.FurnaceBlockEntity;
14+
import net.neoforged.testframework.DynamicTest;
15+
import net.neoforged.testframework.annotation.ForEachTest;
16+
import net.neoforged.testframework.annotation.TestHolder;
17+
import net.neoforged.testframework.gametest.EmptyTemplate;
18+
import net.neoforged.testframework.gametest.GameTest;
19+
20+
@ForEachTest(groups = "crafting_remainder_tests")
21+
public interface CraftingRemainderTests {
22+
@GameTest
23+
@EmptyTemplate
24+
@TestHolder(description = "Ensures lava buckets turn into empty buckets when used as fuel", enabledByDefault = true)
25+
static void testLavaBucketToEmptyBucket(DynamicTest test) {
26+
test.onGameTest(helper -> helper.startSequence()
27+
.thenExecute(() -> helper.setBlock(BlockPos.ZERO, Blocks.FURNACE))
28+
.thenMap(() -> helper.getBlockEntity(BlockPos.ZERO, FurnaceBlockEntity.class))
29+
.thenExecute(furnace -> {
30+
furnace.setItem(/* AbstractFurnaceBlockEntity.SLOT_INPUT */ 0, new ItemStack(Items.RAW_IRON, 64));
31+
furnace.setItem(/* AbstractFurnaceBlockEntity.SLOT_FUEL */ 1, new ItemStack(Items.LAVA_BUCKET));
32+
})
33+
.thenIdle(1)
34+
.thenMap(furnace -> furnace.getItem(/* AbstractFurnaceBlockEntity.SLOT_FUEL */ 1))
35+
.thenExecute(fuel -> {
36+
if (!fuel.is(Items.BUCKET)) {
37+
helper.fail("Exepected crafting raminder to be '" + itemName(Items.BUCKET) + "' but found '" + itemName(fuel.getItem()) + "'");
38+
}
39+
})
40+
.thenSucceed());
41+
}
42+
43+
private static String itemName(Item item) {
44+
return item.builtInRegistryHolder().getRegisteredName();
45+
}
46+
}

0 commit comments

Comments
 (0)