diff --git a/src/main/java/refinedstorage/api/autocrafting/ICraftingPattern.java b/src/main/java/refinedstorage/api/autocrafting/ICraftingPattern.java index 06709771e..26809efe1 100755 --- a/src/main/java/refinedstorage/api/autocrafting/ICraftingPattern.java +++ b/src/main/java/refinedstorage/api/autocrafting/ICraftingPattern.java @@ -28,6 +28,11 @@ public interface ICraftingPattern { */ List getInputs(); + /** + * @return true if this crafting pattern cares about the ore dictionary when extracting items, false otherwise + */ + boolean isOredicted(); + /** * @return the outputs */ diff --git a/src/main/java/refinedstorage/api/network/NetworkUtils.java b/src/main/java/refinedstorage/api/network/NetworkUtils.java index e8fc0ecb9..af2885db3 100755 --- a/src/main/java/refinedstorage/api/network/NetworkUtils.java +++ b/src/main/java/refinedstorage/api/network/NetworkUtils.java @@ -6,11 +6,14 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fml.common.network.ByteBufUtils; +import net.minecraftforge.oredict.OreDictionary; import refinedstorage.api.RefinedStorageAPI; import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.autocrafting.task.ICraftingTask; import refinedstorage.api.storage.CompareUtils; +import java.util.List; + /** * Utilities for network manipulation. */ @@ -19,6 +22,29 @@ public final class NetworkUtils { return network.extractItem(stack, size, CompareUtils.COMPARE_DAMAGE | CompareUtils.COMPARE_NBT); } + public static ItemStack extractItemOreDict(INetworkMaster network, ItemStack stack, int size) { + int ids[] = OreDictionary.getOreIDs(stack); + String names[] = new String[ids.length]; + + for (int i = 0; i < ids.length; ++i) { + names[i] = OreDictionary.getOreName(ids[i]); + } + + for (String name : names) { + List possibilities = OreDictionary.getOres(name); + + for (ItemStack possibility : possibilities) { + ItemStack result = network.extractItem(possibility, size, 0); + + if (result != null) { + return result; + } + } + } + + return null; + } + public static FluidStack extractFluid(INetworkMaster network, FluidStack stack, int size) { return network.extractFluid(stack, size, CompareUtils.COMPARE_NBT); } diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingPattern.java b/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingPattern.java index 0a6556b1a..4ce1f07ad 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingPattern.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingPattern.java @@ -83,6 +83,11 @@ public class CraftingPattern implements ICraftingPattern { return inputs; } + @Override + public boolean isOredicted() { + return true; + } + @Override public List getOutputs() { return outputs; diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java index d28b2accf..aff5f67e6 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java @@ -20,7 +20,7 @@ public class CraftingTaskNormal extends CraftingTask { ItemStack input = pattern.getInputs().get(i); if (!satisfied[i]) { - ItemStack received = FluidUtils.extractItemOrIfBucketLookInFluids(network, input, input.stackSize); + ItemStack received = FluidUtils.extractItemOrIfBucketLookInFluids(network, input, input.stackSize, pattern.isOredicted()); if (received != null) { satisfied[i] = true; diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskProcessing.java b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskProcessing.java index 6f9a5c712..2f297a324 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskProcessing.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskProcessing.java @@ -34,7 +34,7 @@ public class CraftingTaskProcessing extends CraftingTask { ItemStack input = pattern.getInputs().get(i); if (!satisfied[i]) { - ItemStack received = FluidUtils.extractItemOrIfBucketLookInFluids(network, input, input.stackSize); + ItemStack received = FluidUtils.extractItemOrIfBucketLookInFluids(network, input, input.stackSize, pattern.isOredicted()); if (received != null) { satisfied[i] = true; diff --git a/src/main/java/refinedstorage/apiimpl/storage/fluid/FluidUtils.java b/src/main/java/refinedstorage/apiimpl/storage/fluid/FluidUtils.java index ac2f73356..3d300278a 100755 --- a/src/main/java/refinedstorage/apiimpl/storage/fluid/FluidUtils.java +++ b/src/main/java/refinedstorage/apiimpl/storage/fluid/FluidUtils.java @@ -39,8 +39,8 @@ public final class FluidUtils { return stack.getFluid() == FluidRegistry.WATER || stack.getFluid() == FluidRegistry.LAVA || FluidRegistry.getBucketFluids().contains(stack.getFluid()); } - public static ItemStack extractItemOrIfBucketLookInFluids(INetworkMaster network, ItemStack stack, int size) { - ItemStack result = NetworkUtils.extractItem(network, stack, size); + public static ItemStack extractItemOrIfBucketLookInFluids(INetworkMaster network, ItemStack stack, int size, boolean oredict) { + ItemStack result = oredict ? NetworkUtils.extractItemOreDict(network, stack, size) : NetworkUtils.extractItem(network, stack, size); if (result == null && stack.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, null)) { FluidStack fluidStack = getFluidFromStack(stack, true);