Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: processing items in the autocrafting monitor now show the machine
Browse files Browse the repository at this point in the history
raoulvdberge committed Jan 26, 2025
1 parent cfd2cdd commit 4c342ff
Showing 20 changed files with 348 additions and 63 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -19,6 +19,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
highest priority first. If there are missing resources, lower priority patterns are checked.
- The Autocrafter now faces the block you're clicking when placing it, like the other cable blocks (like the Exporter or Importer).
- You can no longer cancel autocrafting tasks if there is not enough space in storage to return the intermediate task storage.
- The Autocrafting Monitor now shows the machine in which a resource is processing.

### Fixed

Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package com.refinedmods.refinedstorage.api.autocrafting.status;

import com.refinedmods.refinedstorage.api.autocrafting.task.ExternalPatternInputSinkKey;
import com.refinedmods.refinedstorage.api.autocrafting.task.TaskId;
import com.refinedmods.refinedstorage.api.resource.ResourceKey;

import java.util.List;
import javax.annotation.Nullable;

import org.apiguardian.api.API;

@@ -15,6 +17,7 @@ public record TaskInfo(TaskId id, ResourceKey resource, long amount, long startT
public record Item(
ResourceKey resource,
ItemType type,
@Nullable ExternalPatternInputSinkKey sinkKey,
long stored,
long processing,
long scheduled,
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package com.refinedmods.refinedstorage.api.autocrafting.status;

import com.refinedmods.refinedstorage.api.autocrafting.task.ExternalPatternInputSinkKey;
import com.refinedmods.refinedstorage.api.autocrafting.task.TaskId;
import com.refinedmods.refinedstorage.api.core.CoreValidations;
import com.refinedmods.refinedstorage.api.resource.ResourceKey;

import java.util.LinkedHashMap;
import java.util.Map;
import javax.annotation.Nullable;

public class TaskStatusBuilder {
private final TaskStatus.TaskInfo info;
@@ -21,9 +23,12 @@ public TaskStatusBuilder stored(final ResourceKey resource, final long stored) {
return this;
}

public TaskStatusBuilder processing(final ResourceKey resource, final long processing) {
public TaskStatusBuilder processing(final ResourceKey resource,
final long processing,
@Nullable final ExternalPatternInputSinkKey sinkKey) {
CoreValidations.validateLargerThanZero(processing, "Processing");
get(resource).processing += processing;
get(resource).sinkKey = sinkKey;
return this;
}

@@ -62,6 +67,7 @@ public TaskStatus build(final double percentageCompleted) {
return new TaskStatus(info, percentageCompleted, items.entrySet().stream().map(entry -> new TaskStatus.Item(
entry.getKey(),
entry.getValue().type,
entry.getValue().sinkKey,
entry.getValue().stored,
entry.getValue().processing,
entry.getValue().scheduled,
@@ -73,6 +79,8 @@ private static class MutableItem {
private TaskStatus.ItemType type;
private long stored;
private long processing;
@Nullable
private ExternalPatternInputSinkKey sinkKey;
private long scheduled;
private long crafting;

Original file line number Diff line number Diff line change
@@ -5,14 +5,17 @@
import com.refinedmods.refinedstorage.api.resource.ResourceAmount;

import java.util.Collection;
import javax.annotation.Nullable;

import org.apiguardian.api.API;

@API(status = API.Status.STABLE, since = "2.0.0-milestone.4.12")
@FunctionalInterface
public interface ExternalPatternInputSink {
Result accept(Pattern pattern, Collection<ResourceAmount> resources, Action action);

@Nullable
ExternalPatternInputSinkKey getKey(Pattern pattern);

enum Result {
ACCEPTED,
REJECTED,
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.refinedmods.refinedstorage.api.autocrafting.task;

import org.apiguardian.api.API;

@FunctionalInterface
@API(status = API.Status.STABLE, since = "2.0.0-milestone.4.12")
public interface ExternalPatternInputSinkKey {
String getName();
}
Original file line number Diff line number Diff line change
@@ -27,6 +27,8 @@ class ExternalTaskPattern extends AbstractTaskPattern {
private boolean interceptedAnythingSinceLastStep;
@Nullable
private ExternalPatternInputSink.Result lastSinkResult;
@Nullable
private ExternalPatternInputSinkKey lastSinkResultKey;

ExternalTaskPattern(final Pattern pattern, final TaskPlan.PatternPlan plan) {
super(pattern, plan);
@@ -103,7 +105,11 @@ void appendStatus(final TaskStatusBuilder builder) {
final long iterationsProcessing = iterationsSentToSink - iterationsReceived;
if (iterationsProcessing > 0) {
for (final ResourceKey input : simulatedIterationInputs.getAll()) {
builder.processing(input, simulatedIterationInputs.get(input) * iterationsProcessing);
builder.processing(
input,
simulatedIterationInputs.get(input) * iterationsProcessing,
lastSinkResultKey
);
}
}
if (lastSinkResult != null) {
@@ -137,6 +143,7 @@ private boolean acceptsIterationInputs(final MutableResourceList internalStorage
Action.SIMULATE
);
lastSinkResult = simulatedResult;
lastSinkResultKey = externalPatternInputSink.getKey(pattern);
if (simulatedResult != ExternalPatternInputSink.Result.ACCEPTED) {
return false;
}
Original file line number Diff line number Diff line change
@@ -28,14 +28,31 @@ Sink storageSink(final Pattern pattern) {
}

ExternalPatternInputSink build() {
return (pattern, resources, action) -> {
final Sink sink = sinks.get(pattern);
return sink != null && sink.accept(resources, action)
? ExternalPatternInputSink.Result.ACCEPTED
: ExternalPatternInputSink.Result.REJECTED;
return new ExternalPatternInputSink() {
@Override
public Result accept(final Pattern pattern,
final Collection<ResourceAmount> resources,
final Action action) {
final Sink sink = sinks.get(pattern);
return sink != null && sink.accept(resources, action)
? ExternalPatternInputSink.Result.ACCEPTED
: ExternalPatternInputSink.Result.REJECTED;
}

@Override
public ExternalPatternInputSinkKey getKey(final Pattern pattern) {
return new SinkKey(pattern);
}
};
}

record SinkKey(Pattern pattern) implements ExternalPatternInputSinkKey {
@Override
public String getName() {
return pattern.id().toString();
}
}

static class Sink {
private final Storage storage;
private boolean enabled = true;
Original file line number Diff line number Diff line change
@@ -16,6 +16,9 @@
import com.refinedmods.refinedstorage.api.storage.root.RootStorage;
import com.refinedmods.refinedstorage.api.storage.root.RootStorageImpl;

import java.util.Collection;
import javax.annotation.Nullable;

import org.assertj.core.api.recursive.comparison.RecursiveComparisonConfiguration;
import org.junit.jupiter.api.Test;

@@ -54,8 +57,24 @@ class TaskImplTest {
private static final RecursiveComparisonConfiguration STATUS_CONFIG = RecursiveComparisonConfiguration.builder()
.withIgnoredFields("info.startTime")
.build();
private static final ExternalPatternInputSink EMPTY_SINK = (pattern, resources, action) ->
ExternalPatternInputSink.Result.SKIPPED;
private static final ExternalPatternInputSink EMPTY_SINK = fixedResultSink(ExternalPatternInputSink.Result.SKIPPED);

private static ExternalPatternInputSink fixedResultSink(final ExternalPatternInputSink.Result result) {
return new ExternalPatternInputSink() {
@Override
public Result accept(final Pattern pattern,
final Collection<ResourceAmount> resources,
final Action action) {
return result;
}

@Nullable
@Override
public ExternalPatternInputSinkKey getKey(final Pattern pattern) {
return null;
}
};
}

@Test
void testInitialState() {
@@ -661,10 +680,22 @@ void shouldNotCompleteTaskWithExternalPatternIfSinkDoesNotAcceptResourcesOnlyWhe
new ResourceAmount(IRON_ORE, 3)
);
final PatternRepository patterns = patterns(IRON_INGOT_PATTERN, IRON_PICKAXE_PATTERN);
final ExternalPatternInputSink sink = (pattern, resources, action) ->
action == Action.SIMULATE
? ExternalPatternInputSink.Result.ACCEPTED
: ExternalPatternInputSink.Result.REJECTED;
final ExternalPatternInputSink sink = new ExternalPatternInputSink() {
@Override
public Result accept(final Pattern pattern,
final Collection<ResourceAmount> resources,
final Action action) {
return action == Action.SIMULATE
? ExternalPatternInputSink.Result.ACCEPTED
: ExternalPatternInputSink.Result.REJECTED;
}

@Nullable
@Override
public ExternalPatternInputSinkKey getKey(final Pattern pattern) {
return null;
}
};
final Task task = getRunningTask(storage, patterns, sink, IRON_PICKAXE, 1);

assertThat(storage.getAll()).isEmpty();
@@ -808,7 +839,7 @@ void shouldReportStatusCorrectly() {
new TaskStatusBuilder(task.getId(), IRON_PICKAXE, 1, 0)
.crafting(IRON_PICKAXE, 1)
.scheduled(IRON_INGOT, 2)
.processing(IRON_ORE, 1)
.processing(IRON_ORE, 1, new ExternalPatternInputSinkBuilder.SinkKey(IRON_INGOT_PATTERN))
.crafting(STICKS, 4)
.stored(OAK_PLANKS, 4)
.stored(IRON_ORE, 2)
@@ -829,7 +860,7 @@ void shouldReportStatusCorrectly() {
new TaskStatusBuilder(task.getId(), IRON_PICKAXE, 1, 0)
.crafting(IRON_PICKAXE, 1)
.scheduled(IRON_INGOT, 1)
.processing(IRON_ORE, 2)
.processing(IRON_ORE, 2, new ExternalPatternInputSinkBuilder.SinkKey(IRON_INGOT_PATTERN))
.stored(OAK_PLANKS, 2)
.stored(IRON_ORE, 1)
.stored(STICKS, 4)
@@ -850,7 +881,7 @@ void shouldReportStatusCorrectly() {
assertThat(task.getStatus()).usingRecursiveComparison(STATUS_CONFIG).isEqualTo(
new TaskStatusBuilder(task.getId(), IRON_PICKAXE, 1, 0)
.crafting(IRON_PICKAXE, 1)
.processing(IRON_ORE, 3)
.processing(IRON_ORE, 3, new ExternalPatternInputSinkBuilder.SinkKey(IRON_INGOT_PATTERN))
.stored(OAK_PLANKS, 2)
.stored(STICKS, 4)
.build(0.6666666666666666));
@@ -869,7 +900,7 @@ void shouldReportStatusCorrectly() {
assertThat(task.getStatus()).usingRecursiveComparison(STATUS_CONFIG).isEqualTo(
new TaskStatusBuilder(task.getId(), IRON_PICKAXE, 1, 0)
.crafting(IRON_PICKAXE, 1)
.processing(IRON_ORE, 1)
.processing(IRON_ORE, 1, new ExternalPatternInputSinkBuilder.SinkKey(IRON_INGOT_PATTERN))
.stored(OAK_PLANKS, 2)
.stored(STICKS, 4)
.stored(IRON_INGOT, 2)
@@ -965,7 +996,7 @@ void shouldReportWhetherSinkIsRejectingInputsOnStatus() {
new TaskStatusBuilder(task.getId(), IRON_INGOT, 2, 0)
.scheduled(IRON_INGOT, 1)
.stored(IRON_ORE, 1)
.processing(IRON_ORE, 1)
.processing(IRON_ORE, 1, new ExternalPatternInputSinkBuilder.SinkKey(IRON_INGOT_PATTERN))
.build(0));

ironOreSink.setEnabled(false);
@@ -974,7 +1005,7 @@ void shouldReportWhetherSinkIsRejectingInputsOnStatus() {
new TaskStatusBuilder(task.getId(), IRON_INGOT, 2, 0)
.scheduled(IRON_INGOT, 1)
.stored(IRON_ORE, 1)
.processing(IRON_ORE, 1)
.processing(IRON_ORE, 1, new ExternalPatternInputSinkBuilder.SinkKey(IRON_INGOT_PATTERN))
.rejected(IRON_INGOT)
.build(0));
}
@@ -995,7 +1026,7 @@ void shouldReportWhetherSinkIsNotFoundOnStatus() {
new TaskStatusBuilder(task.getId(), IRON_INGOT, 2, 0)
.scheduled(IRON_INGOT, 1)
.stored(IRON_ORE, 1)
.processing(IRON_ORE, 1)
.processing(IRON_ORE, 1, new ExternalPatternInputSinkBuilder.SinkKey(IRON_INGOT_PATTERN))
.build(0));

ironOreSink.setEnabled(false);
@@ -1004,7 +1035,7 @@ void shouldReportWhetherSinkIsNotFoundOnStatus() {
new TaskStatusBuilder(task.getId(), IRON_INGOT, 2, 0)
.scheduled(IRON_INGOT, 1)
.stored(IRON_ORE, 1)
.processing(IRON_ORE, 1)
.processing(IRON_ORE, 1, null)
.noneFound(IRON_INGOT)
.build(0));
}
@@ -1025,20 +1056,20 @@ void shouldReportWhetherSinkIsLockedFoundOnStatus() {
new TaskStatusBuilder(task.getId(), IRON_INGOT, 2, 0)
.scheduled(IRON_INGOT, 1)
.stored(IRON_ORE, 1)
.processing(IRON_ORE, 1)
.processing(IRON_ORE, 1, new ExternalPatternInputSinkBuilder.SinkKey(IRON_INGOT_PATTERN))
.build(0));

ironOreSink.setEnabled(false);
task.step(
storage,
(pattern, resources, action) -> ExternalPatternInputSink.Result.LOCKED,
fixedResultSink(ExternalPatternInputSink.Result.LOCKED),
StepBehavior.DEFAULT
);
assertThat(task.getStatus()).usingRecursiveComparison(STATUS_CONFIG).isEqualTo(
new TaskStatusBuilder(task.getId(), IRON_INGOT, 2, 0)
.scheduled(IRON_INGOT, 1)
.stored(IRON_ORE, 1)
.processing(IRON_ORE, 1)
.processing(IRON_ORE, 1, null)
.locked(IRON_INGOT)
.build(0));
}
Loading

0 comments on commit 4c342ff

Please sign in to comment.