Increased the speed of autocrafting. Fixes #2066

Added a completion percentage to the Crafting Monitor
This commit is contained in:
raoulvdberge
2018-11-26 20:56:21 +01:00
parent f03eabb27d
commit f5beae667c
7 changed files with 133 additions and 25 deletions

View File

@@ -1,5 +1,10 @@
# Refined Storage Changelog
### 1.6.12
- Increased the speed of autocrafting (raoulvdberge)
- Added a completion percentage to the Crafting Monitor (raoulvdberge)
- Updated Russian translation (kellixon)
### 1.6.11
- Fixed blocks neighboring a controller breaking when returning from a dimension in a unchunkloaded area (raoulvdberge)

View File

@@ -16,9 +16,37 @@ import java.util.UUID;
*/
public interface ICraftingPatternContainer {
/**
* @deprecated Use {@link #getUpdateInterval()} and/or {@link #getMaximumSuccessfulCraftingUpdates()}
* @return the amount of speed upgrades in the container
*/
int getSpeedUpgradeCount();
@Deprecated
default int getSpeedUpgradeCount() {
return 0;
}
/**
* Returns the interval of when a crafting step with a pattern in this container can update.
* Minimum value is 0 (each tick).
* <p>
* Note: rather than maxing out the update interval, implementors might want to balance around {@link #getMaximumSuccessfulCraftingUpdates()}.
* This method merely speeds up the update rate, it might be more interesting to increase the output rate in {@link #getMaximumSuccessfulCraftingUpdates()}.
*
* @return the update interval
*/
default int getUpdateInterval() {
return 10;
}
/**
* Returns the amount of successful crafting updates that this container can have per crafting step update.
* If this limit is reached, crafting patterns from this container won't be able to update until the next
* eligible crafting step update interval from {@link #getUpdateInterval()}.
*
* @return the maximum amount of successful crafting updates
*/
default int getMaximumSuccessfulCraftingUpdates() {
return 1;
}
/**
* @return the inventory that this container is connected to, or null if no inventory is present

View File

@@ -47,6 +47,13 @@ public interface ICraftingTask {
*/
int getQuantityPerCraft();
/**
* @return the completion percentage
*/
default int getCompletionPercentage() {
return 0;
}
/**
* @return the stack requested
*/

View File

@@ -1,5 +1,6 @@
package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task;
import com.google.common.collect.Maps;
import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.api.autocrafting.*;
import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement;
@@ -56,6 +57,7 @@ public class CraftingTask implements ICraftingTask {
private static final String NBT_PROCESSING = "Processing";
private static final String NBT_MISSING = "Missing";
private static final String NBT_MISSING_FLUIDS = "MissingFluids";
private static final String NBT_TOTAL_STEPS = "TotalSteps";
private static final String NBT_PATTERN_STACK = "Stack";
private static final String NBT_PATTERN_CONTAINER_POS = "ContainerPos";
@@ -72,6 +74,7 @@ public class CraftingTask implements ICraftingTask {
private int ticks;
private long calculationStarted = -1;
private long executionStarted = -1;
private int totalSteps;
private Set<ICraftingPattern> patternsUsed = new HashSet<>();
private IStorageDisk<ItemStack> internalStorage;
@@ -118,6 +121,10 @@ public class CraftingTask implements ICraftingTask {
this.id = tag.getUniqueId(NBT_ID);
this.executionStarted = tag.getLong(NBT_EXECUTION_STARTED);
if (tag.hasKey(NBT_TOTAL_STEPS)) {
totalSteps = tag.getInteger(NBT_TOTAL_STEPS);
}
StorageDiskFactoryItem factoryItem = new StorageDiskFactoryItem();
StorageDiskFactoryFluid factoryFluid = new StorageDiskFactoryFluid();
@@ -153,6 +160,7 @@ public class CraftingTask implements ICraftingTask {
tag.setTag(NBT_INTERNAL_FLUID_STORAGE, internalFluidStorage.writeToNbt());
tag.setTag(NBT_TO_EXTRACT_INITIAL, writeItemStackList(toExtractInitial));
tag.setTag(NBT_TO_EXTRACT_INITIAL_FLUIDS, writeFluidStackList(toExtractInitialFluids));
tag.setInteger(NBT_TOTAL_STEPS, totalSteps);
NBTTagList craftingList = new NBTTagList();
for (Crafting crafting : this.crafting) {
@@ -535,23 +543,6 @@ public class CraftingTask implements ICraftingTask {
return null;
}
private static int getTickInterval(int speedUpgrades) {
switch (speedUpgrades) {
case 0:
return 10;
case 1:
return 8;
case 2:
return 6;
case 3:
return 4;
case 4:
return 2;
default:
return 2;
}
}
private void extractInitial() {
if (!toExtractInitial.isEmpty()) {
List<ItemStack> toRemove = new ArrayList<>();
@@ -601,10 +592,24 @@ public class CraftingTask implements ICraftingTask {
private void updateCrafting() {
Iterator<Crafting> it = crafting.iterator();
Map<ICraftingPatternContainer, Integer> counter = Maps.newHashMap();
while (it.hasNext()) {
Crafting c = it.next();
if (ticks % getTickInterval(c.getPattern().getContainer().getSpeedUpgradeCount()) == 0) {
ICraftingPatternContainer container = c.getPattern().getContainer();
int interval = container.getUpdateInterval();
if (interval < 0) {
throw new IllegalStateException(c.getPattern().getContainer() + " has an update interval of < 0");
}
if (interval == 0 || ticks % interval == 0) {
if (counter.getOrDefault(container, 0) == container.getMaximumSuccessfulCraftingUpdates()) {
continue;
}
boolean hasAll = true;
for (ItemStack need : c.getToExtract().getStacks()) {
@@ -648,7 +653,7 @@ public class CraftingTask implements ICraftingTask {
network.getCraftingManager().onTaskChanged();
return;
counter.merge(container, 1, (a, b) -> a + b);
}
}
}
@@ -657,9 +662,13 @@ public class CraftingTask implements ICraftingTask {
private void updateProcessing() {
Iterator<Processing> it = processing.iterator();
Map<ICraftingPatternContainer, Integer> counter = Maps.newHashMap();
while (it.hasNext()) {
Processing p = it.next();
ICraftingPatternContainer container = p.getPattern().getContainer();
if (p.getState() == ProcessingState.PROCESSED) {
it.remove();
@@ -672,7 +681,17 @@ public class CraftingTask implements ICraftingTask {
continue;
}
if (ticks % getTickInterval(p.getPattern().getContainer().getSpeedUpgradeCount()) == 0) {
int interval = p.getPattern().getContainer().getUpdateInterval();
if (interval < 0) {
throw new IllegalStateException(p.getPattern().getContainer() + " has an update interval of < 0");
}
if (interval == 0 || ticks % interval == 0) {
if (counter.getOrDefault(container, 0) == container.getMaximumSuccessfulCraftingUpdates()) {
continue;
}
ProcessingState originalState = p.getState();
if (p.getPattern().getContainer().isLocked()) {
@@ -751,6 +770,8 @@ public class CraftingTask implements ICraftingTask {
p.setState(ProcessingState.EXTRACTED_ALL);
p.getPattern().getContainer().onUsedForProcessing();
counter.merge(container, 1, (a, b) -> a + b);
}
}
@@ -798,6 +819,15 @@ public class CraftingTask implements ICraftingTask {
return current == null && stacks.isEmpty();
}
@Override
public int getCompletionPercentage() {
if (totalSteps == 0) {
return 0;
}
return 100 - (int) (((float) (crafting.size() + processing.size()) / (float) totalSteps) * 100F);
}
@Override
public boolean update() {
if (hasMissing()) {
@@ -808,6 +838,8 @@ public class CraftingTask implements ICraftingTask {
if (executionStarted == -1) {
executionStarted = System.currentTimeMillis();
totalSteps = crafting.size() + processing.size();
}
++ticks;

View File

@@ -228,8 +228,39 @@ public class NetworkNodeCrafter extends NetworkNode implements ICraftingPatternC
}
@Override
public int getSpeedUpgradeCount() {
return upgrades.getUpgradeCount(ItemUpgrade.TYPE_SPEED);
public int getUpdateInterval() {
switch (upgrades.getUpgradeCount(ItemUpgrade.TYPE_SPEED)) {
case 0:
return 10;
case 1:
return 8;
case 2:
return 6;
case 3:
return 4;
case 4:
return 2;
default:
return 0;
}
}
@Override
public int getMaximumSuccessfulCraftingUpdates() {
switch (upgrades.getUpgradeCount(ItemUpgrade.TYPE_SPEED)) {
case 0:
return 1;
case 1:
return 2;
case 2:
return 3;
case 3:
return 4;
case 4:
return 5;
default:
return 1;
}
}
@Override

View File

@@ -64,13 +64,15 @@ public class GuiCraftingMonitor extends GuiBase {
private ICraftingRequestInfo requested;
private int qty;
private long executionStarted;
private int completionPercentage;
private List<ICraftingMonitorElement> elements;
public CraftingMonitorTask(UUID id, ICraftingRequestInfo requested, int qty, long executionStarted, List<ICraftingMonitorElement> elements) {
public CraftingMonitorTask(UUID id, ICraftingRequestInfo requested, int qty, long executionStarted, int completionPercentage, List<ICraftingMonitorElement> elements) {
this.id = id;
this.requested = requested;
this.qty = qty;
this.executionStarted = executionStarted;
this.completionPercentage = completionPercentage;
this.elements = elements;
}
@@ -90,6 +92,7 @@ public class GuiCraftingMonitor extends GuiBase {
smallTextLines.add(I18n.format("gui.refinedstorage:crafting_monitor.tooltip.requested", requested.getFluid() != null ? API.instance().getQuantityFormatter().formatInBucketForm(qty) : API.instance().getQuantityFormatter().format(qty)));
smallTextLines.add(String.format("%02d:%02d", minutes, seconds));
smallTextLines.add(String.format("%d%%", completionPercentage));
RenderUtils.drawTooltipWithSmallText(textLines, smallTextLines, true, ItemStack.EMPTY, x, y, screenWidth, screenHeight, fontRenderer);
}

View File

@@ -48,6 +48,7 @@ public class MessageCraftingMonitorElements implements IMessage, IMessageHandler
int qty = buf.readInt();
long executionStarted = buf.readLong();
int percentage = buf.readInt();
List<ICraftingMonitorElement> elements = new ArrayList<>();
@@ -61,7 +62,7 @@ public class MessageCraftingMonitorElements implements IMessage, IMessageHandler
}
}
tasks.add(new GuiCraftingMonitor.CraftingMonitorTask(id, requested, qty, executionStarted, elements));
tasks.add(new GuiCraftingMonitor.CraftingMonitorTask(id, requested, qty, executionStarted, percentage, elements));
}
}
@@ -74,6 +75,7 @@ public class MessageCraftingMonitorElements implements IMessage, IMessageHandler
ByteBufUtils.writeTag(buf, task.getRequested().writeToNbt());
buf.writeInt(task.getQuantity());
buf.writeLong(task.getExecutionStarted());
buf.writeInt(task.getCompletionPercentage());
List<ICraftingMonitorElement> elements = task.getCraftingMonitorElements();