Skip to content

Commit

Permalink
add hashable itemstaskkey
Browse files Browse the repository at this point in the history
  • Loading branch information
slprime committed Dec 31, 2024
1 parent 8581394 commit d9a7beb
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 5 deletions.
12 changes: 7 additions & 5 deletions src/main/java/codechicken/nei/recipe/StackInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,20 @@
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 {

private static final FluidStack NULL_FLUID = new FluidStack(FluidRegistry.WATER, 0);
public static final ArrayList<IStackStringifyHandler> stackStringifyHandlers = new ArrayList<>();
private static final HashMap<String, HashMap<String, String[]>> guidfilters = new HashMap<>();
private static final ItemStackMap<String> guidcache = new ItemStackMap<>();
private static final LinkedHashMap<ItemStack, FluidStack> fluidcache = new LinkedHashMap<>() {
private static final LinkedHashMap<ItemStackKey, FluidStack> fluidcache = new LinkedHashMap<>() {

private static final long serialVersionUID = 1042213947848622164L;

@Override
protected boolean removeEldestEntry(Map.Entry<ItemStack, FluidStack> eldest) {
protected boolean removeEldestEntry(Map.Entry<ItemStackKey, FluidStack> eldest) {
return size() > 200;
}
};
Expand Down Expand Up @@ -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;
Expand Down
33 changes: 33 additions & 0 deletions src/main/java/codechicken/nei/util/ItemStackKey.java
Original file line number Diff line number Diff line change
@@ -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);
}
}

0 comments on commit d9a7beb

Please sign in to comment.