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