From cfd2cdda273640ebfefcd867b1596f8c9a460f27 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Sun, 26 Jan 2025 14:10:33 +0100 Subject: [PATCH] feat: processing status now identifies sink result types --- config/checkstyle/checkstyle.xml | 6 +- .../api/autocrafting/status/TaskStatus.java | 7 +- .../status/TaskStatusBuilder.java | 17 ++- .../task/ExternalPatternInputSink.java | 19 +++- .../task/ExternalTaskPattern.java | 38 +++++-- .../api/autocrafting/task/TaskImpl.java | 4 +- .../task/ExternalPatternInputSinkBuilder.java | 4 +- .../api/autocrafting/task/TaskImplTest.java | 101 +++++++++++++++++- ...tternProviderExternalPatternInputSink.java | 12 ++- .../monitor/AutocraftingMonitorScreen.java | 6 +- .../assets/refinedstorage/lang/en_us.json | 10 +- ...orageExternalPatternInputSinkStrategy.java | 3 +- ...eExternalPatternInputSinkStrategyImpl.java | 13 ++- ...tternProviderExternalPatternInputSink.java | 12 ++- ...ndlerExternalPatternProviderInputSink.java | 15 +-- ...ndlerExternalPatternProviderInputSink.java | 13 +-- ...tternProviderExternalPatternInputSink.java | 3 +- .../AutocraftingNetworkComponentImpl.java | 4 +- .../PatternProviderNetworkNode.java | 4 +- .../node/relay/RelayOutputNetworkNode.java | 5 +- .../relay/RelayOutputPatternProvider.java | 5 +- .../PatternProviderNetworkNodeTest.java | 11 +- 22 files changed, 243 insertions(+), 69 deletions(-) diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml index d4e5b129a..80eae4094 100644 --- a/config/checkstyle/checkstyle.xml +++ b/config/checkstyle/checkstyle.xml @@ -22,7 +22,7 @@ - + @@ -106,7 +106,9 @@ - + + + diff --git a/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/status/TaskStatus.java b/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/status/TaskStatus.java index e0e633e16..0570fc394 100644 --- a/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/status/TaskStatus.java +++ b/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/status/TaskStatus.java @@ -22,11 +22,10 @@ public record Item( ) { } - // TODO: crafter logic doesn't know what to do with these public enum ItemType { NORMAL, - MACHINE_DOES_NOT_ACCEPT_RESOURCE, - NO_MACHINE_FOUND, - AUTOCRAFTER_IS_LOCKED + REJECTED, + NONE_FOUND, + LOCKED } } diff --git a/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/status/TaskStatusBuilder.java b/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/status/TaskStatusBuilder.java index 50d5b4cd2..577111b74 100644 --- a/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/status/TaskStatusBuilder.java +++ b/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/status/TaskStatusBuilder.java @@ -39,6 +39,21 @@ public TaskStatusBuilder crafting(final ResourceKey resource, final long craftin return this; } + public TaskStatusBuilder rejected(final ResourceKey resource) { + get(resource).type = TaskStatus.ItemType.REJECTED; + return this; + } + + public TaskStatusBuilder noneFound(final ResourceKey resource) { + get(resource).type = TaskStatus.ItemType.NONE_FOUND; + return this; + } + + public TaskStatusBuilder locked(final ResourceKey resource) { + get(resource).type = TaskStatus.ItemType.LOCKED; + return this; + } + private MutableItem get(final ResourceKey resource) { return items.computeIfAbsent(resource, key -> new MutableItem(TaskStatus.ItemType.NORMAL)); } @@ -55,7 +70,7 @@ public TaskStatus build(final double percentageCompleted) { } private static class MutableItem { - private final TaskStatus.ItemType type; + private TaskStatus.ItemType type; private long stored; private long processing; private long scheduled; diff --git a/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/task/ExternalPatternInputSink.java b/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/task/ExternalPatternInputSink.java index acf5a59a6..8893ee97b 100644 --- a/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/task/ExternalPatternInputSink.java +++ b/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/task/ExternalPatternInputSink.java @@ -11,5 +11,22 @@ @API(status = API.Status.STABLE, since = "2.0.0-milestone.4.12") @FunctionalInterface public interface ExternalPatternInputSink { - boolean accept(Pattern pattern, Collection resources, Action action); + Result accept(Pattern pattern, Collection resources, Action action); + + enum Result { + ACCEPTED, + REJECTED, + SKIPPED, + LOCKED; + + public Result and(final Result other) { + if (this == SKIPPED) { + return other; + } else if (this == REJECTED || other == REJECTED) { + return REJECTED; + } else { + return ACCEPTED; + } + } + } } diff --git a/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/task/ExternalTaskPattern.java b/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/task/ExternalTaskPattern.java index 5201928ec..19b8da18d 100644 --- a/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/task/ExternalTaskPattern.java +++ b/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/task/ExternalTaskPattern.java @@ -11,6 +11,8 @@ import com.refinedmods.refinedstorage.api.storage.root.RootStorage; import com.refinedmods.refinedstorage.api.storage.root.RootStorageListener; +import javax.annotation.Nullable; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,6 +25,8 @@ class ExternalTaskPattern extends AbstractTaskPattern { private long iterationsToSendToSink; private long iterationsReceived; private boolean interceptedAnythingSinceLastStep; + @Nullable + private ExternalPatternInputSink.Result lastSinkResult; ExternalTaskPattern(final Pattern pattern, final TaskPlan.PatternPlan plan) { super(pattern, plan); @@ -41,21 +45,25 @@ PatternStepResult step(final MutableResourceList internalStorage, if (expectedOutputs.isEmpty()) { return PatternStepResult.COMPLETED; } - if (interceptedAnythingSinceLastStep) { - interceptedAnythingSinceLastStep = false; - return PatternStepResult.RUNNING; - } if (iterationsToSendToSink == 0) { - return PatternStepResult.IDLE; + return idleOrRunning(); } if (!acceptsIterationInputs(internalStorage, externalPatternInputSink)) { - return PatternStepResult.IDLE; + return idleOrRunning(); } LOGGER.debug("Stepped {} with {} iterations remaining", pattern, iterationsToSendToSink); iterationsToSendToSink--; return PatternStepResult.RUNNING; } + private PatternStepResult idleOrRunning() { + if (interceptedAnythingSinceLastStep) { + interceptedAnythingSinceLastStep = false; + return PatternStepResult.RUNNING; + } + return PatternStepResult.IDLE; + } + @Override RootStorageListener.InterceptResult interceptInsertion(final ResourceKey resource, final long amount) { final long needed = expectedOutputs.get(resource); @@ -98,6 +106,13 @@ void appendStatus(final TaskStatusBuilder builder) { builder.processing(input, simulatedIterationInputs.get(input) * iterationsProcessing); } } + if (lastSinkResult != null) { + switch (lastSinkResult) { + case REJECTED -> pattern.outputs().stream().map(ResourceAmount::resource).forEach(builder::rejected); + case SKIPPED -> pattern.outputs().stream().map(ResourceAmount::resource).forEach(builder::noneFound); + case LOCKED -> pattern.outputs().stream().map(ResourceAmount::resource).forEach(builder::locked); + } + } } @Override @@ -116,7 +131,13 @@ private boolean acceptsIterationInputs(final MutableResourceList internalStorage if (!extractAll(iterationInputsSimulated, internalStorage, Action.SIMULATE)) { return false; } - if (!externalPatternInputSink.accept(pattern, iterationInputsSimulated.copyState(), Action.SIMULATE)) { + final ExternalPatternInputSink.Result simulatedResult = externalPatternInputSink.accept( + pattern, + iterationInputsSimulated.copyState(), + Action.SIMULATE + ); + lastSinkResult = simulatedResult; + if (simulatedResult != ExternalPatternInputSink.Result.ACCEPTED) { return false; } final ResourceList iterationInputs = calculateIterationInputs(Action.EXECUTE); @@ -130,7 +151,8 @@ private boolean acceptsIterationInputs(final MutableResourceList internalStorage // across the sink and the internal storage. // The end result is that we lie, do as if the insertion was successful, // and potentially void the extracted resources from the internal storage. - if (!externalPatternInputSink.accept(pattern, iterationInputs.copyState(), Action.EXECUTE)) { + if (externalPatternInputSink.accept(pattern, iterationInputs.copyState(), Action.EXECUTE) + != ExternalPatternInputSink.Result.ACCEPTED) { LOGGER.warn("External sink {} did not accept all inputs for pattern {}", externalPatternInputSink, pattern); } return true; diff --git a/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/task/TaskImpl.java b/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/task/TaskImpl.java index 883ef9501..993b05248 100644 --- a/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/task/TaskImpl.java +++ b/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/task/TaskImpl.java @@ -185,8 +185,8 @@ private PatternStepResult stepPattern(final RootStorage rootStorage, LOGGER.debug("{} completed", pattern.getKey()); completedPatterns.add(pattern.getValue()); return stepResult; - } else { - result = result.and(stepResult); + } else if (stepResult != PatternStepResult.IDLE) { + result = PatternStepResult.RUNNING; } } return result; diff --git a/refinedstorage-autocrafting-api/src/test/java/com/refinedmods/refinedstorage/api/autocrafting/task/ExternalPatternInputSinkBuilder.java b/refinedstorage-autocrafting-api/src/test/java/com/refinedmods/refinedstorage/api/autocrafting/task/ExternalPatternInputSinkBuilder.java index f34547ea9..d4c4417fe 100644 --- a/refinedstorage-autocrafting-api/src/test/java/com/refinedmods/refinedstorage/api/autocrafting/task/ExternalPatternInputSinkBuilder.java +++ b/refinedstorage-autocrafting-api/src/test/java/com/refinedmods/refinedstorage/api/autocrafting/task/ExternalPatternInputSinkBuilder.java @@ -30,7 +30,9 @@ Sink storageSink(final Pattern pattern) { ExternalPatternInputSink build() { return (pattern, resources, action) -> { final Sink sink = sinks.get(pattern); - return sink != null && sink.accept(resources, action); + return sink != null && sink.accept(resources, action) + ? ExternalPatternInputSink.Result.ACCEPTED + : ExternalPatternInputSink.Result.REJECTED; }; } diff --git a/refinedstorage-autocrafting-api/src/test/java/com/refinedmods/refinedstorage/api/autocrafting/task/TaskImplTest.java b/refinedstorage-autocrafting-api/src/test/java/com/refinedmods/refinedstorage/api/autocrafting/task/TaskImplTest.java index 4efd3bd67..d37de381b 100644 --- a/refinedstorage-autocrafting-api/src/test/java/com/refinedmods/refinedstorage/api/autocrafting/task/TaskImplTest.java +++ b/refinedstorage-autocrafting-api/src/test/java/com/refinedmods/refinedstorage/api/autocrafting/task/TaskImplTest.java @@ -54,7 +54,8 @@ class TaskImplTest { private static final RecursiveComparisonConfiguration STATUS_CONFIG = RecursiveComparisonConfiguration.builder() .withIgnoredFields("info.startTime") .build(); - private static final ExternalPatternInputSink EMPTY_SINK = (pattern, resources, action) -> false; + private static final ExternalPatternInputSink EMPTY_SINK = (pattern, resources, action) -> + ExternalPatternInputSink.Result.SKIPPED; @Test void testInitialState() { @@ -661,7 +662,9 @@ void shouldNotCompleteTaskWithExternalPatternIfSinkDoesNotAcceptResourcesOnlyWhe ); final PatternRepository patterns = patterns(IRON_INGOT_PATTERN, IRON_PICKAXE_PATTERN); final ExternalPatternInputSink sink = (pattern, resources, action) -> - action == Action.SIMULATE; + action == Action.SIMULATE + ? ExternalPatternInputSink.Result.ACCEPTED + : ExternalPatternInputSink.Result.REJECTED; final Task task = getRunningTask(storage, patterns, sink, IRON_PICKAXE, 1); assertThat(storage.getAll()).isEmpty(); @@ -946,6 +949,100 @@ void shouldReportStatusCorrectly() { ); } + @Test + void shouldReportWhetherSinkIsRejectingInputsOnStatus() { + // Arrange + final RootStorage storage = storage(new ResourceAmount(IRON_ORE, 10)); + final PatternRepository patterns = patterns(IRON_INGOT_PATTERN); + final ExternalPatternInputSinkBuilder sinkBuilder = externalPatternInputSink(); + final ExternalPatternInputSinkBuilder.Sink ironOreSink = sinkBuilder.storageSink(IRON_INGOT_PATTERN); + final ExternalPatternInputSink sink = sinkBuilder.build(); + final Task task = getRunningTask(storage, patterns, EMPTY_SINK, IRON_INGOT, 2); + + // Act & assert + task.step(storage, sink, 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) + .build(0)); + + ironOreSink.setEnabled(false); + task.step(storage, sink, 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) + .rejected(IRON_INGOT) + .build(0)); + } + + @Test + void shouldReportWhetherSinkIsNotFoundOnStatus() { + // Arrange + final RootStorage storage = storage(new ResourceAmount(IRON_ORE, 10)); + final PatternRepository patterns = patterns(IRON_INGOT_PATTERN); + final ExternalPatternInputSinkBuilder sinkBuilder = externalPatternInputSink(); + final ExternalPatternInputSinkBuilder.Sink ironOreSink = sinkBuilder.storageSink(IRON_INGOT_PATTERN); + final ExternalPatternInputSink sink = sinkBuilder.build(); + final Task task = getRunningTask(storage, patterns, EMPTY_SINK, IRON_INGOT, 2); + + // Act & assert + task.step(storage, sink, 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) + .build(0)); + + ironOreSink.setEnabled(false); + task.step(storage, EMPTY_SINK, 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) + .noneFound(IRON_INGOT) + .build(0)); + } + + @Test + void shouldReportWhetherSinkIsLockedFoundOnStatus() { + // Arrange + final RootStorage storage = storage(new ResourceAmount(IRON_ORE, 10)); + final PatternRepository patterns = patterns(IRON_INGOT_PATTERN); + final ExternalPatternInputSinkBuilder sinkBuilder = externalPatternInputSink(); + final ExternalPatternInputSinkBuilder.Sink ironOreSink = sinkBuilder.storageSink(IRON_INGOT_PATTERN); + final ExternalPatternInputSink sink = sinkBuilder.build(); + final Task task = getRunningTask(storage, patterns, EMPTY_SINK, IRON_INGOT, 2); + + // Act & assert + task.step(storage, sink, 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) + .build(0)); + + ironOreSink.setEnabled(false); + task.step( + storage, + (pattern, resources, action) -> 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) + .locked(IRON_INGOT) + .build(0)); + } + private static Task getTask(final RootStorage storage, final PatternRepository patterns, final ResourceKey resource, diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/CompositePatternProviderExternalPatternInputSink.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/CompositePatternProviderExternalPatternInputSink.java index 65c1bd285..634787dc2 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/CompositePatternProviderExternalPatternInputSink.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/CompositePatternProviderExternalPatternInputSink.java @@ -1,5 +1,6 @@ package com.refinedmods.refinedstorage.common.autocrafting; +import com.refinedmods.refinedstorage.api.autocrafting.task.ExternalPatternInputSink; import com.refinedmods.refinedstorage.api.core.Action; import com.refinedmods.refinedstorage.api.network.autocrafting.PatternProviderExternalPatternInputSink; import com.refinedmods.refinedstorage.api.resource.ResourceAmount; @@ -16,12 +17,15 @@ class CompositePatternProviderExternalPatternInputSink } @Override - public boolean accept(final Collection resources, final Action action) { + public ExternalPatternInputSink.Result accept(final Collection resources, final Action action) { + ExternalPatternInputSink.Result result = ExternalPatternInputSink.Result.SKIPPED; for (final PatternProviderExternalPatternInputSink sink : sinks) { - if (!sink.accept(resources, action)) { - return false; + final ExternalPatternInputSink.Result sinkResult = sink.accept(resources, action); + if (sinkResult == ExternalPatternInputSink.Result.REJECTED) { + return sinkResult; } + result = result.and(sinkResult); } - return true; + return result; } } diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/monitor/AutocraftingMonitorScreen.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/monitor/AutocraftingMonitorScreen.java index 192edf46b..a05169f2e 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/monitor/AutocraftingMonitorScreen.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/monitor/AutocraftingMonitorScreen.java @@ -306,9 +306,9 @@ private List getItemTooltip(final TaskStatus.Item item, f private Component getErrorTooltip(final TaskStatus.ItemType type) { return switch (type) { - case MACHINE_DOES_NOT_ACCEPT_RESOURCE -> MACHINE_DOES_NOT_ACCEPT_RESOURCE; - case NO_MACHINE_FOUND -> NO_MACHINE_FOUND; - case AUTOCRAFTER_IS_LOCKED -> AUTOCRAFTER_IS_LOCKED; + case REJECTED -> MACHINE_DOES_NOT_ACCEPT_RESOURCE; + case NONE_FOUND -> NO_MACHINE_FOUND; + case LOCKED -> AUTOCRAFTER_IS_LOCKED; default -> Component.empty(); }; } diff --git a/refinedstorage-common/src/main/resources/assets/refinedstorage/lang/en_us.json b/refinedstorage-common/src/main/resources/assets/refinedstorage/lang/en_us.json index 99441770a..ab2e5ea4e 100644 --- a/refinedstorage-common/src/main/resources/assets/refinedstorage/lang/en_us.json +++ b/refinedstorage-common/src/main/resources/assets/refinedstorage/lang/en_us.json @@ -82,7 +82,7 @@ "gui.refinedstorage.pattern_grid.processing.inputs": "Inputs", "gui.refinedstorage.pattern_grid.processing.outputs": "Outputs", "gui.refinedstorage.pattern_grid.processing.input_slots_help": "The resources that will be extracted from the storage network and will be inserted into the target inventory.", - "gui.refinedstorage.pattern_grid.processing.output_slots_help": "The resources that are expected to be returned to the storage network to deem the crafting task successful.", + "gui.refinedstorage.pattern_grid.processing.output_slots_help": "The resources that are expected to be returned to the storage network to deem the autocrafting task successful.", "gui.refinedstorage.pattern_grid.processing.click_to_configure_amount_and_alternatives": "Click to configure amount and alternatives", "gui.refinedstorage.pattern_grid.processing.allowed_alternatives": "Allowed alternatives:", "gui.refinedstorage.pattern_grid.alternatives": "Alternatives", @@ -137,7 +137,7 @@ "gui.refinedstorage.priority.insert": "Insert: %d", "gui.refinedstorage.priority.extract": "Extract: %d", "gui.refinedstorage.priority.storage_help": "The order in which the storage network will insert or extract resources, highest-first. Click to modify the insert/extract priority. Press CTRL and click to modify the insert priority. Press ALT and click to modify the extract priority.", - "gui.refinedstorage.priority.autocrafter_help": "If multiple patterns exist for one resource, crafting tasks will prioritize the pattern in the autocrafter with the highest priority.", + "gui.refinedstorage.priority.autocrafter_help": "If multiple patterns exist for one resource, autocrafting tasks will prioritize the pattern in the autocrafter with the highest priority.", "gui.refinedstorage.configure_amount": "Configure amount", "gui.refinedstorage.configure_amount.reset": "Reset", "gui.refinedstorage.configure_amount.set": "Set", @@ -171,7 +171,7 @@ "gui.refinedstorage.filter_slot.right_click_for": "Right click for", "gui.refinedstorage.filter_slot.click_to_clear": "Click to clear", "gui.refinedstorage.filter_slot.click_to_configure_amount": "Click to configure amount", - "gui.refinedstorage.filter_slot.shift_click_to_clear": "Shift click to clear", + "gui.refinedstorage.filter_slot.shift_click_to_clear": "SHIFT click to clear", "gui.refinedstorage.regulator_upgrade.filter_help": "The resource that should be regulated in the target.", "gui.refinedstorage.network_transmitter.status.inactive": "Inactive", "gui.refinedstorage.network_transmitter.status.missing_network_card": "Missing Network Card", @@ -199,7 +199,7 @@ "gui.refinedstorage.disk_interface.filter_mode.block.help": "Disallow resources into the storage disks or into the network that are configured in the filters.", "gui.refinedstorage.disk_interface.in": "In", "gui.refinedstorage.disk_interface.out": "Out", - "gui.refinedstorage.disk_interface.filter_help": "The resources that may or may not be allowed transferred from or into the provided storage disks, depending if the device is in allowlist or blocklist mode.", + "gui.refinedstorage.disk_interface.filter_help": "The resources that may or may not be transferred from or into the provided storage disks, depending if the device is in allowlist or blocklist mode.", "gui.refinedstorage.disk_interface.transfer_mode": "Transfer mode", "gui.refinedstorage.disk_interface.transfer_mode.insert_into_network": "Insert into network", "gui.refinedstorage.disk_interface.transfer_mode.insert_into_network.help": "Insert the resources from the storage disks into the storage network.", @@ -472,7 +472,7 @@ "text.autoconfig.refinedstorage.option.grid.largeFont": "Large font", "text.autoconfig.refinedstorage.option.grid.largeFont.tooltip": "Whether the Grid should use a large font for quantities.", "text.autoconfig.refinedstorage.option.grid.preventSortingWhileShiftIsDown": "Prevent sorting while SHIFT is down", - "text.autoconfig.refinedstorage.option.grid.preventSortingWhileShiftIsDown.tooltip": "Whether the Grid should avoid sorting when shift is held down.", + "text.autoconfig.refinedstorage.option.grid.preventSortingWhileShiftIsDown.tooltip": "Whether the Grid should avoid sorting when SHIFT is held down.", "text.autoconfig.refinedstorage.option.grid.detailedTooltip": "Detailed tooltip", "text.autoconfig.refinedstorage.option.grid.detailedTooltip.tooltip": "Whether the Grid should show a detailed tooltip.", "text.autoconfig.refinedstorage.option.grid.rememberSearchQuery": "Remember search query", diff --git a/refinedstorage-fabric-api/src/main/java/com/refinedmods/refinedstorage/fabric/api/FabricStorageExternalPatternInputSinkStrategy.java b/refinedstorage-fabric-api/src/main/java/com/refinedmods/refinedstorage/fabric/api/FabricStorageExternalPatternInputSinkStrategy.java index 27fa022f6..b15d8e277 100644 --- a/refinedstorage-fabric-api/src/main/java/com/refinedmods/refinedstorage/fabric/api/FabricStorageExternalPatternInputSinkStrategy.java +++ b/refinedstorage-fabric-api/src/main/java/com/refinedmods/refinedstorage/fabric/api/FabricStorageExternalPatternInputSinkStrategy.java @@ -1,5 +1,6 @@ package com.refinedmods.refinedstorage.fabric.api; +import com.refinedmods.refinedstorage.api.autocrafting.task.ExternalPatternInputSink; import com.refinedmods.refinedstorage.api.resource.ResourceAmount; import java.util.Collection; @@ -9,5 +10,5 @@ @API(status = API.Status.STABLE, since = "2.0.0-milestone.4.12") public interface FabricStorageExternalPatternInputSinkStrategy { - boolean accept(Transaction tx, Collection resources); + ExternalPatternInputSink.Result accept(Transaction tx, Collection resources); } diff --git a/refinedstorage-fabric/src/main/java/com/refinedmods/refinedstorage/fabric/autocrafting/FabricStorageExternalPatternInputSinkStrategyImpl.java b/refinedstorage-fabric/src/main/java/com/refinedmods/refinedstorage/fabric/autocrafting/FabricStorageExternalPatternInputSinkStrategyImpl.java index d04fedb94..7ef7bffea 100644 --- a/refinedstorage-fabric/src/main/java/com/refinedmods/refinedstorage/fabric/autocrafting/FabricStorageExternalPatternInputSinkStrategyImpl.java +++ b/refinedstorage-fabric/src/main/java/com/refinedmods/refinedstorage/fabric/autocrafting/FabricStorageExternalPatternInputSinkStrategyImpl.java @@ -1,5 +1,6 @@ package com.refinedmods.refinedstorage.fabric.autocrafting; +import com.refinedmods.refinedstorage.api.autocrafting.task.ExternalPatternInputSink; import com.refinedmods.refinedstorage.api.core.NullableType; import com.refinedmods.refinedstorage.api.resource.ResourceAmount; import com.refinedmods.refinedstorage.api.resource.ResourceKey; @@ -34,20 +35,24 @@ class FabricStorageExternalPatternInputSinkStrategyImpl implements FabricStor } @Override - public boolean accept(final Transaction tx, final Collection resources) { + public ExternalPatternInputSink.Result accept(final Transaction tx, final Collection resources) { + boolean anyResourceWasApplicable = false; for (final ResourceAmount resourceAmount : resources) { final T platformResource = toPlatformMapper.apply(resourceAmount.resource()); if (platformResource == null) { continue; } + anyResourceWasApplicable = true; final Storage storage = cache.find(direction); if (storage == null) { - return false; + return ExternalPatternInputSink.Result.SKIPPED; } if (storage.insert(platformResource, resourceAmount.amount(), tx) != resourceAmount.amount()) { - return false; + return ExternalPatternInputSink.Result.REJECTED; } } - return true; + return anyResourceWasApplicable + ? ExternalPatternInputSink.Result.ACCEPTED + : ExternalPatternInputSink.Result.SKIPPED; } } diff --git a/refinedstorage-fabric/src/main/java/com/refinedmods/refinedstorage/fabric/autocrafting/FabricStoragePatternProviderExternalPatternInputSink.java b/refinedstorage-fabric/src/main/java/com/refinedmods/refinedstorage/fabric/autocrafting/FabricStoragePatternProviderExternalPatternInputSink.java index 0a8f5bbbe..8f28959c7 100644 --- a/refinedstorage-fabric/src/main/java/com/refinedmods/refinedstorage/fabric/autocrafting/FabricStoragePatternProviderExternalPatternInputSink.java +++ b/refinedstorage-fabric/src/main/java/com/refinedmods/refinedstorage/fabric/autocrafting/FabricStoragePatternProviderExternalPatternInputSink.java @@ -1,5 +1,6 @@ package com.refinedmods.refinedstorage.fabric.autocrafting; +import com.refinedmods.refinedstorage.api.autocrafting.task.ExternalPatternInputSink; import com.refinedmods.refinedstorage.api.core.Action; import com.refinedmods.refinedstorage.api.network.autocrafting.PatternProviderExternalPatternInputSink; import com.refinedmods.refinedstorage.api.resource.ResourceAmount; @@ -20,17 +21,20 @@ class FabricStoragePatternProviderExternalPatternInputSink implements PatternPro } @Override - public boolean accept(final Collection resources, final Action action) { + public ExternalPatternInputSink.Result accept(final Collection resources, final Action action) { + ExternalPatternInputSink.Result result = ExternalPatternInputSink.Result.SKIPPED; try (Transaction tx = Transaction.openOuter()) { for (final FabricStorageExternalPatternInputSinkStrategy strategy : strategies) { - if (!strategy.accept(tx, resources)) { - return false; + final ExternalPatternInputSink.Result strategyResult = strategy.accept(tx, resources); + if (strategyResult == ExternalPatternInputSink.Result.REJECTED) { + return strategyResult; } + result = result.and(strategyResult); } if (action == Action.EXECUTE) { tx.commit(); } } - return true; + return result; } } diff --git a/refinedstorage-neoforge/src/main/java/com/refinedmods/refinedstorage/neoforge/autocrafting/FluidHandlerExternalPatternProviderInputSink.java b/refinedstorage-neoforge/src/main/java/com/refinedmods/refinedstorage/neoforge/autocrafting/FluidHandlerExternalPatternProviderInputSink.java index 07d316310..f79f96b28 100644 --- a/refinedstorage-neoforge/src/main/java/com/refinedmods/refinedstorage/neoforge/autocrafting/FluidHandlerExternalPatternProviderInputSink.java +++ b/refinedstorage-neoforge/src/main/java/com/refinedmods/refinedstorage/neoforge/autocrafting/FluidHandlerExternalPatternProviderInputSink.java @@ -1,5 +1,6 @@ package com.refinedmods.refinedstorage.neoforge.autocrafting; +import com.refinedmods.refinedstorage.api.autocrafting.task.ExternalPatternInputSink; import com.refinedmods.refinedstorage.api.core.Action; import com.refinedmods.refinedstorage.api.network.autocrafting.PatternProviderExternalPatternInputSink; import com.refinedmods.refinedstorage.api.resource.ResourceAmount; @@ -25,22 +26,22 @@ class FluidHandlerExternalPatternProviderInputSink implements PatternProviderExt } @Override - public boolean accept(final Collection resources, final Action action) { + public ExternalPatternInputSink.Result accept(final Collection resources, final Action action) { return capabilityCache.getFluidHandler() .map(handler -> accept(resources, action, handler)) - .orElse(true); + .orElse(ExternalPatternInputSink.Result.SKIPPED); } - private boolean accept(final Collection resources, - final Action action, - final IFluidHandler handler) { + private ExternalPatternInputSink.Result accept(final Collection resources, + final Action action, + final IFluidHandler handler) { for (final ResourceAmount resource : resources) { if (resource.resource() instanceof FluidResource fluidResource && !accept(action, handler, resource.amount(), fluidResource)) { - return false; + return ExternalPatternInputSink.Result.REJECTED; } } - return true; + return ExternalPatternInputSink.Result.ACCEPTED; } private boolean accept(final Action action, diff --git a/refinedstorage-neoforge/src/main/java/com/refinedmods/refinedstorage/neoforge/autocrafting/ItemHandlerExternalPatternProviderInputSink.java b/refinedstorage-neoforge/src/main/java/com/refinedmods/refinedstorage/neoforge/autocrafting/ItemHandlerExternalPatternProviderInputSink.java index 57b3dbe18..f0cf50773 100644 --- a/refinedstorage-neoforge/src/main/java/com/refinedmods/refinedstorage/neoforge/autocrafting/ItemHandlerExternalPatternProviderInputSink.java +++ b/refinedstorage-neoforge/src/main/java/com/refinedmods/refinedstorage/neoforge/autocrafting/ItemHandlerExternalPatternProviderInputSink.java @@ -1,5 +1,6 @@ package com.refinedmods.refinedstorage.neoforge.autocrafting; +import com.refinedmods.refinedstorage.api.autocrafting.task.ExternalPatternInputSink; import com.refinedmods.refinedstorage.api.core.Action; import com.refinedmods.refinedstorage.api.network.autocrafting.PatternProviderExternalPatternInputSink; import com.refinedmods.refinedstorage.api.resource.ResourceAmount; @@ -28,15 +29,15 @@ class ItemHandlerExternalPatternProviderInputSink implements PatternProviderExte } @Override - public boolean accept(final Collection resources, final Action action) { + public ExternalPatternInputSink.Result accept(final Collection resources, final Action action) { return capabilityCache.getItemHandler() .map(handler -> accept(resources, action, handler)) - .orElse(true); + .orElse(ExternalPatternInputSink.Result.SKIPPED); } - private boolean accept(final Collection resources, - final Action action, - final IItemHandler handler) { + private ExternalPatternInputSink.Result accept(final Collection resources, + final Action action, + final IItemHandler handler) { final Deque stacks = getStacks(resources); ItemStack current = stacks.poll(); final List availableSlots = IntStream.range(0, handler.getSlots()) @@ -60,7 +61,7 @@ private boolean accept(final Collection resources, stacks ); } - return success; + return success ? ExternalPatternInputSink.Result.ACCEPTED : ExternalPatternInputSink.Result.REJECTED; } private ItemStack insert(final Action action, diff --git a/refinedstorage-network-api/src/main/java/com/refinedmods/refinedstorage/api/network/autocrafting/PatternProviderExternalPatternInputSink.java b/refinedstorage-network-api/src/main/java/com/refinedmods/refinedstorage/api/network/autocrafting/PatternProviderExternalPatternInputSink.java index 962171f04..3417e17d8 100644 --- a/refinedstorage-network-api/src/main/java/com/refinedmods/refinedstorage/api/network/autocrafting/PatternProviderExternalPatternInputSink.java +++ b/refinedstorage-network-api/src/main/java/com/refinedmods/refinedstorage/api/network/autocrafting/PatternProviderExternalPatternInputSink.java @@ -1,5 +1,6 @@ package com.refinedmods.refinedstorage.api.network.autocrafting; +import com.refinedmods.refinedstorage.api.autocrafting.task.ExternalPatternInputSink; import com.refinedmods.refinedstorage.api.core.Action; import com.refinedmods.refinedstorage.api.resource.ResourceAmount; @@ -10,5 +11,5 @@ @API(status = API.Status.STABLE, since = "2.0.0-milestone.4.12") @FunctionalInterface public interface PatternProviderExternalPatternInputSink { - boolean accept(Collection resources, Action action); + ExternalPatternInputSink.Result accept(Collection resources, Action action); } diff --git a/refinedstorage-network/src/main/java/com/refinedmods/refinedstorage/api/network/impl/autocrafting/AutocraftingNetworkComponentImpl.java b/refinedstorage-network/src/main/java/com/refinedmods/refinedstorage/api/network/impl/autocrafting/AutocraftingNetworkComponentImpl.java index f0294f5f9..1d96e95d9 100644 --- a/refinedstorage-network/src/main/java/com/refinedmods/refinedstorage/api/network/impl/autocrafting/AutocraftingNetworkComponentImpl.java +++ b/refinedstorage-network/src/main/java/com/refinedmods/refinedstorage/api/network/impl/autocrafting/AutocraftingNetworkComponentImpl.java @@ -232,10 +232,10 @@ public void taskChanged(final Task task) { // TODO(feat): processing pattern balancing @Override - public boolean accept(final Pattern pattern, final Collection resources, final Action action) { + public Result accept(final Pattern pattern, final Collection resources, final Action action) { final PatternProvider patternProvider = providerByPattern.get(pattern); if (patternProvider == null) { - return false; + return Result.SKIPPED; } return patternProvider.accept(resources, action); } diff --git a/refinedstorage-network/src/main/java/com/refinedmods/refinedstorage/api/network/impl/node/patternprovider/PatternProviderNetworkNode.java b/refinedstorage-network/src/main/java/com/refinedmods/refinedstorage/api/network/impl/node/patternprovider/PatternProviderNetworkNode.java index 05a53b233..0584a9bbd 100644 --- a/refinedstorage-network/src/main/java/com/refinedmods/refinedstorage/api/network/impl/node/patternprovider/PatternProviderNetworkNode.java +++ b/refinedstorage-network/src/main/java/com/refinedmods/refinedstorage/api/network/impl/node/patternprovider/PatternProviderNetworkNode.java @@ -146,9 +146,9 @@ private void cleanupTask(final Task task, final StorageNetworkComponent storage) } @Override - public boolean accept(final Collection resources, final Action action) { + public ExternalPatternInputSink.Result accept(final Collection resources, final Action action) { if (externalPatternInputSink == null) { - return false; + return ExternalPatternInputSink.Result.SKIPPED; } return externalPatternInputSink.accept(resources, action); } diff --git a/refinedstorage-network/src/main/java/com/refinedmods/refinedstorage/api/network/impl/node/relay/RelayOutputNetworkNode.java b/refinedstorage-network/src/main/java/com/refinedmods/refinedstorage/api/network/impl/node/relay/RelayOutputNetworkNode.java index b99112abc..016318bea 100644 --- a/refinedstorage-network/src/main/java/com/refinedmods/refinedstorage/api/network/impl/node/relay/RelayOutputNetworkNode.java +++ b/refinedstorage-network/src/main/java/com/refinedmods/refinedstorage/api/network/impl/node/relay/RelayOutputNetworkNode.java @@ -1,6 +1,7 @@ package com.refinedmods.refinedstorage.api.network.impl.node.relay; import com.refinedmods.refinedstorage.api.autocrafting.status.TaskStatus; +import com.refinedmods.refinedstorage.api.autocrafting.task.ExternalPatternInputSink; import com.refinedmods.refinedstorage.api.autocrafting.task.Task; import com.refinedmods.refinedstorage.api.autocrafting.task.TaskId; import com.refinedmods.refinedstorage.api.core.Action; @@ -180,7 +181,7 @@ public void onRemovedFromContainer(final ParentContainer parentContainer) { } @Override - public boolean accept(final Collection resources, final Action action) { - return false; // TODO(feat): relay support + public ExternalPatternInputSink.Result accept(final Collection resources, final Action action) { + return ExternalPatternInputSink.Result.SKIPPED; // TODO(feat): relay support } } diff --git a/refinedstorage-network/src/main/java/com/refinedmods/refinedstorage/api/network/impl/node/relay/RelayOutputPatternProvider.java b/refinedstorage-network/src/main/java/com/refinedmods/refinedstorage/api/network/impl/node/relay/RelayOutputPatternProvider.java index d5a9efb79..1a78e7ebd 100644 --- a/refinedstorage-network/src/main/java/com/refinedmods/refinedstorage/api/network/impl/node/relay/RelayOutputPatternProvider.java +++ b/refinedstorage-network/src/main/java/com/refinedmods/refinedstorage/api/network/impl/node/relay/RelayOutputPatternProvider.java @@ -2,6 +2,7 @@ import com.refinedmods.refinedstorage.api.autocrafting.Pattern; import com.refinedmods.refinedstorage.api.autocrafting.status.TaskStatus; +import com.refinedmods.refinedstorage.api.autocrafting.task.ExternalPatternInputSink; import com.refinedmods.refinedstorage.api.autocrafting.task.Task; import com.refinedmods.refinedstorage.api.autocrafting.task.TaskId; import com.refinedmods.refinedstorage.api.core.Action; @@ -128,7 +129,7 @@ public void onRemovedFromContainer(final ParentContainer parentContainer) { } @Override - public boolean accept(final Collection resources, final Action action) { - return false; // TODO(feat): relay support + public ExternalPatternInputSink.Result accept(final Collection resources, final Action action) { + return ExternalPatternInputSink.Result.SKIPPED; // TODO(feat): relay support } } diff --git a/refinedstorage-network/src/test/java/com/refinedmods/refinedstorage/api/network/impl/node/patternprovider/PatternProviderNetworkNodeTest.java b/refinedstorage-network/src/test/java/com/refinedmods/refinedstorage/api/network/impl/node/patternprovider/PatternProviderNetworkNodeTest.java index f4845d08d..60e54410f 100644 --- a/refinedstorage-network/src/test/java/com/refinedmods/refinedstorage/api/network/impl/node/patternprovider/PatternProviderNetworkNodeTest.java +++ b/refinedstorage-network/src/test/java/com/refinedmods/refinedstorage/api/network/impl/node/patternprovider/PatternProviderNetworkNodeTest.java @@ -4,6 +4,7 @@ import com.refinedmods.refinedstorage.api.autocrafting.PatternType; import com.refinedmods.refinedstorage.api.autocrafting.status.TaskStatus; import com.refinedmods.refinedstorage.api.autocrafting.status.TaskStatusListener; +import com.refinedmods.refinedstorage.api.autocrafting.task.ExternalPatternInputSink; import com.refinedmods.refinedstorage.api.autocrafting.task.StepBehavior; import com.refinedmods.refinedstorage.api.autocrafting.task.TaskId; import com.refinedmods.refinedstorage.api.core.Action; @@ -264,7 +265,7 @@ void shouldUseProviderAsSinkForExternalPatternInputsWhenSinkIsAttached( resources.forEach(resource -> sinkContents.insert(resource.resource(), resource.amount(), Action.EXECUTE, Actor.EMPTY)); } - return true; + return ExternalPatternInputSink.Result.ACCEPTED; }); assertThat(autocrafting.startTask(B, 1, Actor.EMPTY, false).join()).isPresent(); @@ -307,7 +308,7 @@ void shouldUseProviderAsSinkForExternalPatternInputsWhenSinkIsAttachedAndDoesNot storage.insert(A, 10, Action.EXECUTE, Actor.EMPTY); sut.setPattern(1, pattern(PatternType.EXTERNAL).ingredient(A, 3).output(B, 1).build()); - sut.setExternalPatternInputSink((resources, action) -> false); + sut.setExternalPatternInputSink((resources, action) -> ExternalPatternInputSink.Result.REJECTED); assertThat(autocrafting.startTask(B, 1, Actor.EMPTY, false).join()).isPresent(); // Act & assert @@ -385,7 +386,7 @@ void shouldInterceptNetworkInsertionsWhenWaitingForExternalPatternOutputs( sut.setPattern(1, pattern(PatternType.EXTERNAL).ingredient(A, 3).output(B, 5).build()); // swallow resources - sut.setExternalPatternInputSink((resources, action) -> true); + sut.setExternalPatternInputSink((resources, action) -> ExternalPatternInputSink.Result.ACCEPTED); // Act & assert assertThat(autocrafting.startTask(B, 1, Actor.EMPTY, false).join()).isPresent(); @@ -517,7 +518,7 @@ void shouldNotifyStatusListenerWhenTaskHasChanged( sut.setPattern(1, pattern(PatternType.EXTERNAL).ingredient(A, 1).output(B, 1).build()); // swallow resources - sut.setExternalPatternInputSink((resources, action) -> true); + sut.setExternalPatternInputSink((resources, action) -> ExternalPatternInputSink.Result.ACCEPTED); // Act & assert assertThat(autocrafting.startTask(B, 2, Actor.EMPTY, false).join()).isPresent(); @@ -634,7 +635,7 @@ void shouldInterceptInsertionsOnNewNetworkWhenNetworkChanges( .output(B, 1) .build()); // swallow resources - sut.setExternalPatternInputSink((resources, action) -> true); + sut.setExternalPatternInputSink((resources, action) -> ExternalPatternInputSink.Result.ACCEPTED); // Act & assert assertThat(autocrafting.startTask(A, 3, Actor.EMPTY, false).join()).isPresent();