diff --git a/.gitignore b/.gitignore index d9ac69212..a862b184c 100755 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ run/ out/ /bin/ logs/ +**/.DS_Store diff --git a/CHANGELOG-old.md b/CHANGELOG-old.md index 57bc1eb9b..90ede8402 100644 --- a/CHANGELOG-old.md +++ b/CHANGELOG-old.md @@ -1,5 +1,9 @@ # Refined Storage Changelog +### 1.9.18 + +- Fixed potential Pattern crash when loading Minecraft. + ### 1.9.17 - Added more slots to the Pattern Grid (Darkere) - Combined Fluid and Item View in the Pattern Grid (Darkere) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a801a0a9..c4faa0055 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,30 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Fixed + +- Fixed Destructor dupe bug +- Fixed being unable to insert items into the Storage Monitor +- Fixed Storage Monitor not showing all matching items in non-exact mode +- Fixed items getting lost on Creative Disk when more than 2,147,483,647 of one type is stored +- Fixed incorrect autocrafting keybind prompt on macOS +- Fixed crashing the game when a network block was removed in a bad way +- Fixed duplication bug with Constructors and Shulker Boxes +- Fixed breaking blocks with pickaxe taking too much time + +### Changed + +- Improved performance for grid updates +- Improved waterlogging to behave more like vanilla +- JEI version 9.7.1 or higher is now required + +### Added + +- Forge relocation and Packing Tape blacklist tag entries to prevent block movement +- Japanese translations for certain autocrafting actions + +## [v1.10.2] - 2022-03-26 + ### Changed - Ported to Minecraft 1.18.2. diff --git a/build.gradle b/build.gradle index 07c76a5f4..c7f85197f 100755 --- a/build.gradle +++ b/build.gradle @@ -33,7 +33,7 @@ apply plugin: 'maven-publish' group = 'com.refinedmods' archivesBaseName = 'refinedstorage' -version = '1.10.2' +version = '1.10.3' if (System.getenv('GITHUB_SHA') != null) { version += '+' + System.getenv('GITHUB_SHA').substring(0, 7) @@ -102,10 +102,10 @@ processResources { } dependencies { - minecraft 'net.minecraftforge:forge:1.18.2-40.0.32' + minecraft 'net.minecraftforge:forge:1.18.2-40.1.48' - compileOnly fg.deobf("mezz.jei:jei-1.18.2:9.5.4.171:api") - runtimeOnly fg.deobf("mezz.jei:jei-1.18.2:9.5.4.171") + compileOnly fg.deobf("mezz.jei:jei-1.18.2:9.7.1.232:api") + runtimeOnly fg.deobf("mezz.jei:jei-1.18.2:9.7.1.232") compileOnly fg.deobf('curse.maven:mouse-tweaks-60089:3578801') @@ -122,7 +122,7 @@ jar { "Specification-Vendor" : "refinedmods", "Specification-Version" : "1", "Implementation-Title" : project.name, - "Implementation-Version" : "${version}", + "Implementation-Version" : project.jar.archiveVersion, "Implementation-Vendor" : "refinedmods", "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") ]) diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 92531710b..b490a4165 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -767,6 +767,8 @@ bbae585b79552836f291bd7a254bb5311362b717 assets/refinedstorage/models/item/yello 8bf5c07f71be511207cb3338cd9ab569f23d89d6 assets/refinedstorage/models/item/yellow_relay.json 031da071bd54f6bbd6bd726ae8e54dcb31d93dd7 assets/refinedstorage/models/item/yellow_security_manager.json 8cd04b5fd0ef2456369a59326d87b5067a6b7cf5 assets/refinedstorage/models/item/yellow_wireless_transmitter.json +346cf6402101b92a94df091df36ea44fb526776e data/forge/tags/blocks/relocation_not_supported.json +072517fbb36937374da062823ff793db732cee6c data/packingtape/tags/block_entity_type/blacklist/problematic.json 24e9450a858ed0e2268fee8f5d37a168f92e73bc data/refinedstorage/advancements/recipes/refinedstorage/coloring_recipes/black_controller.json 0e90c4471c953dbb46ae3f87b713f107a4b5c6ed data/refinedstorage/advancements/recipes/refinedstorage/coloring_recipes/black_crafter.json 6645b1e1c826d9147b0c81d3169ab0e8e1ef6ef2 data/refinedstorage/advancements/recipes/refinedstorage/coloring_recipes/black_crafter_manager.json @@ -1599,6 +1601,22 @@ f7ec08070c9ea50a614731adc57d07b94cdd3853 data/refinedstorage/recipes/pattern_gri f60de4928bb466ca6c9010d07817963f771caa94 data/refinedstorage/recipes/pattern_grid/red_pattern_grid.json a4be089e23d8452846198b5c273fd2bcc77266ca data/refinedstorage/recipes/pattern_grid/white_pattern_grid.json c1672fda10e2f1326c8dfea6b0379cda5156a9e7 data/refinedstorage/recipes/pattern_grid/yellow_pattern_grid.json +0b7b05fd6b7942263c550e1ac28029c34a2d1df3 data/refinedstorage/tags/blocks/controller.json +55a19599ea37daf13407b2f2cfb8499f8ba0460d data/refinedstorage/tags/blocks/crafter.json +a7e857fa1054067960733aeba34648b19ef7b6c0 data/refinedstorage/tags/blocks/crafter_manager.json +65535d054b0c6adaefaf96d73a03d2c1bcfcbd12 data/refinedstorage/tags/blocks/crafting_grid.json +dc6d041c09fccabd495c8f0edcd10ab07aafb4f5 data/refinedstorage/tags/blocks/crafting_monitor.json +e3f2ad6beb27c3ab1e78d149050e0184c327cef0 data/refinedstorage/tags/blocks/creative_controller.json +a46c335e9b9fe849307b6bda03ac1b62e43c8e5e data/refinedstorage/tags/blocks/detector.json +4d6cf8175e66ad05a36b03d2e1ba3ee55fbf150f data/refinedstorage/tags/blocks/disk_manipulator.json +b047ec7509a9adb5bdd7d7d7915211e27ecd51ae data/refinedstorage/tags/blocks/fluid_grid.json +6cef1d9ca36a6f9b90188e8d1872e8b5d498b224 data/refinedstorage/tags/blocks/grid.json +160871a29dcd72d0212afeb40462f36549f12725 data/refinedstorage/tags/blocks/network_receiver.json +fa7ffed55c5cf1f96d0762495765d7e2be4ac89a data/refinedstorage/tags/blocks/network_transmitter.json +428fd07b2f9098024738edb68efd338aed5f9723 data/refinedstorage/tags/blocks/pattern_grid.json +cddb4a7aa4728aa0af85a16cbc52c87c25e95366 data/refinedstorage/tags/blocks/relay.json +b9f5ac8ab978b8a5328fa480bc8a4d7bd2c307f2 data/refinedstorage/tags/blocks/security_manager.json +46aed661692d3d4b26880e4b293b8892ce440706 data/refinedstorage/tags/blocks/wireless_transmitter.json 0b7b05fd6b7942263c550e1ac28029c34a2d1df3 data/refinedstorage/tags/items/controller.json 55a19599ea37daf13407b2f2cfb8499f8ba0460d data/refinedstorage/tags/items/crafter.json a7e857fa1054067960733aeba34648b19ef7b6c0 data/refinedstorage/tags/items/crafter_manager.json diff --git a/src/generated/resources/data/forge/tags/blocks/relocation_not_supported.json b/src/generated/resources/data/forge/tags/blocks/relocation_not_supported.json new file mode 100644 index 000000000..054628461 --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/relocation_not_supported.json @@ -0,0 +1,42 @@ +{ + "replace": false, + "values": [ + "#refinedstorage:controller", + "#refinedstorage:crafting_monitor", + "#refinedstorage:relay", + "#refinedstorage:crafter_manager", + "#refinedstorage:crafter", + "#refinedstorage:crafting_grid", + "#refinedstorage:network_receiver", + "#refinedstorage:disk_manipulator", + "#refinedstorage:creative_controller", + "#refinedstorage:pattern_grid", + "#refinedstorage:network_transmitter", + "#refinedstorage:security_manager", + "#refinedstorage:fluid_grid", + "#refinedstorage:detector", + "#refinedstorage:grid", + "#refinedstorage:wireless_transmitter", + "refinedstorage:1k_storage_block", + "refinedstorage:4k_storage_block", + "refinedstorage:16k_storage_block", + "refinedstorage:64k_storage_block", + "refinedstorage:creative_storage_block", + "refinedstorage:64k_fluid_storage_block", + "refinedstorage:256k_fluid_storage_block", + "refinedstorage:1024k_fluid_storage_block", + "refinedstorage:4096k_fluid_storage_block", + "refinedstorage:creative_fluid_storage_block", + "refinedstorage:importer", + "refinedstorage:exporter", + "refinedstorage:external_storage", + "refinedstorage:disk_drive", + "refinedstorage:interface", + "refinedstorage:fluid_interface", + "refinedstorage:storage_monitor", + "refinedstorage:constructor", + "refinedstorage:destructor", + "refinedstorage:portable_grid", + "refinedstorage:creative_portable_grid" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/packingtape/tags/block_entity_type/blacklist/problematic.json b/src/generated/resources/data/packingtape/tags/block_entity_type/blacklist/problematic.json new file mode 100644 index 000000000..e888de87d --- /dev/null +++ b/src/generated/resources/data/packingtape/tags/block_entity_type/blacklist/problematic.json @@ -0,0 +1,43 @@ +{ + "replace": false, + "values": [ + "refinedstorage:controller", + "refinedstorage:creative_controller", + "refinedstorage:detector", + "refinedstorage:disk_drive", + "refinedstorage:exporter", + "refinedstorage:external_storage", + "refinedstorage:grid", + "refinedstorage:crafting_grid", + "refinedstorage:pattern_grid", + "refinedstorage:fluid_grid", + "refinedstorage:importer", + "refinedstorage:network_transmitter", + "refinedstorage:network_receiver", + "refinedstorage:relay", + "refinedstorage:cable", + "refinedstorage:1k_storage_block", + "refinedstorage:4k_storage_block", + "refinedstorage:16k_storage_block", + "refinedstorage:64k_storage_block", + "refinedstorage:creative_storage_block", + "refinedstorage:64k_fluid_storage_block", + "refinedstorage:256k_fluid_storage_block", + "refinedstorage:1024k_fluid_storage_block", + "refinedstorage:4096k_fluid_storage_block", + "refinedstorage:creative_fluid_storage_block", + "refinedstorage:security_manager", + "refinedstorage:interface", + "refinedstorage:fluid_interface", + "refinedstorage:wireless_transmitter", + "refinedstorage:storage_monitor", + "refinedstorage:constructor", + "refinedstorage:destructor", + "refinedstorage:disk_manipulator", + "refinedstorage:portable_grid", + "refinedstorage:creative_portable_grid", + "refinedstorage:crafter", + "refinedstorage:crafter_manager", + "refinedstorage:crafting_monitor" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/refinedstorage/tags/blocks/controller.json b/src/generated/resources/data/refinedstorage/tags/blocks/controller.json new file mode 100644 index 000000000..af9280905 --- /dev/null +++ b/src/generated/resources/data/refinedstorage/tags/blocks/controller.json @@ -0,0 +1,21 @@ +{ + "replace": false, + "values": [ + "refinedstorage:white_controller", + "refinedstorage:orange_controller", + "refinedstorage:magenta_controller", + "refinedstorage:controller", + "refinedstorage:yellow_controller", + "refinedstorage:lime_controller", + "refinedstorage:pink_controller", + "refinedstorage:gray_controller", + "refinedstorage:light_gray_controller", + "refinedstorage:cyan_controller", + "refinedstorage:purple_controller", + "refinedstorage:blue_controller", + "refinedstorage:brown_controller", + "refinedstorage:green_controller", + "refinedstorage:red_controller", + "refinedstorage:black_controller" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/refinedstorage/tags/blocks/crafter.json b/src/generated/resources/data/refinedstorage/tags/blocks/crafter.json new file mode 100644 index 000000000..efe2272ac --- /dev/null +++ b/src/generated/resources/data/refinedstorage/tags/blocks/crafter.json @@ -0,0 +1,21 @@ +{ + "replace": false, + "values": [ + "refinedstorage:white_crafter", + "refinedstorage:orange_crafter", + "refinedstorage:magenta_crafter", + "refinedstorage:crafter", + "refinedstorage:yellow_crafter", + "refinedstorage:lime_crafter", + "refinedstorage:pink_crafter", + "refinedstorage:gray_crafter", + "refinedstorage:light_gray_crafter", + "refinedstorage:cyan_crafter", + "refinedstorage:purple_crafter", + "refinedstorage:blue_crafter", + "refinedstorage:brown_crafter", + "refinedstorage:green_crafter", + "refinedstorage:red_crafter", + "refinedstorage:black_crafter" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/refinedstorage/tags/blocks/crafter_manager.json b/src/generated/resources/data/refinedstorage/tags/blocks/crafter_manager.json new file mode 100644 index 000000000..e523f3c18 --- /dev/null +++ b/src/generated/resources/data/refinedstorage/tags/blocks/crafter_manager.json @@ -0,0 +1,21 @@ +{ + "replace": false, + "values": [ + "refinedstorage:white_crafter_manager", + "refinedstorage:orange_crafter_manager", + "refinedstorage:magenta_crafter_manager", + "refinedstorage:crafter_manager", + "refinedstorage:yellow_crafter_manager", + "refinedstorage:lime_crafter_manager", + "refinedstorage:pink_crafter_manager", + "refinedstorage:gray_crafter_manager", + "refinedstorage:light_gray_crafter_manager", + "refinedstorage:cyan_crafter_manager", + "refinedstorage:purple_crafter_manager", + "refinedstorage:blue_crafter_manager", + "refinedstorage:brown_crafter_manager", + "refinedstorage:green_crafter_manager", + "refinedstorage:red_crafter_manager", + "refinedstorage:black_crafter_manager" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/refinedstorage/tags/blocks/crafting_grid.json b/src/generated/resources/data/refinedstorage/tags/blocks/crafting_grid.json new file mode 100644 index 000000000..35d358cf1 --- /dev/null +++ b/src/generated/resources/data/refinedstorage/tags/blocks/crafting_grid.json @@ -0,0 +1,21 @@ +{ + "replace": false, + "values": [ + "refinedstorage:white_crafting_grid", + "refinedstorage:orange_crafting_grid", + "refinedstorage:magenta_crafting_grid", + "refinedstorage:crafting_grid", + "refinedstorage:yellow_crafting_grid", + "refinedstorage:lime_crafting_grid", + "refinedstorage:pink_crafting_grid", + "refinedstorage:gray_crafting_grid", + "refinedstorage:light_gray_crafting_grid", + "refinedstorage:cyan_crafting_grid", + "refinedstorage:purple_crafting_grid", + "refinedstorage:blue_crafting_grid", + "refinedstorage:brown_crafting_grid", + "refinedstorage:green_crafting_grid", + "refinedstorage:red_crafting_grid", + "refinedstorage:black_crafting_grid" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/refinedstorage/tags/blocks/crafting_monitor.json b/src/generated/resources/data/refinedstorage/tags/blocks/crafting_monitor.json new file mode 100644 index 000000000..493ca506f --- /dev/null +++ b/src/generated/resources/data/refinedstorage/tags/blocks/crafting_monitor.json @@ -0,0 +1,21 @@ +{ + "replace": false, + "values": [ + "refinedstorage:white_crafting_monitor", + "refinedstorage:orange_crafting_monitor", + "refinedstorage:magenta_crafting_monitor", + "refinedstorage:crafting_monitor", + "refinedstorage:yellow_crafting_monitor", + "refinedstorage:lime_crafting_monitor", + "refinedstorage:pink_crafting_monitor", + "refinedstorage:gray_crafting_monitor", + "refinedstorage:light_gray_crafting_monitor", + "refinedstorage:cyan_crafting_monitor", + "refinedstorage:purple_crafting_monitor", + "refinedstorage:blue_crafting_monitor", + "refinedstorage:brown_crafting_monitor", + "refinedstorage:green_crafting_monitor", + "refinedstorage:red_crafting_monitor", + "refinedstorage:black_crafting_monitor" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/refinedstorage/tags/blocks/creative_controller.json b/src/generated/resources/data/refinedstorage/tags/blocks/creative_controller.json new file mode 100644 index 000000000..2e140cc01 --- /dev/null +++ b/src/generated/resources/data/refinedstorage/tags/blocks/creative_controller.json @@ -0,0 +1,21 @@ +{ + "replace": false, + "values": [ + "refinedstorage:white_creative_controller", + "refinedstorage:orange_creative_controller", + "refinedstorage:magenta_creative_controller", + "refinedstorage:creative_controller", + "refinedstorage:yellow_creative_controller", + "refinedstorage:lime_creative_controller", + "refinedstorage:pink_creative_controller", + "refinedstorage:gray_creative_controller", + "refinedstorage:light_gray_creative_controller", + "refinedstorage:cyan_creative_controller", + "refinedstorage:purple_creative_controller", + "refinedstorage:blue_creative_controller", + "refinedstorage:brown_creative_controller", + "refinedstorage:green_creative_controller", + "refinedstorage:red_creative_controller", + "refinedstorage:black_creative_controller" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/refinedstorage/tags/blocks/detector.json b/src/generated/resources/data/refinedstorage/tags/blocks/detector.json new file mode 100644 index 000000000..1092c9f26 --- /dev/null +++ b/src/generated/resources/data/refinedstorage/tags/blocks/detector.json @@ -0,0 +1,21 @@ +{ + "replace": false, + "values": [ + "refinedstorage:white_detector", + "refinedstorage:orange_detector", + "refinedstorage:magenta_detector", + "refinedstorage:detector", + "refinedstorage:yellow_detector", + "refinedstorage:lime_detector", + "refinedstorage:pink_detector", + "refinedstorage:gray_detector", + "refinedstorage:light_gray_detector", + "refinedstorage:cyan_detector", + "refinedstorage:purple_detector", + "refinedstorage:blue_detector", + "refinedstorage:brown_detector", + "refinedstorage:green_detector", + "refinedstorage:red_detector", + "refinedstorage:black_detector" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/refinedstorage/tags/blocks/disk_manipulator.json b/src/generated/resources/data/refinedstorage/tags/blocks/disk_manipulator.json new file mode 100644 index 000000000..e9e0ddbf2 --- /dev/null +++ b/src/generated/resources/data/refinedstorage/tags/blocks/disk_manipulator.json @@ -0,0 +1,21 @@ +{ + "replace": false, + "values": [ + "refinedstorage:white_disk_manipulator", + "refinedstorage:orange_disk_manipulator", + "refinedstorage:magenta_disk_manipulator", + "refinedstorage:disk_manipulator", + "refinedstorage:yellow_disk_manipulator", + "refinedstorage:lime_disk_manipulator", + "refinedstorage:pink_disk_manipulator", + "refinedstorage:gray_disk_manipulator", + "refinedstorage:light_gray_disk_manipulator", + "refinedstorage:cyan_disk_manipulator", + "refinedstorage:purple_disk_manipulator", + "refinedstorage:blue_disk_manipulator", + "refinedstorage:brown_disk_manipulator", + "refinedstorage:green_disk_manipulator", + "refinedstorage:red_disk_manipulator", + "refinedstorage:black_disk_manipulator" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/refinedstorage/tags/blocks/fluid_grid.json b/src/generated/resources/data/refinedstorage/tags/blocks/fluid_grid.json new file mode 100644 index 000000000..4b57e76c8 --- /dev/null +++ b/src/generated/resources/data/refinedstorage/tags/blocks/fluid_grid.json @@ -0,0 +1,21 @@ +{ + "replace": false, + "values": [ + "refinedstorage:white_fluid_grid", + "refinedstorage:orange_fluid_grid", + "refinedstorage:magenta_fluid_grid", + "refinedstorage:fluid_grid", + "refinedstorage:yellow_fluid_grid", + "refinedstorage:lime_fluid_grid", + "refinedstorage:pink_fluid_grid", + "refinedstorage:gray_fluid_grid", + "refinedstorage:light_gray_fluid_grid", + "refinedstorage:cyan_fluid_grid", + "refinedstorage:purple_fluid_grid", + "refinedstorage:blue_fluid_grid", + "refinedstorage:brown_fluid_grid", + "refinedstorage:green_fluid_grid", + "refinedstorage:red_fluid_grid", + "refinedstorage:black_fluid_grid" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/refinedstorage/tags/blocks/grid.json b/src/generated/resources/data/refinedstorage/tags/blocks/grid.json new file mode 100644 index 000000000..cc5b43744 --- /dev/null +++ b/src/generated/resources/data/refinedstorage/tags/blocks/grid.json @@ -0,0 +1,21 @@ +{ + "replace": false, + "values": [ + "refinedstorage:white_grid", + "refinedstorage:orange_grid", + "refinedstorage:magenta_grid", + "refinedstorage:grid", + "refinedstorage:yellow_grid", + "refinedstorage:lime_grid", + "refinedstorage:pink_grid", + "refinedstorage:gray_grid", + "refinedstorage:light_gray_grid", + "refinedstorage:cyan_grid", + "refinedstorage:purple_grid", + "refinedstorage:blue_grid", + "refinedstorage:brown_grid", + "refinedstorage:green_grid", + "refinedstorage:red_grid", + "refinedstorage:black_grid" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/refinedstorage/tags/blocks/network_receiver.json b/src/generated/resources/data/refinedstorage/tags/blocks/network_receiver.json new file mode 100644 index 000000000..d8edf164d --- /dev/null +++ b/src/generated/resources/data/refinedstorage/tags/blocks/network_receiver.json @@ -0,0 +1,21 @@ +{ + "replace": false, + "values": [ + "refinedstorage:white_network_receiver", + "refinedstorage:orange_network_receiver", + "refinedstorage:magenta_network_receiver", + "refinedstorage:network_receiver", + "refinedstorage:yellow_network_receiver", + "refinedstorage:lime_network_receiver", + "refinedstorage:pink_network_receiver", + "refinedstorage:gray_network_receiver", + "refinedstorage:light_gray_network_receiver", + "refinedstorage:cyan_network_receiver", + "refinedstorage:purple_network_receiver", + "refinedstorage:blue_network_receiver", + "refinedstorage:brown_network_receiver", + "refinedstorage:green_network_receiver", + "refinedstorage:red_network_receiver", + "refinedstorage:black_network_receiver" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/refinedstorage/tags/blocks/network_transmitter.json b/src/generated/resources/data/refinedstorage/tags/blocks/network_transmitter.json new file mode 100644 index 000000000..c2e320ddc --- /dev/null +++ b/src/generated/resources/data/refinedstorage/tags/blocks/network_transmitter.json @@ -0,0 +1,21 @@ +{ + "replace": false, + "values": [ + "refinedstorage:white_network_transmitter", + "refinedstorage:orange_network_transmitter", + "refinedstorage:magenta_network_transmitter", + "refinedstorage:network_transmitter", + "refinedstorage:yellow_network_transmitter", + "refinedstorage:lime_network_transmitter", + "refinedstorage:pink_network_transmitter", + "refinedstorage:gray_network_transmitter", + "refinedstorage:light_gray_network_transmitter", + "refinedstorage:cyan_network_transmitter", + "refinedstorage:purple_network_transmitter", + "refinedstorage:blue_network_transmitter", + "refinedstorage:brown_network_transmitter", + "refinedstorage:green_network_transmitter", + "refinedstorage:red_network_transmitter", + "refinedstorage:black_network_transmitter" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/refinedstorage/tags/blocks/pattern_grid.json b/src/generated/resources/data/refinedstorage/tags/blocks/pattern_grid.json new file mode 100644 index 000000000..bc14c201b --- /dev/null +++ b/src/generated/resources/data/refinedstorage/tags/blocks/pattern_grid.json @@ -0,0 +1,21 @@ +{ + "replace": false, + "values": [ + "refinedstorage:white_pattern_grid", + "refinedstorage:orange_pattern_grid", + "refinedstorage:magenta_pattern_grid", + "refinedstorage:pattern_grid", + "refinedstorage:yellow_pattern_grid", + "refinedstorage:lime_pattern_grid", + "refinedstorage:pink_pattern_grid", + "refinedstorage:gray_pattern_grid", + "refinedstorage:light_gray_pattern_grid", + "refinedstorage:cyan_pattern_grid", + "refinedstorage:purple_pattern_grid", + "refinedstorage:blue_pattern_grid", + "refinedstorage:brown_pattern_grid", + "refinedstorage:green_pattern_grid", + "refinedstorage:red_pattern_grid", + "refinedstorage:black_pattern_grid" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/refinedstorage/tags/blocks/relay.json b/src/generated/resources/data/refinedstorage/tags/blocks/relay.json new file mode 100644 index 000000000..736ba7cc2 --- /dev/null +++ b/src/generated/resources/data/refinedstorage/tags/blocks/relay.json @@ -0,0 +1,21 @@ +{ + "replace": false, + "values": [ + "refinedstorage:white_relay", + "refinedstorage:orange_relay", + "refinedstorage:magenta_relay", + "refinedstorage:relay", + "refinedstorage:yellow_relay", + "refinedstorage:lime_relay", + "refinedstorage:pink_relay", + "refinedstorage:gray_relay", + "refinedstorage:light_gray_relay", + "refinedstorage:cyan_relay", + "refinedstorage:purple_relay", + "refinedstorage:blue_relay", + "refinedstorage:brown_relay", + "refinedstorage:green_relay", + "refinedstorage:red_relay", + "refinedstorage:black_relay" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/refinedstorage/tags/blocks/security_manager.json b/src/generated/resources/data/refinedstorage/tags/blocks/security_manager.json new file mode 100644 index 000000000..3d378b1b4 --- /dev/null +++ b/src/generated/resources/data/refinedstorage/tags/blocks/security_manager.json @@ -0,0 +1,21 @@ +{ + "replace": false, + "values": [ + "refinedstorage:white_security_manager", + "refinedstorage:orange_security_manager", + "refinedstorage:magenta_security_manager", + "refinedstorage:security_manager", + "refinedstorage:yellow_security_manager", + "refinedstorage:lime_security_manager", + "refinedstorage:pink_security_manager", + "refinedstorage:gray_security_manager", + "refinedstorage:light_gray_security_manager", + "refinedstorage:cyan_security_manager", + "refinedstorage:purple_security_manager", + "refinedstorage:blue_security_manager", + "refinedstorage:brown_security_manager", + "refinedstorage:green_security_manager", + "refinedstorage:red_security_manager", + "refinedstorage:black_security_manager" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/refinedstorage/tags/blocks/wireless_transmitter.json b/src/generated/resources/data/refinedstorage/tags/blocks/wireless_transmitter.json new file mode 100644 index 000000000..9158222e5 --- /dev/null +++ b/src/generated/resources/data/refinedstorage/tags/blocks/wireless_transmitter.json @@ -0,0 +1,21 @@ +{ + "replace": false, + "values": [ + "refinedstorage:white_wireless_transmitter", + "refinedstorage:orange_wireless_transmitter", + "refinedstorage:magenta_wireless_transmitter", + "refinedstorage:wireless_transmitter", + "refinedstorage:yellow_wireless_transmitter", + "refinedstorage:lime_wireless_transmitter", + "refinedstorage:pink_wireless_transmitter", + "refinedstorage:gray_wireless_transmitter", + "refinedstorage:light_gray_wireless_transmitter", + "refinedstorage:cyan_wireless_transmitter", + "refinedstorage:purple_wireless_transmitter", + "refinedstorage:blue_wireless_transmitter", + "refinedstorage:brown_wireless_transmitter", + "refinedstorage:green_wireless_transmitter", + "refinedstorage:red_wireless_transmitter", + "refinedstorage:black_wireless_transmitter" + ] +} \ No newline at end of file diff --git a/src/main/java/com/refinedmods/refinedstorage/RS.java b/src/main/java/com/refinedmods/refinedstorage/RS.java index 5c54ddc46..a6a48c117 100644 --- a/src/main/java/com/refinedmods/refinedstorage/RS.java +++ b/src/main/java/com/refinedmods/refinedstorage/RS.java @@ -48,6 +48,7 @@ public final class RS { RSBlocks.register(); RSItems.register(); + RSLootFunctions.register(); FMLJavaModLoadingContext.get().getModEventBus().addListener(CommonSetup::onCommonSetup); FMLJavaModLoadingContext.get().getModEventBus().addGenericListener(BlockEntityType.class, CommonSetup::onRegisterBlockEntities); diff --git a/src/main/java/com/refinedmods/refinedstorage/RSBlocks.java b/src/main/java/com/refinedmods/refinedstorage/RSBlocks.java index 27c7c083e..89c6c7cbf 100644 --- a/src/main/java/com/refinedmods/refinedstorage/RSBlocks.java +++ b/src/main/java/com/refinedmods/refinedstorage/RSBlocks.java @@ -7,6 +7,7 @@ import com.refinedmods.refinedstorage.apiimpl.storage.ItemStorageType; import com.refinedmods.refinedstorage.block.*; import com.refinedmods.refinedstorage.item.blockitem.PortableGridBlockItem; import com.refinedmods.refinedstorage.util.ColorMap; +import net.minecraft.tags.TagKey; import net.minecraft.world.level.block.Block; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.registries.DeferredRegister; @@ -15,6 +16,7 @@ import net.minecraftforge.registries.RegistryObject; import java.util.ArrayList; import java.util.EnumMap; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -28,6 +30,7 @@ public final class RSBlocks { public static final RegistryObject EXTERNAL_STORAGE; public static final Map> STORAGE_BLOCKS = new EnumMap<>(ItemStorageType.class); public static final Map> FLUID_STORAGE_BLOCKS = new EnumMap<>(FluidStorageType.class); + public static final Map, ColorMap> COLORED_BLOCK_TAGS = new HashMap<>(); public static final RegistryObject INTERFACE; public static final RegistryObject FLUID_INTERFACE; public static final RegistryObject STORAGE_MONITOR; diff --git a/src/main/java/com/refinedmods/refinedstorage/RSLootFunctions.java b/src/main/java/com/refinedmods/refinedstorage/RSLootFunctions.java index ab4384483..69e4eeabb 100644 --- a/src/main/java/com/refinedmods/refinedstorage/RSLootFunctions.java +++ b/src/main/java/com/refinedmods/refinedstorage/RSLootFunctions.java @@ -5,38 +5,30 @@ import com.refinedmods.refinedstorage.loottable.CrafterLootFunction; import com.refinedmods.refinedstorage.loottable.PortableGridBlockLootFunction; import com.refinedmods.refinedstorage.loottable.StorageBlockLootFunction; import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.storage.loot.functions.LootItemFunctionType; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.RegistryObject; public final class RSLootFunctions { - private static LootItemFunctionType storageBlock; - private static LootItemFunctionType portableGrid; - private static LootItemFunctionType crafter; - private static LootItemFunctionType controller; + public static final RegistryObject STORAGE_BLOCK; + public static final RegistryObject PORTABLE_GRID; + public static final RegistryObject CRAFTER; + public static final RegistryObject CONTROLLER; + + private static final DeferredRegister LOOT_ITEM_FUNCTIONS = DeferredRegister.create(Registry.LOOT_FUNCTION_REGISTRY, RS.ID); + + static { + STORAGE_BLOCK = LOOT_ITEM_FUNCTIONS.register("storage_block", () -> new LootItemFunctionType(new StorageBlockLootFunction.Serializer())); + PORTABLE_GRID = LOOT_ITEM_FUNCTIONS.register("portable_grid", () -> new LootItemFunctionType(new PortableGridBlockLootFunction.Serializer())); + CRAFTER = LOOT_ITEM_FUNCTIONS.register("crafter", () -> new LootItemFunctionType(new CrafterLootFunction.Serializer())); + CONTROLLER = LOOT_ITEM_FUNCTIONS.register("controller", () -> new LootItemFunctionType(new ControllerLootFunction.Serializer())); + } private RSLootFunctions() { } public static void register() { - storageBlock = Registry.register(Registry.LOOT_FUNCTION_TYPE, new ResourceLocation(RS.ID, "storage_block"), new LootItemFunctionType(new StorageBlockLootFunction.Serializer())); - portableGrid = Registry.register(Registry.LOOT_FUNCTION_TYPE, new ResourceLocation(RS.ID, "portable_grid"), new LootItemFunctionType(new PortableGridBlockLootFunction.Serializer())); - crafter = Registry.register(Registry.LOOT_FUNCTION_TYPE, new ResourceLocation(RS.ID, "crafter"), new LootItemFunctionType(new CrafterLootFunction.Serializer())); - controller = Registry.register(Registry.LOOT_FUNCTION_TYPE, new ResourceLocation(RS.ID, "controller"), new LootItemFunctionType(new ControllerLootFunction.Serializer())); - } - - public static LootItemFunctionType getStorageBlock() { - return storageBlock; - } - - public static LootItemFunctionType getPortableGrid() { - return portableGrid; - } - - public static LootItemFunctionType getCrafter() { - return crafter; - } - - public static LootItemFunctionType getController() { - return controller; + LOOT_ITEM_FUNCTIONS.register(FMLJavaModLoadingContext.get().getModEventBus()); } } diff --git a/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/node/ConstructorNetworkNode.java b/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/node/ConstructorNetworkNode.java index cbd443502..36dcfbfa6 100644 --- a/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/node/ConstructorNetworkNode.java +++ b/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/node/ConstructorNetworkNode.java @@ -14,8 +14,8 @@ import com.refinedmods.refinedstorage.inventory.item.UpgradeItemHandler; import com.refinedmods.refinedstorage.inventory.listener.NetworkNodeFluidInventoryListener; import com.refinedmods.refinedstorage.inventory.listener.NetworkNodeInventoryListener; import com.refinedmods.refinedstorage.item.UpgradeItem; -import com.refinedmods.refinedstorage.util.StackUtils; import com.refinedmods.refinedstorage.util.LevelUtils; +import com.refinedmods.refinedstorage.util.StackUtils; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.PositionImpl; @@ -112,6 +112,8 @@ public class ConstructorNetworkNode extends NetworkNode implements IComparable, private void extractAndPlaceBlock(ItemStack stack) { ItemStack took = network.extractItem(stack, 1, compare, Action.SIMULATE); if (!took.isEmpty()) { + // We have to copy took as the forge hook clears the item. + final ItemStack tookCopy = took.copy(); BlockPlaceContext ctx = new ConstructorBlockItemUseContext( level, LevelUtils.getFakePlayer((ServerLevel) level, getOwner()), @@ -122,7 +124,7 @@ public class ConstructorNetworkNode extends NetworkNode implements IComparable, InteractionResult result = ForgeHooks.onPlaceItemIntoWorld(ctx); if (result.consumesAction()) { - network.extractItem(stack, 1, Action.PERFORM); + network.extractItem(tookCopy, 1, Action.PERFORM); } } else if (upgrades.hasUpgrade(UpgradeItem.Type.CRAFTING)) { ItemStack craft = itemFilters.getStackInSlot(0); diff --git a/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/node/DestructorNetworkNode.java b/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/node/DestructorNetworkNode.java index 9facb3b6c..7d6da7c12 100644 --- a/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/node/DestructorNetworkNode.java +++ b/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/node/DestructorNetworkNode.java @@ -15,8 +15,8 @@ import com.refinedmods.refinedstorage.inventory.item.UpgradeItemHandler; import com.refinedmods.refinedstorage.inventory.listener.NetworkNodeFluidInventoryListener; import com.refinedmods.refinedstorage.inventory.listener.NetworkNodeInventoryListener; import com.refinedmods.refinedstorage.item.UpgradeItem; -import com.refinedmods.refinedstorage.util.StackUtils; import com.refinedmods.refinedstorage.util.LevelUtils; +import com.refinedmods.refinedstorage.util.StackUtils; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; @@ -100,7 +100,12 @@ public class DestructorNetworkNode extends NetworkNode implements IComparable, I List droppedItems = level.getEntitiesOfClass(ItemEntity.class, new AABB(front)); for (ItemEntity entity : droppedItems) { - ItemStack droppedItem = ((ItemEntity) entity).getItem(); + + if (entity.isRemoved()) { + continue; + } + + ItemStack droppedItem = entity.getItem(); if (IWhitelistBlacklist.acceptsItem(itemFilters, mode, compare, droppedItem) && network.insertItem(droppedItem, droppedItem.getCount(), Action.SIMULATE).isEmpty()) { diff --git a/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/node/StorageMonitorNetworkNode.java b/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/node/StorageMonitorNetworkNode.java index 02d1eb06e..2a6d0b80b 100644 --- a/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/node/StorageMonitorNetworkNode.java +++ b/src/main/java/com/refinedmods/refinedstorage/apiimpl/network/node/StorageMonitorNetworkNode.java @@ -5,16 +5,16 @@ import com.refinedmods.refinedstorage.api.network.security.Permission; import com.refinedmods.refinedstorage.api.util.Action; import com.refinedmods.refinedstorage.api.util.IComparer; import com.refinedmods.refinedstorage.apiimpl.API; -import com.refinedmods.refinedstorage.inventory.fluid.FluidInventory; -import com.refinedmods.refinedstorage.inventory.item.BaseItemHandler; -import com.refinedmods.refinedstorage.inventory.listener.NetworkNodeInventoryListener; import com.refinedmods.refinedstorage.blockentity.StorageMonitorBlockEntity; import com.refinedmods.refinedstorage.blockentity.config.IComparable; import com.refinedmods.refinedstorage.blockentity.config.IType; import com.refinedmods.refinedstorage.blockentity.config.RedstoneMode; +import com.refinedmods.refinedstorage.inventory.fluid.FluidInventory; +import com.refinedmods.refinedstorage.inventory.item.BaseItemHandler; +import com.refinedmods.refinedstorage.inventory.listener.NetworkNodeInventoryListener; +import com.refinedmods.refinedstorage.util.LevelUtils; import com.refinedmods.refinedstorage.util.NetworkUtils; import com.refinedmods.refinedstorage.util.StackUtils; -import com.refinedmods.refinedstorage.util.LevelUtils; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -299,9 +299,13 @@ public class StorageMonitorNetworkNode extends NetworkNode implements IComparabl return 0; } - ItemStack stored = network.getItemStorageCache().getList().get(toCheck, compare); + if (compare == IComparer.COMPARE_NBT) { + ItemStack stored = network.getItemStorageCache().getList().get(toCheck, compare); + return stored != null ? stored.getCount() : 0; + } else { + return network.getItemStorageCache().getList().getStacks(toCheck).stream().mapToInt(entry -> entry.getStack().getCount()).sum(); + } - return stored != null ? stored.getCount() : 0; } else if (getType() == IType.FLUIDS) { FluidStack toCheck = fluidFilter.getFluid(0); diff --git a/src/main/java/com/refinedmods/refinedstorage/apiimpl/storage/disk/FluidStorageDisk.java b/src/main/java/com/refinedmods/refinedstorage/apiimpl/storage/disk/FluidStorageDisk.java index c692e8d70..a3170a836 100644 --- a/src/main/java/com/refinedmods/refinedstorage/apiimpl/storage/disk/FluidStorageDisk.java +++ b/src/main/java/com/refinedmods/refinedstorage/apiimpl/storage/disk/FluidStorageDisk.java @@ -95,13 +95,14 @@ public class FluidStorageDisk implements IStorageDisk { return StackUtils.copy(otherStack, size - remainingSpace); } else { + int maxConsumable = Math.min(size, Integer.MAX_VALUE - otherStack.getAmount()); if (action == Action.PERFORM) { - otherStack.grow(size); + otherStack.grow(maxConsumable); onChanged(); } - return FluidStack.EMPTY; + return StackUtils.copy(otherStack, size - maxConsumable); } } } diff --git a/src/main/java/com/refinedmods/refinedstorage/apiimpl/storage/disk/ItemStorageDisk.java b/src/main/java/com/refinedmods/refinedstorage/apiimpl/storage/disk/ItemStorageDisk.java index 27b30daa9..cea7e2326 100644 --- a/src/main/java/com/refinedmods/refinedstorage/apiimpl/storage/disk/ItemStorageDisk.java +++ b/src/main/java/com/refinedmods/refinedstorage/apiimpl/storage/disk/ItemStorageDisk.java @@ -102,14 +102,15 @@ public class ItemStorageDisk implements IStorageDisk { return ItemHandlerHelper.copyStackWithSize(otherStack, size - remainingSpace); } else { + int maxConsumable = Math.min(size, Integer.MAX_VALUE - otherStack.getCount()); if (action == Action.PERFORM) { - otherStack.grow(size); - itemCount += size; + otherStack.grow(maxConsumable); + itemCount += maxConsumable; onChanged(); } - return ItemStack.EMPTY; + return ItemHandlerHelper.copyStackWithSize(otherStack, size - maxConsumable); } } } diff --git a/src/main/java/com/refinedmods/refinedstorage/block/CableBlock.java b/src/main/java/com/refinedmods/refinedstorage/block/CableBlock.java index d2b5374a7..3ee9af354 100644 --- a/src/main/java/com/refinedmods/refinedstorage/block/CableBlock.java +++ b/src/main/java/com/refinedmods/refinedstorage/block/CableBlock.java @@ -6,9 +6,9 @@ import com.refinedmods.refinedstorage.api.network.node.INetworkNodeProxy; import com.refinedmods.refinedstorage.apiimpl.network.node.cover.Cover; import com.refinedmods.refinedstorage.apiimpl.network.node.cover.CoverType; import com.refinedmods.refinedstorage.block.shape.ShapeCache; +import com.refinedmods.refinedstorage.blockentity.CableBlockEntity; import com.refinedmods.refinedstorage.capability.NetworkNodeProxyCapability; import com.refinedmods.refinedstorage.render.ConstantsCable; -import com.refinedmods.refinedstorage.blockentity.CableBlockEntity; import com.refinedmods.refinedstorage.util.BlockUtils; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -165,7 +165,8 @@ public class CableBlock extends NetworkNodeBlock implements SimpleWaterloggedBlo @Nullable @Override public BlockState getStateForPlacement(BlockPlaceContext ctx) { - return getState(defaultBlockState(), ctx.getLevel(), ctx.getClickedPos()); + FluidState fluidState = ctx.getLevel().getFluidState(ctx.getClickedPos()); + return getState(defaultBlockState().setValue(WATERLOGGED, fluidState.getType() == Fluids.WATER), ctx.getLevel(), ctx.getClickedPos()); } @Override diff --git a/src/main/java/com/refinedmods/refinedstorage/block/StorageMonitorBlock.java b/src/main/java/com/refinedmods/refinedstorage/block/StorageMonitorBlock.java index 051f3a508..74b4e2722 100644 --- a/src/main/java/com/refinedmods/refinedstorage/block/StorageMonitorBlock.java +++ b/src/main/java/com/refinedmods/refinedstorage/block/StorageMonitorBlock.java @@ -1,12 +1,12 @@ package com.refinedmods.refinedstorage.block; import com.refinedmods.refinedstorage.apiimpl.network.node.StorageMonitorNetworkNode; +import com.refinedmods.refinedstorage.blockentity.StorageMonitorBlockEntity; import com.refinedmods.refinedstorage.container.StorageMonitorContainerMenu; import com.refinedmods.refinedstorage.container.factory.BlockEntityMenuProvider; -import com.refinedmods.refinedstorage.blockentity.StorageMonitorBlockEntity; import com.refinedmods.refinedstorage.util.BlockUtils; -import com.refinedmods.refinedstorage.util.NetworkUtils; import com.refinedmods.refinedstorage.util.LevelUtils; +import com.refinedmods.refinedstorage.util.NetworkUtils; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.server.level.ServerPlayer; @@ -40,7 +40,7 @@ public class StorageMonitorBlock extends NetworkNodeBlock { @SuppressWarnings("deprecation") public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { if (!level.isClientSide) { - ItemStack held = player.containerMenu.getCarried(); + ItemStack held = player.getItemInHand(handIn); if (player.isCrouching()) { return NetworkUtils.attemptModify(level, pos, player, () -> NetworkHooks.openGui( diff --git a/src/main/java/com/refinedmods/refinedstorage/blockentity/NetworkNodeBlockEntity.java b/src/main/java/com/refinedmods/refinedstorage/blockentity/NetworkNodeBlockEntity.java index 207c21a2c..b81292352 100644 --- a/src/main/java/com/refinedmods/refinedstorage/blockentity/NetworkNodeBlockEntity.java +++ b/src/main/java/com/refinedmods/refinedstorage/blockentity/NetworkNodeBlockEntity.java @@ -6,10 +6,10 @@ import com.refinedmods.refinedstorage.api.network.node.INetworkNodeProxy; import com.refinedmods.refinedstorage.api.util.Action; import com.refinedmods.refinedstorage.apiimpl.API; import com.refinedmods.refinedstorage.apiimpl.network.node.NetworkNode; -import com.refinedmods.refinedstorage.capability.NetworkNodeProxyCapability; import com.refinedmods.refinedstorage.blockentity.config.IRedstoneConfigurable; import com.refinedmods.refinedstorage.blockentity.config.RedstoneMode; import com.refinedmods.refinedstorage.blockentity.data.BlockEntitySynchronizationParameter; +import com.refinedmods.refinedstorage.capability.NetworkNodeProxyCapability; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -18,6 +18,8 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -28,6 +30,8 @@ public abstract class NetworkNodeBlockEntity extends Base private N clientNode; private N removedNode; + private static final Logger LOGGER = LogManager.getLogger(); + protected NetworkNodeBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); @@ -61,7 +65,10 @@ public abstract class NetworkNodeBlockEntity extends Base INetworkNode node = manager.getNode(worldPosition); if (node == null) { - throw new IllegalStateException("No network node present at " + worldPosition.toString() + ", consider removing the block at this position"); + LOGGER.warn("Expected a node @ {} but couldn't find it, creating a new one...", worldPosition); + node = createNode(level, worldPosition); + manager.setNode(worldPosition, node); + manager.markForSaving(); } return (N) node; diff --git a/src/main/java/com/refinedmods/refinedstorage/datageneration/BlockEntityTagGenerator.java b/src/main/java/com/refinedmods/refinedstorage/datageneration/BlockEntityTagGenerator.java new file mode 100644 index 000000000..58ecdb45f --- /dev/null +++ b/src/main/java/com/refinedmods/refinedstorage/datageneration/BlockEntityTagGenerator.java @@ -0,0 +1,68 @@ +package com.refinedmods.refinedstorage.datageneration; + +import com.refinedmods.refinedstorage.RSBlockEntities; +import net.minecraft.core.Registry; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.tags.TagsProvider; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraftforge.common.data.ExistingFileHelper; + +import javax.annotation.Nullable; + +public class BlockEntityTagGenerator extends TagsProvider> { + public BlockEntityTagGenerator(DataGenerator dataGenerator, String modId, @Nullable ExistingFileHelper existingFileHelper) { + super(dataGenerator, Registry.BLOCK_ENTITY_TYPE, modId, existingFileHelper); + } + + @Override + protected void addTags() { + TagAppender> packingTapeBlacklist = tag(TagKey.create(Registry.BLOCK_ENTITY_TYPE_REGISTRY, new ResourceLocation("packingtape:blacklist/problematic"))); + packingTapeBlacklist.add( + RSBlockEntities.CONTROLLER, + RSBlockEntities.CREATIVE_CONTROLLER, + RSBlockEntities.DETECTOR, + RSBlockEntities.DISK_DRIVE, + RSBlockEntities.EXPORTER, + RSBlockEntities.EXTERNAL_STORAGE, + RSBlockEntities.GRID, + RSBlockEntities.CRAFTING_GRID, + RSBlockEntities.PATTERN_GRID, + RSBlockEntities.FLUID_GRID, + RSBlockEntities.IMPORTER, + RSBlockEntities.NETWORK_TRANSMITTER, + RSBlockEntities.NETWORK_RECEIVER, + RSBlockEntities.RELAY, + RSBlockEntities.CABLE, + RSBlockEntities.ONE_K_STORAGE_BLOCK, + RSBlockEntities.FOUR_K_STORAGE_BLOCK, + RSBlockEntities.SIXTEEN_K_STORAGE_BLOCK, + RSBlockEntities.SIXTY_FOUR_K_STORAGE_BLOCK, + RSBlockEntities.CREATIVE_STORAGE_BLOCK, + RSBlockEntities.SIXTY_FOUR_K_FLUID_STORAGE_BLOCK, + RSBlockEntities.TWO_HUNDRED_FIFTY_SIX_K_FLUID_STORAGE_BLOCK, + RSBlockEntities.THOUSAND_TWENTY_FOUR_K_FLUID_STORAGE_BLOCK, + RSBlockEntities.FOUR_THOUSAND_NINETY_SIX_K_FLUID_STORAGE_BLOCK, + RSBlockEntities.CREATIVE_FLUID_STORAGE_BLOCK, + RSBlockEntities.SECURITY_MANAGER, + RSBlockEntities.INTERFACE, + RSBlockEntities.FLUID_INTERFACE, + RSBlockEntities.WIRELESS_TRANSMITTER, + RSBlockEntities.STORAGE_MONITOR, + RSBlockEntities.CONSTRUCTOR, + RSBlockEntities.DESTRUCTOR, + RSBlockEntities.DISK_MANIPULATOR, + RSBlockEntities.PORTABLE_GRID, + RSBlockEntities.CREATIVE_PORTABLE_GRID, + RSBlockEntities.CRAFTER, + RSBlockEntities.CRAFTER_MANAGER, + RSBlockEntities.CRAFTING_MONITOR + ); + } + + @Override + public String getName() { + return "Block Entity Type Tags"; + } +} diff --git a/src/main/java/com/refinedmods/refinedstorage/datageneration/BlockTagGenerator.java b/src/main/java/com/refinedmods/refinedstorage/datageneration/BlockTagGenerator.java new file mode 100644 index 000000000..567872714 --- /dev/null +++ b/src/main/java/com/refinedmods/refinedstorage/datageneration/BlockTagGenerator.java @@ -0,0 +1,42 @@ +package com.refinedmods.refinedstorage.datageneration; + +import com.refinedmods.refinedstorage.RSBlocks; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.tags.BlockTagsProvider; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.common.data.ExistingFileHelper; + +import javax.annotation.Nullable; + +public class BlockTagGenerator extends BlockTagsProvider { + public BlockTagGenerator(DataGenerator dataGenerator, String modId, @Nullable ExistingFileHelper existingFileHelper) { + super(dataGenerator, modId, existingFileHelper); + } + + @Override + protected void addTags() { + TagAppender noRelocationTag = tag(BlockTags.create(new ResourceLocation("forge:relocation_not_supported"))); + RSBlocks.COLORED_BLOCK_TAGS.forEach((tag, map) -> { + map.values().forEach(block -> tag(tag).add(block.get())); + noRelocationTag.addTags(tag); + }); + RSBlocks.STORAGE_BLOCKS.forEach((tag, block) -> noRelocationTag.add(block.get())); + RSBlocks.FLUID_STORAGE_BLOCKS.forEach((tag, block) -> noRelocationTag.add(block.get())); + + noRelocationTag.add( + RSBlocks.IMPORTER.get(), + RSBlocks.EXPORTER.get(), + RSBlocks.EXTERNAL_STORAGE.get(), + RSBlocks.DISK_DRIVE.get(), + RSBlocks.INTERFACE.get(), + RSBlocks.FLUID_INTERFACE.get(), + RSBlocks.STORAGE_MONITOR.get(), + RSBlocks.CONSTRUCTOR.get(), + RSBlocks.DESTRUCTOR.get(), + RSBlocks.PORTABLE_GRID.get(), + RSBlocks.CREATIVE_PORTABLE_GRID.get() + ); + } +} diff --git a/src/main/java/com/refinedmods/refinedstorage/datageneration/DataGenerators.java b/src/main/java/com/refinedmods/refinedstorage/datageneration/DataGenerators.java index 13ed3bfbe..24fdf2333 100644 --- a/src/main/java/com/refinedmods/refinedstorage/datageneration/DataGenerators.java +++ b/src/main/java/com/refinedmods/refinedstorage/datageneration/DataGenerators.java @@ -13,12 +13,22 @@ public class DataGenerators { } if (event.includeServer()) { event.getGenerator().addProvider(new RecipeGenerator(event.getGenerator())); - event.getGenerator().addProvider(new TagGenerator( + BlockTagGenerator blockTagGenerator = new BlockTagGenerator( + event.getGenerator(), + RS.ID, + event.getExistingFileHelper()); + event.getGenerator().addProvider(blockTagGenerator); + event.getGenerator().addProvider(new ItemTagGenerator( event.getGenerator(), - new BlockTagsProvider(event.getGenerator(), RS.ID, event.getExistingFileHelper()), + blockTagGenerator, RS.ID, event.getExistingFileHelper()) ); + event.getGenerator().addProvider(new BlockEntityTagGenerator( + event.getGenerator(), + RS.ID, + event.getExistingFileHelper() + )); event.getGenerator().addProvider(new LootTableGenerator(event.getGenerator())); } } diff --git a/src/main/java/com/refinedmods/refinedstorage/datageneration/TagGenerator.java b/src/main/java/com/refinedmods/refinedstorage/datageneration/ItemTagGenerator.java similarity index 73% rename from src/main/java/com/refinedmods/refinedstorage/datageneration/TagGenerator.java rename to src/main/java/com/refinedmods/refinedstorage/datageneration/ItemTagGenerator.java index 32d49371c..3eaae3bc1 100644 --- a/src/main/java/com/refinedmods/refinedstorage/datageneration/TagGenerator.java +++ b/src/main/java/com/refinedmods/refinedstorage/datageneration/ItemTagGenerator.java @@ -8,8 +8,8 @@ import net.minecraftforge.common.data.ExistingFileHelper; import javax.annotation.Nullable; -public class TagGenerator extends ItemTagsProvider { - public TagGenerator(DataGenerator dataGenerator, BlockTagsProvider blockTagProvider, String modId, @Nullable ExistingFileHelper existingFileHelper) { +public class ItemTagGenerator extends ItemTagsProvider { + public ItemTagGenerator(DataGenerator dataGenerator, BlockTagsProvider blockTagProvider, String modId, @Nullable ExistingFileHelper existingFileHelper) { super(dataGenerator, blockTagProvider, modId, existingFileHelper); } diff --git a/src/main/java/com/refinedmods/refinedstorage/integration/jei/CoverCraftingCategoryExtension.java b/src/main/java/com/refinedmods/refinedstorage/integration/jei/CoverCraftingCategoryExtension.java index 95063fcd4..11e5f1d87 100644 --- a/src/main/java/com/refinedmods/refinedstorage/integration/jei/CoverCraftingCategoryExtension.java +++ b/src/main/java/com/refinedmods/refinedstorage/integration/jei/CoverCraftingCategoryExtension.java @@ -5,9 +5,11 @@ import com.refinedmods.refinedstorage.apiimpl.network.node.cover.CoverManager; import com.refinedmods.refinedstorage.item.CoverItem; import com.refinedmods.refinedstorage.recipe.CoverRecipe; import mezz.jei.api.constants.VanillaTypes; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.ingredients.IIngredients; -import mezz.jei.api.recipe.category.extensions.vanilla.crafting.ICustomCraftingCategoryExtension; +import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; +import mezz.jei.api.gui.builder.IRecipeSlotBuilder; +import mezz.jei.api.gui.ingredient.ICraftingGridHelper; +import mezz.jei.api.recipe.IFocusGroup; +import mezz.jei.api.recipe.category.extensions.vanilla.crafting.ICraftingCategoryExtension; import net.minecraft.core.NonNullList; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.CreativeModeTab; @@ -16,25 +18,24 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.block.Block; import net.minecraftforge.common.Tags; -import net.minecraftforge.common.util.Size2i; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.tags.ITag; import javax.annotation.Nullable; import java.util.ArrayList; -import java.util.Arrays; +import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; -public class CoverCraftingCategoryExtension implements ICustomCraftingCategoryExtension { +public class CoverCraftingCategoryExtension implements ICraftingCategoryExtension { + @Override - public void setIngredients(IIngredients ingredients) { + public void setRecipe(IRecipeLayoutBuilder builder, ICraftingGridHelper craftingGridHelper, IFocusGroup focuses) { List input = new ArrayList<>(); List output = new ArrayList<>(); for (Block block : ForgeRegistries.BLOCKS.getValues()) { - Item item = Item.byBlock(block); - if (item == Items.AIR) { + Item item = Item.BY_BLOCK.get(block); + if (item == null || item == Items.AIR) { continue; } NonNullList subBlocks = NonNullList.create(); @@ -48,15 +49,26 @@ public class CoverCraftingCategoryExtension implements ICustomCraftingCategoryEx } } } - ITag nuggets = ForgeRegistries.ITEMS.tags().getTag(Tags.Items.NUGGETS_IRON); - ingredients.setInputLists(VanillaTypes.ITEM, Arrays.asList(nuggets.stream().map(ItemStack::new).collect(Collectors.toList()), input)); - ingredients.setOutputs(VanillaTypes.ITEM, output); + + ITag nuggetTag = ForgeRegistries.ITEMS.tags().getTag(Tags.Items.NUGGETS_IRON); + List nuggets = nuggetTag.stream().map(ItemStack::new).toList(); + List> inputs = new ArrayList<>(Collections.nCopies(9, new ArrayList<>())); + inputs.set(3, nuggets); + inputs.set(4, input); + List inputSlots = craftingGridHelper.createAndSetInputs(builder, VanillaTypes.ITEM_STACK, inputs, 3, 3); + IRecipeSlotBuilder outputSlot = craftingGridHelper.createAndSetOutputs(builder, VanillaTypes.ITEM_STACK, output); + + builder.createFocusLink(inputSlots.get(4), outputSlot); } - @Nullable @Override - public Size2i getSize() { - return new Size2i(2, 1); + public int getWidth() { + return 3; + } + + @Override + public int getHeight() { + return 3; } @Nullable @@ -64,21 +76,4 @@ public class CoverCraftingCategoryExtension implements ICustomCraftingCategoryEx public ResourceLocation getRegistryName() { return CoverRecipe.SERIALIZER.getRegistryName(); } - - @Override - public void setRecipe(IRecipeLayout recipeLayout, IIngredients ingredients) { - ITag nuggets = ForgeRegistries.ITEMS.tags().getTag(Tags.Items.NUGGETS_IRON); - ItemStack stack = recipeLayout.getFocus(VanillaTypes.ITEM).getValue(); - if (stack.getItem() instanceof CoverItem) { - recipeLayout.getIngredientsGroup(VanillaTypes.ITEM).set(4, nuggets.stream().map(ItemStack::new).collect(Collectors.toList())); - recipeLayout.getIngredientsGroup(VanillaTypes.ITEM).set(5, CoverItem.getItem(stack)); - recipeLayout.getIngredientsGroup(VanillaTypes.ITEM).set(0, stack); - } else { - recipeLayout.getIngredientsGroup(VanillaTypes.ITEM).set(4, nuggets.stream().map(ItemStack::new).collect(Collectors.toList())); - recipeLayout.getIngredientsGroup(VanillaTypes.ITEM).set(5, stack); - ItemStack output = new ItemStack(RSItems.COVER.get()); - CoverItem.setItem(output, stack); - recipeLayout.getIngredientsGroup(VanillaTypes.ITEM).set(0, output); - } - } } diff --git a/src/main/java/com/refinedmods/refinedstorage/integration/jei/GridRecipeTransferHandler.java b/src/main/java/com/refinedmods/refinedstorage/integration/jei/GridRecipeTransferHandler.java index 93c0fabde..c68bb945b 100644 --- a/src/main/java/com/refinedmods/refinedstorage/integration/jei/GridRecipeTransferHandler.java +++ b/src/main/java/com/refinedmods/refinedstorage/integration/jei/GridRecipeTransferHandler.java @@ -9,8 +9,11 @@ import com.refinedmods.refinedstorage.network.grid.GridTransferMessage; import com.refinedmods.refinedstorage.screen.grid.GridScreen; import com.refinedmods.refinedstorage.screen.grid.stack.IGridStack; import com.refinedmods.refinedstorage.screen.grid.stack.ItemGridStack; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.gui.ingredient.IGuiIngredient; +import mezz.jei.api.constants.VanillaTypes; +import mezz.jei.api.forge.ForgeTypes; +import mezz.jei.api.gui.ingredient.IRecipeSlotView; +import mezz.jei.api.gui.ingredient.IRecipeSlotsView; +import mezz.jei.api.recipe.RecipeIngredientRole; import mezz.jei.api.recipe.transfer.IRecipeTransferError; import mezz.jei.api.recipe.transfer.IRecipeTransferHandler; import net.minecraft.client.gui.screens.Screen; @@ -19,11 +22,9 @@ import net.minecraft.world.inventory.CraftingContainer; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.CraftingRecipe; import net.minecraftforge.fluids.FluidStack; +import org.jetbrains.annotations.Nullable; -import javax.annotation.Nonnull; -import java.util.Collection; -import java.util.LinkedList; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; public class GridRecipeTransferHandler implements IRecipeTransferHandler { @@ -47,23 +48,22 @@ public class GridRecipeTransferHandler implements IRecipeTransferHandler s.container instanceof CraftingContainer).collect(Collectors.toList()), - recipe instanceof CraftingRecipe - )); + private void move(IRecipeSlotsView recipeSlotsView) { + List> inputs = recipeSlotsView.getSlotViews(RecipeIngredientRole.INPUT).stream().map(view -> { + + //Creating a mutable list + List stacks = view.getIngredients(VanillaTypes.ITEM_STACK).collect(Collectors.toCollection(ArrayList::new)); + + //moving the displayed stack to first + Optional displayStack = view.getDisplayedIngredient(VanillaTypes.ITEM_STACK); + displayStack.ifPresent(stack -> { + int index = stacks.indexOf(stack); + if (index > -1) { + stacks.remove(index); + stacks.add(0, stack); + } + }); + return stacks; + }).toList(); + + RS.NETWORK_HANDLER.sendToServer(new GridTransferMessage(inputs)); } - private void moveForProcessing(IRecipeLayout recipeLayout, IngredientTracker tracker) { + private void moveForProcessing(IRecipeSlotsView recipeLayout, IngredientTracker tracker) { List inputs = new LinkedList<>(); List outputs = new LinkedList<>(); List fluidInputs = new LinkedList<>(); List fluidOutputs = new LinkedList<>(); - for (IGuiIngredient guiIngredient : recipeLayout.getItemStacks().getGuiIngredients().values()) { - handleItemIngredient(inputs, outputs, guiIngredient, tracker); + List inputSlots = recipeLayout.getSlotViews(RecipeIngredientRole.INPUT); + for (IRecipeSlotView view : inputSlots) { + handleItemIngredient(inputs, view, tracker); + handleFluidIngredient(fluidInputs, view); } - for (IGuiIngredient guiIngredient : recipeLayout.getFluidStacks().getGuiIngredients().values()) { - handleFluidIngredient(fluidInputs, fluidOutputs, guiIngredient); + List outputSlots = recipeLayout.getSlotViews(RecipeIngredientRole.OUTPUT); + for (IRecipeSlotView view : outputSlots) { + handleItemIngredient(outputs, view, tracker); + handleFluidIngredient(fluidOutputs, view); } RS.NETWORK_HANDLER.sendToServer(new GridProcessingTransferMessage(inputs, outputs, fluidInputs, fluidOutputs)); } - private void handleFluidIngredient(List fluidInputs, List fluidOutputs, IGuiIngredient guiIngredient) { - if (guiIngredient != null && guiIngredient.getDisplayedIngredient() != null) { - FluidStack ingredient = guiIngredient.getDisplayedIngredient().copy(); - - if (guiIngredient.isInput()) { - fluidInputs.add(ingredient); - } else { - fluidOutputs.add(ingredient); - } + private void handleFluidIngredient(List list, IRecipeSlotView slotView) { + if (slotView != null) { + slotView.getDisplayedIngredient(ForgeTypes.FLUID_STACK).ifPresent(list::add); } } - private void handleItemIngredient(List inputs, List outputs, IGuiIngredient guiIngredient, IngredientTracker tracker) { - if (guiIngredient != null && guiIngredient.getDisplayedIngredient() != null) { - ItemStack ingredient = tracker.findBestMatch(guiIngredient.getAllIngredients()).copy(); + private void handleItemIngredient(List list, IRecipeSlotView slotView, IngredientTracker tracker) { + if (slotView != null && slotView.getIngredients(VanillaTypes.ITEM_STACK).findAny().isPresent()) { + ItemStack stack = tracker.findBestMatch(slotView.getIngredients(VanillaTypes.ITEM_STACK).toList()); - if (ingredient == ItemStack.EMPTY) { - ingredient = guiIngredient.getDisplayedIngredient().copy(); + if (stack.isEmpty() && slotView.getDisplayedIngredient(VanillaTypes.ITEM_STACK).isPresent()) { + stack = slotView.getDisplayedIngredient(VanillaTypes.ITEM_STACK).get(); } - - if (guiIngredient.isInput()) { - inputs.add(ingredient); - } else { - outputs.add(ingredient); + if (!stack.isEmpty()) { + list.add(stack); } } } diff --git a/src/main/java/com/refinedmods/refinedstorage/integration/jei/HollowCoverCraftingCategoryExtension.java b/src/main/java/com/refinedmods/refinedstorage/integration/jei/HollowCoverCraftingCategoryExtension.java index d1c9a6809..520d3d686 100644 --- a/src/main/java/com/refinedmods/refinedstorage/integration/jei/HollowCoverCraftingCategoryExtension.java +++ b/src/main/java/com/refinedmods/refinedstorage/integration/jei/HollowCoverCraftingCategoryExtension.java @@ -1,30 +1,60 @@ package com.refinedmods.refinedstorage.integration.jei; import com.refinedmods.refinedstorage.RSItems; +import com.refinedmods.refinedstorage.apiimpl.network.node.cover.CoverManager; import com.refinedmods.refinedstorage.item.CoverItem; import com.refinedmods.refinedstorage.recipe.HollowCoverRecipe; import mezz.jei.api.constants.VanillaTypes; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.ingredients.IIngredients; -import mezz.jei.api.recipe.category.extensions.vanilla.crafting.ICustomCraftingCategoryExtension; +import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; +import mezz.jei.api.gui.builder.IRecipeSlotBuilder; +import mezz.jei.api.gui.ingredient.ICraftingGridHelper; +import mezz.jei.api.recipe.IFocusGroup; +import mezz.jei.api.recipe.category.extensions.vanilla.crafting.ICraftingCategoryExtension; +import net.minecraft.core.NonNullList; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.common.util.Size2i; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.registries.ForgeRegistries; import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; -public class HollowCoverCraftingCategoryExtension implements ICustomCraftingCategoryExtension { +public class HollowCoverCraftingCategoryExtension implements ICraftingCategoryExtension { @Override - public void setIngredients(IIngredients ingredients) { - ingredients.setInput(VanillaTypes.ITEM, new ItemStack(RSItems.COVER.get())); - ingredients.setOutput(VanillaTypes.ITEM, new ItemStack(RSItems.HOLLOW_COVER.get())); - } + public void setRecipe(IRecipeLayoutBuilder builder, ICraftingGridHelper craftingGridHelper, IFocusGroup focuses) { - @Nullable - @Override - public Size2i getSize() { - return new Size2i(2, 1); + List> stacks = new ArrayList<>(Collections.nCopies(9, new ArrayList<>())); + List input = new ArrayList<>(); + List output = new ArrayList<>(); + for (Block block : ForgeRegistries.BLOCKS.getValues()) { + Item item = Item.BY_BLOCK.get(block); + if (item == null || item == Items.AIR) { + continue; + } + NonNullList subBlocks = NonNullList.create(); + block.fillItemCategory(CreativeModeTab.TAB_SEARCH, subBlocks); + for (ItemStack subBlock : subBlocks) { + if (CoverManager.isValidCover(subBlock)) { + ItemStack fullCover = new ItemStack(RSItems.COVER.get()); + CoverItem.setItem(fullCover, subBlock); + input.add(fullCover); + ItemStack hollowCover = new ItemStack(RSItems.HOLLOW_COVER.get()); + CoverItem.setItem(hollowCover, subBlock); + output.add(hollowCover); + } + } + } + + stacks.set(4, input); + List inputSlots = craftingGridHelper.createAndSetInputs(builder, VanillaTypes.ITEM_STACK, stacks, 0, 0); + IRecipeSlotBuilder outputSlot = craftingGridHelper.createAndSetOutputs(builder, VanillaTypes.ITEM_STACK, output); + builder.createFocusLink(inputSlots.get(4), outputSlot); } @Nullable @@ -34,18 +64,12 @@ public class HollowCoverCraftingCategoryExtension implements ICustomCraftingCate } @Override - public void setRecipe(IRecipeLayout recipeLayout, IIngredients ingredients) { - ItemStack stack = recipeLayout.getFocus(VanillaTypes.ITEM).getValue(); - if (stack.getItem() == RSItems.COVER.get()) { - recipeLayout.getIngredientsGroup(VanillaTypes.ITEM).set(5, stack); - ItemStack output = new ItemStack(RSItems.HOLLOW_COVER.get()); - CoverItem.setItem(output, CoverItem.getItem(stack)); - recipeLayout.getIngredientsGroup(VanillaTypes.ITEM).set(0, output); - } else { - ItemStack input = new ItemStack(RSItems.COVER.get()); - CoverItem.setItem(input, CoverItem.getItem(stack)); - recipeLayout.getIngredientsGroup(VanillaTypes.ITEM).set(5, input); - recipeLayout.getIngredientsGroup(VanillaTypes.ITEM).set(0, stack); - } + public int getWidth() { + return 0; + } + + @Override + public int getHeight() { + return 0; } } diff --git a/src/main/java/com/refinedmods/refinedstorage/integration/jei/Ingredient.java b/src/main/java/com/refinedmods/refinedstorage/integration/jei/Ingredient.java index 30f43f32d..c2aa43de1 100644 --- a/src/main/java/com/refinedmods/refinedstorage/integration/jei/Ingredient.java +++ b/src/main/java/com/refinedmods/refinedstorage/integration/jei/Ingredient.java @@ -1,19 +1,18 @@ package com.refinedmods.refinedstorage.integration.jei; -import mezz.jei.api.gui.ingredient.IGuiIngredient; -import net.minecraft.world.item.ItemStack; +import mezz.jei.api.gui.ingredient.IRecipeSlotView; import java.util.UUID; class Ingredient { - private final IGuiIngredient guiIngredient; + private final IRecipeSlotView slotView; private final int required; private UUID craftStackId; private int fulfilled; - public Ingredient(IGuiIngredient guiIngredient) { - this.guiIngredient = guiIngredient; - this.required = guiIngredient.getAllIngredients().get(0).getCount(); + public Ingredient(IRecipeSlotView view, int count) { + this.slotView = view; + this.required = count; } public boolean isAvailable() { @@ -28,8 +27,8 @@ class Ingredient { return craftStackId != null; } - public IGuiIngredient getGuiIngredient() { - return guiIngredient; + public IRecipeSlotView getSlotView() { + return slotView; } public UUID getCraftStackId() { diff --git a/src/main/java/com/refinedmods/refinedstorage/integration/jei/IngredientTracker.java b/src/main/java/com/refinedmods/refinedstorage/integration/jei/IngredientTracker.java index 2f2947763..1e1923dbc 100644 --- a/src/main/java/com/refinedmods/refinedstorage/integration/jei/IngredientTracker.java +++ b/src/main/java/com/refinedmods/refinedstorage/integration/jei/IngredientTracker.java @@ -6,8 +6,10 @@ import com.refinedmods.refinedstorage.api.util.IComparer; import com.refinedmods.refinedstorage.apiimpl.API; import com.refinedmods.refinedstorage.item.PatternItem; import com.refinedmods.refinedstorage.screen.grid.stack.IGridStack; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.gui.ingredient.IGuiIngredient; +import mezz.jei.api.constants.VanillaTypes; +import mezz.jei.api.gui.ingredient.IRecipeSlotView; +import mezz.jei.api.gui.ingredient.IRecipeSlotsView; +import mezz.jei.api.recipe.RecipeIngredientRole; import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; @@ -20,12 +22,13 @@ public class IngredientTracker { private final Map storedItems = new HashMap<>(); private boolean doTransfer; - public IngredientTracker(IRecipeLayout recipeLayout, boolean doTransfer) { - for (IGuiIngredient guiIngredient : recipeLayout.getItemStacks().getGuiIngredients().values()) { - if (guiIngredient.isInput() && !guiIngredient.getAllIngredients().isEmpty()) { - ingredients.add(new Ingredient(guiIngredient)); - } + public IngredientTracker(IRecipeSlotsView recipeLayout, boolean doTransfer) { + for (IRecipeSlotView slotView : recipeLayout.getSlotViews(RecipeIngredientRole.INPUT)) { + Optional optionalItemStack = slotView.getIngredients(VanillaTypes.ITEM_STACK).findAny(); + + optionalItemStack.ifPresent(stack -> ingredients.add(new Ingredient(slotView, stack.getCount()))); } + this.doTransfer = doTransfer; } @@ -55,9 +58,8 @@ public class IngredientTracker { } Optional match = ingredient - .getGuiIngredient() - .getAllIngredients() - .stream() + .getSlotView() + .getIngredients(VanillaTypes.ITEM_STACK) .filter(s -> API.instance().getComparer().isEqual(stack, s, IComparer.COMPARE_NBT)) .findFirst(); diff --git a/src/main/java/com/refinedmods/refinedstorage/integration/jei/RecipeTransferCraftingGridError.java b/src/main/java/com/refinedmods/refinedstorage/integration/jei/RecipeTransferCraftingGridError.java index 0b89a868f..a2342268c 100644 --- a/src/main/java/com/refinedmods/refinedstorage/integration/jei/RecipeTransferCraftingGridError.java +++ b/src/main/java/com/refinedmods/refinedstorage/integration/jei/RecipeTransferCraftingGridError.java @@ -1,7 +1,7 @@ package com.refinedmods.refinedstorage.integration.jei; import com.mojang.blaze3d.vertex.PoseStack; -import mezz.jei.api.gui.IRecipeLayout; +import mezz.jei.api.gui.ingredient.IRecipeSlotsView; import mezz.jei.api.recipe.transfer.IRecipeTransferError; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; @@ -16,6 +16,7 @@ import java.util.List; public class RecipeTransferCraftingGridError implements IRecipeTransferError { protected static final Color AUTOCRAFTING_HIGHLIGHT_COLOR = new Color(0.0f, 0.0f, 1.0f, 0.4f); private static final Color MISSING_HIGHLIGHT_COLOR = new Color(1.0f, 0.0f, 0.0f, 0.4f); + private static final boolean HOST_OS_IS_MACOS = System.getProperty("os.name").equals("Mac OS X"); protected final IngredientTracker tracker; public RecipeTransferCraftingGridError(IngredientTracker tracker) { @@ -28,11 +29,12 @@ public class RecipeTransferCraftingGridError implements IRecipeTransferError { } @Override - public void showError(PoseStack stack, int mouseX, int mouseY, IRecipeLayout recipeLayout, int recipeX, int recipeY) { - List message = drawIngredientHighlights(stack, recipeX, recipeY); + public void showError(PoseStack poseStack, int mouseX, int mouseY, IRecipeSlotsView recipeSlotsView, int recipeX, int recipeY) { + poseStack.translate(recipeX, recipeY, 0); + List message = drawIngredientHighlights(poseStack, recipeX, recipeY); Screen currentScreen = Minecraft.getInstance().screen; - currentScreen.renderComponentTooltip(stack, message, mouseX, mouseY); + currentScreen.renderComponentTooltip(poseStack, message, mouseX, mouseY); } protected List drawIngredientHighlights(PoseStack stack, int recipeX, int recipeY) { @@ -45,10 +47,10 @@ public class RecipeTransferCraftingGridError implements IRecipeTransferError { for (Ingredient ingredient : tracker.getIngredients()) { if (!ingredient.isAvailable()) { if (ingredient.isCraftable()) { - ingredient.getGuiIngredient().drawHighlight(stack, AUTOCRAFTING_HIGHLIGHT_COLOR.getRGB(), recipeX, recipeY); + ingredient.getSlotView().drawHighlight(stack, AUTOCRAFTING_HIGHLIGHT_COLOR.getRGB()); craftMessage = true; } else { - ingredient.getGuiIngredient().drawHighlight(stack, MISSING_HIGHLIGHT_COLOR.getRGB(), recipeX, recipeY); + ingredient.getSlotView().drawHighlight(stack, MISSING_HIGHLIGHT_COLOR.getRGB()); missingMessage = true; } } @@ -59,7 +61,11 @@ public class RecipeTransferCraftingGridError implements IRecipeTransferError { } if (craftMessage) { - message.add(new TranslatableComponent("gui.refinedstorage.jei.transfer.request_autocrafting").withStyle(ChatFormatting.BLUE)); + if (HOST_OS_IS_MACOS) { + message.add(new TranslatableComponent("gui.refinedstorage.jei.transfer.request_autocrafting_mac").withStyle(ChatFormatting.BLUE)); + } else { + message.add(new TranslatableComponent("gui.refinedstorage.jei.transfer.request_autocrafting").withStyle(ChatFormatting.BLUE)); + } } return message; diff --git a/src/main/java/com/refinedmods/refinedstorage/integration/jei/RecipeTransferPatternGridError.java b/src/main/java/com/refinedmods/refinedstorage/integration/jei/RecipeTransferPatternGridError.java index 38ce96ce6..b4269176f 100644 --- a/src/main/java/com/refinedmods/refinedstorage/integration/jei/RecipeTransferPatternGridError.java +++ b/src/main/java/com/refinedmods/refinedstorage/integration/jei/RecipeTransferPatternGridError.java @@ -22,7 +22,7 @@ public class RecipeTransferPatternGridError extends RecipeTransferCraftingGridEr for (Ingredient ingredient : tracker.getIngredients()) { if (ingredient.isCraftable()) { - ingredient.getGuiIngredient().drawHighlight(stack, AUTOCRAFTING_HIGHLIGHT_COLOR.getRGB(), recipeX, recipeY); + ingredient.getSlotView().drawHighlight(stack, AUTOCRAFTING_HIGHLIGHT_COLOR.getRGB()); craftMessage = true; } } diff --git a/src/main/java/com/refinedmods/refinedstorage/loottable/ControllerLootFunction.java b/src/main/java/com/refinedmods/refinedstorage/loottable/ControllerLootFunction.java index 55bb76cec..c4b62c13a 100644 --- a/src/main/java/com/refinedmods/refinedstorage/loottable/ControllerLootFunction.java +++ b/src/main/java/com/refinedmods/refinedstorage/loottable/ControllerLootFunction.java @@ -38,7 +38,7 @@ public class ControllerLootFunction extends LootItemConditionalFunction { @Override public LootItemFunctionType getType() { - return RSLootFunctions.getController(); + return RSLootFunctions.CONTROLLER.get(); } public static class Serializer extends LootItemConditionalFunction.Serializer { diff --git a/src/main/java/com/refinedmods/refinedstorage/loottable/CrafterLootFunction.java b/src/main/java/com/refinedmods/refinedstorage/loottable/CrafterLootFunction.java index 090dbacad..117e316bb 100644 --- a/src/main/java/com/refinedmods/refinedstorage/loottable/CrafterLootFunction.java +++ b/src/main/java/com/refinedmods/refinedstorage/loottable/CrafterLootFunction.java @@ -40,7 +40,7 @@ public class CrafterLootFunction extends LootItemConditionalFunction { @Override public LootItemFunctionType getType() { - return RSLootFunctions.getCrafter(); + return RSLootFunctions.CRAFTER.get(); } public static class Serializer extends LootItemConditionalFunction.Serializer { diff --git a/src/main/java/com/refinedmods/refinedstorage/loottable/PortableGridBlockLootFunction.java b/src/main/java/com/refinedmods/refinedstorage/loottable/PortableGridBlockLootFunction.java index 101c24bbc..b16062938 100644 --- a/src/main/java/com/refinedmods/refinedstorage/loottable/PortableGridBlockLootFunction.java +++ b/src/main/java/com/refinedmods/refinedstorage/loottable/PortableGridBlockLootFunction.java @@ -30,7 +30,7 @@ public class PortableGridBlockLootFunction extends LootItemConditionalFunction { @Override public LootItemFunctionType getType() { - return RSLootFunctions.getPortableGrid(); + return RSLootFunctions.PORTABLE_GRID.get(); } public static class Serializer extends LootItemConditionalFunction.Serializer { diff --git a/src/main/java/com/refinedmods/refinedstorage/loottable/StorageBlockLootFunction.java b/src/main/java/com/refinedmods/refinedstorage/loottable/StorageBlockLootFunction.java index 8a2f0414d..cd2582423 100644 --- a/src/main/java/com/refinedmods/refinedstorage/loottable/StorageBlockLootFunction.java +++ b/src/main/java/com/refinedmods/refinedstorage/loottable/StorageBlockLootFunction.java @@ -51,7 +51,7 @@ public class StorageBlockLootFunction extends LootItemConditionalFunction { @Override public LootItemFunctionType getType() { - return RSLootFunctions.getStorageBlock(); + return RSLootFunctions.STORAGE_BLOCK.get(); } public static class Serializer extends LootItemConditionalFunction.Serializer { diff --git a/src/main/java/com/refinedmods/refinedstorage/network/grid/GridTransferMessage.java b/src/main/java/com/refinedmods/refinedstorage/network/grid/GridTransferMessage.java index a0935671b..406c219da 100644 --- a/src/main/java/com/refinedmods/refinedstorage/network/grid/GridTransferMessage.java +++ b/src/main/java/com/refinedmods/refinedstorage/network/grid/GridTransferMessage.java @@ -1,47 +1,36 @@ package com.refinedmods.refinedstorage.network.grid; + import com.refinedmods.refinedstorage.api.network.grid.GridType; import com.refinedmods.refinedstorage.api.network.grid.IGrid; import com.refinedmods.refinedstorage.container.GridContainerMenu; import com.refinedmods.refinedstorage.util.StackUtils; -import mezz.jei.api.gui.ingredient.IGuiIngredient; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import net.minecraftforge.network.NetworkEvent; -import java.util.ArrayList; import java.util.List; -import java.util.Map; import java.util.function.Supplier; - public class GridTransferMessage { private final ItemStack[][] recipe = new ItemStack[9][]; - private Map> inputs; - private List slots; - boolean isCraftingRecipe; + List> inputs; public GridTransferMessage() { } - public GridTransferMessage(Map> inputs, List slots, boolean isCraftingRecipe) { + public GridTransferMessage(List> inputs) { this.inputs = inputs; - this.slots = slots; - this.isCraftingRecipe = isCraftingRecipe; } public static GridTransferMessage decode(FriendlyByteBuf buf) { GridTransferMessage msg = new GridTransferMessage(); - int slots = buf.readInt(); + for (int i = 0; i < slots; i++) { + int numberOfIngredients = buf.readInt(); + msg.recipe[i] = new ItemStack[numberOfIngredients]; - for (int i = 0; i < slots; ++i) { - int ingredients = buf.readInt(); - - msg.recipe[i] = new ItemStack[ingredients]; - - for (int j = 0; j < ingredients; ++j) { + for (int j = 0; j < numberOfIngredients; j++) { msg.recipe[i][j] = StackUtils.readItemStack(buf); } } @@ -50,29 +39,18 @@ public class GridTransferMessage { } public static void encode(GridTransferMessage message, FriendlyByteBuf buf) { - buf.writeInt(message.slots.size()); - for (Slot slot : message.slots) { - IGuiIngredient ingredient = message.inputs.get(slot.getSlotIndex() + (message.isCraftingRecipe ? 1 : 0)); + buf.writeInt(message.inputs.size()); + for (List stacks : message.inputs) { + buf.writeInt(stacks.size()); - List ingredients = new ArrayList<>(); - - if (ingredient != null) { - for (ItemStack possibleStack : ingredient.getAllIngredients()) { - if (possibleStack != null) { - ingredients.add(possibleStack); - } - } - } - - buf.writeInt(ingredients.size()); - - for (ItemStack possibleStack : ingredients) { + for (ItemStack possibleStack : stacks) { StackUtils.writeItemStack(buf, possibleStack); } } } + public static void handle(GridTransferMessage message, Supplier ctx) { Player player = ctx.get().getSender(); diff --git a/src/main/java/com/refinedmods/refinedstorage/screen/grid/stack/FluidGridStack.java b/src/main/java/com/refinedmods/refinedstorage/screen/grid/stack/FluidGridStack.java index f50908f24..574e4120e 100644 --- a/src/main/java/com/refinedmods/refinedstorage/screen/grid/stack/FluidGridStack.java +++ b/src/main/java/com/refinedmods/refinedstorage/screen/grid/stack/FluidGridStack.java @@ -26,7 +26,7 @@ import java.util.stream.Collectors; public class FluidGridStack implements IGridStack { private static final String ERROR_PLACEHOLDER = ""; - private final Logger logger = LogManager.getLogger(getClass()); + private static final Logger LOGGER = LogManager.getLogger(FluidGridStack.class); private final UUID id; private final FluidStack stack; @@ -86,7 +86,7 @@ public class FluidGridStack implements IGridStack { try { cachedName = stack.getDisplayName().getString(); } catch (Throwable t) { - logger.warn("Could not retrieve fluid name of {}", stack.getFluid().getRegistryName()); + LOGGER.warn("Could not retrieve fluid name of {}", stack.getFluid().getRegistryName()); cachedName = ERROR_PLACEHOLDER; } @@ -146,7 +146,7 @@ public class FluidGridStack implements IGridStack { try { tooltip = Lists.newArrayList(stack.getDisplayName()); } catch (Throwable t) { - logger.warn("Could not retrieve fluid tooltip of {}", stack.getFluid().getRegistryName()); + LOGGER.warn("Could not retrieve fluid tooltip of {}", stack.getFluid().getRegistryName()); tooltip = Lists.newArrayList(new TextComponent(ERROR_PLACEHOLDER)); } diff --git a/src/main/java/com/refinedmods/refinedstorage/screen/grid/stack/ItemGridStack.java b/src/main/java/com/refinedmods/refinedstorage/screen/grid/stack/ItemGridStack.java index 1150e1d83..fecff1bcb 100644 --- a/src/main/java/com/refinedmods/refinedstorage/screen/grid/stack/ItemGridStack.java +++ b/src/main/java/com/refinedmods/refinedstorage/screen/grid/stack/ItemGridStack.java @@ -26,7 +26,7 @@ import java.util.stream.Collectors; public class ItemGridStack implements IGridStack { private static final String ERROR_PLACEHOLDER = ""; - private final Logger logger = LogManager.getLogger(getClass()); + private static final Logger LOGGER = LogManager.getLogger(ItemGridStack.class); private final ItemStack stack; private UUID id; @Nullable @@ -96,7 +96,7 @@ public class ItemGridStack implements IGridStack { try { cachedName = stack.getHoverName().getString(); } catch (Throwable t) { - logger.warn("Could not retrieve item name of {}", stack.getItem().getRegistryName()); + LOGGER.warn("Could not retrieve item name of {}", stack.getItem().getRegistryName()); cachedName = ERROR_PLACEHOLDER; } @@ -156,7 +156,7 @@ public class ItemGridStack implements IGridStack { try { tooltip = RenderUtils.getTooltipFromItem(stack); } catch (Throwable t) { - logger.warn("Could not retrieve item tooltip of {}", stack.getItem().getRegistryName()); + LOGGER.warn("Could not retrieve item tooltip of {}", stack.getItem().getRegistryName()); tooltip = new ArrayList<>(); tooltip.add(new TextComponent(ERROR_PLACEHOLDER)); diff --git a/src/main/java/com/refinedmods/refinedstorage/setup/CommonSetup.java b/src/main/java/com/refinedmods/refinedstorage/setup/CommonSetup.java index 57d08073b..0828b11be 100644 --- a/src/main/java/com/refinedmods/refinedstorage/setup/CommonSetup.java +++ b/src/main/java/com/refinedmods/refinedstorage/setup/CommonSetup.java @@ -159,9 +159,6 @@ public final class CommonSetup { @SubscribeEvent public static void onRegisterBlockEntities(RegistryEvent.Register> e) { - // Register here, there seems to be no specific register event for loot function types. - RSLootFunctions.register(); - e.getRegistry().register(registerSynchronizationParameters(BlockEntityType.Builder.of((pos, state) -> new ControllerBlockEntity(NetworkType.NORMAL, pos, state), RSBlocks.CONTROLLER.getBlocks()).build(null).setRegistryName(RS.ID, "controller"))); e.getRegistry().register(registerSynchronizationParameters(BlockEntityType.Builder.of((pos, state) -> new ControllerBlockEntity(NetworkType.CREATIVE, pos, state), RSBlocks.CREATIVE_CONTROLLER.getBlocks()).build(null).setRegistryName(RS.ID, "creative_controller"))); e.getRegistry().register(BlockEntityType.Builder.of(CableBlockEntity::new, RSBlocks.CABLE.get()).build(null).setRegistryName(RS.ID, "cable")); diff --git a/src/main/java/com/refinedmods/refinedstorage/util/BlockUtils.java b/src/main/java/com/refinedmods/refinedstorage/util/BlockUtils.java index 13f78c796..35fb200e7 100644 --- a/src/main/java/com/refinedmods/refinedstorage/util/BlockUtils.java +++ b/src/main/java/com/refinedmods/refinedstorage/util/BlockUtils.java @@ -8,7 +8,7 @@ import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.material.Material; public final class BlockUtils { - public static final BlockBehaviour.Properties DEFAULT_ROCK_PROPERTIES = BlockBehaviour.Properties.of(Material.STONE).strength(1.9F).sound(SoundType.STONE); + public static final BlockBehaviour.Properties DEFAULT_ROCK_PROPERTIES = BlockBehaviour.Properties.of(Material.STONE).strength(0.5F, 6.0F).sound(SoundType.STONE); public static final BlockBehaviour.Properties DEFAULT_GLASS_PROPERTIES = BlockBehaviour.Properties.of(Material.GLASS).sound(SoundType.GLASS).strength(0.35F); private BlockUtils() { diff --git a/src/main/java/com/refinedmods/refinedstorage/util/ColorMap.java b/src/main/java/com/refinedmods/refinedstorage/util/ColorMap.java index edba36433..dc856066f 100644 --- a/src/main/java/com/refinedmods/refinedstorage/util/ColorMap.java +++ b/src/main/java/com/refinedmods/refinedstorage/util/ColorMap.java @@ -10,6 +10,7 @@ import com.refinedmods.refinedstorage.item.blockitem.ColoredBlockItem; import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.tags.BlockTags; import net.minecraft.tags.ItemTags; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; @@ -77,6 +78,7 @@ public class ColorMap> { map.put(color, (RegistryObject) block); RSBlocks.COLORED_BLOCKS.add(block); } + RSBlocks.COLORED_BLOCK_TAGS.put(BlockTags.create(new ResourceLocation(RS.ID, get(DEFAULT_COLOR).getId().getPath())), (ColorMap) this); } public void registerItemsFromBlocks(ColorMap blockMap) { diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index de6a82fec..fd247f50b 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -3,12 +3,24 @@ loaderVersion = "[40,)" issueTrackerURL = "https://github.com/refinedmods/refinedstorage" license="MIT" [[mods]] -modId="refinedstorage" -version="${version}" -displayName="Refined Storage" -displayURL="https://refinedmods.com/refined-storage" -logoFile="logo.png" +modId = "refinedstorage" +version = "${version}" +displayName = "Refined Storage" +displayURL = "https://refinedmods.com/refined-storage" +logoFile = "logo.png" authors = "Refined Mods" description = ''' An elegant solution to your hoarding problem ''' +[[dependencies.refinedstorage]] +modId = "forge" +mandatory = true +versionRange = "[40.1,)" +ordering = "NONE" +side = "BOTH" +[[dependencies.refinedstorage]] +modId = "jei" +mandatory = false +versionRange = "[9.7.1,)" +ordering = "BEFORE" +side = "BOTH" \ No newline at end of file diff --git a/src/main/resources/assets/refinedstorage/lang/en_us.json b/src/main/resources/assets/refinedstorage/lang/en_us.json index 658cbb6e4..997a36f98 100644 --- a/src/main/resources/assets/refinedstorage/lang/en_us.json +++ b/src/main/resources/assets/refinedstorage/lang/en_us.json @@ -90,6 +90,7 @@ "gui.refinedstorage.alternatives.apply": "Apply", "gui.refinedstorage.jei.transfer.autocrafting_available": "Autocrafting available", "gui.refinedstorage.jei.transfer.request_autocrafting": "CTRL + CLICK to request autocrafting", + "gui.refinedstorage.jei.transfer.request_autocrafting_mac": "CMD + CLICK to request autocrafting", "misc.refinedstorage.energy_stored": "%d / %d FE", "misc.refinedstorage.energy_usage": "Usage: %d FE/t", "misc.refinedstorage.energy_usage_minimal": "%d FE/t", diff --git a/src/main/resources/assets/refinedstorage/lang/it_IT.json b/src/main/resources/assets/refinedstorage/lang/it_it.json similarity index 99% rename from src/main/resources/assets/refinedstorage/lang/it_IT.json rename to src/main/resources/assets/refinedstorage/lang/it_it.json index c02db0c72..f5ef27234 100644 --- a/src/main/resources/assets/refinedstorage/lang/it_IT.json +++ b/src/main/resources/assets/refinedstorage/lang/it_it.json @@ -88,6 +88,7 @@ "gui.refinedstorage.alternatives.apply": "Applica", "gui.refinedstorage.jei.transfer.autocrafting_available": "Fabbricazione automatica disponibile", "gui.refinedstorage.jei.transfer.request_autocrafting": "CTRL + CLICK per richiedere la fabbricazione automatica", + "gui.refinedstorage.jei.transfer.request_autocrafting_mac": "CMD + CLICK per richiedere la fabbricazione automatica", "misc.refinedstorage.energy_stored": "%d / %d FE", "misc.refinedstorage.energy_usage": "Utilizzo: %d FE/t", "misc.refinedstorage.energy_usage_minimal": "%d FE/t", diff --git a/src/main/resources/assets/refinedstorage/lang/ja_jp.json b/src/main/resources/assets/refinedstorage/lang/ja_jp.json index 0d0dd9c5f..02667b22f 100644 --- a/src/main/resources/assets/refinedstorage/lang/ja_jp.json +++ b/src/main/resources/assets/refinedstorage/lang/ja_jp.json @@ -88,7 +88,9 @@ "gui.refinedstorage.crafter_manager": "クラフターマネージャー", "gui.refinedstorage.alternatives": "代替案", "gui.refinedstorage.alternatives.apply": "適用", - + "gui.refinedstorage.jei.transfer.autocrafting_available": "自動クラフトが出来る", + "gui.refinedstorage.jei.transfer.request_autocrafting": "CTRLキーを押しながらクリックするために自動クラフトする", + "gui.refinedstorage.jei.transfer.request_autocrafting_mac": "CMDキーを押しながらクリックするために自動クラフトする", "misc.refinedstorage.energy_stored": "%d / %d FE", "misc.refinedstorage.energy_usage": "消費電力: %d FE/t", "misc.refinedstorage.energy_usage_minimal": "%d FE/t", diff --git a/src/main/resources/assets/refinedstorage/lang/ko_kr.json b/src/main/resources/assets/refinedstorage/lang/ko_kr.json index 0b09cadb3..ab27ce45f 100644 --- a/src/main/resources/assets/refinedstorage/lang/ko_kr.json +++ b/src/main/resources/assets/refinedstorage/lang/ko_kr.json @@ -90,6 +90,7 @@ "gui.refinedstorage.alternatives.apply": "적용", "gui.refinedstorage.jei.transfer.autocrafting_available": "자동 제작 사용 가능", "gui.refinedstorage.jei.transfer.request_autocrafting": "CTRL + 클릭하여 자동 제작 요청", + "gui.refinedstorage.jei.transfer.request_autocrafting_mac": "CMD + 클릭하여 자동 제작 요청", "misc.refinedstorage.energy_stored": "%d / %d FE", "misc.refinedstorage.energy_usage": "사용: %d FE/t", "misc.refinedstorage.energy_usage_minimal": "%d FE/t", diff --git a/src/main/resources/assets/refinedstorage/lang/pl_pl.json b/src/main/resources/assets/refinedstorage/lang/pl_pl.json index 9775d6049..35e591a03 100644 --- a/src/main/resources/assets/refinedstorage/lang/pl_pl.json +++ b/src/main/resources/assets/refinedstorage/lang/pl_pl.json @@ -90,6 +90,7 @@ "gui.refinedstorage.alternatives.apply": "Zastosuj", "gui.refinedstorage.jei.transfer.autocrafting_available": "Auto-wytwarzanie dostępne", "gui.refinedstorage.jei.transfer.request_autocrafting": "CTRL + KLIKNIJ aby zażądać wytworzenia", + "gui.refinedstorage.jei.transfer.request_autocrafting_mac": "CMD + KLIKNIJ aby zażądać wytworzenia", "misc.refinedstorage.energy_stored": "%d / %d FE", "misc.refinedstorage.energy_usage": "Zużycie: %d FE/t", "misc.refinedstorage.energy_usage_minimal": "%d FE/t",