diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingManager.java b/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingManager.java index 6c4f7cdb4..87f5ffaa0 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingManager.java @@ -100,7 +100,7 @@ public interface ICraftingManager { /** * Makes the network send a crafting monitor update to all players as soon as it can. */ - // TODO: rework system to be subscribed-based, per task + // TODO: rework system to be subscribed-based void markCraftingMonitorForUpdate(); /** @@ -108,7 +108,7 @@ public interface ICraftingManager { *
* WARNING: In most cases, you should just use {@link ICraftingManager#markCraftingMonitorForUpdate()}, if not, you can get high bandwidth usage.
*/
- // TODO: rework system to be subscribed-based, per task
+ // TODO: rework system to be subscribed-based
void sendCraftingMonitorUpdate();
/**
@@ -116,6 +116,6 @@ public interface ICraftingManager {
*
* @param player the player
*/
- // TODO: rework system to be subscribed-based, per task
+ // TODO: rework system to be subscribed-based
void sendCraftingMonitorUpdate(EntityPlayerMP player);
}
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingPatternContainer.java b/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingPatternContainer.java
index 42b328bc7..50635b604 100755
--- a/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingPatternContainer.java
+++ b/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingPatternContainer.java
@@ -20,13 +20,15 @@ public interface ICraftingPatternContainer {
int getSpeedUpgradeCount();
/**
- * @return the inventory that this container is connected to
+ * @return the inventory that this container is connected to, or null if no inventory is present
*/
+ @Nullable
IItemHandler getConnectedInventory();
/**
- * @return the tile that this container is connected to
+ * @return the tile that this container is connected to, or null if no tile is present
*/
+ @Nullable
TileEntity getConnectedTile();
/**
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/task/ICraftingTask.java b/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/task/ICraftingTask.java
index 14ac6c642..dbf61fd41 100755
--- a/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/task/ICraftingTask.java
+++ b/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/task/ICraftingTask.java
@@ -41,6 +41,14 @@ public interface ICraftingTask {
*/
ItemStack getRequested();
+ /**
+ * Called when a stack is inserted into the system through {@link com.raoulvdberge.refinedstorage.api.network.INetwork#insertItemTracked(ItemStack, int)}.
+ *
+ * @param stack the stack
+ * @return the size remaining, decremented by the crafting task when it was relevant to it
+ */
+ int onTrackedItemInserted(ItemStack stack, int size);
+
/**
* Writes this task to NBT.
*
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingManager.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingManager.java
index 0163259b5..45cb06ad1 100644
--- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingManager.java
+++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingManager.java
@@ -148,7 +148,13 @@ public class CraftingManager implements ICraftingManager {
@Override
public void track(ItemStack stack, int size) {
- // TODO
+ for (ICraftingTask task : tasks) {
+ size = task.onTrackedItemInserted(stack, size);
+
+ if (size == 0) {
+ return;
+ }
+ }
}
@Override
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingExtractor.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingExtractor.java
index 279c2463d..f874eaaf6 100644
--- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingExtractor.java
+++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingExtractor.java
@@ -2,7 +2,10 @@ package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task;
import com.raoulvdberge.refinedstorage.api.network.INetwork;
import net.minecraft.item.ItemStack;
+import net.minecraftforge.items.IItemHandler;
+import net.minecraftforge.items.ItemHandlerHelper;
+import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
@@ -28,6 +31,7 @@ public class CraftingExtractor {
return status;
}
+ // TODO: send crafting monitor update when this changes
public void updateStatus() {
for (int i = 0; i < items.size(); ++i) {
if (status.get(i) != CraftingExtractorItemStatus.EXTRACTED) {
@@ -52,12 +56,13 @@ public class CraftingExtractor {
return !items.isEmpty() && status.stream().allMatch(s -> s == CraftingExtractorItemStatus.EXTRACTED);
}
+ // TODO: send crafting monitor update when this changes
public void extractOne() {
for (int i = 0; i < items.size(); ++i) {
if (status.get(i) == CraftingExtractorItemStatus.AVAILABLE) {
ItemStack extracted = network.extractItem(items.get(i), items.get(i).getCount(), false);
if (extracted == null) {
- throw new IllegalStateException("Did not extract anything");
+ throw new IllegalStateException("Did not extract anything while available");
}
status.set(i, CraftingExtractorItemStatus.EXTRACTED);
@@ -66,4 +71,31 @@ public class CraftingExtractor {
}
}
}
+
+ // TODO: send crafting monitor update when this changes
+ public void extractOneAndInsert(@Nullable IItemHandler dest) {
+ for (int i = 0; i < items.size(); ++i) {
+ if (status.get(i) == CraftingExtractorItemStatus.AVAILABLE) {
+ ItemStack extracted = network.extractItem(items.get(i), items.get(i).getCount(), true);
+ if (extracted == null) {
+ throw new IllegalStateException("Extraction simulation failed while available");
+ }
+
+ if (dest == null) {
+ status.set(i, CraftingExtractorItemStatus.MACHINE_NONE);
+ } else if (ItemHandlerHelper.insertItem(dest, extracted, false).isEmpty()) {
+ extracted = network.extractItem(items.get(i), items.get(i).getCount(), false);
+ if (extracted == null) {
+ throw new IllegalStateException("Did not extract anything while available");
+ }
+
+ status.set(i, CraftingExtractorItemStatus.EXTRACTED);
+ } else {
+ status.set(i, CraftingExtractorItemStatus.MACHINE_DOES_NOT_ACCEPT);
+ }
+
+ return;
+ }
+ }
+ }
}
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingExtractorItemStatus.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingExtractorItemStatus.java
index 757f099e8..c636a4769 100644
--- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingExtractorItemStatus.java
+++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingExtractorItemStatus.java
@@ -3,5 +3,7 @@ package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task;
public enum CraftingExtractorItemStatus {
AVAILABLE,
MISSING,
- EXTRACTED
+ EXTRACTED,
+ MACHINE_NONE,
+ MACHINE_DOES_NOT_ACCEPT
}
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 1ea2cf99a..6850c4d5d 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
@@ -14,6 +14,9 @@ import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.craftingmonitor.Craf
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 com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.step.CraftingStep;
+import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.step.CraftingStepCraft;
+import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.step.CraftingStepProcess;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.NonNullList;
@@ -136,15 +139,17 @@ public class CraftingTask implements ICraftingTask {
for (ItemStack output : pattern.getOutputs()) {
results.add(output);
}
+
+ return new CraftingStepProcess(pattern, network, new ArrayList<>(itemsToExtract.getStacks()));
} else {
results.add(pattern.getOutput(took));
for (ItemStack byproduct : pattern.getByproducts(took)) {
results.add(byproduct);
}
- }
- return new CraftingStepCraft(pattern, inserter, network, new ArrayList<>(itemsToExtract.getStacks()), took);
+ return new CraftingStepCraft(pattern, inserter, network, new ArrayList<>(itemsToExtract.getStacks()), took);
+ }
}
private int getQuantityPerCraft(ICraftingPattern pattern, ItemStack requested) {
@@ -201,6 +206,21 @@ public class CraftingTask implements ICraftingTask {
return requested;
}
+ @Override
+ public int onTrackedItemInserted(ItemStack stack, int size) {
+ for (CraftingStep step : steps) {
+ if (step instanceof CraftingStepProcess) {
+ size = ((CraftingStepProcess) step).onTrackedItemInserted(stack, size);
+
+ if (size == 0) {
+ break;
+ }
+ }
+ }
+
+ return size;
+ }
+
@Override
public NBTTagCompound writeToNBT(NBTTagCompound tag) {
return tag;
@@ -281,6 +301,40 @@ public class CraftingTask implements ICraftingTask {
elements.commit();
}
+ if (steps.stream().anyMatch(s -> s instanceof CraftingStepProcess && !s.isCompleted())) {
+ elements.directAdd(new CraftingMonitorElementText("gui.refinedstorage:crafting_monitor.items_processing", 16));
+
+ for (CraftingStep step : steps) {
+ if (step instanceof CraftingStepProcess && !step.isCompleted()) {
+ CraftingExtractor extractor = ((CraftingStepProcess) step).getExtractor();
+
+ for (int i = 0; i < extractor.getItems().size(); ++i) {
+ ItemStack item = extractor.getItems().get(i);
+ CraftingExtractorItemStatus status = extractor.getStatus().get(i);
+
+ ICraftingMonitorElement element = new CraftingMonitorElementItemRender(
+ -1,
+ item,
+ item.getCount(),
+ 32
+ );
+
+ if (status == CraftingExtractorItemStatus.MISSING) {
+ element = new CraftingMonitorElementInfo(element, "gui.refinedstorage:crafting_monitor.waiting_for_items");
+ } else if (status == CraftingExtractorItemStatus.MACHINE_DOES_NOT_ACCEPT) {
+ element = new CraftingMonitorElementError(element, "gui.refinedstorage:crafting_monitor.machine_does_not_accept");
+ } else if (status == CraftingExtractorItemStatus.MACHINE_NONE) {
+ element = new CraftingMonitorElementError(element, "gui.refinedstorage:crafting_monitor.machine_none");
+ }
+
+ elements.add(element);
+ }
+ }
+ }
+
+ elements.commit();
+ }
+
return elements.getElements();
}
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStep.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/step/CraftingStep.java
similarity index 98%
rename from src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStep.java
rename to src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/step/CraftingStep.java
index d7ae02195..4e9ef373c 100644
--- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStep.java
+++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/step/CraftingStep.java
@@ -1,4 +1,4 @@
-package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task;
+package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.step;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern;
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStepCraft.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/step/CraftingStepCraft.java
similarity index 88%
rename from src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStepCraft.java
rename to src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/step/CraftingStepCraft.java
index 848e70493..2e3610f7f 100644
--- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStepCraft.java
+++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/step/CraftingStepCraft.java
@@ -1,7 +1,9 @@
-package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task;
+package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.step;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern;
import com.raoulvdberge.refinedstorage.api.network.INetwork;
+import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.CraftingExtractor;
+import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.CraftingInserter;
import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/step/CraftingStepProcess.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/step/CraftingStepProcess.java
new file mode 100644
index 000000000..365959f6a
--- /dev/null
+++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/step/CraftingStepProcess.java
@@ -0,0 +1,61 @@
+package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.step;
+
+import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern;
+import com.raoulvdberge.refinedstorage.api.network.INetwork;
+import com.raoulvdberge.refinedstorage.api.util.IStackList;
+import com.raoulvdberge.refinedstorage.apiimpl.API;
+import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.CraftingExtractor;
+import net.minecraft.item.ItemStack;
+
+import java.util.List;
+
+public class CraftingStepProcess extends CraftingStep {
+ private CraftingExtractor extractor;
+ private IStackList