adds rescheduler, #550, #552

This commit is contained in:
way2muchnoise
2016-10-30 12:27:58 +01:00
parent 9c2aed7b93
commit 0d6aaca8d6
11 changed files with 101 additions and 16 deletions

View File

@@ -66,11 +66,17 @@ public interface ICraftingStep {
boolean hasReceivedOutputs();
/**
* @param stack the output to check,
* @param stack the output to check
* @return true if we received the given output (based upon item and stacksize), false otherwise
*/
boolean hasReceivedOutput(ItemStack stack);
/**
* @param stack the output to check
* @return amount of times this {@link ItemStack} has been received
*/
int getReceivedOutput(ItemStack stack);
/**
* The {@link ItemStack} given to it will be changed and contain the remainder
* The return value will only be true if the stack size is zero

View File

@@ -40,6 +40,16 @@ public interface ICraftingTask {
*/
boolean update(Map<ICraftingPatternContainer, Integer> usedContainers);
/**
* Reschedule the task. This does a recalculation and restart of the task.
*/
void reschedule();
/**
* Clear out missing items. Tasks will run all possible tasks, before reporting missing items again.
*/
void clearMissing();
/**
* @return the amount of items that have to be crafted
*/

View File

@@ -184,13 +184,11 @@ public interface INetworkMaster {
ICraftingTask task = createCraftingTask(stack, pattern, 1);
task.calculate();
if (!task.hasMissing()) {
task.clearMissing();
addCraftingTask(task);
}
}
}
}
/**
* Sends a grid update packet with all the items to all clients that are watching a grid connected to this network.

View File

@@ -112,6 +112,12 @@ public abstract class CraftingStep implements ICraftingStep {
return received != null && received >= stack.stackSize;
}
@Override
public int getReceivedOutput(ItemStack stack) {
Integer received = satisfied.get(API.instance().getItemStackHashCode(stack));
return received == null ? 0 : received;
}
@Override
public boolean onReceiveOutput(ItemStack stack) {
for (ItemStack output : pattern.getOutputs()) {

View File

@@ -240,6 +240,21 @@ public class CraftingTask implements ICraftingTask {
@Override
public boolean update(Map<ICraftingPatternContainer, Integer> usedContainers) {
IItemStackList oreDictPrepped = network.getItemStorageCache().getList().prepOreDict();
if (hasMissing()) {
for (ItemStack missing : this.missing.getStacks()) {
if (!oreDictPrepped.trackedRemove(missing, true)) {
oreDictPrepped.undo();
return false;
}
}
oreDictPrepped.undo();
reschedule();
return false;
}
for (FluidStack stack : toTakeFluids.getStacks()) {
FluidStack stackExtracted = network.extractFluid(stack, stack.amount);
if (stackExtracted != null) {
@@ -251,8 +266,6 @@ public class CraftingTask implements ICraftingTask {
toTakeFluids.clean();
IItemStackList oreDictPrepped = network.getItemStorageCache().getList().prepOreDict();
for (ICraftingStep step : steps) {
ICraftingPatternContainer container = step.getPattern().getContainer();
Integer timesUsed = usedContainers.get(container);
@@ -284,11 +297,39 @@ public class CraftingTask implements ICraftingTask {
}
}
if (steps.stream().filter(ICraftingStep::hasStartedProcessing).count() == 0) {
// When there is no started processes, restart the task.
reschedule();
}
// Remove finished tasks
steps.removeIf(ICraftingStep::hasReceivedOutputs);
return isFinished();
}
@Override
public void reschedule() {
List<ICraftingStep> mainSteps = steps.stream().filter(s -> s.getPattern() == pattern).collect(Collectors.toList());
missing.clear();
steps.clear();
// if the list of main steps is empty there is no point in rescheduling
if (!mainSteps.isEmpty()) {
quantity = 0;
int quantityPerRequest = pattern.getQuantityPerRequest(requested);
for (ICraftingStep step : mainSteps) {
quantity += quantityPerRequest - step.getReceivedOutput(requested);
}
calculate();
network.sendCraftingMonitorUpdate();
}
}
@Override
public void clearMissing() {
missing.clear();
}
@Override
public int getQuantity() {
return quantity;
@@ -346,6 +387,21 @@ public class CraftingTask implements ICraftingTask {
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.stackSize,
32
), ""))
.forEach(elements::add);
elements.commit();
}
if (!toInsertItems.isEmpty()) {
elements.directAdd(new CraftingMonitorElementText("gui.refinedstorage:crafting_monitor.items_inserting", 16));

View File

@@ -145,14 +145,11 @@ public class ItemGridHandler implements IItemGridHandler {
if (stack != null) {
ICraftingTask task = new CraftingTask(network, stack, network.getPattern(stack), quantity);
task.calculate();
if (!task.hasMissing()) {
task.clearMissing();
network.addCraftingTask(task);
}
}
}
@Override
public void onCraftingCancelRequested(int id) {

View File

@@ -132,7 +132,7 @@ public class GuiCraftingMonitor extends GuiBase {
item++;
}
if (itemSelectedTooltip != null) {
if (itemSelectedTooltip != null && !itemSelectedTooltip.isEmpty()) {
drawTooltip(mouseX, mouseY, I18n.format(itemSelectedTooltip));
}
}

View File

@@ -78,6 +78,10 @@ public class GuiCraftingPreview extends GuiBase {
public void update(int x, int y) {
scrollbar.setEnabled(getRows() > VISIBLE_ROWS);
scrollbar.setMaxOffset(getRows() - VISIBLE_ROWS);
if (!startButton.enabled && isCtrlKeyDown() && isShiftKeyDown()) {
startButton.enabled = true;
}
}
@Override
@@ -146,6 +150,10 @@ public class GuiCraftingPreview extends GuiBase {
} else if (hoveringFluid != null) {
drawTooltip(mouseX, mouseY, hoveringFluid.getLocalizedName());
}
if (!startButton.enabled && inBounds(85, 144, 50, 20, mouseX, mouseY)) {
drawTooltip(mouseX, mouseY, t("gui.refinedstorage:crafting_preview.force_start"));
}
}
}

View File

@@ -13,6 +13,7 @@ import net.minecraft.item.ItemStack;
import javax.annotation.Nullable;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
public class RecipeTransferHandlerPattern implements IRecipeTransferHandler<ContainerProcessingPatternEncoder> {
@@ -30,8 +31,8 @@ public class RecipeTransferHandlerPattern implements IRecipeTransferHandler<Cont
@Override
public IRecipeTransferError transferRecipe(ContainerProcessingPatternEncoder container, IRecipeLayout recipeLayout, EntityPlayer player, boolean maxTransfer, boolean doTransfer) {
if (doTransfer) {
Map<Integer, ItemStack> inputs = new HashMap<>();
Map<Integer, ItemStack> outputs = new HashMap<>();
Map<Integer, ItemStack> inputs = new LinkedHashMap<>();
Map<Integer, ItemStack> outputs = new LinkedHashMap<>();
for (IGuiIngredient<ItemStack> guiIngredient : recipeLayout.getItemStacks().getGuiIngredients().values()) {
if (guiIngredient != null && guiIngredient.getDisplayedIngredient() != null) {

View File

@@ -275,6 +275,8 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
craftingTaskIterator.remove();
craftingTasksChanged = true;
} else if(task.hasMissing() && ticks % 100 == 0 && Math.random() > 0.5) {
task.clearMissing();
}
}

View File

@@ -24,9 +24,9 @@ gui.refinedstorage:crafting_monitor.fluids_taking=Fluids taking
gui.refinedstorage:crafting_monitor.items_crafting=Items crafting
gui.refinedstorage:crafting_monitor.items_processing=Items processing
gui.refinedstorage:crafting_monitor.items_inserting=Items inserting
gui.refinedstorage:crafting_monitor.items_missing=Items missing
gui.refinedstorage:crafting_monitor.machine_in_use=Machine is in use
gui.refinedstorage:crafting_monitor.machine_none=No machine found
gui.refinedstorage:crafting_monitor.waiting_for_items=Waiting for items
gui.refinedstorage:wireless_transmitter=Wireless Transmitter
gui.refinedstorage:wireless_transmitter.distance=%d blocks
gui.refinedstorage:crafter=Crafter
@@ -50,6 +50,7 @@ gui.refinedstorage:crafting_preview.available=Available: %d
gui.refinedstorage:crafting_preview.missing=Missing: %d
gui.refinedstorage:crafting_preview.circular=Circular dependency!
gui.refinedstorage:crafting_preview.loop=Loop in processing...
gui.refinedstorage:crafting_preview.force_start=Press ctrl + shift to start anyway.
misc.refinedstorage:energy_stored=%d / %d RS
misc.refinedstorage:energy_usage=Usage: %d RS/t