diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStepCraft.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStepCraft.java index 768f7fa4c..31371c832 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStepCraft.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStepCraft.java @@ -21,14 +21,6 @@ public class CraftingStepCraft implements ICraftingStep { @Override public boolean execute() { - for (ItemStack toExtractItem : toExtract.getStacks()) { - ItemStack inNetwork = network.extractItem(toExtractItem, toExtractItem.getCount(), true); - - if (inNetwork == null || inNetwork.getCount() < toExtractItem.getCount()) { - return false; - } - } - for (ItemStack toExtractItem : toExtract.getStacks()) { ItemStack extracted = network.extractItem(toExtractItem, toExtractItem.getCount(), false); @@ -48,6 +40,23 @@ public class CraftingStepCraft implements ICraftingStep { return true; } + @Override + public boolean canExecute() { + for (ItemStack toExtractItem : toExtract.getStacks()) { + ItemStack inNetwork = network.extractItem(toExtractItem, toExtractItem.getCount(), true); + + if (inNetwork == null || inNetwork.getCount() < toExtractItem.getCount()) { + return false; + } + } + + return true; + } + + public IStackList getToExtract() { + return toExtract; + } + @Override public ICraftingPattern getPattern() { return pattern; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStepSlot.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStepWrapper.java similarity index 64% rename from src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStepSlot.java rename to src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStepWrapper.java index ef3130137..8fbaa9e3b 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStepSlot.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStepWrapper.java @@ -1,15 +1,19 @@ package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task; -public class CraftingStepSlot { +class CraftingStepWrapper { private ICraftingStep step; - private boolean fulfilled; + private boolean completed; private int ticks = -1; - public CraftingStepSlot(ICraftingStep step) { + CraftingStepWrapper(ICraftingStep step) { this.step = step; } - public boolean canExecute() { + boolean canExecute() { + if (!step.canExecute()) { + return false; + } + ticks++; switch (step.getPattern().getContainer().getSpeedUpdateCount()) { @@ -27,15 +31,15 @@ public class CraftingStepSlot { } } - public ICraftingStep getStep() { + ICraftingStep getStep() { return step; } - public boolean isFulfilled() { - return fulfilled; + boolean isCompleted() { + return completed; } - public void setFulfilled() { - this.fulfilled = true; + void setCompleted() { + this.completed = true; } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java index 99e8983b6..51cea4aad 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java @@ -9,7 +9,10 @@ import com.raoulvdberge.refinedstorage.api.network.INetwork; import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.api.util.IStackList; import com.raoulvdberge.refinedstorage.apiimpl.API; +import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementError; +import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementInfo; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementItemRender; +import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementText; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementItemStack; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -22,7 +25,7 @@ public class CraftingTask implements ICraftingTask { private ItemStack requested; private int quantity; private ICraftingPattern pattern; - private List steps = new LinkedList<>(); + private List steps = new LinkedList<>(); private IStackList toTake = API.instance().createItemStackList(); private IStackList missing = API.instance().createItemStackList(); @@ -43,7 +46,7 @@ public class CraftingTask implements ICraftingTask { IStackList storage = network.getItemStorageCache().getList().copy(); while (qty > 0) { - this.steps.add(new CraftingStepSlot(calculateInternal(storage, results, pattern))); + this.steps.add(new CraftingStepWrapper(calculateInternal(storage, results, pattern))); qty -= getQuantityPerCraft(pattern, requested); } @@ -69,9 +72,11 @@ public class CraftingTask implements ICraftingTask { ItemStack fromSelf = results.get(possibleInput); if (fromSelf != null) { - results.remove(fromSelf, Math.min(possibleInput.getCount(), fromSelf.getCount())); + int toExtractFromSelf = fromSelf.getCount(); - toExtract -= fromSelf.getCount(); + results.remove(fromSelf, Math.min(possibleInput.getCount(), toExtractFromSelf)); + + toExtract -= toExtractFromSelf; } if (toExtract > 0) { @@ -98,7 +103,7 @@ public class CraftingTask implements ICraftingTask { this.toCraft.add(possibleInput, missing); while (missing > 0) { - this.steps.add(new CraftingStepSlot(calculateInternal(mutatedStorage, results, subPattern))); + this.steps.add(new CraftingStepWrapper(calculateInternal(mutatedStorage, results, subPattern))); missing -= getQuantityPerCraft(subPattern, possibleInput); } @@ -144,19 +149,21 @@ public class CraftingTask implements ICraftingTask { @Override public boolean update() { - boolean allFulfilled = true; + boolean allCompleted = true; - for (CraftingStepSlot slot : steps) { - if (!slot.isFulfilled()) { - allFulfilled = false; + for (CraftingStepWrapper step : steps) { + if (!step.isCompleted()) { + allCompleted = false; - if (slot.canExecute() && slot.getStep().execute()) { - slot.setFulfilled(); + if (step.canExecute() && step.getStep().execute()) { + step.setCompleted(); + + network.getCraftingManager().sendCraftingMonitorUpdate(); } } } - return allFulfilled; + return allCompleted; } @Override @@ -181,11 +188,53 @@ public class CraftingTask implements ICraftingTask { @Override public List getCraftingMonitorElements() { - // TODO - ICraftingMonitorElementList elements = API.instance().createCraftingMonitorElementList(); - elements.directAdd(new CraftingMonitorElementItemRender(network.getCraftingManager().getTasks().indexOf(this), requested, quantity, 0)); + elements.directAdd(new CraftingMonitorElementItemRender( + network.getCraftingManager().getTasks().indexOf(this), + requested != null ? requested : pattern.getOutputs().get(0), + quantity, + 0 + )); + + if (!missing.isEmpty()) { + elements.directAdd(new CraftingMonitorElementText("gui.refinedstorage:crafting_monitor.items_missing", 16)); + + missing.getStacks().stream().map(stack -> new CraftingMonitorElementError(new CraftingMonitorElementItemRender( + -1, + stack, + stack.getCount(), + 32 + ), "")).forEach(elements::add); + + elements.commit(); + } + + if (steps.stream().anyMatch(s -> s.getStep() instanceof CraftingStepCraft && !s.isCompleted())) { + elements.directAdd(new CraftingMonitorElementText("gui.refinedstorage:crafting_monitor.items_crafting", 16)); + + for (CraftingStepWrapper step : steps) { + if (step.getStep() instanceof CraftingStepCraft && !step.isCompleted()) { + for (ItemStack stack : ((CraftingStepCraft) step.getStep()).getToExtract().getStacks()) { + ICraftingMonitorElement element = new CraftingMonitorElementItemRender( + -1, + stack, + stack.getCount(), + 32 + ); + + // TODO: cache this + if (!step.getStep().canExecute()) { + element = new CraftingMonitorElementInfo(element, "gui.refinedstorage:crafting_monitor.waiting_for_items"); + } + + elements.add(element); + } + } + } + + elements.commit(); + } return elements.getElements(); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/ICraftingStep.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/ICraftingStep.java index 67e3038f1..81194935a 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/ICraftingStep.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/ICraftingStep.java @@ -5,5 +5,7 @@ import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern; public interface ICraftingStep { boolean execute(); + boolean canExecute(); + ICraftingPattern getPattern(); }