From 24f8c88f7e905f228176910d55a003a8f9d23b80 Mon Sep 17 00:00:00 2001 From: way2muchnoise Date: Thu, 2 Feb 2017 16:57:34 +0100 Subject: [PATCH] add oredict stuff to Cyclops support, forward port 75e3d69ccf45b0655d929f166e2bd7e21c548d8c --- .../cyclopscore/CyclopsComparer.java | 28 +++++----- .../SlotlessItemHandlerHelper.java | 51 ++++++++++++++----- 2 files changed, 52 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/integration/cyclopscore/CyclopsComparer.java b/src/main/java/com/raoulvdberge/refinedstorage/integration/cyclopscore/CyclopsComparer.java index d356570b4..90be857f0 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/integration/cyclopscore/CyclopsComparer.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/integration/cyclopscore/CyclopsComparer.java @@ -3,40 +3,38 @@ package com.raoulvdberge.refinedstorage.integration.cyclopscore; import com.raoulvdberge.refinedstorage.api.util.IComparer; import org.cyclops.commoncapabilities.api.capability.itemhandler.ItemMatch; -public final class CyclopsComparer { +public class CyclopsComparer { public static int comparerFlagsToItemMatch(int flags) { + return comparerFlagsToItemMatch(flags, false); + } + + public static int comparerFlagsToItemMatch(int flags, boolean oredictWildcard) { int itemMatch = 0; - - if ((flags & IComparer.COMPARE_DAMAGE) == IComparer.COMPARE_DAMAGE) { - itemMatch |= ItemMatch.DAMAGE; + if (!oredictWildcard) { + if ((flags & IComparer.COMPARE_DAMAGE) == IComparer.COMPARE_DAMAGE) { + itemMatch |= ItemMatch.DAMAGE; + } + if ((flags & IComparer.COMPARE_NBT) == IComparer.COMPARE_NBT) { + itemMatch |= ItemMatch.NBT; + } } - - if ((flags & IComparer.COMPARE_NBT) == IComparer.COMPARE_NBT) { - itemMatch |= ItemMatch.NBT; - } - if ((flags & IComparer.COMPARE_QUANTITY) == IComparer.COMPARE_QUANTITY) { itemMatch |= ItemMatch.STACKSIZE; } - return itemMatch; } public static int itemMatchToComparerFlags(int itemMatch) { int flags = 0; - if ((itemMatch & ItemMatch.DAMAGE) == ItemMatch.DAMAGE) { flags |= IComparer.COMPARE_DAMAGE; } - if ((itemMatch & ItemMatch.NBT) == ItemMatch.NBT) { flags |= IComparer.COMPARE_NBT; } - if ((itemMatch & ItemMatch.STACKSIZE) == ItemMatch.STACKSIZE) { flags |= IComparer.COMPARE_QUANTITY; } - return flags; } -} +} \ No newline at end of file diff --git a/src/main/java/com/raoulvdberge/refinedstorage/integration/cyclopscore/SlotlessItemHandlerHelper.java b/src/main/java/com/raoulvdberge/refinedstorage/integration/cyclopscore/SlotlessItemHandlerHelper.java index bf7b6c01c..3e3b82c24 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/integration/cyclopscore/SlotlessItemHandlerHelper.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/integration/cyclopscore/SlotlessItemHandlerHelper.java @@ -1,14 +1,18 @@ package com.raoulvdberge.refinedstorage.integration.cyclopscore; import com.raoulvdberge.refinedstorage.api.util.IComparer; +import com.raoulvdberge.refinedstorage.apiimpl.util.Comparer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraftforge.items.ItemHandlerHelper; +import net.minecraftforge.oredict.OreDictionary; import org.cyclops.commoncapabilities.api.capability.itemhandler.ISlotlessItemHandler; +import org.cyclops.commoncapabilities.api.capability.itemhandler.ItemMatch; import org.cyclops.commoncapabilities.capability.itemhandler.SlotlessItemHandlerConfig; import javax.annotation.Nonnull; +import java.util.Iterator; public class SlotlessItemHandlerHelper { public static boolean isSlotless(TileEntity entity, EnumFacing facing) { @@ -31,8 +35,9 @@ public class SlotlessItemHandlerHelper { ItemStack remainder = handler.insertItem(ItemHandlerHelper.copyStackWithSize(stack, size), simulate); int remainderCount = -1; - while (!remainder.isEmpty() && remainder.getCount() != remainderCount) { + while (remainder.isEmpty() && remainder.getCount() != remainderCount) { remainderCount = remainder.getCount(); + remainder = handler.insertItem(remainder.copy(), simulate); } @@ -52,16 +57,38 @@ public class SlotlessItemHandlerHelper { } public static ItemStack extractItem(ISlotlessItemHandler handler, @Nonnull ItemStack stack, int size, int flags, boolean simulate) { - ItemStack extracted = handler.extractItem(ItemHandlerHelper.copyStackWithSize(stack, size), CyclopsComparer.comparerFlagsToItemMatch(flags), simulate); + int compare = CyclopsComparer.comparerFlagsToItemMatch(flags, stack.getMetadata() == OreDictionary.WILDCARD_VALUE); + stack = ItemHandlerHelper.copyStackWithSize(stack, size); + if ((flags & IComparer.COMPARE_STRIP_NBT) == IComparer.COMPARE_STRIP_NBT) { + stack = Comparer.stripTags(stack); + } + ItemStack extracted = handler.extractItem(stack, compare, simulate); - while (!extracted.isEmpty() && extracted.getCount() < size) { - ItemStack extraExtract = handler.extractItem(ItemHandlerHelper.copyStackWithSize(extracted, size - extracted.getCount()), CyclopsComparer.comparerFlagsToItemMatch(flags), simulate); + if (extracted.isEmpty() && (flags & IComparer.COMPARE_OREDICT) == IComparer.COMPARE_OREDICT) { + for (int id : OreDictionary.getOreIDs(stack)) { + Iterator itr = OreDictionary.getOres(OreDictionary.getOreName(id)).iterator(); + while (itr.hasNext() && extracted.isEmpty()) { + ItemStack oreStack = itr.next(); + int oreCompare = ItemMatch.NBT | (oreStack.getMetadata() == OreDictionary.WILDCARD_VALUE ? 0 : ItemMatch.DAMAGE); + extracted = handler.extractItem(oreStack, oreCompare, simulate); + } + if (extracted.isEmpty()) { + // We found one. Woooo! + break; + } + } + } - if (!extraExtract.isEmpty()) { - extracted.grow(extraExtract.getCount()); - } else { - // Nothing more to extract - break; + if (extracted.isEmpty()) { + while (extracted.getCount() < size) { + ItemStack extraExtract = handler.extractItem(ItemHandlerHelper.copyStackWithSize(extracted, size - extracted.getCount()), compare, simulate); + + if (extraExtract.isEmpty()) { + extracted.grow(extraExtract.getCount()); + } else { + // Nothing more to extract + break; + } } } @@ -72,7 +99,7 @@ public class SlotlessItemHandlerHelper { return extractItem(getSlotlessHandler(tile, facing), size, simulate); } - public static ItemStack extractItem(ISlotlessItemHandler handler, int size, boolean simulate) { - return handler.extractItem(size, simulate); + public static ItemStack extractItem(ISlotlessItemHandler slotlessItemHandler, int size, boolean simulate) { + return slotlessItemHandler.extractItem(size, simulate); } -} +} \ No newline at end of file