add oredict stuff to Cyclops support, forward port

75e3d69ccf45b0655d929f166e2bd7e21c548d8c
This commit is contained in:
way2muchnoise
2017-02-02 16:57:34 +01:00
parent fcfd1ba819
commit 24f8c88f7e
2 changed files with 52 additions and 27 deletions

View File

@@ -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;
}
}
}

View File

@@ -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<ItemStack> 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);
}
}
}