diff --git a/src/main/java/refinedstorage/api/autocrafting/task/IProcessable.java b/src/main/java/refinedstorage/api/autocrafting/task/IProcessable.java index d556973cd..756bb9ebd 100755 --- a/src/main/java/refinedstorage/api/autocrafting/task/IProcessable.java +++ b/src/main/java/refinedstorage/api/autocrafting/task/IProcessable.java @@ -3,6 +3,7 @@ package refinedstorage.api.autocrafting.task; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import refinedstorage.api.autocrafting.ICraftingPattern; +import refinedstorage.api.util.IItemStackList; import java.util.Deque; @@ -18,7 +19,15 @@ public interface IProcessable { /** * @return the stacks to insert */ - Deque getToInsert(); + IItemStackList getToInsert(); + + /** + * Check if the processing can start + * + * @param list a list to compare the need inputs against + * @return true if processing can start + */ + boolean canStartProcessing(IItemStackList list); void setStartedProcessing(); diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java index 8abaecf89..fdf165938 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java @@ -236,33 +236,33 @@ public class CraftingTask implements ICraftingTask { for (IProcessable processable : toProcess) { IItemHandler inventory = processable.getPattern().getContainer().getFacingInventory(); - if (inventory != null && !processable.getToInsert().isEmpty() && canProcess(processable)) { + if (!processable.isStartedProcessing() && inventory != null && processable.canStartProcessing(network.getItemStorageCache().getList()) && canProcess(processable)) { processable.setStartedProcessing(); - ItemStack toInsert = network.extractItem(processable.getToInsert().peek(), 1, DEFAULT_COMPARE | (pattern.isOredict() ? IComparer.COMPARE_OREDICT : 0)); + for (ItemStack insertStack : processable.getToInsert().getStacks()) { + ItemStack toInsert = network.extractItem(insertStack, insertStack.stackSize, DEFAULT_COMPARE | (processable.getPattern().isOredict() ? IComparer.COMPARE_OREDICT : 0)); - if (ItemHandlerHelper.insertItem(inventory, toInsert, true) == null) { - ItemHandlerHelper.insertItem(inventory, toInsert, false); + if (ItemHandlerHelper.insertItem(inventory, toInsert, true) == null) { + ItemHandlerHelper.insertItem(inventory, toInsert, false); - processable.getToInsert().pop(); - - network.sendCraftingMonitorUpdate(); + network.sendCraftingMonitorUpdate(); + } } } } for (ItemStack stack : toTake.getStacks()) { - ItemStack stackExtracted = network.extractItem(stack, 1); + ItemStack stackExtracted = network.extractItem(stack, Math.min(stack.stackSize, 64)); if (stackExtracted != null) { - toTake.remove(stack, 1, true); + toTake.remove(stack, stackExtracted.stackSize, true); took.add(stackExtracted); network.sendCraftingMonitorUpdate(); - } - break; + break; + } } // If we took all the items, we can start taking fluids @@ -276,9 +276,9 @@ public class CraftingTask implements ICraftingTask { tookFluids.add(stackExtracted); network.sendCraftingMonitorUpdate(); - } - break; + break; + } } } diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/task/Processable.java b/src/main/java/refinedstorage/apiimpl/autocrafting/task/Processable.java index d24918260..175988921 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/task/Processable.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/task/Processable.java @@ -2,23 +2,20 @@ package refinedstorage.apiimpl.autocrafting.task; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; import net.minecraftforge.common.util.Constants; +import refinedstorage.RSUtils; import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.autocrafting.task.IProcessable; +import refinedstorage.api.util.IComparer; +import refinedstorage.api.util.IItemStackList; import refinedstorage.apiimpl.API; -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.Deque; -import java.util.List; - public class Processable implements IProcessable { private static final String NBT_SATISFIED = "Satisfied_%d"; private static final String NBT_TO_INSERT = "ToInsert"; private ICraftingPattern pattern; - private Deque toInsert = new ArrayDeque<>(); + private IItemStackList toInsert = API.instance().createItemStackList(); private boolean satisfied[]; private boolean startedProcessing; @@ -45,19 +42,7 @@ public class Processable implements IProcessable { } } - NBTTagList toInsertList = tag.getTagList(NBT_TO_INSERT, Constants.NBT.TAG_COMPOUND); - - List toInsert = new ArrayList<>(); - - for (int i = 0; i < toInsertList.tagCount(); ++i) { - ItemStack stack = ItemStack.loadItemStackFromNBT(toInsertList.getCompoundTagAt(i)); - - if (stack != null) { - toInsert.add(stack); - } - } - - this.toInsert = new ArrayDeque<>(toInsert); + this.toInsert = RSUtils.readItemStackList(tag.getTagList(NBT_TO_INSERT, Constants.NBT.TAG_COMPOUND)); } @Override @@ -66,10 +51,22 @@ public class Processable implements IProcessable { } @Override - public Deque getToInsert() { + public IItemStackList getToInsert() { return toInsert; } + @Override + public boolean canStartProcessing(IItemStackList list) { + list = list.copy(); // So we can edit the list + for (ItemStack stack : toInsert.getStacks()) { + ItemStack actualStack = list.get(stack, IComparer.COMPARE_DAMAGE | IComparer.COMPARE_NBT | (pattern.isOredict() ? IComparer.COMPARE_OREDICT : 0)); + if (actualStack == null || actualStack.stackSize == 0 || !list.remove(actualStack, true)) { + return false; + } + } + return true; + } + @Override public void setStartedProcessing() { startedProcessing = true; @@ -119,13 +116,7 @@ public class Processable implements IProcessable { tag.setBoolean(String.format(NBT_SATISFIED, i), satisfied[i]); } - NBTTagList toInsertList = new NBTTagList(); - - for (ItemStack stack : new ArrayList<>(toInsert)) { - toInsertList.appendTag(stack.serializeNBT()); - } - - tag.setTag(NBT_TO_INSERT, toInsertList); + tag.setTag(NBT_TO_INSERT, RSUtils.serializeItemStackList(toInsert)); return tag; }