diff --git a/src/main/java/refinedstorage/api/autocrafting/ICraftingPatternContainer.java b/src/main/java/refinedstorage/api/autocrafting/ICraftingPatternContainer.java index b646679f9..89c77408d 100755 --- a/src/main/java/refinedstorage/api/autocrafting/ICraftingPatternContainer.java +++ b/src/main/java/refinedstorage/api/autocrafting/ICraftingPatternContainer.java @@ -1,5 +1,6 @@ package refinedstorage.api.autocrafting; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraftforge.items.IItemHandler; @@ -21,6 +22,8 @@ public interface ICraftingPatternContainer { */ IItemHandler getFacingInventory(); + TileEntity getFacingTile(); + /** * @return the patterns stored in this container */ diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java index 719290af5..e505f0ca3 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java @@ -164,12 +164,14 @@ public class CraftingTask implements ICraftingTask { } } - for (ItemStack byproduct : (pattern.isOredict() && missing.isEmpty() ? pattern.getByproducts(took) : pattern.getByproducts())) { - toInsert.add(byproduct.copy()); - } + if (!pattern.isProcessing()) { + for (ItemStack byproduct : (pattern.isOredict() && missing.isEmpty() ? pattern.getByproducts(took) : pattern.getByproducts())) { + toInsert.add(byproduct.copy()); + } - for (ItemStack output : (pattern.isOredict() && missing.isEmpty() ? pattern.getOutputs(took) : pattern.getOutputs())) { - toInsert.add(output.copy()); + for (ItemStack output : (pattern.isOredict() && missing.isEmpty() ? pattern.getOutputs(took) : pattern.getOutputs())) { + toInsert.add(output.copy()); + } } usedPatterns.remove(pattern); @@ -232,7 +234,7 @@ public class CraftingTask implements ICraftingTask { for (IProcessable processable : toProcess) { IItemHandler inventory = processable.getPattern().getContainer().getFacingInventory(); - if (inventory != null && !processable.getToInsert().isEmpty()) { + if (inventory != null && !processable.getToInsert().isEmpty() && canProcess(processable)) { ItemStack toInsert = network.extractItem(processable.getToInsert().peek(), 1, DEFAULT_COMPARE | (pattern.isOredict() ? IComparer.COMPARE_OREDICT : 0)); if (ItemHandlerHelper.insertItem(inventory, toInsert, true) == null) { @@ -283,7 +285,7 @@ public class CraftingTask implements ICraftingTask { network.insertItem(insert, insert.stackSize, false); toInsert.pop(); - + network.sendCraftingMonitorUpdate(); } @@ -293,6 +295,35 @@ public class CraftingTask implements ICraftingTask { return false; } + private boolean canProcess(IProcessable processable) { + for (ICraftingTask otherTask : network.getCraftingTasks()) { + for (IProcessable otherProcessable : otherTask.getToProcess()) { + if (otherProcessable != processable) { + if (!isPatternsEqual(processable.getPattern(), otherProcessable.getPattern())) { + if (processable.getPattern().getContainer().getFacingTile().getPos().equals(otherProcessable.getPattern().getContainer().getFacingTile().getPos())) { + return false; + } + } + } + } + } + + return true; + } + + private boolean isPatternsEqual(ICraftingPattern left, ICraftingPattern right) { + for (int i = 0; i < 9; ++i) { + ItemStack leftStack = left.getInputs().get(i); + ItemStack rightStack = right.getInputs().get(i); + + if (!API.instance().getComparer().isEqual(leftStack, rightStack)) { + return false; + } + } + + return true; + } + @Override public int getQuantity() { return quantity; @@ -411,6 +442,10 @@ public class CraftingTask implements ICraftingTask { )); } } + + if (!canProcess(processable)) { + elements.add(new CraftingMonitorElementText("gui.refinedstorage:crafting_monitor.machine_in_use", 32)); + } } } }