Merge pull request #3353 from refinedmods/develop

v1.10.3
This commit is contained in:
Raoul
2022-08-06 17:38:39 +02:00
committed by GitHub
61 changed files with 874 additions and 240 deletions

1
.gitignore vendored
View File

@@ -15,3 +15,4 @@ run/
out/
/bin/
logs/
**/.DS_Store

View File

@@ -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)

View File

@@ -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.

View File

@@ -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")
])

View File

@@ -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

View File

@@ -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"
]
}

View File

@@ -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"
]
}

View File

@@ -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"
]
}

View File

@@ -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"
]
}

View File

@@ -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"
]
}

View File

@@ -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"
]
}

View File

@@ -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"
]
}

View File

@@ -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"
]
}

View File

@@ -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"
]
}

View File

@@ -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"
]
}

View File

@@ -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"
]
}

View File

@@ -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"
]
}

View File

@@ -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"
]
}

View File

@@ -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"
]
}

View File

@@ -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"
]
}

View File

@@ -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"
]
}

View File

@@ -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"
]
}

View File

@@ -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"
]
}

View File

@@ -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);

View File

@@ -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<ExternalStorageBlock> EXTERNAL_STORAGE;
public static final Map<ItemStorageType, RegistryObject<StorageBlock>> STORAGE_BLOCKS = new EnumMap<>(ItemStorageType.class);
public static final Map<FluidStorageType, RegistryObject<FluidStorageBlock>> FLUID_STORAGE_BLOCKS = new EnumMap<>(FluidStorageType.class);
public static final Map<TagKey<Block>, ColorMap<? extends Block>> COLORED_BLOCK_TAGS = new HashMap<>();
public static final RegistryObject<InterfaceBlock> INTERFACE;
public static final RegistryObject<FluidInterfaceBlock> FLUID_INTERFACE;
public static final RegistryObject<StorageMonitorBlock> STORAGE_MONITOR;

View File

@@ -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<LootItemFunctionType> STORAGE_BLOCK;
public static final RegistryObject<LootItemFunctionType> PORTABLE_GRID;
public static final RegistryObject<LootItemFunctionType> CRAFTER;
public static final RegistryObject<LootItemFunctionType> CONTROLLER;
private static final DeferredRegister<LootItemFunctionType> 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());
}
}

View File

@@ -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);

View File

@@ -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<ItemEntity> 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()) {

View File

@@ -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);

View File

@@ -95,13 +95,14 @@ public class FluidStorageDisk implements IStorageDisk<FluidStack> {
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);
}
}
}

View File

@@ -102,14 +102,15 @@ public class ItemStorageDisk implements IStorageDisk<ItemStack> {
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);
}
}
}

View File

@@ -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

View File

@@ -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(

View File

@@ -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<N extends NetworkNode> 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<N extends NetworkNode> 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;

View File

@@ -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<BlockEntityType<?>> {
public BlockEntityTagGenerator(DataGenerator dataGenerator, String modId, @Nullable ExistingFileHelper existingFileHelper) {
super(dataGenerator, Registry.BLOCK_ENTITY_TYPE, modId, existingFileHelper);
}
@Override
protected void addTags() {
TagAppender<BlockEntityType<?>> 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";
}
}

View File

@@ -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<Block> 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()
);
}
}

View File

@@ -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()));
}
}

View File

@@ -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);
}

View File

@@ -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<ItemStack> input = new ArrayList<>();
List<ItemStack> 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<ItemStack> subBlocks = NonNullList.create();
@@ -48,15 +49,26 @@ public class CoverCraftingCategoryExtension implements ICustomCraftingCategoryEx
}
}
}
ITag<Item> 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<Item> nuggetTag = ForgeRegistries.ITEMS.tags().getTag(Tags.Items.NUGGETS_IRON);
List<ItemStack> nuggets = nuggetTag.stream().map(ItemStack::new).toList();
List<List<ItemStack>> inputs = new ArrayList<>(Collections.nCopies(9, new ArrayList<>()));
inputs.set(3, nuggets);
inputs.set(4, input);
List<IRecipeSlotBuilder> 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<Item> 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);
}
}
}

View File

