Fixed crafting tasks stealing from each other and causing stalls.
This commit is contained in:
@@ -52,6 +52,9 @@ public class CraftingTask implements ICraftingTask {
|
||||
private static final String NBT_MISSING = "Missing";
|
||||
private static final String NBT_EXECUTION_STARTED = "ExecutionStarted";
|
||||
|
||||
private static final String NBT_PATTERN_STACK = "Stack";
|
||||
private static final String NBT_PATTERN_CONTAINER_POS = "ContainerPos";
|
||||
|
||||
private INetwork network;
|
||||
private ItemStack requested;
|
||||
private int quantity;
|
||||
@@ -60,7 +63,7 @@ public class CraftingTask implements ICraftingTask {
|
||||
private CraftingInserter inserter;
|
||||
private Set<ICraftingPattern> patternsUsed = new HashSet<>();
|
||||
private int ticks = 0;
|
||||
private long calculationStarted;
|
||||
private long calculationStarted = -1;
|
||||
private long executionStarted = -1;
|
||||
private UUID id = UUID.randomUUID();
|
||||
|
||||
@@ -116,6 +119,14 @@ public class CraftingTask implements ICraftingTask {
|
||||
@Override
|
||||
@Nullable
|
||||
public ICraftingTaskError calculate() {
|
||||
if (calculationStarted != -1) {
|
||||
throw new IllegalStateException("Task already calculated!");
|
||||
}
|
||||
|
||||
if (executionStarted != -1) {
|
||||
throw new IllegalStateException("Task already started!");
|
||||
}
|
||||
|
||||
this.calculationStarted = System.currentTimeMillis();
|
||||
|
||||
int qty = this.quantity;
|
||||
@@ -125,6 +136,27 @@ public class CraftingTask implements ICraftingTask {
|
||||
IStackList<ItemStack> results = API.instance().createItemStackList();
|
||||
IStackList<ItemStack> storage = network.getItemStorageCache().getList().copy();
|
||||
|
||||
// Items that are being handled in other tasks aren't available to us.
|
||||
for (ICraftingTask task : network.getCraftingManager().getTasks()) {
|
||||
if (task instanceof CraftingTask) {
|
||||
for (CraftingStep step : ((CraftingTask) task).steps) {
|
||||
CraftingExtractor extractor = null;
|
||||
|
||||
if (step instanceof CraftingStepCraft) {
|
||||
extractor = ((CraftingStepCraft) step).getExtractor();
|
||||
} else if (step instanceof CraftingStepProcess) {
|
||||
extractor = ((CraftingStepProcess) step).getExtractor();
|
||||
}
|
||||
|
||||
if (extractor != null) {
|
||||
for (ItemStack inUse : extractor.getItems()) {
|
||||
storage.remove(inUse);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ICraftingPatternChainList patternChainList = network.getCraftingManager().createPatternChainList();
|
||||
|
||||
ICraftingPatternChain patternChain = patternChainList.getChain(pattern);
|
||||
@@ -371,7 +403,7 @@ public class CraftingTask implements ICraftingTask {
|
||||
elements.directAdd(new CraftingMonitorElementText("gui.refinedstorage:crafting_monitor.items_missing", 5));
|
||||
|
||||
for (ItemStack missing : this.missing.getStacks()) {
|
||||
elements.add(new CraftingMonitorElementColor(new CraftingMonitorElementItemRender(missing, missing.getCount(), 16), "", CraftingMonitorElementColor.COLOR_ERROR));
|
||||
elements.add(new CraftingMonitorElementColor(new CraftingMonitorElementItemRender(missing, missing.getCount(), 0), "", CraftingMonitorElementColor.COLOR_ERROR));
|
||||
}
|
||||
|
||||
elements.commit();
|
||||
@@ -381,11 +413,7 @@ public class CraftingTask implements ICraftingTask {
|
||||
elements.directAdd(new CraftingMonitorElementText("gui.refinedstorage:crafting_monitor.items_inserting", 5));
|
||||
|
||||
for (CraftingInserterItem item : inserter.getItems()) {
|
||||
ICraftingMonitorElement element = new CraftingMonitorElementItemRender(
|
||||
item.getStack(),
|
||||
item.getStack().getCount(),
|
||||
16
|
||||
);
|
||||
ICraftingMonitorElement element = new CraftingMonitorElementItemRender(item.getStack(), item.getStack().getCount(), 0);
|
||||
|
||||
if (item.getStatus() == CraftingInserterItemStatus.FULL) {
|
||||
element = new CraftingMonitorElementColor(element, "gui.refinedstorage:crafting_monitor.network_full", CraftingMonitorElementColor.COLOR_ERROR);
|
||||
@@ -408,11 +436,7 @@ public class CraftingTask implements ICraftingTask {
|
||||
ItemStack item = extractor.getItems().get(i);
|
||||
CraftingExtractorItemStatus status = extractor.getStatus().get(i);
|
||||
|
||||
ICraftingMonitorElement element = new CraftingMonitorElementItemRender(
|
||||
item,
|
||||
item.getCount(),
|
||||
16
|
||||
);
|
||||
ICraftingMonitorElement element = new CraftingMonitorElementItemRender(item, item.getCount(), 0);
|
||||
|
||||
if (status == CraftingExtractorItemStatus.MISSING) {
|
||||
element = new CraftingMonitorElementColor(element, "gui.refinedstorage:crafting_monitor.waiting_for_items", CraftingMonitorElementColor.COLOR_INFO);
|
||||
@@ -437,11 +461,7 @@ public class CraftingTask implements ICraftingTask {
|
||||
ItemStack item = extractor.getItems().get(i);
|
||||
CraftingExtractorItemStatus status = extractor.getStatus().get(i);
|
||||
|
||||
ICraftingMonitorElement element = new CraftingMonitorElementItemRender(
|
||||
item,
|
||||
item.getCount(),
|
||||
16
|
||||
);
|
||||
ICraftingMonitorElement element = new CraftingMonitorElementItemRender(item, item.getCount(), 0);
|
||||
|
||||
if (status == CraftingExtractorItemStatus.MISSING) {
|
||||
element = new CraftingMonitorElementColor(element, "gui.refinedstorage:crafting_monitor.waiting_for_items", CraftingMonitorElementColor.COLOR_INFO);
|
||||
@@ -582,9 +602,6 @@ public class CraftingTask implements ICraftingTask {
|
||||
}
|
||||
}
|
||||
|
||||
private static final String NBT_PATTERN_STACK = "Stack";
|
||||
private static final String NBT_PATTERN_CONTAINER_POS = "ContainerPos";
|
||||
|
||||
public static NBTTagCompound writePatternToNbt(ICraftingPattern pattern) {
|
||||
NBTTagCompound tag = new NBTTagCompound();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user