Keep track if a crafting task was made in automated way for an upcoming feature in the crafting monitor

This commit is contained in:
raoulvdberge
2017-01-29 20:37:31 +01:00
parent fcf707ea2c
commit 81e94ef727
7 changed files with 96 additions and 76 deletions

View File

@@ -36,9 +36,10 @@ public interface ICraftingManager {
* @param stack the stack to create a task for * @param stack the stack to create a task for
* @param pattern the pattern * @param pattern the pattern
* @param quantity the quantity * @param quantity the quantity
* @param automated whether this crafting task is created in an automated way
* @return the crafting task * @return the crafting task
*/ */
ICraftingTask create(@Nullable ItemStack stack, ICraftingPattern pattern, int quantity); ICraftingTask create(@Nullable ItemStack stack, ICraftingPattern pattern, int quantity, boolean automated);
/** /**
* Creates a crafting task. * Creates a crafting task.
@@ -46,9 +47,10 @@ public interface ICraftingManager {
* @param stack the stack to create a task for * @param stack the stack to create a task for
* @param patternChain the pattern * @param patternChain the pattern
* @param quantity the quantity * @param quantity the quantity
* @param automated whether this crafting task is created in an automated way
* @return the crafting task * @return the crafting task
*/ */
ICraftingTask create(@Nullable ItemStack stack, ICraftingPatternChain patternChain, int quantity); ICraftingTask create(@Nullable ItemStack stack, ICraftingPatternChain patternChain, int quantity, boolean automated);
/** /**
* Schedules a crafting task if the task isn't scheduled yet. * Schedules a crafting task if the task isn't scheduled yet.
@@ -100,6 +102,7 @@ public interface ICraftingManager {
@Nullable @Nullable
default ICraftingPattern getPattern(ItemStack pattern, int flags) { default ICraftingPattern getPattern(ItemStack pattern, int flags) {
ICraftingPatternChain chain = getPatternChain(pattern, flags); ICraftingPatternChain chain = getPatternChain(pattern, flags);
return chain == null ? null : chain.cycle(); return chain == null ? null : chain.cycle();
} }
@@ -117,6 +120,7 @@ public interface ICraftingManager {
@Nullable @Nullable
default ICraftingPattern getPattern(ItemStack pattern, int flags, IStackList<ItemStack> itemList) { default ICraftingPattern getPattern(ItemStack pattern, int flags, IStackList<ItemStack> itemList) {
ICraftingPatternChain chain = getPatternChain(pattern, flags, itemList); ICraftingPatternChain chain = getPatternChain(pattern, flags, itemList);
return chain == null ? null : chain.cycle(); return chain == null ? null : chain.cycle();
} }

View File

@@ -1,7 +1,7 @@
package com.raoulvdberge.refinedstorage.api.autocrafting.registry; package com.raoulvdberge.refinedstorage.api.autocrafting.registry;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternChain;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern; import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternChain;
import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask; import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask;
import com.raoulvdberge.refinedstorage.api.network.INetworkMaster; import com.raoulvdberge.refinedstorage.api.network.INetworkMaster;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
@@ -22,21 +22,23 @@ public interface ICraftingTaskFactory {
* @param stack the stack to create task for * @param stack the stack to create task for
* @param pattern the pattern * @param pattern the pattern
* @param quantity the quantity * @param quantity the quantity
* @param automated whether this crafting task is created in an automated way
* @param tag the NBT tag, if this is null it isn't reading from disk but is used for making a task on demand * @param tag the NBT tag, if this is null it isn't reading from disk but is used for making a task on demand
* @return the crafting task * @return the crafting task
*/ */
@Nonnull @Nonnull
ICraftingTask create(INetworkMaster network, @Nullable ItemStack stack, ICraftingPattern pattern, int quantity, @Nullable NBTTagCompound tag); ICraftingTask create(INetworkMaster network, @Nullable ItemStack stack, ICraftingPattern pattern, int quantity, boolean automated, @Nullable NBTTagCompound tag);
/** /**
* Returns a crafting task for a given NBT tag and pattern. * Returns a crafting task for a given NBT tag and pattern.
* *
* @param network the network * @param network the network
* @param stack the stack to create task for * @param stack the stack to create task for
* @param patternChain the patternChain * @param patternChain the pattern chain
* @param quantity the quantity * @param quantity the quantity
* @param automated whether this crafting task is created in an automated way
* @return the crafting task * @return the crafting task
*/ */
@Nonnull @Nonnull
ICraftingTask create(INetworkMaster network, @Nullable ItemStack stack, ICraftingPatternChain patternChain, int quantity); ICraftingTask create(INetworkMaster network, @Nullable ItemStack stack, ICraftingPatternChain patternChain, int quantity, boolean automated);
} }

