From a84a774d932957f6973080ee7b52508547b9edc9 Mon Sep 17 00:00:00 2001 From: jchung01 Date: Wed, 1 Apr 2026 17:50:17 -0700 Subject: [PATCH 1/4] Fix ore-dict based matching in PartyInventory --- .../questing/party/PartyInventory.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/betterquesting/questing/party/PartyInventory.java b/src/main/java/betterquesting/questing/party/PartyInventory.java index f15fd81d8..13bcd97d3 100644 --- a/src/main/java/betterquesting/questing/party/PartyInventory.java +++ b/src/main/java/betterquesting/questing/party/PartyInventory.java @@ -100,8 +100,18 @@ public PartyInventory(EntityPlayer mainPlayer, List party) { public ItemMatchContext getItemCountFor(BigItemStack req, boolean taskConsumes, boolean ignoreNBT, boolean partialMatch) { var gatheredStacks = taskConsumes ? playerStacks : partyStacks; - // The stacks matched by Item - var subStacks = gatheredStacks.get(req.getHashKey()); + List subStacks = null; + if (req.hasOreDict()) { + // Stacks matched by any ore-dict item + for (ItemStack oreStack : req.getOreIngredient().getMatchingStacks()) { + int itemHash = BigItemStack.getHashKey(oreStack); + subStacks = gatheredStacks.get(itemHash); + if (subStacks != null) break; + } + } else { + // Stacks matched by base item + subStacks = gatheredStacks.get(req.getHashKey()); + } if (subStacks == null || subStacks.isEmpty()) { return ItemMatchContext.EMPTY; } From 784a16fed17386448ac6855f980131f9e80d460f Mon Sep 17 00:00:00 2001 From: jchung01 Date: Wed, 1 Apr 2026 18:22:18 -0700 Subject: [PATCH 2/4] Use standard packed ids from RecipeItemHelper --- .../betterquesting/api/utils/BigItemStack.java | 18 +++++------------- .../questing/party/PartyInventory.java | 18 ++++++++++++------ 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/main/java/betterquesting/api/utils/BigItemStack.java b/src/main/java/betterquesting/api/utils/BigItemStack.java index d3e08018a..e5f9b9c3b 100644 --- a/src/main/java/betterquesting/api/utils/BigItemStack.java +++ b/src/main/java/betterquesting/api/utils/BigItemStack.java @@ -2,10 +2,10 @@ import betterquesting.NBTUtil; import net.minecraft.block.Block; +import net.minecraft.client.util.RecipeItemHelper; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.ResourceLocation; import net.minecraft.util.StringUtils; import net.minecraftforge.oredict.OreDictionary; import net.minecraftforge.oredict.OreIngredient; @@ -36,7 +36,7 @@ public BigItemStack(ItemStack stack) { baseStack = stack.copy(); this.stackSize = baseStack.getCount(); baseStack.setCount(1); - this.hashKey = getHashKey(baseStack); + this.hashKey = RecipeItemHelper.pack(baseStack); } public BigItemStack(@Nonnull Block block) { @@ -62,15 +62,7 @@ public BigItemStack(@Nonnull Item item, int amount) { public BigItemStack(@Nonnull Item item, int amount, int damage) { baseStack = new ItemStack(item, 1, damage); this.stackSize = amount; - this.hashKey = getHashKey(baseStack); - } - - public static int getHashKey(ItemStack stack) { - ResourceLocation registryName = stack.getItem().getRegistryName(); - if (registryName == null) { - return 0; - } - return registryName.hashCode(); + this.hashKey = RecipeItemHelper.pack(baseStack); } /** @@ -81,7 +73,7 @@ public ItemStack getBaseStack() { } /** - * @see BigItemStack#getHashKey(ItemStack) + * @see RecipeItemHelper#pack(ItemStack) * @return the hash key to use for this BigItemStack to compare with other stacks */ public int getHashKey() { @@ -175,7 +167,7 @@ public BigItemStack(@Nonnull NBTTagCompound tags) // Can load normal ItemStack N this.setOreDict(tags.getString("OreDict")); this.baseStack = new ItemStack(itemNBT); // Minecraft does the ID conversions for me if (tags.getShort("Damage") < 0) this.baseStack.setItemDamage(OreDictionary.WILDCARD_VALUE); - this.hashKey = getHashKey(baseStack); + this.hashKey = RecipeItemHelper.pack(baseStack); } @Deprecated diff --git a/src/main/java/betterquesting/questing/party/PartyInventory.java b/src/main/java/betterquesting/questing/party/PartyInventory.java index 13bcd97d3..5dde5feef 100644 --- a/src/main/java/betterquesting/questing/party/PartyInventory.java +++ b/src/main/java/betterquesting/questing/party/PartyInventory.java @@ -5,6 +5,9 @@ import com.github.bsideup.jabel.Desugar; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.ints.IntList; + +import net.minecraft.client.util.RecipeItemHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; @@ -24,9 +27,9 @@ * A snapshot of a party's inventories, accumulating counts of all item stacks. */ public class PartyInventory { - /** The main player's collected inventory, keys are item ids. */ + /** The main player's collected inventory, keys are stacks packed by {@link RecipeItemHelper#pack(ItemStack)}. */ private final Int2ObjectMap> playerStacks; - /** The collapsed inventory of all party members, keys are item ids. */ + /** The collapsed inventory of all party members, keys are stacks packed by {@link RecipeItemHelper#pack(ItemStack)}. */ private final Int2ObjectMap> partyStacks; /** The main player's collected fluid containers. */ private final List playerFluidContainers; @@ -61,7 +64,7 @@ public PartyInventory(EntityPlayer mainPlayer, List party) { indexedFluidContainer = null; } - int itemHash = BigItemStack.getHashKey(stack); + int itemHash = RecipeItemHelper.pack(stack); if (player == mainPlayer) { var subStacks = playerStacks.get(itemHash); if (subStacks == null) { @@ -103,9 +106,12 @@ public ItemMatchContext getItemCountFor(BigItemStack req, boolean taskConsumes, List subStacks = null; if (req.hasOreDict()) { // Stacks matched by any ore-dict item - for (ItemStack oreStack : req.getOreIngredient().getMatchingStacks()) { - int itemHash = BigItemStack.getHashKey(oreStack); - subStacks = gatheredStacks.get(itemHash); + IntList oreHashes = req.getOreIngredient().getValidItemStacksPacked(); + + // for-each causes autoboxing, suppress + //noinspection ForLoopReplaceableByForEach + for (int i = 0; i < oreHashes.size(); i++) { + subStacks = gatheredStacks.get(oreHashes.get(i)); if (subStacks != null) break; } } else { From 70090d3fa9fc80f86121adf2e324d460ad02d136 Mon Sep 17 00:00:00 2001 From: jchung01 Date: Wed, 1 Apr 2026 18:36:16 -0700 Subject: [PATCH 3/4] Revert "Use standard packed ids from RecipeItemHelper" - Packed ids can't handle wildcard meta This reverts commit 784a16fed17386448ac6855f980131f9e80d460f. --- .../betterquesting/api/utils/BigItemStack.java | 18 +++++++++++++----- .../questing/party/PartyInventory.java | 18 ++++++------------ 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/main/java/betterquesting/api/utils/BigItemStack.java b/src/main/java/betterquesting/api/utils/BigItemStack.java index e5f9b9c3b..d3e08018a 100644 --- a/src/main/java/betterquesting/api/utils/BigItemStack.java +++ b/src/main/java/betterquesting/api/utils/BigItemStack.java @@ -2,10 +2,10 @@ import betterquesting.NBTUtil; import net.minecraft.block.Block; -import net.minecraft.client.util.RecipeItemHelper; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.StringUtils; import net.minecraftforge.oredict.OreDictionary; import net.minecraftforge.oredict.OreIngredient; @@ -36,7 +36,7 @@ public BigItemStack(ItemStack stack) { baseStack = stack.copy(); this.stackSize = baseStack.getCount(); baseStack.setCount(1); - this.hashKey = RecipeItemHelper.pack(baseStack); + this.hashKey = getHashKey(baseStack); } public BigItemStack(@Nonnull Block block) { @@ -62,7 +62,15 @@ public BigItemStack(@Nonnull Item item, int amount) { public BigItemStack(@Nonnull Item item, int amount, int damage) { baseStack = new ItemStack(item, 1, damage); this.stackSize = amount; - this.hashKey = RecipeItemHelper.pack(baseStack); + this.hashKey = getHashKey(baseStack); + } + + public static int getHashKey(ItemStack stack) { + ResourceLocation registryName = stack.getItem().getRegistryName(); + if (registryName == null) { + return 0; + } + return registryName.hashCode(); } /** @@ -73,7 +81,7 @@ public ItemStack getBaseStack() { } /** - * @see RecipeItemHelper#pack(ItemStack) + * @see BigItemStack#getHashKey(ItemStack) * @return the hash key to use for this BigItemStack to compare with other stacks */ public int getHashKey() { @@ -167,7 +175,7 @@ public BigItemStack(@Nonnull NBTTagCompound tags) // Can load normal ItemStack N this.setOreDict(tags.getString("OreDict")); this.baseStack = new ItemStack(itemNBT); // Minecraft does the ID conversions for me if (tags.getShort("Damage") < 0) this.baseStack.setItemDamage(OreDictionary.WILDCARD_VALUE); - this.hashKey = RecipeItemHelper.pack(baseStack); + this.hashKey = getHashKey(baseStack); } @Deprecated diff --git a/src/main/java/betterquesting/questing/party/PartyInventory.java b/src/main/java/betterquesting/questing/party/PartyInventory.java index 5dde5feef..13bcd97d3 100644 --- a/src/main/java/betterquesting/questing/party/PartyInventory.java +++ b/src/main/java/betterquesting/questing/party/PartyInventory.java @@ -5,9 +5,6 @@ import com.github.bsideup.jabel.Desugar; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import it.unimi.dsi.fastutil.ints.IntList; - -import net.minecraft.client.util.RecipeItemHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; @@ -27,9 +24,9 @@ * A snapshot of a party's inventories, accumulating counts of all item stacks. */ public class PartyInventory { - /** The main player's collected inventory, keys are stacks packed by {@link RecipeItemHelper#pack(ItemStack)}. */ + /** The main player's collected inventory, keys are item ids. */ private final Int2ObjectMap> playerStacks; - /** The collapsed inventory of all party members, keys are stacks packed by {@link RecipeItemHelper#pack(ItemStack)}. */ + /** The collapsed inventory of all party members, keys are item ids. */ private final Int2ObjectMap> partyStacks; /** The main player's collected fluid containers. */ private final List playerFluidContainers; @@ -64,7 +61,7 @@ public PartyInventory(EntityPlayer mainPlayer, List party) { indexedFluidContainer = null; } - int itemHash = RecipeItemHelper.pack(stack); + int itemHash = BigItemStack.getHashKey(stack); if (player == mainPlayer) { var subStacks = playerStacks.get(itemHash); if (subStacks == null) { @@ -106,12 +103,9 @@ public ItemMatchContext getItemCountFor(BigItemStack req, boolean taskConsumes, List subStacks = null; if (req.hasOreDict()) { // Stacks matched by any ore-dict item - IntList oreHashes = req.getOreIngredient().getValidItemStacksPacked(); - - // for-each causes autoboxing, suppress - //noinspection ForLoopReplaceableByForEach - for (int i = 0; i < oreHashes.size(); i++) { - subStacks = gatheredStacks.get(oreHashes.get(i)); + for (ItemStack oreStack : req.getOreIngredient().getMatchingStacks()) { + int itemHash = BigItemStack.getHashKey(oreStack); + subStacks = gatheredStacks.get(itemHash); if (subStacks != null) break; } } else { From bfcc24d6f26a3ef0d17f5209c7dcd6c4c94f47a7 Mon Sep 17 00:00:00 2001 From: jchung01 Date: Wed, 1 Apr 2026 19:43:45 -0700 Subject: [PATCH 4/4] Collect substacks over all matching ore stacks --- .../questing/party/PartyInventory.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/betterquesting/questing/party/PartyInventory.java b/src/main/java/betterquesting/questing/party/PartyInventory.java index 13bcd97d3..809dcf461 100644 --- a/src/main/java/betterquesting/questing/party/PartyInventory.java +++ b/src/main/java/betterquesting/questing/party/PartyInventory.java @@ -5,6 +5,8 @@ import com.github.bsideup.jabel.Desugar; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.ints.IntOpenHashSet; + import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; @@ -100,13 +102,19 @@ public PartyInventory(EntityPlayer mainPlayer, List party) { public ItemMatchContext getItemCountFor(BigItemStack req, boolean taskConsumes, boolean ignoreNBT, boolean partialMatch) { var gatheredStacks = taskConsumes ? playerStacks : partyStacks; - List subStacks = null; + List subStacks; if (req.hasOreDict()) { // Stacks matched by any ore-dict item + subStacks = new ArrayList<>(); + var checkedHashes = new IntOpenHashSet(); for (ItemStack oreStack : req.getOreIngredient().getMatchingStacks()) { int itemHash = BigItemStack.getHashKey(oreStack); - subStacks = gatheredStacks.get(itemHash); - if (subStacks != null) break; + if (checkedHashes.add(itemHash)) { + var matchedSubStacks = gatheredStacks.get(itemHash); + if (matchedSubStacks != null) { + subStacks.addAll(matchedSubStacks); + } + } } } else { // Stacks matched by base item