From d9a7beb43cf03f6b4ce48d368816d687a5cc1c1c Mon Sep 17 00:00:00 2001 From: slprime Date: Tue, 31 Dec 2024 20:00:01 +0200 Subject: [PATCH] add hashable itemstaskkey --- .../codechicken/nei/recipe/StackInfo.java | 12 ++++--- .../codechicken/nei/util/ItemStackKey.java | 33 +++++++++++++++++++ 2 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 src/main/java/codechicken/nei/util/ItemStackKey.java diff --git a/src/main/java/codechicken/nei/recipe/StackInfo.java b/src/main/java/codechicken/nei/recipe/StackInfo.java index 9856010e7..612be8ec5 100644 --- a/src/main/java/codechicken/nei/recipe/StackInfo.java +++ b/src/main/java/codechicken/nei/recipe/StackInfo.java @@ -19,6 +19,7 @@ import codechicken.nei.api.IStackStringifyHandler; import codechicken.nei.recipe.stackinfo.DefaultStackStringifyHandler; import codechicken.nei.recipe.stackinfo.GTFluidStackStringifyHandler; +import codechicken.nei.util.ItemStackKey; public class StackInfo { @@ -26,12 +27,12 @@ public class StackInfo { public static final ArrayList stackStringifyHandlers = new ArrayList<>(); private static final HashMap> guidfilters = new HashMap<>(); private static final ItemStackMap guidcache = new ItemStackMap<>(); - private static final LinkedHashMap fluidcache = new LinkedHashMap<>() { + private static final LinkedHashMap fluidcache = new LinkedHashMap<>() { private static final long serialVersionUID = 1042213947848622164L; @Override - protected boolean removeEldestEntry(Map.Entry eldest) { + protected boolean removeEldestEntry(Map.Entry eldest) { return size() > 200; } }; @@ -95,15 +96,16 @@ public static boolean equalItemAndNBT(ItemStack stackA, ItemStack stackB, boolea } public static synchronized FluidStack getFluid(ItemStack stack) { - FluidStack fluid = fluidcache.get(stack); + ItemStackKey key = new ItemStackKey(stack); + FluidStack fluid = fluidcache.get(key); - if (fluid == null && !fluidcache.containsKey(stack)) { + if (fluid == null) { for (int i = stackStringifyHandlers.size() - 1; i >= 0 && fluid == null; i--) { fluid = stackStringifyHandlers.get(i).getFluid(stack); } - fluidcache.put(stack, fluid == null ? NULL_FLUID : fluid); + fluidcache.put(key, fluid == null ? NULL_FLUID : fluid); } return fluid == NULL_FLUID ? null : fluid; diff --git a/src/main/java/codechicken/nei/util/ItemStackKey.java b/src/main/java/codechicken/nei/util/ItemStackKey.java new file mode 100644 index 000000000..e695aefd4 --- /dev/null +++ b/src/main/java/codechicken/nei/util/ItemStackKey.java @@ -0,0 +1,33 @@ +package codechicken.nei.util; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +public class ItemStackKey { + + public final ItemStack stack; + private int hashCode = 1; + + public ItemStackKey(ItemStack stack) { + this.stack = stack; + + if (this.stack != null) { + this.hashCode = 31 * this.hashCode + stack.stackSize; + this.hashCode = 31 * this.hashCode + Item.getIdFromItem(stack.getItem()); + this.hashCode = 31 * this.hashCode + stack.getItemDamage(); + this.hashCode = 31 * this.hashCode + (!stack.hasTagCompound() ? 0 : stack.getTagCompound().hashCode()); + } + } + + @Override + public int hashCode() { + return this.hashCode; + } + + @Override + public boolean equals(Object o) { + if (o == this) return true; + if (!(o instanceof ItemStackKey)) return false; + return ItemStack.areItemStacksEqual(this.stack, ((ItemStackKey) o).stack); + } +}