View File

@@ -127,4 +127,9 @@ public interface ICraftingTask {
* @return get a list of {@link ICraftingPreviewElement}s * @return get a list of {@link ICraftingPreviewElement}s
*/ */
List<ICraftingPreviewElement> getPreviewStacks(); List<ICraftingPreviewElement> getPreviewStacks();
/**
* @return whether this crafting task is created in an automated way
*/
boolean isAutomated();
} }

View File

@@ -1,10 +1,6 @@
package com.raoulvdberge.refinedstorage.apiimpl.autocrafting; package com.raoulvdberge.refinedstorage.apiimpl.autocrafting;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternChain; import com.raoulvdberge.refinedstorage.api.autocrafting.*;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingManager;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternContainer;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternProvider;
import com.raoulvdberge.refinedstorage.api.autocrafting.registry.ICraftingTaskFactory; import com.raoulvdberge.refinedstorage.api.autocrafting.registry.ICraftingTaskFactory;
import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingStep; import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingStep;
import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask; import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask;
@@ -67,13 +63,13 @@ public class CraftingManager implements ICraftingManager {
} }
@Override @Override
public ICraftingTask create(@Nullable ItemStack stack, ICraftingPattern pattern, int quantity) { public ICraftingTask create(@Nullable ItemStack stack, ICraftingPattern pattern, int quantity, boolean automated) {
return API.instance().getCraftingTaskRegistry().get(pattern.getId()).create(network, stack, pattern, quantity, null); return API.instance().getCraftingTaskRegistry().get(pattern.getId()).create(network, stack, pattern, quantity, automated, null);
} }
@Override @Override
public ICraftingTask create(@Nullable ItemStack stack, ICraftingPatternChain patternChain, int quantity) { public ICraftingTask create(@Nullable ItemStack stack, ICraftingPatternChain patternChain, int quantity, boolean automated) {
return API.instance().getCraftingTaskRegistry().get(patternChain.getPrototype().getId()).create( network, stack, patternChain, quantity); return API.instance().getCraftingTaskRegistry().get(patternChain.getPrototype().getId()).create(network, stack, patternChain, quantity, automated);
} }
@Override @Override
@@ -242,7 +238,7 @@ public class CraftingManager implements ICraftingManager {
ICraftingPatternChain patternChain = getPatternChain(stack, compare); ICraftingPatternChain patternChain = getPatternChain(stack, compare);
if (patternChain != null) { if (patternChain != null) {
ICraftingTask task = create(stack, patternChain, toSchedule); ICraftingTask task = create(stack, patternChain, toSchedule, true);
task.calculate(); task.calculate();
task.getMissing().clear(); task.getMissing().clear();
@@ -293,7 +289,7 @@ public class CraftingManager implements ICraftingManager {
ICraftingTaskFactory factory = API.instance().getCraftingTaskRegistry().get(tag.getString(ICraftingTask.NBT_PATTERN_ID)); ICraftingTaskFactory factory = API.instance().getCraftingTaskRegistry().get(tag.getString(ICraftingTask.NBT_PATTERN_ID));
if (factory != null) { if (factory != null) {
return factory.create(network, tag.hasKey(ICraftingTask.NBT_REQUESTED) ? new ItemStack(tag.getCompoundTag(ICraftingTask.NBT_REQUESTED)) : null, pattern, tag.getInteger(ICraftingTask.NBT_QUANTITY), tag); return factory.create(network, tag.hasKey(ICraftingTask.NBT_REQUESTED) ? new ItemStack(tag.getCompoundTag(ICraftingTask.NBT_REQUESTED)) : null, pattern, tag.getInteger(ICraftingTask.NBT_QUANTITY), false, tag);
} }
} }
} }

View File