@@ -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<GridContainerMenu, Object> {
@@ -47,23 +48,22 @@ public class GridRecipeTransferHandler implements IRecipeTransferHandler<GridCon
}
@Override
public IRecipeTransferError transferRecipe(@Nonnull GridContainerMenu container, Object recipe, @Nonnull IRecipeLayout recipeLayout, @Nonnull Player player, boolean maxTransfer, boolean doTransfer) {
public @Nullable IRecipeTransferError transferRecipe(GridContainerMenu container, Object recipe, IRecipeSlotsView recipeSlots, Player player, boolean maxTransfer, boolean doTransfer) {
if (!(container.getScreenInfoProvider() instanceof GridScreen)) {
return null;
}
GridType type = container.getGrid().getGridType();
if (type == GridType.CRAFTING) {
return transferRecipeForCraftingGrid(container, recipe, recipeLayout, player, doTransfer);
return transferRecipeForCraftingGrid(container, recipe, recipeSlots, player, doTransfer);
} else if (type == GridType.PATTERN) {
return transferRecipeForPatternGrid(container, recipe, recipeLayout, player, doTransfer);
return transferRecipeForPatternGrid(container, recipe, recipeSlots, player, doTransfer);
}
return null;
}
private RecipeTransferCraftingGridError transferRecipeForCraftingGrid(GridContainerMenu container, Object recipe, IRecipeLayout recipeLayout, Player player, boolean doTransfer) {
private RecipeTransferCraftingGridError transferRecipeForCraftingGrid(GridContainerMenu container, Object recipe, IRecipeSlotsView recipeLayout, Player player, boolean doTransfer) {
IngredientTracker tracker = createTracker(container, recipeLayout, player, doTransfer);
if (doTransfer) {
@@ -88,7 +88,7 @@ public class GridRecipeTransferHandler implements IRecipeTransferHandler<GridCon
return null;
}
private IRecipeTransferError transferRecipeForPatternGrid(GridContainerMenu container, Object recipe, IRecipeLayout recipeLayout, Player player, boolean doTransfer) {
private IRecipeTransferError transferRecipeForPatternGrid(GridContainerMenu container, Object recipe, IRecipeSlotsView recipeLayout, Player player, boolean doTransfer) {
IngredientTracker tracker = createTracker(container, recipeLayout, player, doTransfer);
if (doTransfer) {
@@ -102,7 +102,7 @@ public class GridRecipeTransferHandler implements IRecipeTransferHandler<GridCon
return null;
}
private IngredientTracker createTracker(GridContainerMenu container, IRecipeLayout recipeLayout, Player player, boolean doTransfer) {
private IngredientTracker createTracker(GridContainerMenu container, IRecipeSlotsView recipeLayout, Player player, boolean doTransfer) {
IngredientTracker tracker = new IngredientTracker(recipeLayout, doTransfer);
// Using IGridView#getStacks will return a *filtered* list of items in the view,
@@ -145,66 +145,74 @@ public class GridRecipeTransferHandler implements IRecipeTransferHandler<GridCon
return System.currentTimeMillis() - lastTransferTimeMs <= TRANSFER_SCROLLBAR_DELAY_MS;
}
private void moveItems(GridContainerMenu gridContainer, Object recipe, IRecipeLayout recipeLayout, IngredientTracker tracker) {
private void moveItems(GridContainerMenu gridContainer, Object recipe, IRecipeSlotsView recipeLayout, IngredientTracker tracker) {
this.lastTransferTimeMs = System.currentTimeMillis();
if (gridContainer.getGrid().getGridType() == GridType.PATTERN && !(recipe instanceof CraftingRecipe)) {
moveForProcessing(recipeLayout, tracker);
} else {
move(gridContainer, recipeLayout, recipe);
move(recipeLayout);
}
}
private void move(GridContainerMenu gridContainer, IRecipeLayout recipeLayout, Object recipe) {
RS.NETWORK_HANDLER.sendToServer(new GridTransferMessage(
recipeLayout.getItemStacks().getGuiIngredients(),
gridContainer.slots.stream().filter(s -> s.container instanceof CraftingContainer).collect(Collectors.toList()),
recipe instanceof CraftingRecipe
));
private void move(IRecipeSlotsView recipeSlotsView) {
List<List<ItemStack>> inputs = recipeSlotsView.getSlotViews(RecipeIngredientRole.INPUT).stream().map(view -> {
//Creating a mutable list
List<ItemStack> stacks = view.getIngredients(VanillaTypes.ITEM_STACK).collect(Collectors.toCollection(ArrayList::new));
//moving the displayed stack to first
Optional<ItemStack> 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<ItemStack> inputs = new LinkedList<>();
List<ItemStack> outputs = new LinkedList<>();
List<FluidStack> fluidInputs = new LinkedList<>();
List<FluidStack> fluidOutputs = new LinkedList<>();
for (IGuiIngredient<ItemStack> guiIngredient : recipeLayout.getItemStacks().getGuiIngredients().values()) {
handleItemIngredient(inputs, outputs, guiIngredient, tracker);
List<IRecipeSlotView> inputSlots = recipeLayout.getSlotViews(RecipeIngredientRole.INPUT);
for (IRecipeSlotView view : inputSlots) {
handleItemIngredient(inputs, view, tracker);
handleFluidIngredient(fluidInputs, view);
}
for (IGuiIngredient<FluidStack> guiIngredient : recipeLayout.getFluidStacks().getGuiIngredients().values()) {
handleFluidIngredient(fluidInputs, fluidOutputs, guiIngredient);
List<IRecipeSlotView> 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<FluidStack> fluidInputs, List<FluidStack> fluidOutputs, IGuiIngredient<FluidStack> 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<FluidStack> list, IRecipeSlotView slotView) {
if (slotView != null) {
slotView.getDisplayedIngredient(ForgeTypes.FLUID_STACK).ifPresent(list::add);
}
}
private void handleItemIngredient(List<ItemStack> inputs, List<ItemStack> outputs, IGuiIngredient<ItemStack> guiIngredient, IngredientTracker tracker) {
if (guiIngredient != null && guiIngredient.getDisplayedIngredient() != null) {
ItemStack ingredient = tracker.findBestMatch(guiIngredient.getAllIngredients()).copy();
private void handleItemIngredient(List<ItemStack> 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);
}
}
}

View File

@@ -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<List<ItemStack>> stacks = new ArrayList<>(Collections.nCopies(9, new ArrayList<>()));
List<ItemStack> input = new ArrayList<>();
List<ItemStack> output = new ArrayList<>();
for (Block block : ForgeRegistries.BLOCKS.getValues()) {
Item item = Item.BY_BLOCK.get(block);
if (item == null || item == Items.AIR) {
continue;
}
NonNullList<ItemStack> 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<IRecipeSlotBuilder> 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;
}
}

View File

@@ -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<ItemStack> guiIngredient;
private final IRecipeSlotView slotView;
private final int required;
private UUID craftStackId;
private int fulfilled;
public Ingredient(IGuiIngredient<ItemStack> 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<ItemStack> getGuiIngredient() {
return guiIngredient;
public IRecipeSlotView getSlotView() {
return slotView;
}
public UUID getCraftStackId() {

View File

@@ -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<ResourceLocation, Integer> storedItems = new HashMap<>();
private boolean doTransfer;
public IngredientTracker(IRecipeLayout recipeLayout, boolean doTransfer) {
for (IGuiIngredient<ItemStack> 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<ItemStack> 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<ItemStack> match = ingredient
.getGuiIngredient()
.getAllIngredients()
.stream()
.getSlotView()
.getIngredients(VanillaTypes.ITEM_STACK)
.filter(s -> API.instance().getComparer().isEqual(stack, s, IComparer.COMPARE_NBT))
.findFirst();

View File

@@ -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<Component> 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<Component> message = drawIngredientHighlights(poseStack, recipeX, recipeY);
Screen currentScreen = Minecraft.getInstance().screen;
currentScreen.renderComponentTooltip(stack, message, mouseX, mouseY);
currentScreen.renderComponentTooltip(poseStack, message, mouseX, mouseY);
}
protected List<Component> 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;

View File

@@ -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;
}
}

View File

@@ -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<ControllerLootFunction> {

View File

@@ -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<CrafterLootFunction> {

View File

@@ -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<PortableGridBlockLootFunction> {

View File

@@ -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<StorageBlockLootFunction> {

View File

@@ -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<Integer, ? extends IGuiIngredient<ItemStack>> inputs;
private List<Slot> slots;
boolean isCraftingRecipe;
List<List<ItemStack>> inputs;
public GridTransferMessage() {
}
public GridTransferMessage(Map<Integer, ? extends IGuiIngredient<ItemStack>> inputs, List<Slot> slots, boolean isCraftingRecipe) {
public GridTransferMessage(List<List<ItemStack>> 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<ItemStack> ingredient = message.inputs.get(slot.getSlotIndex() + (message.isCraftingRecipe ? 1 : 0));
buf.writeInt(message.inputs.size());
for (List<ItemStack> stacks : message.inputs) {
buf.writeInt(stacks.size());
List<ItemStack> 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<NetworkEvent.Context> ctx) {
Player player = ctx.get().getSender();

View File

@@ -26,7 +26,7 @@ import java.util.stream.Collectors;
public class FluidGridStack implements IGridStack {
private static final String ERROR_PLACEHOLDER = "<Error>";
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));
}

View File

@@ -26,7 +26,7 @@ import java.util.stream.Collectors;
public class ItemGridStack implements IGridStack {
private static final String ERROR_PLACEHOLDER = "<Error>";
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));

View File

@@ -159,9 +159,6 @@ public final class CommonSetup {
@SubscribeEvent
public static void onRegisterBlockEntities(RegistryEvent.Register<BlockEntityType<?>> 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"));

View File

@@ -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() {

View File

@@ -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<T extends IForgeRegistryEntry<? super T>> {
map.put(color, (RegistryObject<T>) block);
RSBlocks.COLORED_BLOCKS.add(block);
}
RSBlocks.COLORED_BLOCK_TAGS.put(BlockTags.create(new ResourceLocation(RS.ID, get(DEFAULT_COLOR).getId().getPath())), (ColorMap<S>) this);
}
public <S extends BaseBlock> void registerItemsFromBlocks(ColorMap<S> blockMap) {

View File

@@ -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"

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",