diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 4dca9cddc..1668531fd 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -8,7 +8,7 @@ on:
types: [ opened, synchronize, reopened ]
jobs:
build:
- uses: refinedmods/refinedarchitect/.github/workflows/build.yml@v0.20.0
+ uses: refinedmods/refinedarchitect/.github/workflows/build.yml@v0.21.0
with:
gametests: true
secrets: inherit
diff --git a/.github/workflows/draft-release.yml b/.github/workflows/draft-release.yml
index d93999737..53cb06636 100644
--- a/.github/workflows/draft-release.yml
+++ b/.github/workflows/draft-release.yml
@@ -17,7 +17,7 @@ on:
type: string
jobs:
draft:
- uses: refinedmods/refinedarchitect/.github/workflows/draft-release.yml@v0.20.0
+ uses: refinedmods/refinedarchitect/.github/workflows/draft-release.yml@v0.21.0
with:
release-type: ${{ inputs.release-type }}
version-number-override: ${{ inputs.version-number-override }}
diff --git a/.github/workflows/issue-for-unsupported-version.yml b/.github/workflows/issue-for-unsupported-version.yml
index 299dcb139..d902c53c9 100644
--- a/.github/workflows/issue-for-unsupported-version.yml
+++ b/.github/workflows/issue-for-unsupported-version.yml
@@ -4,4 +4,4 @@ on:
types: [ labeled, unlabeled, reopened ]
jobs:
unsupported-labeler:
- uses: refinedmods/refinedarchitect/.github/workflows/issue-for-unsupported-version.yml@v0.20.0
\ No newline at end of file
+ uses: refinedmods/refinedarchitect/.github/workflows/issue-for-unsupported-version.yml@v0.21.0
\ No newline at end of file
diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml
index fea3cfaa7..14c98b262 100644
--- a/.github/workflows/publish-release.yml
+++ b/.github/workflows/publish-release.yml
@@ -7,7 +7,7 @@ on:
- closed
jobs:
publish-release:
- uses: refinedmods/refinedarchitect/.github/workflows/publish-release.yml@v0.20.0
+ uses: refinedmods/refinedarchitect/.github/workflows/publish-release.yml@v0.21.0
secrets: inherit
with:
project-name: 'Refined Storage'
diff --git a/.github/workflows/resolved-issue-locking.yml b/.github/workflows/resolved-issue-locking.yml
index 48e9142ed..2faee0de3 100644
--- a/.github/workflows/resolved-issue-locking.yml
+++ b/.github/workflows/resolved-issue-locking.yml
@@ -4,4 +4,4 @@ on:
- cron: '0 0 * * 1'
jobs:
lock:
- uses: refinedmods/refinedarchitect/.github/workflows/resolved-issue-locking.yml@v0.20.0
\ No newline at end of file
+ uses: refinedmods/refinedarchitect/.github/workflows/resolved-issue-locking.yml@v0.21.0
\ No newline at end of file
diff --git a/.github/workflows/validate-branch-name.yml b/.github/workflows/validate-branch-name.yml
index bd5a15790..7aa4f80c7 100644
--- a/.github/workflows/validate-branch-name.yml
+++ b/.github/workflows/validate-branch-name.yml
@@ -2,4 +2,4 @@ name: Validate branch name
on: [ pull_request ]
jobs:
validate-branch-name:
- uses: refinedmods/refinedarchitect/.github/workflows/validate-branch-name.yml@v0.20.0
\ No newline at end of file
+ uses: refinedmods/refinedarchitect/.github/workflows/validate-branch-name.yml@v0.21.0
\ No newline at end of file
diff --git a/.github/workflows/validate-changelog.yml b/.github/workflows/validate-changelog.yml
index d18cbc9ba..7688254ea 100644
--- a/.github/workflows/validate-changelog.yml
+++ b/.github/workflows/validate-changelog.yml
@@ -4,4 +4,4 @@ on:
types: [ opened, synchronize, reopened, ready_for_review, labeled, unlabeled ]
jobs:
validate-changelog:
- uses: refinedmods/refinedarchitect/.github/workflows/validate-changelog.yml@v0.20.0
\ No newline at end of file
+ uses: refinedmods/refinedarchitect/.github/workflows/validate-changelog.yml@v0.21.0
\ No newline at end of file
diff --git a/.github/workflows/validate-commit-messages.yml b/.github/workflows/validate-commit-messages.yml
index 3005b5ace..a2f43c243 100644
--- a/.github/workflows/validate-commit-messages.yml
+++ b/.github/workflows/validate-commit-messages.yml
@@ -2,4 +2,4 @@ name: Validate commit messages
on: [ pull_request ]
jobs:
validate-commit-messages:
- uses: refinedmods/refinedarchitect/.github/workflows/validate-commit-messages.yml@v0.20.0
\ No newline at end of file
+ uses: refinedmods/refinedarchitect/.github/workflows/validate-commit-messages.yml@v0.21.0
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 056a68741..452b10981 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,21 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
+## [2.0.0-milestone.4.13] - 2025-02-01
+
+### Added
+
+- Colored variants are now moved to a separate creative mode tab.
+- You can now start autocrafting tasks in the Relay's output network, using patterns and autocrafters from the input network.
+
+### Fixed
+
+- Fixed Crafter and Security Manager bottom sides being lit on NeoForge.
+- Fixed pattern input slot in the Pattern Grid not being accessible as an external inventory.
+- Fixed duplication bug with the Crafting Grid matrix and insert-only storages.
+- Fixed not being able to deselect the Grid search box.
+- Fixed Storage Block not showing the amount and capacity when inactive.
+
## [2.0.0-milestone.4.12] - 2025-01-27
### Added
@@ -849,7 +864,9 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
- The Grid can now use smooth scrolling.
- The Grid now has syntax highlighting for the search query.
-[Unreleased]: https://github.com/refinedmods/refinedstorage2/compare/v2.0.0-milestone.4.12...HEAD
+[Unreleased]: https://github.com/refinedmods/refinedstorage2/compare/v2.0.0-milestone.4.13...HEAD
+
+[2.0.0-milestone.4.13]: https://github.com/refinedmods/refinedstorage2/compare/v2.0.0-milestone.4.12...v2.0.0-milestone.4.13
[2.0.0-milestone.4.12]: https://github.com/refinedmods/refinedstorage2/compare/v2.0.0-milestone.4.11...v2.0.0-milestone.4.12
diff --git a/README.md b/README.md
index 36620222b..9c609f0e3 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@
Refined Storage is a mass storage mod for Minecraft that offers the player a network-based storage system, allowing
them to store items and fluids on a massively expandable device network.
-[![Build Status](https://github.com/refinedmods/refinedstorage2/actions/workflows/build.yml/badge.svg?branch=develop)](https://github.com/refinedmods/refinedstorage2/actions/workflows/build.yml) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=refinedmods_refinedstorage2&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=refinedmods_refinedstorage2) [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=refinedmods_refinedstorage2&metric=coverage)](https://sonarcloud.io/summary/new_code?id=refinedmods_refinedstorage2) [![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=refinedmods_refinedstorage2&metric=code_smells)](https://sonarcloud.io/summary/new_code?id=refinedmods_refinedstorage2) [![Crowdin](https://badges.crowdin.net/refined-storage-2/localized.svg)](https://crowdin.com/project/refined-storage-2) [![Downloads on CurseForge](http://cf.way2muchnoise.eu/full_243076_downloads.svg)](http://minecraft.curseforge.com/projects/refined-storage) [![Downloads on Modrinth](https://img.shields.io/modrinth/dt/refined-storage?logo=modrinth)](https://modrinth.com/mod/refined-storage) [![Discord](https://img.shields.io/discord/342942776494653441)](https://discordapp.com/invite/VYzsydb) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE.md)
+[![Build Status](https://github.com/refinedmods/refinedstorage2/actions/workflows/build.yml/badge.svg?branch=develop)](https://github.com/refinedmods/refinedstorage2/actions/workflows/build.yml) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=refinedmods_refinedstorage2&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=refinedmods_refinedstorage2) [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=refinedmods_refinedstorage2&metric=coverage)](https://sonarcloud.io/summary/new_code?id=refinedmods_refinedstorage2) [![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=refinedmods_refinedstorage2&metric=code_smells)](https://sonarcloud.io/summary/new_code?id=refinedmods_refinedstorage2) [![Crowdin](https://badges.crowdin.net/refined-storage-2/localized.svg)](https://crowdin.com/project/refined-storage-2) [![Downloads on CurseForge](http://cf.way2muchnoise.eu/full_243076_downloads.svg)](https://www.curseforge.com/minecraft/mc-mods/refined-storage) [![Downloads on Modrinth](https://img.shields.io/modrinth/dt/refined-storage?logo=modrinth)](https://modrinth.com/mod/refined-storage) [![Discord](https://img.shields.io/discord/342942776494653441)](https://discordapp.com/invite/VYzsydb) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE.md)
## About
diff --git a/build.gradle.kts b/build.gradle.kts
index b854b533d..e7891180d 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -13,17 +13,6 @@ subprojects {
group = "com.refinedmods.refinedstorage"
}
-/* publish all subprojects to mavenLocal */
-subprojects {
- apply(plugin = "maven-publish")
-
- publishing {
- repositories {
- mavenLocal()
- }
- }
-}
-
project.extensions.getByType().apply {
properties {
property(
diff --git a/gradle.properties b/gradle.properties
index 71fe28b3e..9c1d0228c 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,4 +1,4 @@
-refinedarchitectVersion=0.20.0
+refinedarchitectVersion=0.21.0
# Gradle
org.gradle.jvmargs=-Xmx1G
org.gradle.configureondemand=true
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 9355b4155..94113f200 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
diff --git a/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/task/ExternalPatternSink.java b/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/task/ExternalPatternSink.java
index 9fb98ac66..a2d3915e1 100644
--- a/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/task/ExternalPatternSink.java
+++ b/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/task/ExternalPatternSink.java
@@ -21,11 +21,12 @@ public interface ExternalPatternSink {
* If the sink is locked, it must return {@link Result#LOCKED}.
* If the resources are not applicable for this sink, it must return {@link Result#SKIPPED}.
*
+ * @param pattern the pattern
* @param resources the resources
* @param action the action
* @return the result
*/
- Result accept(Collection resources, Action action);
+ Result accept(Pattern pattern, Collection resources, Action action);
/**
* @return the key for this sink
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 601939eed..b04216d16 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
@@ -194,7 +194,7 @@ 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 (sink.accept(iterationInputs.copyState(), Action.EXECUTE) != ExternalPatternSink.Result.ACCEPTED) {
+ if (sink.accept(pattern, iterationInputs.copyState(), Action.EXECUTE) != ExternalPatternSink.Result.ACCEPTED) {
LOGGER.warn("Sink {} did not accept all inputs for pattern {}", sink, pattern);
}
return true;
@@ -209,6 +209,7 @@ private ExternalPatternSink getSinkThatIsAcceptingResources(final List resources, final Action action) {
+ public Result accept(final Pattern p,
+ final Collection resources,
+ final Action action) {
if (fixedResult != null) {
return fixedResult;
}
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 abbb5e982..7f0ce2df4 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
@@ -765,7 +765,7 @@ void shouldNotCompleteTaskWithExternalPatternIfSinkDoesNotAcceptResourcesOnlyWhe
);
final PatternRepository patterns = patterns(IRON_INGOT_PATTERN, IRON_PICKAXE_PATTERN);
final ExternalPatternSinkProviderImpl sinkProvider = new ExternalPatternSinkProviderImpl();
- sinkProvider.put(IRON_INGOT_PATTERN, (resources, action) -> action == Action.EXECUTE
+ sinkProvider.put(IRON_INGOT_PATTERN, (pattern, resources, action) -> action == Action.EXECUTE
? ExternalPatternSink.Result.REJECTED
: ExternalPatternSink.Result.ACCEPTED);
final Task task = getRunningTask(storage, patterns, sinkProvider, IRON_PICKAXE, 1);
diff --git a/refinedstorage-common-api/src/main/java/com/refinedmods/refinedstorage/common/api/RefinedStorageApi.java b/refinedstorage-common-api/src/main/java/com/refinedmods/refinedstorage/common/api/RefinedStorageApi.java
index df9b03521..36e7296db 100644
--- a/refinedstorage-common-api/src/main/java/com/refinedmods/refinedstorage/common/api/RefinedStorageApi.java
+++ b/refinedstorage-common-api/src/main/java/com/refinedmods/refinedstorage/common/api/RefinedStorageApi.java
@@ -208,6 +208,8 @@ EnergyStorage asBlockItemEnergyStorage(
ResourceLocation getCreativeModeTabId();
+ ResourceLocation getColoredCreativeModeTabId();
+
AbstractNetworkNodeContainerBlockEntity> createStorageBlockEntity(BlockPos pos,
BlockState state,
StorageBlockProvider provider);
diff --git a/refinedstorage-common-api/src/main/java/com/refinedmods/refinedstorage/common/api/RefinedStorageApiProxy.java b/refinedstorage-common-api/src/main/java/com/refinedmods/refinedstorage/common/api/RefinedStorageApiProxy.java
index ca69ed38f..4f067043e 100644
--- a/refinedstorage-common-api/src/main/java/com/refinedmods/refinedstorage/common/api/RefinedStorageApiProxy.java
+++ b/refinedstorage-common-api/src/main/java/com/refinedmods/refinedstorage/common/api/RefinedStorageApiProxy.java
@@ -402,6 +402,11 @@ public ResourceLocation getCreativeModeTabId() {
return ensureLoaded().getCreativeModeTabId();
}
+ @Override
+ public ResourceLocation getColoredCreativeModeTabId() {
+ return ensureLoaded().getColoredCreativeModeTabId();
+ }
+
@Override
public AbstractNetworkNodeContainerBlockEntity> createStorageBlockEntity(final BlockPos pos,
final BlockState state,
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/black.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/black.json
index 31dc22334..12917a2e1 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/black.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/black.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/autocrafter/cutouts/side/black",
"cutout_north": "refinedstorage:block/autocrafter/cutouts/side/black",
"cutout_south": "refinedstorage:block/autocrafter/cutouts/side/black",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/blue.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/blue.json
index 8b871805f..adf4f8ebc 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/blue.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/blue.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/autocrafter/cutouts/side/blue",
"cutout_north": "refinedstorage:block/autocrafter/cutouts/side/blue",
"cutout_south": "refinedstorage:block/autocrafter/cutouts/side/blue",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/brown.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/brown.json
index 6c90bac5c..49376454f 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/brown.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/brown.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/autocrafter/cutouts/side/brown",
"cutout_north": "refinedstorage:block/autocrafter/cutouts/side/brown",
"cutout_south": "refinedstorage:block/autocrafter/cutouts/side/brown",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/cyan.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/cyan.json
index 71ae49092..913824da5 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/cyan.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/cyan.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/autocrafter/cutouts/side/cyan",
"cutout_north": "refinedstorage:block/autocrafter/cutouts/side/cyan",
"cutout_south": "refinedstorage:block/autocrafter/cutouts/side/cyan",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/gray.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/gray.json
index 286ad7726..ad430b42d 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/gray.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/gray.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/autocrafter/cutouts/side/gray",
"cutout_north": "refinedstorage:block/autocrafter/cutouts/side/gray",
"cutout_south": "refinedstorage:block/autocrafter/cutouts/side/gray",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/green.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/green.json
index 931e5c24c..2c9cdc86d 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/green.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/green.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/autocrafter/cutouts/side/green",
"cutout_north": "refinedstorage:block/autocrafter/cutouts/side/green",
"cutout_south": "refinedstorage:block/autocrafter/cutouts/side/green",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/inactive.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/inactive.json
index a7e6b97d3..b2f3b7fcc 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/inactive.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/inactive.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/cutout",
+ "parent": "refinedstorage:block/sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/autocrafter/cutouts/side/inactive",
"cutout_north": "refinedstorage:block/autocrafter/cutouts/side/inactive",
"cutout_south": "refinedstorage:block/autocrafter/cutouts/side/inactive",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/light_blue.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/light_blue.json
index 77f583f74..c908ede78 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/light_blue.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/light_blue.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/autocrafter/cutouts/side/light_blue",
"cutout_north": "refinedstorage:block/autocrafter/cutouts/side/light_blue",
"cutout_south": "refinedstorage:block/autocrafter/cutouts/side/light_blue",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/light_gray.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/light_gray.json
index 4a3930c0a..11c0a10a2 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/light_gray.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/light_gray.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/autocrafter/cutouts/side/light_gray",
"cutout_north": "refinedstorage:block/autocrafter/cutouts/side/light_gray",
"cutout_south": "refinedstorage:block/autocrafter/cutouts/side/light_gray",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/lime.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/lime.json
index 74f446585..b21816254 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/lime.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/lime.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/autocrafter/cutouts/side/lime",
"cutout_north": "refinedstorage:block/autocrafter/cutouts/side/lime",
"cutout_south": "refinedstorage:block/autocrafter/cutouts/side/lime",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/magenta.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/magenta.json
index 95fac1354..519ba286a 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/magenta.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/magenta.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/autocrafter/cutouts/side/magenta",
"cutout_north": "refinedstorage:block/autocrafter/cutouts/side/magenta",
"cutout_south": "refinedstorage:block/autocrafter/cutouts/side/magenta",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/orange.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/orange.json
index f86758f23..b34b2c6c8 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/orange.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/orange.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/autocrafter/cutouts/side/orange",
"cutout_north": "refinedstorage:block/autocrafter/cutouts/side/orange",
"cutout_south": "refinedstorage:block/autocrafter/cutouts/side/orange",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/pink.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/pink.json
index 951d0e6c2..a8a427cd0 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/pink.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/pink.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/autocrafter/cutouts/side/pink",
"cutout_north": "refinedstorage:block/autocrafter/cutouts/side/pink",
"cutout_south": "refinedstorage:block/autocrafter/cutouts/side/pink",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/purple.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/purple.json
index c3d7ae5f6..06c330e0c 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/purple.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/purple.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/autocrafter/cutouts/side/purple",
"cutout_north": "refinedstorage:block/autocrafter/cutouts/side/purple",
"cutout_south": "refinedstorage:block/autocrafter/cutouts/side/purple",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/red.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/red.json
index 378e69693..df1dbe9c3 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/red.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/red.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/autocrafter/cutouts/side/red",
"cutout_north": "refinedstorage:block/autocrafter/cutouts/side/red",
"cutout_south": "refinedstorage:block/autocrafter/cutouts/side/red",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/white.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/white.json
index 757b3cac6..aa62d3f37 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/white.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/white.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/autocrafter/cutouts/side/white",
"cutout_north": "refinedstorage:block/autocrafter/cutouts/side/white",
"cutout_south": "refinedstorage:block/autocrafter/cutouts/side/white",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/yellow.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/yellow.json
index 0b1fadea8..eed46cb74 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/yellow.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/autocrafter/yellow.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/autocrafter/cutouts/side/yellow",
"cutout_north": "refinedstorage:block/autocrafter/cutouts/side/yellow",
"cutout_south": "refinedstorage:block/autocrafter/cutouts/side/yellow",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/black.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/black.json
index 80e160d29..5c35336dc 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/black.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/black.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/security_manager/cutouts/right/black",
"cutout_north": "refinedstorage:block/security_manager/cutouts/front/black",
"cutout_south": "refinedstorage:block/security_manager/cutouts/back/black",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/blue.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/blue.json
index 78e86a1ad..d0de7ec20 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/blue.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/blue.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/security_manager/cutouts/right/blue",
"cutout_north": "refinedstorage:block/security_manager/cutouts/front/blue",
"cutout_south": "refinedstorage:block/security_manager/cutouts/back/blue",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/brown.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/brown.json
index 8cd7fa835..a08ffe895 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/brown.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/brown.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/security_manager/cutouts/right/brown",
"cutout_north": "refinedstorage:block/security_manager/cutouts/front/brown",
"cutout_south": "refinedstorage:block/security_manager/cutouts/back/brown",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/cyan.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/cyan.json
index ec9a26bdc..a86301dc3 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/cyan.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/cyan.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/security_manager/cutouts/right/cyan",
"cutout_north": "refinedstorage:block/security_manager/cutouts/front/cyan",
"cutout_south": "refinedstorage:block/security_manager/cutouts/back/cyan",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/gray.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/gray.json
index b79503189..3f719191e 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/gray.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/gray.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/security_manager/cutouts/right/gray",
"cutout_north": "refinedstorage:block/security_manager/cutouts/front/gray",
"cutout_south": "refinedstorage:block/security_manager/cutouts/back/gray",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/green.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/green.json
index a8c6d22bb..5dcf3a1bf 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/green.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/green.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/security_manager/cutouts/right/green",
"cutout_north": "refinedstorage:block/security_manager/cutouts/front/green",
"cutout_south": "refinedstorage:block/security_manager/cutouts/back/green",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/inactive.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/inactive.json
index 9d88acc41..497f8a68e 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/inactive.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/inactive.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/cutout",
+ "parent": "refinedstorage:block/sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/security_manager/cutouts/right/inactive",
"cutout_north": "refinedstorage:block/security_manager/cutouts/front/inactive",
"cutout_south": "refinedstorage:block/security_manager/cutouts/back/inactive",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/light_blue.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/light_blue.json
index dba3ca672..0d94b39c0 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/light_blue.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/light_blue.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/security_manager/cutouts/right/light_blue",
"cutout_north": "refinedstorage:block/security_manager/cutouts/front/light_blue",
"cutout_south": "refinedstorage:block/security_manager/cutouts/back/light_blue",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/light_gray.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/light_gray.json
index 961884b50..6a74c0d90 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/light_gray.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/light_gray.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/security_manager/cutouts/right/light_gray",
"cutout_north": "refinedstorage:block/security_manager/cutouts/front/light_gray",
"cutout_south": "refinedstorage:block/security_manager/cutouts/back/light_gray",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/lime.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/lime.json
index 2d169eec4..83a60c23a 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/lime.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/lime.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/security_manager/cutouts/right/lime",
"cutout_north": "refinedstorage:block/security_manager/cutouts/front/lime",
"cutout_south": "refinedstorage:block/security_manager/cutouts/back/lime",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/magenta.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/magenta.json
index bd92610c2..c9caa5390 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/magenta.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/magenta.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/security_manager/cutouts/right/magenta",
"cutout_north": "refinedstorage:block/security_manager/cutouts/front/magenta",
"cutout_south": "refinedstorage:block/security_manager/cutouts/back/magenta",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/orange.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/orange.json
index facebacfe..1fad451af 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/orange.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/orange.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/security_manager/cutouts/right/orange",
"cutout_north": "refinedstorage:block/security_manager/cutouts/front/orange",
"cutout_south": "refinedstorage:block/security_manager/cutouts/back/orange",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/pink.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/pink.json
index 1b5b4be0c..0b04cd0bd 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/pink.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/pink.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/security_manager/cutouts/right/pink",
"cutout_north": "refinedstorage:block/security_manager/cutouts/front/pink",
"cutout_south": "refinedstorage:block/security_manager/cutouts/back/pink",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/purple.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/purple.json
index 41f70d9d7..ee290c41b 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/purple.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/purple.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/security_manager/cutouts/right/purple",
"cutout_north": "refinedstorage:block/security_manager/cutouts/front/purple",
"cutout_south": "refinedstorage:block/security_manager/cutouts/back/purple",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/red.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/red.json
index 5d7cf7bc8..60787ce9f 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/red.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/red.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/security_manager/cutouts/right/red",
"cutout_north": "refinedstorage:block/security_manager/cutouts/front/red",
"cutout_south": "refinedstorage:block/security_manager/cutouts/back/red",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/white.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/white.json
index ff8161470..df4c5cd92 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/white.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/white.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/security_manager/cutouts/right/white",
"cutout_north": "refinedstorage:block/security_manager/cutouts/front/white",
"cutout_south": "refinedstorage:block/security_manager/cutouts/back/white",
diff --git a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/yellow.json b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/yellow.json
index b0ce171cc..d6a9a8807 100644
--- a/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/yellow.json
+++ b/refinedstorage-common/src/generated/resources/assets/refinedstorage/models/block/security_manager/yellow.json
@@ -1,7 +1,6 @@
{
- "parent": "refinedstorage:block/emissive_cutout",
+ "parent": "refinedstorage:block/emissive_sides_cutout",
"textures": {
- "cutout_down": "refinedstorage:block/bottom",
"cutout_east": "refinedstorage:block/security_manager/cutouts/right/yellow",
"cutout_north": "refinedstorage:block/security_manager/cutouts/front/yellow",
"cutout_south": "refinedstorage:block/security_manager/cutouts/back/yellow",
diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/RefinedStorageApiImpl.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/RefinedStorageApiImpl.java
index bea2dba60..432052839 100644
--- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/RefinedStorageApiImpl.java
+++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/RefinedStorageApiImpl.java
@@ -597,6 +597,11 @@ public ResourceLocation getCreativeModeTabId() {
return ContentIds.CREATIVE_MODE_TAB;
}
+ @Override
+ public ResourceLocation getColoredCreativeModeTabId() {
+ return ContentIds.COLORED_CREATIVE_MODE_TAB;
+ }
+
@Override
public AbstractNetworkNodeContainerBlockEntity> createStorageBlockEntity(final BlockPos pos,
final BlockState state,
diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/patterngrid/PatternGridBlockEntity.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/patterngrid/PatternGridBlockEntity.java
index 770439a5e..cb75b2466 100644
--- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/patterngrid/PatternGridBlockEntity.java
+++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/patterngrid/PatternGridBlockEntity.java
@@ -123,7 +123,7 @@ ResourceContainer getProcessingOutput() {
return processingOutput;
}
- FilteredContainer getPatternInput() {
+ public FilteredContainer getPatternInput() {
return patternInput;
}
diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/content/BlockColorMap.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/content/BlockColorMap.java
index 1d3c5896d..e6ac5e396 100644
--- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/content/BlockColorMap.java
+++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/content/BlockColorMap.java
@@ -2,7 +2,6 @@
import com.refinedmods.refinedstorage.common.support.BlockItemProvider;
-import java.util.Objects;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Supplier;
@@ -25,6 +24,9 @@
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.Property;
+import static com.refinedmods.refinedstorage.common.util.IdentifierUtil.createTranslation;
+import static java.util.Objects.requireNonNull;
+
public class BlockColorMap, I extends BlockItem> extends ColorMap {
private final BlockFactory blockFactory;
private final MutableComponent baseName;
@@ -34,8 +36,8 @@ public BlockColorMap(final BlockFactory blockFactory,
final MutableComponent baseName,
final DyeColor defaultColor) {
super(baseId, defaultColor);
- this.blockFactory = Objects.requireNonNull(blockFactory);
- this.baseName = Objects.requireNonNull(baseName);
+ this.blockFactory = requireNonNull(blockFactory);
+ this.baseName = requireNonNull(baseName);
}
public Optional updateColor(final BlockState state,
@@ -83,7 +85,9 @@ private BlockState getNewState(final Block newBlock, final BlockState oldState)
private MutableComponent getName(final DyeColor color) {
if (color != defaultColor) {
- return Component.translatable("color.minecraft." + color.getName()).append(" ").append(baseName);
+ final MutableComponent colorTranslation = Component.translatable("color.minecraft." + color.getName());
+ // this is a translation because concatting color and item names hardcoded reads unnatural in Japanese
+ return createTranslation("item", "color_and_item_name", colorTranslation, baseName);
} else {
return baseName;
}
diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/content/ContentIds.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/content/ContentIds.java
index 1350d084e..cb95acdc6 100644
--- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/content/ContentIds.java
+++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/content/ContentIds.java
@@ -10,6 +10,7 @@
public final class ContentIds {
public static final ResourceLocation CREATIVE_MODE_TAB = createIdentifier("general");
+ public static final ResourceLocation COLORED_CREATIVE_MODE_TAB = createIdentifier("colored");
public static final ResourceLocation DISK_DRIVE = createIdentifier("disk_drive");
public static final ResourceLocation MACHINE_CASING = createIdentifier("machine_casing");
diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/content/ContentNames.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/content/ContentNames.java
index dc026ac38..c84892f9c 100644
--- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/content/ContentNames.java
+++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/content/ContentNames.java
@@ -10,6 +10,9 @@
public final class ContentNames {
public static final String MOD_TRANSLATION_KEY = "mod." + MOD_ID;
public static final MutableComponent MOD = Component.translatable(MOD_TRANSLATION_KEY);
+ public static final MutableComponent MOD_COLORIZED = Component.translatable(
+ MOD_TRANSLATION_KEY + ".colorized"
+ );
public static final MutableComponent CABLE = name("cable");
public static final MutableComponent GRID = name("grid");
diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/content/CreativeModeTabItems.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/content/CreativeModeTabItems.java
index d05ebea7d..e3ebc4913 100644
--- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/content/CreativeModeTabItems.java
+++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/content/CreativeModeTabItems.java
@@ -6,7 +6,6 @@
import java.util.Arrays;
import java.util.function.Consumer;
-import java.util.function.Supplier;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.ItemLike;
@@ -22,26 +21,24 @@ public static void append(final Consumer consumer) {
private static void appendBlocks(final Consumer consumer) {
final Consumer itemConsumer = item -> consumer.accept(new ItemStack(item));
- Items.INSTANCE.getControllers().stream().map(Supplier::get).forEach(itemConsumer);
- Items.INSTANCE.getControllers().forEach(controllerItem -> consumer.accept(
- controllerItem.get().createAtEnergyCapacity()
- ));
- Items.INSTANCE.getCreativeControllers().stream().map(Supplier::get).forEach(itemConsumer);
- Items.INSTANCE.getCables().stream().map(Supplier::get).forEach(itemConsumer);
- Items.INSTANCE.getImporters().stream().map(Supplier::get).forEach(itemConsumer);
- Items.INSTANCE.getExporters().stream().map(Supplier::get).forEach(itemConsumer);
- Items.INSTANCE.getExternalStorages().stream().map(Supplier::get).forEach(itemConsumer);
- Items.INSTANCE.getConstructors().stream().map(Supplier::get).forEach(itemConsumer);
- Items.INSTANCE.getDestructors().stream().map(Supplier::get).forEach(itemConsumer);
- Items.INSTANCE.getWirelessTransmitters().stream().map(Supplier::get).forEach(itemConsumer);
+ appendDefaultBlockColor(consumer, Blocks.INSTANCE.getController());
+ consumer.accept(Items.INSTANCE.getControllers().getFirst().get().createAtEnergyCapacity());
+ appendDefaultBlockColor(consumer, Blocks.INSTANCE.getCreativeController());
+ appendDefaultBlockColor(consumer, Blocks.INSTANCE.getCable());
+ appendDefaultBlockColor(consumer, Blocks.INSTANCE.getImporter());
+ appendDefaultBlockColor(consumer, Blocks.INSTANCE.getExporter());
+ appendDefaultBlockColor(consumer, Blocks.INSTANCE.getExternalStorage());
+ appendDefaultBlockColor(consumer, Blocks.INSTANCE.getConstructor());
+ appendDefaultBlockColor(consumer, Blocks.INSTANCE.getDestructor());
+ appendDefaultBlockColor(consumer, Blocks.INSTANCE.getWirelessTransmitter());
itemConsumer.accept(Blocks.INSTANCE.getDiskDrive());
- appendBlockColors(consumer, Blocks.INSTANCE.getGrid());
- appendBlockColors(consumer, Blocks.INSTANCE.getCraftingGrid());
- appendBlockColors(consumer, Blocks.INSTANCE.getPatternGrid());
+ appendDefaultBlockColor(consumer, Blocks.INSTANCE.getGrid());
+ appendDefaultBlockColor(consumer, Blocks.INSTANCE.getCraftingGrid());
+ appendDefaultBlockColor(consumer, Blocks.INSTANCE.getPatternGrid());
itemConsumer.accept(Items.INSTANCE.getPortableGrid());
consumer.accept(Items.INSTANCE.getPortableGrid().createAtEnergyCapacity());
itemConsumer.accept(Items.INSTANCE.getCreativePortableGrid());
- Items.INSTANCE.getDetectors().stream().map(Supplier::get).forEach(itemConsumer);
+ appendDefaultBlockColor(consumer, Blocks.INSTANCE.getDetector());
itemConsumer.accept(Blocks.INSTANCE.getInterface());
Arrays.stream(ItemStorageVariant.values()).forEach(variant -> itemConsumer.accept(
Blocks.INSTANCE.getItemStorageBlock(variant)
@@ -51,18 +48,54 @@ private static void appendBlocks(final Consumer consumer) {
));
itemConsumer.accept(Blocks.INSTANCE.getMachineCasing());
itemConsumer.accept(Blocks.INSTANCE.getStorageMonitor());
- Items.INSTANCE.getNetworkTransmitters().stream().map(Supplier::get).forEach(itemConsumer);
- Items.INSTANCE.getNetworkReceivers().stream().map(Supplier::get).forEach(itemConsumer);
- Items.INSTANCE.getSecurityManagers().stream().map(Supplier::get).forEach(itemConsumer);
- Items.INSTANCE.getRelays().stream().map(Supplier::get).forEach(itemConsumer);
- Items.INSTANCE.getDiskInterfaces().stream().map(Supplier::get).forEach(itemConsumer);
- Items.INSTANCE.getAutocrafters().stream().map(Supplier::get).forEach(itemConsumer);
- Items.INSTANCE.getAutocrafterManagers().stream().map(Supplier::get).forEach(itemConsumer);
- Items.INSTANCE.getAutocraftingMonitors().stream().map(Supplier::get).forEach(itemConsumer);
+ appendDefaultBlockColor(consumer, Blocks.INSTANCE.getNetworkTransmitter());
+ appendDefaultBlockColor(consumer, Blocks.INSTANCE.getNetworkReceiver());
+ appendDefaultBlockColor(consumer, Blocks.INSTANCE.getSecurityManager());
+ appendDefaultBlockColor(consumer, Blocks.INSTANCE.getRelay());
+ appendDefaultBlockColor(consumer, Blocks.INSTANCE.getDiskInterface());
+ appendDefaultBlockColor(consumer, Blocks.INSTANCE.getAutocrafter());
+ appendDefaultBlockColor(consumer, Blocks.INSTANCE.getAutocrafterManager());
+ appendDefaultBlockColor(consumer, Blocks.INSTANCE.getAutocraftingMonitor());
+ }
+
+ private static void appendDefaultBlockColor(final Consumer consumer, final BlockColorMap, ?> map) {
+ consumer.accept(new ItemStack(map.getDefault()));
+ }
+
+ public static void appendColoredVariants(final Consumer consumer) {
+ appendColoredBlocks(consumer, Blocks.INSTANCE.getController());
+ final var controllers = Items.INSTANCE.getControllers();
+ for (int i = 1; i < controllers.size(); ++i) {
+ consumer.accept(controllers.get(i).get().createAtEnergyCapacity());
+ }
+ appendColoredBlocks(consumer, Blocks.INSTANCE.getCreativeController());
+ appendColoredBlocks(consumer, Blocks.INSTANCE.getCable());
+ appendColoredBlocks(consumer, Blocks.INSTANCE.getImporter());
+ appendColoredBlocks(consumer, Blocks.INSTANCE.getExporter());
+ appendColoredBlocks(consumer, Blocks.INSTANCE.getExternalStorage());
+ appendColoredBlocks(consumer, Blocks.INSTANCE.getConstructor());
+ appendColoredBlocks(consumer, Blocks.INSTANCE.getDestructor());
+ appendColoredBlocks(consumer, Blocks.INSTANCE.getWirelessTransmitter());
+ appendColoredBlocks(consumer, Blocks.INSTANCE.getGrid());
+ appendColoredBlocks(consumer, Blocks.INSTANCE.getCraftingGrid());
+ appendColoredBlocks(consumer, Blocks.INSTANCE.getPatternGrid());
+ appendColoredBlocks(consumer, Blocks.INSTANCE.getDetector());
+ appendColoredBlocks(consumer, Blocks.INSTANCE.getNetworkTransmitter());
+ appendColoredBlocks(consumer, Blocks.INSTANCE.getNetworkReceiver());
+ appendColoredBlocks(consumer, Blocks.INSTANCE.getSecurityManager());
+ appendColoredBlocks(consumer, Blocks.INSTANCE.getRelay());
+ appendColoredBlocks(consumer, Blocks.INSTANCE.getDiskInterface());
+ appendColoredBlocks(consumer, Blocks.INSTANCE.getAutocrafter());
+ appendColoredBlocks(consumer, Blocks.INSTANCE.getAutocrafterManager());
+ appendColoredBlocks(consumer, Blocks.INSTANCE.getAutocraftingMonitor());
}
- private static void appendBlockColors(final Consumer consumer, final BlockColorMap, ?> map) {
- map.values().forEach(block -> consumer.accept(new ItemStack(block)));
+ private static void appendColoredBlocks(final Consumer consumer, final BlockColorMap, ?> map) {
+ map.forEach((color, id, block) -> {
+ if (!map.isDefaultColor(color)) {
+ consumer.accept(new ItemStack(block.get()));
+ }
+ });
}
private static void appendItems(final Consumer consumer) {
diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/grid/SnapshotExtractTransaction.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/grid/SnapshotExtractTransaction.java
index 6316369ba..65f3129f8 100644
--- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/grid/SnapshotExtractTransaction.java
+++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/grid/SnapshotExtractTransaction.java
@@ -44,7 +44,12 @@ private void addAvailableItem(final ItemStack craftingMatrixStack) {
final ItemResource craftingMatrixResource = ItemResource.ofItemStack(craftingMatrixStack);
// a single resource can occur multiple times in a recipe, only add it once
if (!available.contains(craftingMatrixResource)) {
- final long amount = rootStorage.get(craftingMatrixResource);
+ final long amount = rootStorage.extract(
+ craftingMatrixResource,
+ Long.MAX_VALUE,
+ Action.SIMULATE,
+ playerActor
+ );
if (amount > 0) {
available.add(craftingMatrixResource, amount);
}
diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/networking/RelayBlockEntity.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/networking/RelayBlockEntity.java
index 768fa7b96..975516dbe 100644
--- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/networking/RelayBlockEntity.java
+++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/networking/RelayBlockEntity.java
@@ -83,6 +83,12 @@ public RelayBlockEntity(final BlockPos pos, final BlockState state) {
setRedstoneMode(RedstoneMode.LOW);
}
+ @Override
+ public void doWork() {
+ super.doWork();
+ ticker.tick(outputNode);
+ }
+
boolean isFuzzyMode() {
return filter.isFuzzyMode();
}
diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/widget/SearchFieldWidget.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/widget/SearchFieldWidget.java
index 3646931d8..ae0e6feb6 100644
--- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/widget/SearchFieldWidget.java
+++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/widget/SearchFieldWidget.java
@@ -37,6 +37,8 @@ && mouseX < getX() + width
setFocused(true);
} else if (wasFocused != isFocused()) {
saveHistory();
+ } else if (!clickedWidget) {
+ setFocused(false);
}
return result;
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 3e080c5dc..a50cb906a 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
@@ -1,5 +1,6 @@
{
"mod.refinedstorage": "Refined Storage",
+ "mod.refinedstorage.colorized": "Refined Storage (colorized)",
"block.refinedstorage.cable": "Cable",
"block.refinedstorage.disk_drive": "Disk Drive",
"block.refinedstorage.machine_casing": "Machine Casing",
@@ -381,6 +382,7 @@
"item.refinedstorage.autocrafting_monitor.help": "Displays the status of autocrafting tasks and allows you to cancel autocrafting tasks in your storage network.",
"item.refinedstorage.wireless_autocrafting_monitor": "Wireless Autocrafting Monitor",
"item.refinedstorage.creative_wireless_autocrafting_monitor": "Creative Wireless Autocrafting Monitor",
+ "item.refinedstorage.color_and_item_name": "%s %s",
"misc.refinedstorage.stored": "Stored: %s",
"misc.refinedstorage.stored_with_capacity": "Stored: %s / %s (%d%%)",
"misc.refinedstorage.total": "%d total",
diff --git a/refinedstorage-common/src/main/resources/assets/refinedstorage/models/block/emissive_sides_cutout.json b/refinedstorage-common/src/main/resources/assets/refinedstorage/models/block/emissive_sides_cutout.json
new file mode 100644
index 000000000..4cab17e31
--- /dev/null
+++ b/refinedstorage-common/src/main/resources/assets/refinedstorage/models/block/emissive_sides_cutout.json
@@ -0,0 +1,98 @@
+{
+ "render_type": "cutout",
+ "parent": "block/cube",
+ "elements": [
+ {
+ "from": [
+ 0,
+ 0,
+ 0
+ ],
+ "to": [
+ 16,
+ 16,
+ 16
+ ],
+ "faces": {
+ "down": {
+ "texture": "#down",
+ "cullface": "down"
+ },
+ "up": {
+ "texture": "#up",
+ "cullface": "up"
+ },
+ "north": {
+ "texture": "#north",
+ "cullface": "north"
+ },
+ "south": {
+ "texture": "#south",
+ "cullface": "south"
+ },
+ "west": {
+ "texture": "#west",
+ "cullface": "west"
+ },
+ "east": {
+ "texture": "#east",
+ "cullface": "east"
+ }
+ }
+ },
+ {
+ "from": [
+ 0,
+ 0,
+ 0
+ ],
+ "to": [
+ 16,
+ 16,
+ 16
+ ],
+ "faces": {
+ "up": {
+ "texture": "#cutout_up",
+ "cullface": "up",
+ "neoforge_data": {
+ "block_light": 15,
+ "sky_light": 15
+ }
+ },
+ "north": {
+ "texture": "#cutout_north",
+ "cullface": "north",
+ "neoforge_data": {
+ "block_light": 15,
+ "sky_light": 15
+ }
+ },
+ "south": {
+ "texture": "#cutout_south",
+ "cullface": "south",
+ "neoforge_data": {
+ "block_light": 15,
+ "sky_light": 15
+ }
+ },
+ "west": {
+ "texture": "#cutout_west",
+ "cullface": "west",
+ "neoforge_data": {
+ "block_light": 15,
+ "sky_light": 15
+ }
+ },
+ "east": {
+ "texture": "#cutout_east",
+ "cullface": "east",
+ "neoforge_data": {
+ "block_light": 15,
+ "sky_light": 15
+ }
+ }
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/refinedstorage-common/src/main/resources/assets/refinedstorage/models/block/sides_cutout.json b/refinedstorage-common/src/main/resources/assets/refinedstorage/models/block/sides_cutout.json
new file mode 100644
index 000000000..2570ba5bf
--- /dev/null
+++ b/refinedstorage-common/src/main/resources/assets/refinedstorage/models/block/sides_cutout.json
@@ -0,0 +1,78 @@
+{
+ "render_type": "cutout",
+ "parent": "block/cube",
+ "elements": [
+ {
+ "from": [
+ 0,
+ 0,
+ 0
+ ],
+ "to": [
+ 16,
+ 16,
+ 16
+ ],
+ "faces": {
+ "down": {
+ "texture": "#down",
+ "cullface": "down"
+ },
+ "up": {
+ "texture": "#up",
+ "cullface": "up"
+ },
+ "north": {
+ "texture": "#north",
+ "cullface": "north"
+ },
+ "south": {
+ "texture": "#south",
+ "cullface": "south"
+ },
+ "west": {
+ "texture": "#west",
+ "cullface": "west"
+ },
+ "east": {
+ "texture": "#east",
+ "cullface": "east"
+ }
+ }
+ },
+ {
+ "from": [
+ 0,
+ 0,
+ 0
+ ],
+ "to": [
+ 16,
+ 16,
+ 16
+ ],
+ "faces": {
+ "up": {
+ "texture": "#cutout_up",
+ "cullface": "up"
+ },
+ "north": {
+ "texture": "#cutout_north",
+ "cullface": "north"
+ },
+ "south": {
+ "texture": "#cutout_south",
+ "cullface": "south"
+ },
+ "west": {
+ "texture": "#cutout_west",
+ "cullface": "west"
+ },
+ "east": {
+ "texture": "#cutout_east",
+ "cullface": "east"
+ }
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/refinedstorage-fabric/src/main/java/com/refinedmods/refinedstorage/fabric/ModInitializerImpl.java b/refinedstorage-fabric/src/main/java/com/refinedmods/refinedstorage/fabric/ModInitializerImpl.java
index 1a8dd65d9..27d27ade5 100644
--- a/refinedstorage-fabric/src/main/java/com/refinedmods/refinedstorage/fabric/ModInitializerImpl.java
+++ b/refinedstorage-fabric/src/main/java/com/refinedmods/refinedstorage/fabric/ModInitializerImpl.java
@@ -5,6 +5,7 @@
import com.refinedmods.refinedstorage.common.api.RefinedStorageApi;
import com.refinedmods.refinedstorage.common.api.support.network.AbstractNetworkNodeContainerBlockEntity;
import com.refinedmods.refinedstorage.common.autocrafting.monitor.WirelessAutocraftingMonitorItem;
+import com.refinedmods.refinedstorage.common.autocrafting.patterngrid.PatternGridBlockEntity;
import com.refinedmods.refinedstorage.common.content.BlockEntities;
import com.refinedmods.refinedstorage.common.content.BlockEntityProvider;
import com.refinedmods.refinedstorage.common.content.BlockEntityProviders;
@@ -148,6 +149,7 @@
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.item.CreativeModeTab;
+import net.minecraft.world.item.DyeColor;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.Block;
@@ -467,6 +469,15 @@ private void registerCreativeModeTab() {
.displayItems((params, output) -> CreativeModeTabItems.append(output::accept))
.build()
);
+ Registry.register(
+ BuiltInRegistries.CREATIVE_MODE_TAB,
+ RefinedStorageApi.INSTANCE.getColoredCreativeModeTabId(),
+ CreativeModeTab.builder(CreativeModeTab.Row.TOP, 1)
+ .title(ContentNames.MOD_COLORIZED)
+ .icon(() -> new ItemStack(Blocks.INSTANCE.getCreativeController().get(DyeColor.LIME)))
+ .displayItems((params, output) -> CreativeModeTabItems.appendColoredVariants(output::accept))
+ .build()
+ );
}
private void registerPackets() {
@@ -822,6 +833,12 @@ private void registerCapabilities() {
InterfaceBlockEntity::getExportedResourcesAsContainer,
BlockEntities.INSTANCE.getInterface()
);
+ registerItemStorage(
+ PatternGridBlockEntity.class::isInstance,
+ PatternGridBlockEntity.class::cast,
+ PatternGridBlockEntity::getPatternInput,
+ BlockEntities.INSTANCE.getPatternGrid()
+ );
ItemStorage.SIDED.registerForBlockEntity((blockEntity, context) -> {
final InventoryStorage storage = InventoryStorage.of(blockEntity.getDiskInventory(), context);
final List> parts = new ArrayList<>();
diff --git a/refinedstorage-neoforge/src/main/java/com/refinedmods/refinedstorage/neoforge/ModInitializer.java b/refinedstorage-neoforge/src/main/java/com/refinedmods/refinedstorage/neoforge/ModInitializer.java
index d86011858..19dec9d4e 100644
--- a/refinedstorage-neoforge/src/main/java/com/refinedmods/refinedstorage/neoforge/ModInitializer.java
+++ b/refinedstorage-neoforge/src/main/java/com/refinedmods/refinedstorage/neoforge/ModInitializer.java
@@ -129,6 +129,7 @@
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.item.CreativeModeTab;
+import net.minecraft.world.item.DyeColor;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.RecipeSerializer;
@@ -494,6 +495,11 @@ private void registerCapabilities(final RegisterCapabilitiesEvent event) {
BlockEntities.INSTANCE.getInterface(),
(be, side) -> new InvWrapper(be.getExportedResourcesAsContainer())
);
+ event.registerBlockEntity(
+ Capabilities.ItemHandler.BLOCK,
+ BlockEntities.INSTANCE.getPatternGrid(),
+ (be, side) -> new InvWrapper(be.getPatternInput())
+ );
event.registerBlockEntity(
Capabilities.FluidHandler.BLOCK,
BlockEntities.INSTANCE.getInterface(),
@@ -598,6 +604,14 @@ public void onRegister(final RegisterEvent e) {
.displayItems((params, output) -> CreativeModeTabItems.append(output::accept))
.build()
));
+ e.register(Registries.CREATIVE_MODE_TAB, helper -> helper.register(
+ RefinedStorageApi.INSTANCE.getColoredCreativeModeTabId(),
+ CreativeModeTab.builder()
+ .title(ContentNames.MOD_COLORIZED)
+ .icon(() -> new ItemStack(Blocks.INSTANCE.getCreativeController().get(DyeColor.LIME)))
+ .displayItems((params, output) -> CreativeModeTabItems.appendColoredVariants(output::accept))
+ .build()
+ ));
}
@SubscribeEvent
diff --git a/refinedstorage-neoforge/src/main/java/com/refinedmods/refinedstorage/neoforge/datagen/BlockModelProviderImpl.java b/refinedstorage-neoforge/src/main/java/com/refinedmods/refinedstorage/neoforge/datagen/BlockModelProviderImpl.java
index 919434c19..ba11c14e8 100644
--- a/refinedstorage-neoforge/src/main/java/com/refinedmods/refinedstorage/neoforge/datagen/BlockModelProviderImpl.java
+++ b/refinedstorage-neoforge/src/main/java/com/refinedmods/refinedstorage/neoforge/datagen/BlockModelProviderImpl.java
@@ -19,9 +19,11 @@ public class BlockModelProviderImpl extends BlockModelProvider {
private static final ResourceLocation EMISSIVE_CUTOUT = createIdentifier("block/emissive_cutout");
private static final ResourceLocation EMISSIVE_ALL_CUTOUT = createIdentifier("block/emissive_all_cutout");
+ private static final ResourceLocation EMISSIVE_SIDES_CUTOUT = createIdentifier("block/emissive_sides_cutout");
private static final ResourceLocation EMISSIVE_NORTH_CUTOUT = createIdentifier("block/emissive_north_cutout");
private static final ResourceLocation CUTOUT = createIdentifier("block/cutout");
+ private static final ResourceLocation SIDES_CUTOUT = createIdentifier("block/sides_cutout");
private static final ResourceLocation ALL_CUTOUT = createIdentifier("block/all_cutout");
private static final ResourceLocation NORTH_CUTOUT = createIdentifier("block/north_cutout");
@@ -212,7 +214,7 @@ private void registerSecurityManagers() {
final ResourceLocation cutoutTop = createIdentifier(
"block/security_manager/cutouts/top/" + color.getName()
);
- withExistingParent("block/security_manager/" + color.getName(), EMISSIVE_CUTOUT)
+ withExistingParent("block/security_manager/" + color.getName(), EMISSIVE_SIDES_CUTOUT)
.texture(PARTICLE_TEXTURE, back)
.texture(NORTH, front)
.texture(EAST, right)
@@ -224,15 +226,14 @@ private void registerSecurityManagers() {
.texture(CUTOUT_EAST, cutoutRight)
.texture(CUTOUT_SOUTH, cutoutBack)
.texture(CUTOUT_WEST, cutoutLeft)
- .texture(CUTOUT_UP, cutoutTop)
- .texture(CUTOUT_DOWN, BOTTOM_TEXTURE);
+ .texture(CUTOUT_UP, cutoutTop);
});
final ResourceLocation cutoutBack = createIdentifier("block/security_manager/cutouts/back/inactive");
final ResourceLocation cutoutFront = createIdentifier("block/security_manager/cutouts/front/inactive");
final ResourceLocation cutoutLeft = createIdentifier("block/security_manager/cutouts/left/inactive");
final ResourceLocation cutoutRight = createIdentifier("block/security_manager/cutouts/right/inactive");
final ResourceLocation cutoutTop = createIdentifier("block/security_manager/cutouts/top/inactive");
- withExistingParent("block/security_manager/inactive", CUTOUT)
+ withExistingParent("block/security_manager/inactive", SIDES_CUTOUT)
.texture(PARTICLE_TEXTURE, back)
.texture(NORTH, front)
.texture(EAST, right)
@@ -244,8 +245,7 @@ private void registerSecurityManagers() {
.texture(CUTOUT_EAST, cutoutRight)
.texture(CUTOUT_SOUTH, cutoutBack)
.texture(CUTOUT_WEST, cutoutLeft)
- .texture(CUTOUT_UP, cutoutTop)
- .texture(CUTOUT_DOWN, BOTTOM_TEXTURE);
+ .texture(CUTOUT_UP, cutoutTop);
}
private void registerRelays() {
@@ -306,7 +306,7 @@ private void registerAutocrafters() {
Blocks.INSTANCE.getAutocrafter().forEach((color, id, autocrafter) -> {
final ResourceLocation cutoutSide = createIdentifier("block/autocrafter/cutouts/side/" + color.getName());
final ResourceLocation cutoutTop = createIdentifier("block/autocrafter/cutouts/top/" + color.getName());
- withExistingParent("block/autocrafter/" + color.getName(), EMISSIVE_CUTOUT)
+ withExistingParent("block/autocrafter/" + color.getName(), EMISSIVE_SIDES_CUTOUT)
.texture(PARTICLE_TEXTURE, side)
.texture(NORTH, side)
.texture(EAST, side)
@@ -318,12 +318,11 @@ private void registerAutocrafters() {
.texture(CUTOUT_EAST, cutoutSide)
.texture(CUTOUT_SOUTH, cutoutSide)
.texture(CUTOUT_WEST, cutoutSide)
- .texture(CUTOUT_UP, cutoutTop)
- .texture(CUTOUT_DOWN, BOTTOM_TEXTURE);
+ .texture(CUTOUT_UP, cutoutTop);
});
final ResourceLocation cutoutSide = createIdentifier("block/autocrafter/cutouts/side/inactive");
final ResourceLocation cutoutTop = createIdentifier("block/autocrafter/cutouts/top/inactive");
- withExistingParent("block/autocrafter/inactive", CUTOUT)
+ withExistingParent("block/autocrafter/inactive", SIDES_CUTOUT)
.texture(PARTICLE_TEXTURE, side)
.texture(NORTH, side)
.texture(EAST, side)
@@ -335,7 +334,6 @@ private void registerAutocrafters() {
.texture(CUTOUT_EAST, cutoutSide)
.texture(CUTOUT_SOUTH, cutoutSide)
.texture(CUTOUT_WEST, cutoutSide)
- .texture(CUTOUT_UP, cutoutTop)
- .texture(CUTOUT_DOWN, BOTTOM_TEXTURE);
+ .texture(CUTOUT_UP, cutoutTop);
}
}
diff --git a/refinedstorage-network/src/main/java/com/refinedmods/refinedstorage/api/network/impl/autocrafting/TaskContainer.java b/refinedstorage-network/src/main/java/com/refinedmods/refinedstorage/api/network/impl/autocrafting/TaskContainer.java
new file mode 100644
index 000000000..4b62e8a38
--- /dev/null
+++ b/refinedstorage-network/src/main/java/com/refinedmods/refinedstorage/api/network/impl/autocrafting/TaskContainer.java
@@ -0,0 +1,120 @@
+package com.refinedmods.refinedstorage.api.network.impl.autocrafting;
+
+import com.refinedmods.refinedstorage.api.autocrafting.status.TaskStatus;
+import com.refinedmods.refinedstorage.api.autocrafting.task.ExternalPatternSinkProvider;
+import com.refinedmods.refinedstorage.api.autocrafting.task.StepBehavior;
+import com.refinedmods.refinedstorage.api.autocrafting.task.Task;
+import com.refinedmods.refinedstorage.api.autocrafting.task.TaskId;
+import com.refinedmods.refinedstorage.api.autocrafting.task.TaskListener;
+import com.refinedmods.refinedstorage.api.autocrafting.task.TaskState;
+import com.refinedmods.refinedstorage.api.network.Network;
+import com.refinedmods.refinedstorage.api.network.autocrafting.AutocraftingNetworkComponent;
+import com.refinedmods.refinedstorage.api.network.autocrafting.ParentContainer;
+import com.refinedmods.refinedstorage.api.network.autocrafting.PatternProvider;
+import com.refinedmods.refinedstorage.api.network.storage.StorageNetworkComponent;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
+import javax.annotation.Nullable;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TaskContainer {
+ private static final Logger LOGGER = LoggerFactory.getLogger(TaskContainer.class);
+
+ private final PatternProvider patternProvider;
+ private final List tasks = new CopyOnWriteArrayList<>();
+ private final List tasksView = Collections.unmodifiableList(tasks);
+ private final Set parents = new HashSet<>();
+
+ public TaskContainer(final PatternProvider patternProvider) {
+ this.patternProvider = patternProvider;
+ }
+
+ public List getAll() {
+ return tasksView;
+ }
+
+ public List getStatuses() {
+ return tasks.stream().map(Task::getStatus).toList();
+ }
+
+ public void onRemovedFromContainer(final ParentContainer parent) {
+ tasks.forEach(parent::taskRemoved);
+ parents.remove(parent);
+ }
+
+ public void onAddedIntoContainer(final ParentContainer parent) {
+ tasks.forEach(task -> parent.taskAdded(patternProvider, task));
+ parents.add(parent);
+ }
+
+ public void add(final Task task, @Nullable final Network network) {
+ tasks.add(task);
+ if (network != null) {
+ attach(task, network.getComponent(StorageNetworkComponent.class));
+ }
+ }
+
+ public void cancel(final TaskId id) {
+ for (final Task task : tasks) {
+ if (task.getId().equals(id)) {
+ task.cancel();
+ return;
+ }
+ }
+ throw new IllegalArgumentException("Task %s not found".formatted(id));
+ }
+
+ public void attachAll(final Network network) {
+ final StorageNetworkComponent storage = network.getComponent(StorageNetworkComponent.class);
+ tasks.forEach(task -> attach(task, storage));
+ }
+
+ public void detachAll(final Network network) {
+ final StorageNetworkComponent storage = network.getComponent(StorageNetworkComponent.class);
+ tasks.forEach(task -> detach(task, storage));
+ }
+
+ private void attach(final Task task, final StorageNetworkComponent storage) {
+ storage.addListener(task);
+ }
+
+ private void detach(final Task task, final StorageNetworkComponent storage) {
+ storage.removeListener(task);
+ }
+
+ public void step(final Network network, final StepBehavior stepBehavior, final TaskListener listener) {
+ final StorageNetworkComponent storage = network.getComponent(StorageNetworkComponent.class);
+ final ExternalPatternSinkProvider sinkProvider = network.getComponent(AutocraftingNetworkComponent.class);
+ tasks.removeIf(task -> step(task, storage, sinkProvider, stepBehavior, listener));
+ }
+
+ private boolean step(final Task task,
+ final StorageNetworkComponent storage,
+ final ExternalPatternSinkProvider sinkProvider,
+ final StepBehavior stepBehavior,
+ final TaskListener listener) {
+ boolean changed;
+ boolean completed;
+ try {
+ changed = task.step(storage, sinkProvider, stepBehavior, listener);
+ completed = task.getState() == TaskState.COMPLETED;
+ } catch (final Exception e) {
+ LOGGER.error("Exception while stepping task {} {}, removing task", task.getResource(), task.getAmount(), e);
+ changed = false;
+ completed = true;
+ }
+ if (completed) {
+ detach(task, storage);
+ parents.forEach(parent -> parent.taskCompleted(task));
+ } else if (changed) {
+ parents.forEach(parent -> parent.taskChanged(task));
+ }
+ return completed;
+ }
+}
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 6fbcf263b..cd39a16b6 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
@@ -4,38 +4,30 @@
import com.refinedmods.refinedstorage.api.autocrafting.status.TaskStatus;
import com.refinedmods.refinedstorage.api.autocrafting.task.ExternalPatternSink;
import com.refinedmods.refinedstorage.api.autocrafting.task.ExternalPatternSinkKey;
-import com.refinedmods.refinedstorage.api.autocrafting.task.ExternalPatternSinkProvider;
import com.refinedmods.refinedstorage.api.autocrafting.task.StepBehavior;
import com.refinedmods.refinedstorage.api.autocrafting.task.Task;
import com.refinedmods.refinedstorage.api.autocrafting.task.TaskId;
import com.refinedmods.refinedstorage.api.autocrafting.task.TaskListener;
-import com.refinedmods.refinedstorage.api.autocrafting.task.TaskState;
import com.refinedmods.refinedstorage.api.core.Action;
import com.refinedmods.refinedstorage.api.network.Network;
import com.refinedmods.refinedstorage.api.network.autocrafting.AutocraftingNetworkComponent;
import com.refinedmods.refinedstorage.api.network.autocrafting.ParentContainer;
import com.refinedmods.refinedstorage.api.network.autocrafting.PatternProvider;
import com.refinedmods.refinedstorage.api.network.autocrafting.PatternProviderExternalPatternSink;
+import com.refinedmods.refinedstorage.api.network.impl.autocrafting.TaskContainer;
import com.refinedmods.refinedstorage.api.network.impl.node.SimpleNetworkNode;
-import com.refinedmods.refinedstorage.api.network.storage.StorageNetworkComponent;
import com.refinedmods.refinedstorage.api.resource.ResourceAmount;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
-import java.util.concurrent.CopyOnWriteArrayList;
import javax.annotation.Nullable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
public class PatternProviderNetworkNode extends SimpleNetworkNode implements PatternProvider, TaskListener {
- private static final Logger LOGGER = LoggerFactory.getLogger(PatternProviderNetworkNode.class);
-
private final Pattern[] patterns;
private final Set parents = new HashSet<>();
- private final List tasks = new CopyOnWriteArrayList<>();
+ private final TaskContainer tasks = new TaskContainer(this);
private int priority;
@Nullable
private PatternProviderExternalPatternSink sink;
@@ -68,17 +60,11 @@ public void setPattern(final int index, @Nullable final Pattern pattern) {
@Override
public void setNetwork(@Nullable final Network network) {
if (this.network != null) {
- final StorageNetworkComponent storage = this.network.getComponent(StorageNetworkComponent.class);
- for (final Task task : tasks) {
- cleanupTask(task, storage);
- }
+ tasks.detachAll(this.network);
}
super.setNetwork(network);
if (network != null) {
- final StorageNetworkComponent storage = network.getComponent(StorageNetworkComponent.class);
- for (final Task task : tasks) {
- setupTask(task, storage);
- }
+ tasks.attachAll(network);
}
}
@@ -103,7 +89,7 @@ protected void onActiveChanged(final boolean newActive) {
@Override
public void onAddedIntoContainer(final ParentContainer parentContainer) {
parents.add(parentContainer);
- tasks.forEach(task -> parentContainer.taskAdded(this, task));
+ tasks.onAddedIntoContainer(parentContainer);
for (final Pattern pattern : patterns) {
if (pattern != null) {
parentContainer.add(this, pattern, priority);
@@ -113,7 +99,7 @@ public void onAddedIntoContainer(final ParentContainer parentContainer) {
@Override
public void onRemovedFromContainer(final ParentContainer parentContainer) {
- tasks.forEach(parentContainer::taskRemoved);
+ tasks.onRemovedFromContainer(parentContainer);
parents.remove(parentContainer);
for (final Pattern pattern : patterns) {
if (pattern != null) {
@@ -124,27 +110,18 @@ public void onRemovedFromContainer(final ParentContainer parentContainer) {
@Override
public void addTask(final Task task) {
- tasks.add(task);
- if (network != null) {
- setupTask(task, network.getComponent(StorageNetworkComponent.class));
- }
+ tasks.add(task, network);
parents.forEach(parent -> parent.taskAdded(this, task));
}
@Override
public void cancelTask(final TaskId taskId) {
- for (final Task task : tasks) {
- if (task.getId().equals(taskId)) {
- task.cancel();
- return;
- }
- }
- throw new IllegalArgumentException("Task %s not found".formatted(taskId));
+ tasks.cancel(taskId);
}
@Override
public List getTaskStatuses() {
- return tasks.stream().map(Task::getStatus).toList();
+ return tasks.getStatuses();
}
@Override
@@ -167,16 +144,10 @@ public void receivedExternalIteration(final Pattern pattern) {
provider.receivedExternalIteration();
}
- private void setupTask(final Task task, final StorageNetworkComponent storage) {
- storage.addListener(task);
- }
-
- private void cleanupTask(final Task task, final StorageNetworkComponent storage) {
- storage.removeListener(task);
- }
-
@Override
- public ExternalPatternSink.Result accept(final Collection resources, final Action action) {
+ public ExternalPatternSink.Result accept(final Pattern pattern,
+ final Collection resources,
+ final Action action) {
if (sink == null) {
return ExternalPatternSink.Result.SKIPPED;
}
@@ -184,7 +155,7 @@ public ExternalPatternSink.Result accept(final Collection resour
}
public List getTasks() {
- return tasks;
+ return tasks.getAll();
}
@Override
@@ -193,31 +164,7 @@ public void doWork() {
if (network == null || !isActive()) {
return;
}
- final StorageNetworkComponent storage = network.getComponent(StorageNetworkComponent.class);
- final ExternalPatternSinkProvider sinkProvider = network.getComponent(AutocraftingNetworkComponent.class);
- tasks.removeIf(task -> stepTask(task, storage, sinkProvider));
- }
-
- private boolean stepTask(final Task task,
- final StorageNetworkComponent storage,
- final ExternalPatternSinkProvider sinkProvider) {
- boolean changed;
- boolean completed;
- try {
- changed = task.step(storage, sinkProvider, stepBehavior, this);
- completed = task.getState() == TaskState.COMPLETED;
- } catch (final Exception e) {
- LOGGER.error("Exception while stepping task {} {}, removing task", task.getResource(), task.getAmount(), e);
- changed = false;
- completed = true;
- }
- if (completed) {
- cleanupTask(task, storage);
- parents.forEach(parent -> parent.taskCompleted(task));
- } else if (changed) {
- parents.forEach(parent -> parent.taskChanged(task));
- }
- return completed;
+ tasks.step(network, stepBehavior, this);
}
@Nullable
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 6e48e45d4..1bbe84548 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,10 +1,12 @@
package com.refinedmods.refinedstorage.api.network.impl.node.relay;
+import com.refinedmods.refinedstorage.api.autocrafting.Pattern;
import com.refinedmods.refinedstorage.api.autocrafting.status.TaskStatus;
-import com.refinedmods.refinedstorage.api.autocrafting.task.ExternalPatternSink;
+import com.refinedmods.refinedstorage.api.autocrafting.task.StepBehavior;
import com.refinedmods.refinedstorage.api.autocrafting.task.Task;
import com.refinedmods.refinedstorage.api.autocrafting.task.TaskId;
import com.refinedmods.refinedstorage.api.core.Action;
+import com.refinedmods.refinedstorage.api.network.Network;
import com.refinedmods.refinedstorage.api.network.autocrafting.AutocraftingNetworkComponent;
import com.refinedmods.refinedstorage.api.network.autocrafting.ParentContainer;
import com.refinedmods.refinedstorage.api.network.autocrafting.PatternProvider;
@@ -34,7 +36,7 @@ public class RelayOutputNetworkNode extends AbstractNetworkNode
implements EnergyProvider, SecurityDecisionProvider, StorageProvider, PatternProvider {
private final long energyUsage;
private final RelayOutputStorage storage = new RelayOutputStorage();
- private final RelayOutputPatternProvider patternProvider = new RelayOutputPatternProvider();
+ private final RelayOutputPatternProvider patternProvider = new RelayOutputPatternProvider(this);
@Nullable
private EnergyNetworkComponent energyDelegate;
@@ -105,6 +107,16 @@ public long getEnergyUsage() {
return 0;
}
+ @Override
+ public void doWork() {
+ super.doWork();
+ patternProvider.doWork();
+ }
+
+ public void setStepBehavior(final StepBehavior stepBehavior) {
+ patternProvider.setStepBehavior(stepBehavior);
+ }
+
@Override
public long getStored() {
return energyDelegate == null || energyDelegate.contains(energyDelegate) ? 0 : energyDelegate.getStored();
@@ -137,24 +149,28 @@ public boolean contains(final AutocraftingNetworkComponent component) {
return patternProvider.contains(component);
}
+ public List getTasks() {
+ return patternProvider.getTasks();
+ }
+
@Override
public void addTask(final Task task) {
- // TODO(feat): relay support
+ patternProvider.addTask(task);
}
@Override
public void cancelTask(final TaskId taskId) {
- // TODO(feat): relay support
+ patternProvider.cancelTask(taskId);
}
@Override
public List getTaskStatuses() {
- return List.of(); // TODO(feat): relay support
+ return patternProvider.getTaskStatuses();
}
@Override
public void receivedExternalIteration() {
- // TODO(feat): relay support
+ patternProvider.receivedExternalIteration();
}
@Override
@@ -186,7 +202,18 @@ public void onRemovedFromContainer(final ParentContainer parentContainer) {
}
@Override
- public ExternalPatternSink.Result accept(final Collection resources, final Action action) {
- return ExternalPatternSink.Result.SKIPPED; // TODO(feat): relay support
+ public Result accept(final Pattern pattern, final Collection resources, final Action action) {
+ return patternProvider.accept(pattern, resources, action);
+ }
+
+ @Override
+ public void setNetwork(@Nullable final Network network) {
+ if (this.network != null) {
+ patternProvider.detachAll(this.network);
+ }
+ super.setNetwork(network);
+ if (network != null) {
+ patternProvider.attachAll(network);
+ }
}
}
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 7d4d3fe4f..2fead6a0c 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
@@ -3,13 +3,17 @@
import com.refinedmods.refinedstorage.api.autocrafting.Pattern;
import com.refinedmods.refinedstorage.api.autocrafting.status.TaskStatus;
import com.refinedmods.refinedstorage.api.autocrafting.task.ExternalPatternSink;
+import com.refinedmods.refinedstorage.api.autocrafting.task.StepBehavior;
import com.refinedmods.refinedstorage.api.autocrafting.task.Task;
import com.refinedmods.refinedstorage.api.autocrafting.task.TaskId;
+import com.refinedmods.refinedstorage.api.autocrafting.task.TaskListener;
import com.refinedmods.refinedstorage.api.core.Action;
+import com.refinedmods.refinedstorage.api.network.Network;
import com.refinedmods.refinedstorage.api.network.autocrafting.AutocraftingNetworkComponent;
import com.refinedmods.refinedstorage.api.network.autocrafting.ParentContainer;
import com.refinedmods.refinedstorage.api.network.autocrafting.PatternListener;
import com.refinedmods.refinedstorage.api.network.autocrafting.PatternProvider;
+import com.refinedmods.refinedstorage.api.network.impl.autocrafting.TaskContainer;
import com.refinedmods.refinedstorage.api.resource.ResourceAmount;
import com.refinedmods.refinedstorage.api.resource.ResourceKey;
import com.refinedmods.refinedstorage.api.resource.filter.Filter;
@@ -24,11 +28,22 @@
import java.util.stream.Collectors;
import javax.annotation.Nullable;
-class RelayOutputPatternProvider implements PatternProvider, PatternListener {
+class RelayOutputPatternProvider implements PatternProvider, PatternListener, TaskListener {
+ private final RelayOutputNetworkNode outputNode;
private final Filter filter = new Filter();
private final Set parents = new HashSet<>();
+ private final TaskContainer tasks = new TaskContainer(this);
@Nullable
private AutocraftingNetworkComponent delegate;
+ private StepBehavior stepBehavior = StepBehavior.DEFAULT;
+
+ RelayOutputPatternProvider(final RelayOutputNetworkNode outputNode) {
+ this.outputNode = outputNode;
+ }
+
+ List getTasks() {
+ return tasks.getAll();
+ }
void setFilters(final Set filters) {
reset(() -> filter.setFilters(filters));
@@ -99,22 +114,46 @@ public boolean contains(final AutocraftingNetworkComponent component) {
@Override
public void addTask(final Task task) {
- // TODO(feat): relay support
+ tasks.add(task, outputNode.getNetwork());
+ parents.forEach(parent -> parent.taskAdded(this, task));
+ }
+
+ void doWork() {
+ if (outputNode.getNetwork() == null) {
+ return;
+ }
+ tasks.step(outputNode.getNetwork(), stepBehavior, this);
+ }
+
+ void setStepBehavior(final StepBehavior stepBehavior) {
+ this.stepBehavior = stepBehavior;
}
@Override
public void cancelTask(final TaskId taskId) {
- // TODO(feat): relay support
+ tasks.cancel(taskId);
}
@Override
public List getTaskStatuses() {
- return List.of(); // TODO(feat): relay support
+ return tasks.getStatuses();
}
@Override
public void receivedExternalIteration() {
- // TODO(feat): relay support
+ // no op
+ }
+
+ @Override
+ public void receivedExternalIteration(final Pattern pattern) {
+ if (delegate == null) {
+ return;
+ }
+ final PatternProvider patternProvider = delegate.getProviderByPattern(pattern);
+ if (patternProvider == null) {
+ return;
+ }
+ patternProvider.receivedExternalIteration();
}
@Override
@@ -122,6 +161,7 @@ public void onAddedIntoContainer(final ParentContainer parentContainer) {
if (delegate != null) {
delegate.getPatterns().forEach(pattern -> parentContainer.add(this, pattern, 0));
}
+ tasks.onAddedIntoContainer(parentContainer);
parents.add(parentContainer);
}
@@ -130,11 +170,29 @@ public void onRemovedFromContainer(final ParentContainer parentContainer) {
if (delegate != null) {
delegate.getPatterns().forEach(pattern -> parentContainer.remove(this, pattern));
}
+ tasks.onRemovedFromContainer(parentContainer);
parents.remove(parentContainer);
}
@Override
- public ExternalPatternSink.Result accept(final Collection resources, final Action action) {
- return ExternalPatternSink.Result.SKIPPED; // TODO(feat): relay support
+ public ExternalPatternSink.Result accept(final Pattern pattern,
+ final Collection resources,
+ final Action action) {
+ if (delegate == null) {
+ return ExternalPatternSink.Result.SKIPPED;
+ }
+ final PatternProvider patternProvider = delegate.getProviderByPattern(pattern);
+ if (patternProvider == null) {
+ return ExternalPatternSink.Result.SKIPPED;
+ }
+ return patternProvider.accept(pattern, resources, action);
+ }
+
+ void detachAll(final Network network) {
+ tasks.detachAll(network);
+ }
+
+ void attachAll(final Network network) {
+ tasks.attachAll(network);
}
}
diff --git a/refinedstorage-network/src/main/java/com/refinedmods/refinedstorage/api/network/impl/node/storage/StorageNetworkNode.java b/refinedstorage-network/src/main/java/com/refinedmods/refinedstorage/api/network/impl/node/storage/StorageNetworkNode.java
index c141c3e4b..7ce7429b0 100644
--- a/refinedstorage-network/src/main/java/com/refinedmods/refinedstorage/api/network/impl/node/storage/StorageNetworkNode.java
+++ b/refinedstorage-network/src/main/java/com/refinedmods/refinedstorage/api/network/impl/node/storage/StorageNetworkNode.java
@@ -65,11 +65,23 @@ public StorageConfiguration getStorageConfiguration() {
}
public long getStored() {
- return storage.getStored();
+ long stored = 0;
+ for (final StateTrackedStorage internalStorage : storages) {
+ if (internalStorage != null) {
+ stored += internalStorage.getStored();
+ }
+ }
+ return stored;
}
public long getCapacity() {
- return storage.getCapacity();
+ long capacity = 0;
+ for (final StateTrackedStorage internalStorage : storages) {
+ if (internalStorage != null) {
+ capacity += internalStorage.getCapacity();
+ }
+ }
+ return capacity;
}
@Override
diff --git a/refinedstorage-network/src/test/java/com/refinedmods/refinedstorage/api/network/impl/node/patternprovider/PatternProviderExternalPatternSinkImpl.java b/refinedstorage-network/src/test/java/com/refinedmods/refinedstorage/api/network/impl/node/patternprovider/PatternProviderExternalPatternSinkImpl.java
index 58bb9b59b..88c39bb89 100644
--- a/refinedstorage-network/src/test/java/com/refinedmods/refinedstorage/api/network/impl/node/patternprovider/PatternProviderExternalPatternSinkImpl.java
+++ b/refinedstorage-network/src/test/java/com/refinedmods/refinedstorage/api/network/impl/node/patternprovider/PatternProviderExternalPatternSinkImpl.java
@@ -10,7 +10,7 @@
import java.util.Collection;
-class PatternProviderExternalPatternSinkImpl implements PatternProviderExternalPatternSink {
+public class PatternProviderExternalPatternSinkImpl implements PatternProviderExternalPatternSink {
private final Storage storage = new StorageImpl();
@Override
@@ -22,7 +22,7 @@ public ExternalPatternSink.Result accept(final Collection resour
return ExternalPatternSink.Result.ACCEPTED;
}
- Collection getAll() {
+ public Collection getAll() {
return storage.getAll();
}
}
diff --git a/refinedstorage-network/src/test/java/com/refinedmods/refinedstorage/api/network/impl/node/relay/RelayAutocraftingNetworkNodeTest.java b/refinedstorage-network/src/test/java/com/refinedmods/refinedstorage/api/network/impl/node/relay/RelayAutocraftingNetworkNodeTest.java
index 0aebeaab4..30c9675c4 100644
--- a/refinedstorage-network/src/test/java/com/refinedmods/refinedstorage/api/network/impl/node/relay/RelayAutocraftingNetworkNodeTest.java
+++ b/refinedstorage-network/src/test/java/com/refinedmods/refinedstorage/api/network/impl/node/relay/RelayAutocraftingNetworkNodeTest.java
@@ -1,18 +1,37 @@
package com.refinedmods.refinedstorage.api.network.impl.node.relay;
+import com.refinedmods.refinedstorage.api.autocrafting.Pattern;
+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.StepBehavior;
+import com.refinedmods.refinedstorage.api.autocrafting.task.TaskId;
+import com.refinedmods.refinedstorage.api.autocrafting.task.TaskState;
+import com.refinedmods.refinedstorage.api.core.Action;
import com.refinedmods.refinedstorage.api.network.Network;
import com.refinedmods.refinedstorage.api.network.autocrafting.AutocraftingNetworkComponent;
+import com.refinedmods.refinedstorage.api.network.impl.node.patternprovider.PatternProviderExternalPatternSinkImpl;
+import com.refinedmods.refinedstorage.api.network.impl.node.patternprovider.PatternProviderListener;
+import com.refinedmods.refinedstorage.api.network.impl.node.patternprovider.PatternProviderNetworkNode;
+import com.refinedmods.refinedstorage.api.network.storage.StorageNetworkComponent;
+import com.refinedmods.refinedstorage.api.resource.ResourceAmount;
import com.refinedmods.refinedstorage.api.resource.filter.FilterMode;
+import com.refinedmods.refinedstorage.api.storage.Actor;
+import com.refinedmods.refinedstorage.api.storage.StorageImpl;
import com.refinedmods.refinedstorage.network.test.AddNetworkNode;
import com.refinedmods.refinedstorage.network.test.InjectNetwork;
import com.refinedmods.refinedstorage.network.test.InjectNetworkAutocraftingComponent;
+import com.refinedmods.refinedstorage.network.test.InjectNetworkStorageComponent;
import com.refinedmods.refinedstorage.network.test.NetworkTest;
import com.refinedmods.refinedstorage.network.test.SetupNetwork;
import java.util.Set;
+import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
+import static com.refinedmods.refinedstorage.api.autocrafting.PatternBuilder.pattern;
import static com.refinedmods.refinedstorage.api.network.impl.node.relay.RelayNetworkNodeTest.addPattern;
import static com.refinedmods.refinedstorage.network.test.fixtures.ResourceFixtures.A;
import static com.refinedmods.refinedstorage.network.test.fixtures.ResourceFixtures.A_ALTERNATIVE;
@@ -21,6 +40,12 @@
import static com.refinedmods.refinedstorage.network.test.fixtures.ResourceFixtures.D;
import static com.refinedmods.refinedstorage.network.test.nodefactory.AbstractNetworkNodeFactory.PROPERTY_ACTIVE;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
@NetworkTest
@SetupNetwork(id = "input")
@@ -322,4 +347,433 @@ void shouldDetectCycles(
assertThat(inputAutocrafting.getOutputs()).usingRecursiveFieldByFieldElementComparator().containsExactly(A);
assertThat(inputAlternativeAutocrafting.getOutputs()).isEmpty();
}
+
+ @Test
+ void shouldUseResourcesFromOutputNetworkForCalculation(
+ @InjectNetworkAutocraftingComponent(networkId = "input") final AutocraftingNetworkComponent inputAutocrafting,
+ @InjectNetworkAutocraftingComponent(networkId = "output") final AutocraftingNetworkComponent outputAutocrafting,
+ @InjectNetworkStorageComponent(networkId = "output") final StorageNetworkComponent outputStorage
+ ) {
+ // Arrange
+ input.setActive(true);
+ input.setOutputNode(output);
+
+ final PatternProviderNetworkNode patternProvider = new PatternProviderNetworkNode(0, 1);
+ patternProvider.setPattern(0, pattern()
+ .ingredient(A, 1)
+ .output(B, 1)
+ .build());
+ inputAutocrafting.onContainerAdded(() -> patternProvider);
+
+ outputStorage.addSource(new StorageImpl());
+ outputStorage.insert(A, 1, Action.EXECUTE, Actor.EMPTY);
+
+ input.setComponentTypes(Set.of(RelayComponentType.AUTOCRAFTING));
+
+ // Act
+ final var taskIdFromOutput = outputAutocrafting.startTask(B, 1, Actor.EMPTY, false).join();
+ final var taskIdFromInput = inputAutocrafting.startTask(B, 1, Actor.EMPTY, false).join();
+
+ // Assert
+ assertThat(taskIdFromOutput).isPresent();
+ assertThat(taskIdFromInput).isEmpty();
+ }
+
+ @Test
+ void shouldStartTaskInOutputPatternProvider(
+ @InjectNetworkAutocraftingComponent(networkId = "input") final AutocraftingNetworkComponent inputAutocrafting,
+ @InjectNetworkAutocraftingComponent(networkId = "output") final AutocraftingNetworkComponent outputAutocrafting,
+ @InjectNetworkStorageComponent(networkId = "output") final StorageNetworkComponent outputStorage
+ ) {
+ // Arrange
+ input.setActive(true);
+ input.setOutputNode(output);
+
+ final PatternProviderNetworkNode patternProvider = new PatternProviderNetworkNode(0, 1);
+ patternProvider.setPattern(0, pattern()
+ .ingredient(A, 1)
+ .output(B, 1)
+ .build());
+ inputAutocrafting.onContainerAdded(() -> patternProvider);
+
+ outputStorage.addSource(new StorageImpl());
+ outputStorage.insert(A, 1, Action.EXECUTE, Actor.EMPTY);
+
+ input.setComponentTypes(Set.of(RelayComponentType.AUTOCRAFTING));
+
+ final var optionalTaskId = outputAutocrafting.startTask(B, 1, Actor.EMPTY, false).join();
+ assertThat(optionalTaskId).isPresent();
+
+ // Act
+ assertThat(output.getTasks()).hasSize(1);
+ assertThat(inputAutocrafting.getStatuses()).isEmpty();
+ assertThat(outputAutocrafting.getStatuses()).hasSize(1);
+ }
+
+ @Test
+ void shouldCancelTask(
+ @InjectNetworkAutocraftingComponent(networkId = "input") final AutocraftingNetworkComponent inputAutocrafting,
+ @InjectNetworkAutocraftingComponent(networkId = "output") final AutocraftingNetworkComponent outputAutocrafting,
+ @InjectNetworkStorageComponent(networkId = "output") final StorageNetworkComponent outputStorage
+ ) {
+ // Arrange
+ input.setActive(true);
+ input.setOutputNode(output);
+
+ final PatternProviderNetworkNode patternProvider = new PatternProviderNetworkNode(0, 1);
+ patternProvider.setPattern(0, pattern()
+ .ingredient(A, 1)
+ .output(B, 1)
+ .build());
+ inputAutocrafting.onContainerAdded(() -> patternProvider);
+
+ outputStorage.addSource(new StorageImpl());
+ outputStorage.insert(A, 1, Action.EXECUTE, Actor.EMPTY);
+
+ input.setComponentTypes(Set.of(RelayComponentType.AUTOCRAFTING));
+
+ // Act & assert
+ final var optionalTaskId = outputAutocrafting.startTask(B, 1, Actor.EMPTY, false).join();
+ assertThat(optionalTaskId).isPresent();
+ final var taskId = optionalTaskId.get();
+ assertThat(output.getTasks())
+ .hasSize(1)
+ .allMatch(task -> task.getId().equals(taskId) && task.getState() == TaskState.READY);
+
+ inputAutocrafting.cancel(taskId);
+ assertThat(output.getTasks())
+ .hasSize(1)
+ .allMatch(task -> task.getId().equals(taskId) && task.getState() == TaskState.READY);
+
+ outputAutocrafting.cancel(taskId);
+ assertThat(output.getTasks())
+ .hasSize(1)
+ .allMatch(task -> task.getId().equals(taskId) && task.getState() == TaskState.RETURNING_INTERNAL_STORAGE);
+ }
+
+ @Test
+ void shouldStepTasks(
+ @InjectNetworkAutocraftingComponent(networkId = "input") final AutocraftingNetworkComponent inputAutocrafting,
+ @InjectNetworkAutocraftingComponent(networkId = "output") final AutocraftingNetworkComponent outputAutocrafting,
+ @InjectNetworkStorageComponent(networkId = "output") final StorageNetworkComponent outputStorage
+ ) {
+ // Arrange
+ input.setActive(true);
+ input.setOutputNode(output);
+
+ final PatternProviderNetworkNode patternProvider = new PatternProviderNetworkNode(0, 1);
+ patternProvider.setPattern(0, pattern()
+ .ingredient(A, 1)
+ .output(B, 1)
+ .build());
+ inputAutocrafting.onContainerAdded(() -> patternProvider);
+
+ outputStorage.addSource(new StorageImpl());
+ outputStorage.insert(A, 1, Action.EXECUTE, Actor.EMPTY);
+
+ input.setComponentTypes(Set.of(RelayComponentType.AUTOCRAFTING));
+
+ assertThat(outputAutocrafting.startTask(B, 1, Actor.EMPTY, false).join()).isPresent();
+
+ // Act & assert
+ output.doWork();
+ assertThat(output.getTasks()).hasSize(1);
+
+ output.doWork();
+ assertThat(output.getTasks()).isEmpty();
+
+ assertThat(outputStorage.getAll()).usingRecursiveFieldByFieldElementComparator().containsExactly(
+ new ResourceAmount(B, 1)
+ );
+ }
+
+ @Test
+ void shouldStepTasksWithCustomStepBehavior(
+ @InjectNetworkAutocraftingComponent(networkId = "input") final AutocraftingNetworkComponent inputAutocrafting,
+ @InjectNetworkAutocraftingComponent(networkId = "output") final AutocraftingNetworkComponent outputAutocrafting,
+ @InjectNetworkStorageComponent(networkId = "output") final StorageNetworkComponent outputStorage
+ ) {
+ // Arrange
+ input.setActive(true);
+ input.setOutputNode(output);
+
+ final PatternProviderNetworkNode patternProvider = new PatternProviderNetworkNode(0, 1);
+ patternProvider.setPattern(0, pattern()
+ .ingredient(A, 1)
+ .output(B, 1)
+ .build());
+ inputAutocrafting.onContainerAdded(() -> patternProvider);
+
+ outputStorage.addSource(new StorageImpl());
+ outputStorage.insert(A, 10, Action.EXECUTE, Actor.EMPTY);
+
+ input.setComponentTypes(Set.of(RelayComponentType.AUTOCRAFTING));
+
+ assertThat(outputAutocrafting.startTask(B, 10, Actor.EMPTY, false).join()).isPresent();
+
+ // Act & assert
+ output.doWork();
+ assertThat(output.getTasks()).hasSize(1);
+
+ output.doWork();
+ assertThat(output.getTasks()).hasSize(1);
+ assertThat(outputStorage.getAll()).usingRecursiveFieldByFieldElementComparator().containsExactly(
+ new ResourceAmount(B, 1)
+ );
+
+ output.setStepBehavior(new StepBehavior() {
+ @Override
+ public int getSteps(final Pattern pattern) {
+ return 9;
+ }
+ });
+
+ output.doWork();
+ assertThat(output.getTasks()).isEmpty();
+ assertThat(outputStorage.getAll()).usingRecursiveFieldByFieldElementComparator().containsExactly(
+ new ResourceAmount(B, 10)
+ );
+ }
+
+ @Test
+ void shouldStepTasksWithExternalPattern(
+ @InjectNetworkAutocraftingComponent(networkId = "input") final AutocraftingNetworkComponent inputAutocrafting,
+ @InjectNetworkAutocraftingComponent(networkId = "output") final AutocraftingNetworkComponent outputAutocrafting,
+ @InjectNetworkStorageComponent(networkId = "input") final StorageNetworkComponent inputStorage,
+ @InjectNetworkStorageComponent(networkId = "output") final StorageNetworkComponent outputStorage
+ ) {
+ // Arrange
+ input.setActive(true);
+ input.setOutputNode(output);
+ inputStorage.addSource(new StorageImpl());
+
+ final PatternProviderNetworkNode patternProvider = new PatternProviderNetworkNode(0, 1);
+ patternProvider.setPattern(0, pattern(PatternType.EXTERNAL)
+ .ingredient(A, 1)
+ .output(B, 1)
+ .build());
+ final PatternProviderListener listener = mock(PatternProviderListener.class);
+ final PatternProviderExternalPatternSinkImpl sink = new PatternProviderExternalPatternSinkImpl();
+ patternProvider.setSink(sink);
+ patternProvider.setListener(listener);
+ inputAutocrafting.onContainerAdded(() -> patternProvider);
+
+ outputStorage.addSource(new StorageImpl());
+ outputStorage.insert(A, 2, Action.EXECUTE, Actor.EMPTY);
+
+ input.setComponentTypes(Set.of(RelayComponentType.AUTOCRAFTING));
+
+ assertThat(outputAutocrafting.startTask(B, 2, Actor.EMPTY, false).join()).isPresent();
+
+ // Act & assert
+ output.doWork();
+ assertThat(output.getTasks()).hasSize(1);
+ assertThat(outputStorage.getAll()).isEmpty();
+ assertThat(sink.getAll()).isEmpty();
+
+ output.doWork();
+ assertThat(output.getTasks()).hasSize(1);
+ assertThat(outputStorage.getAll()).isEmpty();
+ assertThat(sink.getAll()).usingRecursiveFieldByFieldElementComparator().containsExactly(
+ new ResourceAmount(A, 1)
+ );
+
+ output.doWork();
+ assertThat(output.getTasks()).hasSize(1);
+ assertThat(outputStorage.getAll()).isEmpty();
+ assertThat(sink.getAll()).usingRecursiveFieldByFieldElementComparator().containsExactly(
+ new ResourceAmount(A, 2)
+ );
+
+ inputStorage.insert(B, 2, Action.EXECUTE, Actor.EMPTY);
+ output.doWork();
+ assertThat(output.getTasks()).hasSize(1);
+ assertThat(outputStorage.getAll()).isEmpty();
+ assertThat(sink.getAll()).usingRecursiveFieldByFieldElementComparator().containsExactly(
+ new ResourceAmount(A, 2)
+ );
+
+ outputStorage.insert(B, 2, Action.EXECUTE, Actor.EMPTY);
+ output.doWork();
+ verify(listener, times(1)).receivedExternalIteration();
+ assertThat(output.getTasks()).isEmpty();
+ assertThat(outputStorage.getAll()).usingRecursiveFieldByFieldElementComparator().containsExactly(
+ new ResourceAmount(B, 2)
+ );
+ assertThat(sink.getAll()).usingRecursiveFieldByFieldElementComparator().containsExactly(
+ new ResourceAmount(A, 2)
+ );
+ }
+
+ @Nested
+ @SetupNetwork(id = "output2")
+ class NetworkChangeTest {
+ @Test
+ void shouldInterceptInsertionsOnNewNetworkWhenNetworkChanges(
+ @InjectNetworkAutocraftingComponent(networkId = "input")
+ final AutocraftingNetworkComponent inputAutocrafting,
+ @InjectNetworkAutocraftingComponent(networkId = "output")
+ final AutocraftingNetworkComponent outputAutocrafting,
+ @InjectNetworkStorageComponent(networkId = "input") final StorageNetworkComponent inputStorage,
+ @InjectNetworkStorageComponent(networkId = "output") final StorageNetworkComponent outputStorage,
+ @InjectNetwork("output2") final Network outputNetwork2,
+ @InjectNetworkStorageComponent(networkId = "output2") final StorageNetworkComponent outputStorage2
+ ) {
+ // Arrange
+ input.setActive(true);
+ input.setOutputNode(output);
+ inputStorage.addSource(new StorageImpl());
+
+ final PatternProviderNetworkNode patternProvider = new PatternProviderNetworkNode(0, 1);
+ patternProvider.setPattern(0, pattern(PatternType.EXTERNAL)
+ .ingredient(A, 1)
+ .output(B, 1)
+ .build());
+ final PatternProviderExternalPatternSinkImpl sink = new PatternProviderExternalPatternSinkImpl();
+ patternProvider.setSink(sink);
+ inputAutocrafting.onContainerAdded(() -> patternProvider);
+
+ outputStorage.addSource(new StorageImpl());
+ outputStorage.insert(A, 2, Action.EXECUTE, Actor.EMPTY);
+
+ input.setComponentTypes(Set.of(RelayComponentType.AUTOCRAFTING));
+
+ assertThat(outputAutocrafting.startTask(B, 2, Actor.EMPTY, false).join()).isPresent();
+
+ // Act & assert
+ output.doWork();
+ assertThat(output.getTasks()).hasSize(1);
+ assertThat(outputStorage.getAll()).isEmpty();
+ assertThat(sink.getAll()).isEmpty();
+
+ output.doWork();
+ assertThat(output.getTasks()).hasSize(1);
+ assertThat(sink.getAll()).usingRecursiveFieldByFieldElementComparator().containsExactly(
+ new ResourceAmount(A, 1)
+ );
+
+ output.doWork();
+ assertThat(output.getTasks()).hasSize(1);
+ assertThat(sink.getAll()).usingRecursiveFieldByFieldElementComparator().containsExactly(
+ new ResourceAmount(A, 2)
+ );
+
+ outputStorage.insert(B, 1, Action.EXECUTE, Actor.EMPTY);
+ output.doWork();
+ assertThat(output.getTasks()).hasSize(1);
+
+ output.setNetwork(outputNetwork2);
+ outputNetwork2.addContainer(() -> output);
+
+ outputStorage.insert(B, 1, Action.EXECUTE, Actor.EMPTY);
+ output.doWork();
+ assertThat(output.getTasks()).hasSize(1);
+
+ outputStorage2.insert(B, 1, Action.EXECUTE, Actor.EMPTY);
+ output.doWork();
+ assertThat(output.getTasks()).isEmpty();
+ }
+
+ @Test
+ void shouldNotifyStatusListenersOfOldAndNewNetworkWhenNetworkChanges(
+ @InjectNetworkAutocraftingComponent(networkId = "input")
+ final AutocraftingNetworkComponent inputAutocrafting,
+ @InjectNetworkAutocraftingComponent(networkId = "output")
+ final AutocraftingNetworkComponent outputAutocrafting,
+ @InjectNetworkAutocraftingComponent(networkId = "output2")
+ final AutocraftingNetworkComponent outputAutocrafting2,
+ @InjectNetworkStorageComponent(networkId = "output") final StorageNetworkComponent outputStorage,
+ @InjectNetwork("output") final Network outputNetwork,
+ @InjectNetwork("output2") final Network outputNetwork2
+ ) {
+ // Arrange
+ final TaskStatusListener listener = mock(TaskStatusListener.class);
+ outputAutocrafting.addListener(listener);
+
+ final TaskStatusListener listener2 = mock(TaskStatusListener.class);
+ outputAutocrafting2.addListener(listener2);
+
+ outputStorage.addSource(new StorageImpl());
+ outputStorage.insert(A, 10, Action.EXECUTE, Actor.EMPTY);
+
+ final PatternProviderNetworkNode patternProvider = new PatternProviderNetworkNode(0, 1);
+ patternProvider.setPattern(0, pattern().ingredient(A, 1).output(B, 1).build());
+ inputAutocrafting.onContainerAdded(() -> patternProvider);
+
+ input.setActive(true);
+ input.setOutputNode(output);
+ input.setComponentTypes(Set.of(RelayComponentType.AUTOCRAFTING));
+
+ // Act & assert
+ final var taskId = outputAutocrafting.startTask(B, 1, Actor.EMPTY, false).join();
+ assertThat(taskId).isPresent();
+ final ArgumentCaptor statusCaptor = ArgumentCaptor.forClass(TaskStatus.class);
+ verify(listener, times(1)).taskAdded(statusCaptor.capture());
+ verify(listener, never()).taskRemoved(any());
+ verify(listener2, never()).taskAdded(any());
+ verify(listener2, never()).taskRemoved(any());
+ final TaskStatus status = statusCaptor.getValue();
+ assertThat(status.info().id()).isEqualTo(taskId.get());
+
+ reset(listener, listener2);
+
+ outputNetwork.removeContainer(() -> output);
+ output.setNetwork(outputNetwork2);
+ outputNetwork2.addContainer(() -> output);
+
+ verify(listener, never()).taskAdded(any());
+ final ArgumentCaptor removedIdCaptor = ArgumentCaptor.forClass(TaskId.class);
+ verify(listener, times(1)).taskRemoved(removedIdCaptor.capture());
+ final ArgumentCaptor addedTaskCaptor = ArgumentCaptor.forClass(TaskStatus.class);
+ verify(listener2, times(1)).taskAdded(addedTaskCaptor.capture());
+ verify(listener2, never()).taskRemoved(any());
+ }
+
+ @Test
+ void shouldBeAbleToCancelTaskInNewNetworkWhenNetworkChanges(
+ @InjectNetworkAutocraftingComponent(networkId = "input")
+ final AutocraftingNetworkComponent inputAutocrafting,
+ @InjectNetworkAutocraftingComponent(networkId = "output")
+ final AutocraftingNetworkComponent outputAutocrafting,
+ @InjectNetworkAutocraftingComponent(networkId = "output2")
+ final AutocraftingNetworkComponent outputAutocrafting2,
+ @InjectNetworkStorageComponent(networkId = "output") final StorageNetworkComponent outputStorage,
+ @InjectNetwork("output") final Network outputNetwork,
+ @InjectNetwork("output2") final Network outputNetwork2
+ ) {
+ // Arrange
+ final TaskStatusListener listener = mock(TaskStatusListener.class);
+ outputAutocrafting.addListener(listener);
+
+ final TaskStatusListener listener2 = mock(TaskStatusListener.class);
+ outputAutocrafting2.addListener(listener2);
+
+ outputStorage.addSource(new StorageImpl());
+ outputStorage.insert(A, 10, Action.EXECUTE, Actor.EMPTY);
+
+ final PatternProviderNetworkNode patternProvider = new PatternProviderNetworkNode(0, 1);
+ patternProvider.setPattern(0, pattern().ingredient(A, 1).output(B, 1).build());
+ inputAutocrafting.onContainerAdded(() -> patternProvider);
+
+ input.setActive(true);
+ input.setOutputNode(output);
+ input.setComponentTypes(Set.of(RelayComponentType.AUTOCRAFTING));
+
+ // Act & assert
+ final var taskId = outputAutocrafting.startTask(B, 1, Actor.EMPTY, false).join();
+ assertThat(taskId).isPresent();
+ assertThat(output.getTasks()).hasSize(1).allMatch(t -> t.getState() == TaskState.READY);
+
+ outputNetwork.removeContainer(() -> output);
+ output.setNetwork(outputNetwork2);
+ outputNetwork2.addContainer(() -> output);
+
+ outputAutocrafting.cancel(taskId.get());
+ assertThat(output.getTasks()).hasSize(1).allMatch(t -> t.getState() == TaskState.READY);
+
+ outputAutocrafting2.cancel(taskId.get());
+ assertThat(output.getTasks()).hasSize(1)
+ .allMatch(t -> t.getState() == TaskState.RETURNING_INTERNAL_STORAGE);
+ }
+ }
}
diff --git a/refinedstorage-network/src/test/java/com/refinedmods/refinedstorage/api/network/impl/node/storage/StorageNetworkNodeTest.java b/refinedstorage-network/src/test/java/com/refinedmods/refinedstorage/api/network/impl/node/storage/StorageNetworkNodeTest.java
index 5135054af..73733e5b7 100644
--- a/refinedstorage-network/src/test/java/com/refinedmods/refinedstorage/api/network/impl/node/storage/StorageNetworkNodeTest.java
+++ b/refinedstorage-network/src/test/java/com/refinedmods/refinedstorage/api/network/impl/node/storage/StorageNetworkNodeTest.java
@@ -77,6 +77,8 @@ void shouldInitializeButNotShowResourcesYet(
// Assert
assertThat(sut.getEnergyUsage()).isEqualTo(BASE_USAGE + USAGE_PER_STORAGE);
+ assertThat(sut.getStored()).isEqualTo(5);
+ assertThat(sut.getCapacity()).isEqualTo(10);
assertThat(networkStorage.getAll()).isEmpty();
assertThat(networkStorage.getStored()).isZero();
}
@@ -96,6 +98,8 @@ void shouldInitializeAndShowResourcesAfterEnabling(
sut.setActive(true);
// Assert
+ assertThat(sut.getStored()).isEqualTo(100);
+ assertThat(sut.getCapacity()).isEqualTo(100);
assertThat(networkStorage.getAll()).usingRecursiveFieldByFieldElementComparator().containsExactlyInAnyOrder(
new ResourceAmount(A, 50),
new ResourceAmount(B, 50)
@@ -134,6 +138,8 @@ void testInitialState(@InjectNetworkStorageComponent final StorageNetworkCompone
assertThat(sut.getStorageConfiguration().getFilterMode()).isEqualTo(FilterMode.BLOCK);
assertThat(networkStorage.getAll()).isEmpty();
assertThat(networkStorage.getStored()).isZero();
+ assertThat(sut.getStored()).isZero();
+ assertThat(sut.getCapacity()).isZero();
assertThat(sut.getSize()).isEqualTo(9);
for (int i = 0; i < 9; ++i) {
assertThat(sut.getState(i)).isEqualTo(StorageState.NONE);
@@ -623,6 +629,8 @@ void shouldHideFromNetworkWhenInactive(
// Assert
assertThat(preInactiveness).isNotEmpty();
assertThat(postInactiveness).isEmpty();
+ assertThat(sut.getStored()).isEqualTo(100);
+ assertThat(sut.getCapacity()).isEqualTo(100);
}
@Test