@@ -1,8 +1,8 @@
package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.registry; package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.registry;
import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.RSUtils;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternChain;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern; import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternChain;
import com.raoulvdberge.refinedstorage.api.autocrafting.registry.ICraftingTaskFactory; import com.raoulvdberge.refinedstorage.api.autocrafting.registry.ICraftingTaskFactory;
import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingStep; import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingStep;
import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask; import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask;
@@ -28,7 +28,7 @@ public class CraftingTaskFactory implements ICraftingTaskFactory {
@Override @Override
@Nonnull @Nonnull
public ICraftingTask create(INetworkMaster network, @Nullable ItemStack stack, ICraftingPattern pattern, int quantity, @Nullable NBTTagCompound tag) { public ICraftingTask create(INetworkMaster network, @Nullable ItemStack stack, ICraftingPattern pattern, int quantity, boolean automated, @Nullable NBTTagCompound tag) {
if (tag != null) { if (tag != null) {
NBTTagList stepsList = tag.getTagList(CraftingTask.NBT_STEPS, Constants.NBT.TAG_COMPOUND); NBTTagList stepsList = tag.getTagList(CraftingTask.NBT_STEPS, Constants.NBT.TAG_COMPOUND);
@@ -70,15 +70,15 @@ public class CraftingTaskFactory implements ICraftingTaskFactory {
} }
} }
return new CraftingTask(network, stack, pattern, quantity, steps, toInsert, toTakeFluids, toInsertFluids); return new CraftingTask(network, stack, pattern, quantity, steps, toInsert, toTakeFluids, toInsertFluids, tag.hasKey(CraftingTask.NBT_AUTOMATED) && tag.getBoolean(CraftingTask.NBT_AUTOMATED));
} }
return new CraftingTask(network, stack, pattern, quantity); return new CraftingTask(network, stack, pattern, quantity, automated);
} }
@Nonnull @Nonnull
@Override @Override
public ICraftingTask create(INetworkMaster network, @Nullable ItemStack stack, ICraftingPatternChain patternChain, int quantity) { public ICraftingTask create(INetworkMaster network, @Nullable ItemStack stack, ICraftingPatternChain patternChain, int quantity, boolean automated) {
return new CraftingTask(network, stack, patternChain, quantity); return new CraftingTask(network, stack, patternChain, quantity, automated);
} }
} }

View File

@@ -1,8 +1,8 @@
package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task; package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task;
import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.RSUtils;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternChain;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern; import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternChain;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternContainer; import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternContainer;
import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement; import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement;
import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElementList; import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElementList;
@@ -38,6 +38,7 @@ public class CraftingTask implements ICraftingTask {
public static final String NBT_TO_TAKE_FLUIDS = "ToTakeFluids"; public static final String NBT_TO_TAKE_FLUIDS = "ToTakeFluids";
public static final String NBT_TO_INSERT_ITEMS = "ToInsertItems"; public static final String NBT_TO_INSERT_ITEMS = "ToInsertItems";
public static final String NBT_TO_INSERT_FLUIDS = "ToInsertFluids"; public static final String NBT_TO_INSERT_FLUIDS = "ToInsertFluids";
public static final String NBT_AUTOMATED = "Automated";
private INetworkMaster network; private INetworkMaster network;
@Nullable @Nullable
@@ -45,6 +46,7 @@ public class CraftingTask implements ICraftingTask {
private ICraftingPattern pattern; private ICraftingPattern pattern;
private ICraftingPatternChain chain; private ICraftingPatternChain chain;
private int quantity; private int quantity;
private boolean automated;
private List<ICraftingStep> mainSteps = new LinkedList<>(); private List<ICraftingStep> mainSteps = new LinkedList<>();
private IStackList<ItemStack> toTake = API.instance().createItemStackList(); private IStackList<ItemStack> toTake = API.instance().createItemStackList();
private IStackList<ItemStack> toCraft = API.instance().createItemStackList(); private IStackList<ItemStack> toCraft = API.instance().createItemStackList();
@@ -55,20 +57,23 @@ public class CraftingTask implements ICraftingTask {
private Deque<FluidStack> toInsertFluids = new ArrayDeque<>(); private Deque<FluidStack> toInsertFluids = new ArrayDeque<>();
private IStackList<FluidStack> toTakeFluids = API.instance().createFluidStackList(); private IStackList<FluidStack> toTakeFluids = API.instance().createFluidStackList();
public CraftingTask(INetworkMaster network, @Nullable ItemStack requested, ICraftingPattern pattern, int quantity) { public CraftingTask(INetworkMaster network, @Nullable ItemStack requested, ICraftingPattern pattern, int quantity, boolean automated) {
this.network = network; this.network = network;
this.requested = requested; this.requested = requested;
this.pattern = pattern; this.pattern = pattern;
this.quantity = quantity; this.quantity = quantity;
this.automated = automated;
} }
public CraftingTask(INetworkMaster network, @Nullable ItemStack requested, ICraftingPatternChain chain, int quantity) { public CraftingTask(INetworkMaster network, @Nullable ItemStack requested, ICraftingPatternChain chain, int quantity, boolean automated) {
this(network, requested, chain.getPrototype(), quantity); this(network, requested, chain.getPrototype(), quantity, automated);
this.chain = chain; this.chain = chain;
} }
public CraftingTask(INetworkMaster network, @Nullable ItemStack requested, ICraftingPattern pattern, int quantity, List<ICraftingStep> mainSteps, Deque<ItemStack> toInsertItems, IStackList<FluidStack> toTakeFluids, Deque<FluidStack> toInsertFluids) { public CraftingTask(INetworkMaster network, @Nullable ItemStack requested, ICraftingPattern pattern, int quantity, List<ICraftingStep> mainSteps, Deque<ItemStack> toInsertItems, IStackList<FluidStack> toTakeFluids, Deque<FluidStack> toInsertFluids, boolean automated) {
this(network, requested, pattern, quantity); this(network, requested, pattern, quantity, automated);
this.mainSteps = mainSteps; this.mainSteps = mainSteps;
this.toInsertItems = toInsertItems; this.toInsertItems = toInsertItems;
this.toTakeFluids = toTakeFluids; this.toTakeFluids = toTakeFluids;
@@ -133,7 +138,8 @@ public class CraftingTask implements ICraftingTask {
extraStack = toInsert.get(input, compare); extraStack = toInsert.get(input, compare);
networkStack = networkList.get(input, compare); networkStack = networkList.get(input, compare);
} while (extraStack == null && networkStack == null && ++i < inputs.size() && network.getCraftingManager().hasPattern(input, compare)); }
while (extraStack == null && networkStack == null && ++i < inputs.size() && network.getCraftingManager().hasPattern(input, compare));
if (i == inputs.size()) { if (i == inputs.size()) {
input = inputs.get(0).copy(); input = inputs.get(0).copy();
} }
@@ -330,6 +336,7 @@ public class CraftingTask implements ICraftingTask {
@Override @Override
public String toString() { public String toString() {
return "\nCraftingTask{quantity=" + quantity + return "\nCraftingTask{quantity=" + quantity +
"\n, automated=" + automated +
"\n, toTake=" + toTake + "\n, toTake=" + toTake +
"\n, toTakeFluids=" + toTakeFluids + "\n, toTakeFluids=" + toTakeFluids +
"\n, toCraft=" + toCraft + "\n, toCraft=" + toCraft +
@@ -395,7 +402,7 @@ public class CraftingTask implements ICraftingTask {
if (timesUsed++ <= container.getSpeedUpdateCount()) { if (timesUsed++ <= container.getSpeedUpdateCount()) {
if (!step.getPattern().isProcessing() || !container.isBlocked()) { if (!step.getPattern().isProcessing() || !container.isBlocked()) {
if (step.canStartProcessing(oreDictPrepped, networkFluids)){ if (step.canStartProcessing(oreDictPrepped, networkFluids)) {
step.setStartedProcessing(); step.setStartedProcessing();
step.execute(toInsertItems, toInsertFluids); step.execute(toInsertItems, toInsertFluids);
usedContainers.put(container, timesUsed); usedContainers.put(container, timesUsed);
@@ -407,7 +414,6 @@ public class CraftingTask implements ICraftingTask {
} }
if (getSteps().stream().filter(ICraftingStep::hasStartedProcessing).count() == 0) { if (getSteps().stream().filter(ICraftingStep::hasStartedProcessing).count() == 0) {
// When there is no started processes, restart the task. // When there is no started processes, restart the task.
reschedule(); reschedule();
@@ -486,6 +492,8 @@ public class CraftingTask implements ICraftingTask {
tag.setTag(NBT_TO_INSERT_FLUIDS, toInsertFluidsList); tag.setTag(NBT_TO_INSERT_FLUIDS, toInsertFluidsList);
tag.setBoolean(NBT_AUTOMATED, automated);
return tag; return tag;
} }
@@ -661,6 +669,11 @@ public class CraftingTask implements ICraftingTask {
return elements; return elements;
} }
@Override
public boolean isAutomated() {
return automated;
}
@Override @Override
public boolean isFinished() { public boolean isFinished() {
return mainSteps.stream().allMatch(ICraftingStep::hasReceivedOutputs); return mainSteps.stream().allMatch(ICraftingStep::hasReceivedOutputs);

View File

@@ -169,7 +169,7 @@ public class ItemGridHandler implements IItemGridHandler {
if (stack != null) { if (stack != null) {
Thread calculationThread = new Thread(() -> { Thread calculationThread = new Thread(() -> {
ICraftingTask task = new CraftingTask(network, stack, network.getCraftingManager().getPatternChain(stack), quantity); ICraftingTask task = new CraftingTask(network, stack, network.getCraftingManager().getPatternChain(stack), quantity, false);
task.calculate(); task.calculate();
@@ -193,7 +193,7 @@ public class ItemGridHandler implements IItemGridHandler {
} }
if (stack != null) { if (stack != null) {
ICraftingTask task = new CraftingTask(network, stack, network.getCraftingManager().getPatternChain(stack), quantity); ICraftingTask task = new CraftingTask(network, stack, network.getCraftingManager().getPatternChain(stack), quantity, false);
task.calculate(); task.calculate();