From ab3a10f739d5a01b4167c102749972d9039865b2 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Fri, 4 Oct 2024 22:47:51 +0200 Subject: [PATCH] feat: storage monitor autocrafting Only if the resource could no longer be extracted, try trigger autocrafting. I tried to reuse shift clicking for this to force autocrafting, but shift is already used to only extract one of a resource. You have to wait 250ms until the last extract to trigger autocrafting as attack method from block might be called very often, and we don't want open the autocrafting window when it's not needed (eg right after an extract). --- CHANGELOG.md | 1 + .../api/autocrafting/AutocraftingPreview.java | 6 ++ .../autocrafting/AutocraftingPreviewItem.java | 6 ++ .../AutocraftingPreviewProvider.java | 11 ++++ .../AutocraftingPreviewType.java | 2 +- .../refinedstorage/common/api/grid/Grid.java | 3 +- .../common/AbstractClientModInitializer.java | 11 ++++ .../common/AbstractModInitializer.java | 7 +++ .../common/RefinedStorageApiImpl.java | 2 +- .../preview/AutocraftingPreview.java | 18 ------ .../AutocraftingPreviewContainerMenu.java | 15 ++++- .../preview/AutocraftingPreviewItem.java | 18 ------ .../preview/AutocraftingPreviewListener.java | 2 + .../preview/AutocraftingPreviewProvider.java | 9 --- .../preview/AutocraftingPreviewScreen.java | 19 +++++- .../preview/AutocraftingRequest.java | 1 + .../refinedstorage/common/content/Menus.java | 13 +++++ .../common/grid/AbstractGridBlockEntity.java | 19 ++++++ .../grid/AbstractGridContainerMenu.java | 29 +++------- .../common/grid/WirelessGrid.java | 17 ++++++ .../common/grid/screen/GridScreen.java | 2 +- .../storage/portablegrid/PortableGrid.java | 13 +++++ ...tocraftingStorageMonitorContainerMenu.java | 54 +++++++++++++++++ ...ingStorageMonitorExtendedMenuProvider.java | 46 +++++++++++++++ .../storagemonitor/StorageMonitorBlock.java | 3 +- .../StorageMonitorBlockEntity.java | 58 ++++++++++++++++--- .../support/amount/AbstractAmountScreen.java | 14 +++-- .../c2s/AutocraftingPreviewRequestPacket.java | 9 +-- .../packet/c2s/AutocraftingRequestPacket.java | 2 +- .../AutocraftingPreviewResponsePacket.java | 26 ++++++++- .../common/support/packet/s2c/S2CPackets.java | 2 +- .../common/util/ClientPlatformUtil.java | 2 +- .../AutocraftingNetworkComponent.java | 3 +- .../AutocraftingNetworkComponentImpl.java | 28 +++++++++ 34 files changed, 371 insertions(+), 100 deletions(-) create mode 100644 refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/AutocraftingPreview.java create mode 100644 refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/AutocraftingPreviewItem.java create mode 100644 refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/AutocraftingPreviewProvider.java rename {refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview => refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting}/AutocraftingPreviewType.java (53%) delete mode 100644 refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingPreview.java delete mode 100644 refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingPreviewItem.java delete mode 100644 refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingPreviewProvider.java create mode 100644 refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/storagemonitor/AutocraftingStorageMonitorContainerMenu.java create mode 100644 refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/storagemonitor/AutocraftingStorageMonitorExtendedMenuProvider.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 0adf911b2..afca303c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - The crafting amount and crafting preview screens have been merged. Changing the amount will update the live preview. - The numbers on the crafting preview screen are now compacted with units. - When requesting autocrafting multiple resources at once, which can happen via a recipe mod, all the crafting requests are now listed on the side of the GUI. +- You can now request autocrafting from the Storage Monitor if the resource count reaches zero. ### Fixed diff --git a/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/AutocraftingPreview.java b/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/AutocraftingPreview.java new file mode 100644 index 000000000..e11e56a4f --- /dev/null +++ b/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/AutocraftingPreview.java @@ -0,0 +1,6 @@ +package com.refinedmods.refinedstorage.api.autocrafting; + +import java.util.List; + +public record AutocraftingPreview(AutocraftingPreviewType type, List items) { +} diff --git a/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/AutocraftingPreviewItem.java b/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/AutocraftingPreviewItem.java new file mode 100644 index 000000000..82919b373 --- /dev/null +++ b/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/AutocraftingPreviewItem.java @@ -0,0 +1,6 @@ +package com.refinedmods.refinedstorage.api.autocrafting; + +import com.refinedmods.refinedstorage.api.resource.ResourceKey; + +public record AutocraftingPreviewItem(ResourceKey resource, long available, long missing, long toCraft) { +} diff --git a/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/AutocraftingPreviewProvider.java b/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/AutocraftingPreviewProvider.java new file mode 100644 index 000000000..207a0d2fd --- /dev/null +++ b/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/AutocraftingPreviewProvider.java @@ -0,0 +1,11 @@ +package com.refinedmods.refinedstorage.api.autocrafting; + +import com.refinedmods.refinedstorage.api.resource.ResourceKey; + +import java.util.Optional; + +public interface AutocraftingPreviewProvider { + Optional getPreview(ResourceKey resource, long amount); + + boolean start(ResourceKey resource, long amount); +} diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingPreviewType.java b/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/AutocraftingPreviewType.java similarity index 53% rename from refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingPreviewType.java rename to refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/AutocraftingPreviewType.java index d53bef456..3d1832829 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingPreviewType.java +++ b/refinedstorage-autocrafting-api/src/main/java/com/refinedmods/refinedstorage/api/autocrafting/AutocraftingPreviewType.java @@ -1,4 +1,4 @@ -package com.refinedmods.refinedstorage.common.autocrafting.preview; +package com.refinedmods.refinedstorage.api.autocrafting; public enum AutocraftingPreviewType { SUCCESS, diff --git a/refinedstorage-common-api/src/main/java/com/refinedmods/refinedstorage/common/api/grid/Grid.java b/refinedstorage-common-api/src/main/java/com/refinedmods/refinedstorage/common/api/grid/Grid.java index a493a55c0..e02e7412e 100644 --- a/refinedstorage-common-api/src/main/java/com/refinedmods/refinedstorage/common/api/grid/Grid.java +++ b/refinedstorage-common-api/src/main/java/com/refinedmods/refinedstorage/common/api/grid/Grid.java @@ -1,5 +1,6 @@ package com.refinedmods.refinedstorage.common.api.grid; +import com.refinedmods.refinedstorage.api.autocrafting.AutocraftingPreviewProvider; import com.refinedmods.refinedstorage.api.grid.operations.GridOperations; import com.refinedmods.refinedstorage.api.grid.watcher.GridWatcher; import com.refinedmods.refinedstorage.api.storage.Actor; @@ -15,7 +16,7 @@ import org.apiguardian.api.API; @API(status = API.Status.STABLE, since = "2.0.0-milestone.3.0") -public interface Grid { +public interface Grid extends AutocraftingPreviewProvider { void addWatcher(GridWatcher watcher, Class actorType); void removeWatcher(GridWatcher watcher); diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/AbstractClientModInitializer.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/AbstractClientModInitializer.java index c1cc720b8..30fd6efb1 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/AbstractClientModInitializer.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/AbstractClientModInitializer.java @@ -5,6 +5,8 @@ import com.refinedmods.refinedstorage.common.api.upgrade.UpgradeMapping; import com.refinedmods.refinedstorage.common.autocrafting.CrafterScreen; import com.refinedmods.refinedstorage.common.autocrafting.PatternGridScreen; +import com.refinedmods.refinedstorage.common.autocrafting.preview.AutocraftingPreviewContainerMenu; +import com.refinedmods.refinedstorage.common.autocrafting.preview.AutocraftingPreviewScreen; import com.refinedmods.refinedstorage.common.constructordestructor.ConstructorScreen; import com.refinedmods.refinedstorage.common.constructordestructor.DestructorScreen; import com.refinedmods.refinedstorage.common.content.Items; @@ -93,6 +95,15 @@ protected static void registerScreens(final ScreenRegistration registration) { registration.register(Menus.INSTANCE.getRelay(), RelayScreen::new); registration.register(Menus.INSTANCE.getDiskInterface(), DiskInterfaceScreen::new); registration.register(Menus.INSTANCE.getCrafter(), CrafterScreen::new); + registration.register(Menus.INSTANCE.getAutocraftingStorageMonitor(), + new ScreenConstructor() { + @Override + public AutocraftingPreviewScreen create(final AutocraftingPreviewContainerMenu menu, + final Inventory inventory, + final Component title) { + return new AutocraftingPreviewScreen(menu, inventory, title); + } + }); } protected static void registerAlternativeGridHints() { diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/AbstractModInitializer.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/AbstractModInitializer.java index 75373db79..0298e2290 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/AbstractModInitializer.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/AbstractModInitializer.java @@ -121,6 +121,7 @@ import com.refinedmods.refinedstorage.common.storage.storageblock.StorageBlockLootItemFunction; import com.refinedmods.refinedstorage.common.storage.storagedisk.FluidStorageDiskItem; import com.refinedmods.refinedstorage.common.storage.storagedisk.ItemStorageDiskItem; +import com.refinedmods.refinedstorage.common.storagemonitor.AutocraftingStorageMonitorContainerMenu; import com.refinedmods.refinedstorage.common.storagemonitor.FluidStorageMonitorExtractionStrategy; import com.refinedmods.refinedstorage.common.storagemonitor.FluidStorageMonitorInsertionStrategy; import com.refinedmods.refinedstorage.common.storagemonitor.ItemStorageMonitorExtractionStrategy; @@ -136,6 +137,7 @@ import com.refinedmods.refinedstorage.common.support.network.component.PlatformStorageNetworkComponent; import com.refinedmods.refinedstorage.common.support.resource.FluidResourceContainerInsertStrategy; import com.refinedmods.refinedstorage.common.support.resource.FluidResourceFactory; +import com.refinedmods.refinedstorage.common.support.resource.ResourceCodecs; import com.refinedmods.refinedstorage.common.support.resource.ResourceContainerData; import com.refinedmods.refinedstorage.common.support.resource.ResourceTypes; import com.refinedmods.refinedstorage.common.support.slotreference.InventorySlotReferenceFactory; @@ -745,6 +747,11 @@ protected final void registerMenus(final RegistryCallback> callback, ContentIds.STORAGE_MONITOR, () -> extendedMenuTypeFactory.create(StorageMonitorContainerMenu::new, ResourceContainerData.STREAM_CODEC) )); + Menus.INSTANCE.setAutocraftingStorageMonitor(callback.register( + createIdentifier("autocrafting_storage_monitor"), + () -> extendedMenuTypeFactory.create(AutocraftingStorageMonitorContainerMenu::new, + ResourceCodecs.STREAM_CODEC) + )); Menus.INSTANCE.setNetworkTransmitter(callback.register( ContentIds.NETWORK_TRANSMITTER, () -> extendedMenuTypeFactory.create(NetworkTransmitterContainerMenu::new, diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/RefinedStorageApiImpl.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/RefinedStorageApiImpl.java index a7487641a..1daca02e8 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/RefinedStorageApiImpl.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/RefinedStorageApiImpl.java @@ -614,7 +614,7 @@ public void openCraftingPreview(final List requests) { minecraft.setScreen(new AutocraftingPreviewScreen( minecraft.screen, inventory, - requests.stream().map(AutocraftingRequest::of).collect(Collectors.toList()) + requests.stream().map(AutocraftingRequest::of).toList() )); } } diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingPreview.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingPreview.java deleted file mode 100644 index afd1946f6..000000000 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingPreview.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.refinedmods.refinedstorage.common.autocrafting.preview; - -import com.refinedmods.refinedstorage.common.util.PlatformUtil; - -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.ByteBufCodecs; -import net.minecraft.network.codec.StreamCodec; - -public record AutocraftingPreview(AutocraftingPreviewType type, List items) { - public static final StreamCodec STREAM_CODEC = StreamCodec.composite( - PlatformUtil.enumStreamCodec(AutocraftingPreviewType.values()), AutocraftingPreview::type, - ByteBufCodecs.collection(ArrayList::new, AutocraftingPreviewItem.STREAM_CODEC), AutocraftingPreview::items, - AutocraftingPreview::new - ); -} diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingPreviewContainerMenu.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingPreviewContainerMenu.java index 81054f343..2b9bc38d9 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingPreviewContainerMenu.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingPreviewContainerMenu.java @@ -1,5 +1,6 @@ package com.refinedmods.refinedstorage.common.autocrafting.preview; +import com.refinedmods.refinedstorage.api.autocrafting.AutocraftingPreview; import com.refinedmods.refinedstorage.api.resource.ResourceAmount; import com.refinedmods.refinedstorage.common.api.support.resource.ResourceContainer; import com.refinedmods.refinedstorage.common.support.containermenu.AbstractResourceContainerMenu; @@ -7,11 +8,13 @@ import com.refinedmods.refinedstorage.common.support.containermenu.ResourceSlotType; import com.refinedmods.refinedstorage.common.support.resource.ResourceContainerImpl; +import java.util.ArrayList; import java.util.List; import java.util.UUID; import javax.annotation.Nullable; import net.minecraft.network.chat.Component; +import net.minecraft.world.inventory.MenuType; public class AutocraftingPreviewContainerMenu extends AbstractResourceContainerMenu { private final List requests; @@ -21,7 +24,15 @@ public class AutocraftingPreviewContainerMenu extends AbstractResourceContainerM private AutocraftingPreviewListener listener; AutocraftingPreviewContainerMenu(final List requests) { - super(null, 0); + this(null, 0, requests); + } + + public AutocraftingPreviewContainerMenu(@Nullable final MenuType type, + final int syncId, + final List requests) { + super(type, syncId); + this.requests = new ArrayList<>(requests); + this.currentRequest = requests.getFirst(); final ResourceContainer resourceContainer = ResourceContainerImpl.createForFilter(1); resourceContainer.set(0, new ResourceAmount(requests.getFirst().getResource(), 1)); addSlot(new DisabledResourceSlot( @@ -32,8 +43,6 @@ public class AutocraftingPreviewContainerMenu extends AbstractResourceContainerM 48, ResourceSlotType.FILTER )); - this.requests = requests; - this.currentRequest = requests.getFirst(); } void setListener(final AutocraftingPreviewListener listener) { diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingPreviewItem.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingPreviewItem.java deleted file mode 100644 index c82b2e9f1..000000000 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingPreviewItem.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.refinedmods.refinedstorage.common.autocrafting.preview; - -import com.refinedmods.refinedstorage.common.api.support.resource.PlatformResourceKey; -import com.refinedmods.refinedstorage.common.support.resource.ResourceCodecs; - -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.ByteBufCodecs; -import net.minecraft.network.codec.StreamCodec; - -public record AutocraftingPreviewItem(PlatformResourceKey resource, long available, long missing, long toCraft) { - static final StreamCodec STREAM_CODEC = StreamCodec.composite( - ResourceCodecs.STREAM_CODEC, AutocraftingPreviewItem::resource, - ByteBufCodecs.VAR_LONG, AutocraftingPreviewItem::available, - ByteBufCodecs.VAR_LONG, AutocraftingPreviewItem::missing, - ByteBufCodecs.VAR_LONG, AutocraftingPreviewItem::toCraft, - AutocraftingPreviewItem::new - ); -} diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingPreviewListener.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingPreviewListener.java index eb6a0e3dd..5ba959f4e 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingPreviewListener.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingPreviewListener.java @@ -1,5 +1,7 @@ package com.refinedmods.refinedstorage.common.autocrafting.preview; +import com.refinedmods.refinedstorage.api.autocrafting.AutocraftingPreview; + import javax.annotation.Nullable; interface AutocraftingPreviewListener { diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingPreviewProvider.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingPreviewProvider.java deleted file mode 100644 index 558056cb7..000000000 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingPreviewProvider.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.refinedmods.refinedstorage.common.autocrafting.preview; - -import com.refinedmods.refinedstorage.common.api.support.resource.PlatformResourceKey; - -public interface AutocraftingPreviewProvider { - AutocraftingPreview getPreview(PlatformResourceKey resource, long amount); - - boolean start(PlatformResourceKey resource, long amount); -} diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingPreviewScreen.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingPreviewScreen.java index 4eef82282..fabe0d70a 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingPreviewScreen.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingPreviewScreen.java @@ -1,5 +1,8 @@ package com.refinedmods.refinedstorage.common.autocrafting.preview; +import com.refinedmods.refinedstorage.api.autocrafting.AutocraftingPreview; +import com.refinedmods.refinedstorage.api.autocrafting.AutocraftingPreviewItem; +import com.refinedmods.refinedstorage.api.autocrafting.AutocraftingPreviewType; import com.refinedmods.refinedstorage.common.api.RefinedStorageApi; import com.refinedmods.refinedstorage.common.api.support.resource.ResourceRendering; import com.refinedmods.refinedstorage.common.support.amount.AbstractAmountScreen; @@ -72,8 +75,20 @@ public class AutocraftingPreviewScreen extends AbstractAmountScreen requests) { + this(new AutocraftingPreviewContainerMenu(requests), parent, playerInventory); + } + + public AutocraftingPreviewScreen(final AutocraftingPreviewContainerMenu menu, + final Inventory playerInventory, + final Component title) { + this(menu, null, playerInventory); + } + + public AutocraftingPreviewScreen(final AutocraftingPreviewContainerMenu menu, + @Nullable final Screen parent, + final Inventory playerInventory) { super( - new AutocraftingPreviewContainerMenu(requests), + menu, parent, playerInventory, TITLE, @@ -478,7 +493,7 @@ private void updateRequestsScrollbar() { public void responseReceived(final UUID id, final boolean started) { if (started && getMenu().requestStarted(id)) { - tryCloseToParent(); + close(); } } } diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingRequest.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingRequest.java index 714845084..f93798dd7 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingRequest.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/autocrafting/preview/AutocraftingRequest.java @@ -1,5 +1,6 @@ package com.refinedmods.refinedstorage.common.autocrafting.preview; +import com.refinedmods.refinedstorage.api.autocrafting.AutocraftingPreview; import com.refinedmods.refinedstorage.api.resource.ResourceAmount; import com.refinedmods.refinedstorage.api.resource.ResourceKey; import com.refinedmods.refinedstorage.common.api.support.resource.PlatformResourceKey; diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/content/Menus.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/content/Menus.java index eba2dc15d..57d8771d3 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/content/Menus.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/content/Menus.java @@ -2,6 +2,7 @@ import com.refinedmods.refinedstorage.common.autocrafting.CrafterContainerMenu; import com.refinedmods.refinedstorage.common.autocrafting.PatternGridContainerMenu; +import com.refinedmods.refinedstorage.common.autocrafting.preview.AutocraftingPreviewContainerMenu; import com.refinedmods.refinedstorage.common.constructordestructor.ConstructorContainerMenu; import com.refinedmods.refinedstorage.common.constructordestructor.DestructorContainerMenu; import com.refinedmods.refinedstorage.common.controller.ControllerContainerMenu; @@ -75,6 +76,8 @@ public final class Menus { @Nullable private Supplier> storageMonitor; @Nullable + private Supplier> autocraftingStorageMonitor; + @Nullable private Supplier> networkTransmitter; @Nullable private Supplier> portableGridBlock; @@ -240,6 +243,16 @@ public void setStorageMonitor(final Supplier getAutocraftingStorageMonitor() { + return requireNonNull(autocraftingStorageMonitor).get(); + } + + public void setAutocraftingStorageMonitor( + final Supplier> supplier + ) { + this.autocraftingStorageMonitor = supplier; + } + public MenuType getNetworkTransmitter() { return requireNonNull(networkTransmitter).get(); } diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/grid/AbstractGridBlockEntity.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/grid/AbstractGridBlockEntity.java index c29cc6df3..30988fee3 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/grid/AbstractGridBlockEntity.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/grid/AbstractGridBlockEntity.java @@ -1,5 +1,6 @@ package com.refinedmods.refinedstorage.common.grid; +import com.refinedmods.refinedstorage.api.autocrafting.AutocraftingPreview; import com.refinedmods.refinedstorage.api.grid.operations.GridOperations; import com.refinedmods.refinedstorage.api.grid.watcher.GridWatcher; import com.refinedmods.refinedstorage.api.network.Network; @@ -7,6 +8,7 @@ import com.refinedmods.refinedstorage.api.network.impl.node.container.NetworkNodeContainerPriorities; import com.refinedmods.refinedstorage.api.network.impl.node.grid.GridNetworkNode; import com.refinedmods.refinedstorage.api.network.storage.StorageNetworkComponent; +import com.refinedmods.refinedstorage.api.resource.ResourceKey; import com.refinedmods.refinedstorage.api.storage.Actor; import com.refinedmods.refinedstorage.api.storage.Storage; import com.refinedmods.refinedstorage.api.storage.TrackedResourceAmount; @@ -23,6 +25,7 @@ import com.refinedmods.refinedstorage.common.support.network.ColoredConnectionStrategy; import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -97,6 +100,22 @@ public void removeWatcher(final GridWatcher watcher) { mainNetworkNode.removeWatcher(watcher); } + @Override + public Optional getPreview(final ResourceKey resource, final long amount) { + return Optional.ofNullable(mainNetworkNode.getNetwork()) + .map(network -> network.getComponent(AutocraftingNetworkComponent.class)) + .flatMap(component -> component.getPreview(resource, amount)); + } + + @Override + public boolean start(final ResourceKey resource, final long amount) { + final Network network = mainNetworkNode.getNetwork(); + if (network == null) { + return false; + } + return network.getComponent(AutocraftingNetworkComponent.class).start(resource, amount); + } + @Override protected boolean doesBlockStateChangeWarrantNetworkNodeUpdate(final BlockState oldBlockState, final BlockState newBlockState) { diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/grid/AbstractGridContainerMenu.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/grid/AbstractGridContainerMenu.java index fcfe79c88..158af2302 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/grid/AbstractGridContainerMenu.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/grid/AbstractGridContainerMenu.java @@ -1,5 +1,7 @@ package com.refinedmods.refinedstorage.common.grid; +import com.refinedmods.refinedstorage.api.autocrafting.AutocraftingPreview; +import com.refinedmods.refinedstorage.api.autocrafting.AutocraftingPreviewProvider; import com.refinedmods.refinedstorage.api.autocrafting.Pattern; import com.refinedmods.refinedstorage.api.autocrafting.PatternRepository; import com.refinedmods.refinedstorage.api.autocrafting.PatternRepositoryImpl; @@ -30,10 +32,6 @@ import com.refinedmods.refinedstorage.common.api.support.registry.PlatformRegistry; import com.refinedmods.refinedstorage.common.api.support.resource.PlatformResourceKey; import com.refinedmods.refinedstorage.common.api.support.resource.ResourceType; -import com.refinedmods.refinedstorage.common.autocrafting.preview.AutocraftingPreview; -import com.refinedmods.refinedstorage.common.autocrafting.preview.AutocraftingPreviewItem; -import com.refinedmods.refinedstorage.common.autocrafting.preview.AutocraftingPreviewProvider; -import com.refinedmods.refinedstorage.common.autocrafting.preview.AutocraftingPreviewType; import com.refinedmods.refinedstorage.common.grid.strategy.ClientGridExtractionStrategy; import com.refinedmods.refinedstorage.common.grid.strategy.ClientGridInsertionStrategy; import com.refinedmods.refinedstorage.common.grid.strategy.ClientGridScrollingStrategy; @@ -45,9 +43,8 @@ import com.refinedmods.refinedstorage.query.lexer.LexerTokenMappings; import com.refinedmods.refinedstorage.query.parser.ParserOperatorMappings; -import java.util.ArrayList; -import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.function.BiPredicate; import javax.annotation.Nullable; @@ -491,25 +488,13 @@ protected ResourceKey getResourceForAutocraftableHint(final Slot slot) { } @Override - public AutocraftingPreview getPreview(final PlatformResourceKey resource, final long amount) { - final List items = new ArrayList<>(); - final boolean missing = amount == 404; - for (int i = 0; i < 31; ++i) { - items.add(new AutocraftingPreviewItem( - resource, - (i + 1), - (i % 2 == 0 && missing) ? amount : 0, - i % 2 == 0 ? 0 : amount - )); - } - return new AutocraftingPreview(missing - ? AutocraftingPreviewType.MISSING_RESOURCES - : AutocraftingPreviewType.SUCCESS, items); + public Optional getPreview(final ResourceKey resource, final long amount) { + return requireNonNull(grid).getPreview(resource, amount); } @Override - public boolean start(final PlatformResourceKey resource, final long amount) { - return true; + public boolean start(final ResourceKey resource, final long amount) { + return requireNonNull(grid).start(resource, amount); } public boolean isLargeSlot(final Slot slot) { diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/grid/WirelessGrid.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/grid/WirelessGrid.java index e471c6e77..765b3a92e 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/grid/WirelessGrid.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/grid/WirelessGrid.java @@ -1,12 +1,15 @@ package com.refinedmods.refinedstorage.common.grid; +import com.refinedmods.refinedstorage.api.autocrafting.AutocraftingPreview; import com.refinedmods.refinedstorage.api.grid.operations.GridOperations; import com.refinedmods.refinedstorage.api.grid.operations.NoopGridOperations; import com.refinedmods.refinedstorage.api.grid.watcher.GridWatcher; import com.refinedmods.refinedstorage.api.grid.watcher.GridWatcherManager; import com.refinedmods.refinedstorage.api.grid.watcher.GridWatcherManagerImpl; +import com.refinedmods.refinedstorage.api.network.autocrafting.AutocraftingNetworkComponent; import com.refinedmods.refinedstorage.api.network.energy.EnergyNetworkComponent; import com.refinedmods.refinedstorage.api.network.storage.StorageNetworkComponent; +import com.refinedmods.refinedstorage.api.resource.ResourceKey; import com.refinedmods.refinedstorage.api.storage.Actor; import com.refinedmods.refinedstorage.api.storage.NoopStorage; import com.refinedmods.refinedstorage.api.storage.Storage; @@ -100,4 +103,18 @@ private GridOperations createGridOperations(final ResourceType resourceType, final GridOperations operations = resourceType.createGridOperations(rootStorage, playerActor); return new SecuredGridOperations(player, securityNetworkComponent, operations); } + + @Override + public Optional getPreview(final ResourceKey resource, final long amount) { + return context.resolveNetwork() + .map(network -> network.getComponent(AutocraftingNetworkComponent.class)) + .flatMap(component -> component.getPreview(resource, amount)); + } + + @Override + public boolean start(final ResourceKey resource, final long amount) { + return context.resolveNetwork() + .map(network -> network.getComponent(AutocraftingNetworkComponent.class).start(resource, amount)) + .orElse(false); + } } diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/grid/screen/GridScreen.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/grid/screen/GridScreen.java index 740c4d1e7..58cb19f21 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/grid/screen/GridScreen.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/grid/screen/GridScreen.java @@ -9,7 +9,7 @@ import static com.refinedmods.refinedstorage.common.util.IdentifierUtil.createIdentifier; public class GridScreen extends AbstractGridScreen { - private static final ResourceLocation TEXTURE = createIdentifier("textures/gui/grid2.png"); + private static final ResourceLocation TEXTURE = createIdentifier("textures/gui/grid.png"); public GridScreen(final T menu, final Inventory inventory, final Component title) { super(menu, inventory, title, 99); diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/storage/portablegrid/PortableGrid.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/storage/portablegrid/PortableGrid.java index f7455d5fc..f38d75ae6 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/storage/portablegrid/PortableGrid.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/storage/portablegrid/PortableGrid.java @@ -1,5 +1,6 @@ package com.refinedmods.refinedstorage.common.storage.portablegrid; +import com.refinedmods.refinedstorage.api.autocrafting.AutocraftingPreview; import com.refinedmods.refinedstorage.api.core.Action; import com.refinedmods.refinedstorage.api.grid.operations.GridOperations; import com.refinedmods.refinedstorage.api.grid.operations.NoopGridOperations; @@ -7,6 +8,7 @@ import com.refinedmods.refinedstorage.api.grid.watcher.GridWatcherManager; import com.refinedmods.refinedstorage.api.grid.watcher.GridWatcherManagerImpl; import com.refinedmods.refinedstorage.api.network.energy.EnergyStorage; +import com.refinedmods.refinedstorage.api.resource.ResourceKey; import com.refinedmods.refinedstorage.api.storage.Actor; import com.refinedmods.refinedstorage.api.storage.NoopStorage; import com.refinedmods.refinedstorage.api.storage.StateTrackedStorage; @@ -23,6 +25,7 @@ import java.util.Collections; import java.util.List; +import java.util.Optional; import java.util.Set; import javax.annotation.Nullable; @@ -126,4 +129,14 @@ public GridOperations createOperations(final ResourceType resourceType, final Se final GridOperations operations = resourceType.createGridOperations(rootStorage, new PlayerActor(player)); return new PortableGridOperations(operations, energyStorage); } + + @Override + public Optional getPreview(final ResourceKey resource, final long amount) { + return Optional.empty(); + } + + @Override + public boolean start(final ResourceKey resource, final long amount) { + return false; + } } diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/storagemonitor/AutocraftingStorageMonitorContainerMenu.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/storagemonitor/AutocraftingStorageMonitorContainerMenu.java new file mode 100644 index 000000000..caeff5d3c --- /dev/null +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/storagemonitor/AutocraftingStorageMonitorContainerMenu.java @@ -0,0 +1,54 @@ +package com.refinedmods.refinedstorage.common.storagemonitor; + +import com.refinedmods.refinedstorage.api.autocrafting.AutocraftingPreview; +import com.refinedmods.refinedstorage.api.autocrafting.AutocraftingPreviewProvider; +import com.refinedmods.refinedstorage.api.resource.ResourceAmount; +import com.refinedmods.refinedstorage.api.resource.ResourceKey; +import com.refinedmods.refinedstorage.common.api.support.resource.PlatformResourceKey; +import com.refinedmods.refinedstorage.common.autocrafting.preview.AutocraftingPreviewContainerMenu; +import com.refinedmods.refinedstorage.common.autocrafting.preview.AutocraftingRequest; +import com.refinedmods.refinedstorage.common.content.Menus; + +import java.util.List; +import java.util.Optional; +import javax.annotation.Nullable; + +import net.minecraft.world.entity.player.Inventory; + +import static java.util.Objects.requireNonNull; + +public class AutocraftingStorageMonitorContainerMenu extends AutocraftingPreviewContainerMenu + implements AutocraftingPreviewProvider { + @Nullable + private final StorageMonitorBlockEntity storageMonitor; + + public AutocraftingStorageMonitorContainerMenu(final int syncId, + final Inventory playerInventory, + final PlatformResourceKey resource) { + super(Menus.INSTANCE.getAutocraftingStorageMonitor(), syncId, getRequests(resource)); + this.storageMonitor = null; + } + + AutocraftingStorageMonitorContainerMenu(final int syncId, + final PlatformResourceKey resource, + final StorageMonitorBlockEntity storageMonitor) { + super(Menus.INSTANCE.getAutocraftingStorageMonitor(), syncId, getRequests(resource)); + this.storageMonitor = storageMonitor; + } + + private static List getRequests(final PlatformResourceKey resource) { + return List.of(AutocraftingRequest.of( + new ResourceAmount(resource, resource.getResourceType().normalizeAmount(1.0D)) + )); + } + + @Override + public Optional getPreview(final ResourceKey resource, final long amount) { + return requireNonNull(storageMonitor).getPreview(resource, amount); + } + + @Override + public boolean start(final ResourceKey resource, final long amount) { + return requireNonNull(storageMonitor).start(resource, amount); + } +} diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/storagemonitor/AutocraftingStorageMonitorExtendedMenuProvider.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/storagemonitor/AutocraftingStorageMonitorExtendedMenuProvider.java new file mode 100644 index 000000000..876db6b15 --- /dev/null +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/storagemonitor/AutocraftingStorageMonitorExtendedMenuProvider.java @@ -0,0 +1,46 @@ +package com.refinedmods.refinedstorage.common.storagemonitor; + +import com.refinedmods.refinedstorage.common.api.support.resource.PlatformResourceKey; +import com.refinedmods.refinedstorage.common.content.ContentNames; +import com.refinedmods.refinedstorage.common.support.containermenu.ExtendedMenuProvider; +import com.refinedmods.refinedstorage.common.support.resource.ResourceCodecs; + +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.StreamEncoder; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; + +class AutocraftingStorageMonitorExtendedMenuProvider implements ExtendedMenuProvider { + private final PlatformResourceKey resource; + private final StorageMonitorBlockEntity blockEntity; + + AutocraftingStorageMonitorExtendedMenuProvider(final PlatformResourceKey resource, + final StorageMonitorBlockEntity blockEntity) { + this.resource = resource; + this.blockEntity = blockEntity; + } + + @Override + public AbstractContainerMenu createMenu(final int syncId, + final Inventory inventory, + final Player player) { + return new AutocraftingStorageMonitorContainerMenu(syncId, resource, blockEntity); + } + + @Override + public Component getDisplayName() { + return ContentNames.STORAGE_MONITOR; + } + + @Override + public PlatformResourceKey getMenuData() { + return resource; + } + + @Override + public StreamEncoder getMenuCodec() { + return ResourceCodecs.STREAM_CODEC; + } +} diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/storagemonitor/StorageMonitorBlock.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/storagemonitor/StorageMonitorBlock.java index 6168adf7b..ddf44f1b0 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/storagemonitor/StorageMonitorBlock.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/storagemonitor/StorageMonitorBlock.java @@ -15,6 +15,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.player.Player; @@ -96,7 +97,7 @@ public void attack(final BlockState state, final Level level, final BlockPos pos if (hitDirection != direction.asDirection()) { return; } - storageMonitor.extract(player); + storageMonitor.extract((ServerPlayer) player); } private Direction getHitDirection(final Level level, final Player player) { diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/storagemonitor/StorageMonitorBlockEntity.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/storagemonitor/StorageMonitorBlockEntity.java index 8b8925d9c..ec255feac 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/storagemonitor/StorageMonitorBlockEntity.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/storagemonitor/StorageMonitorBlockEntity.java @@ -1,6 +1,9 @@ package com.refinedmods.refinedstorage.common.storagemonitor; +import com.refinedmods.refinedstorage.api.autocrafting.AutocraftingPreview; +import com.refinedmods.refinedstorage.api.autocrafting.AutocraftingPreviewProvider; import com.refinedmods.refinedstorage.api.network.Network; +import com.refinedmods.refinedstorage.api.network.autocrafting.AutocraftingNetworkComponent; import com.refinedmods.refinedstorage.api.network.impl.node.SimpleNetworkNode; import com.refinedmods.refinedstorage.api.network.storage.StorageNetworkComponent; import com.refinedmods.refinedstorage.api.resource.ResourceKey; @@ -9,6 +12,7 @@ import com.refinedmods.refinedstorage.common.api.RefinedStorageApi; import com.refinedmods.refinedstorage.common.api.storage.PlayerActor; import com.refinedmods.refinedstorage.common.api.storage.root.FuzzyRootStorage; +import com.refinedmods.refinedstorage.common.api.support.resource.PlatformResourceKey; import com.refinedmods.refinedstorage.common.api.support.resource.ResourceContainer; import com.refinedmods.refinedstorage.common.content.BlockEntities; import com.refinedmods.refinedstorage.common.content.ContentNames; @@ -21,6 +25,7 @@ import com.refinedmods.refinedstorage.common.support.resource.ResourceContainerImpl; import com.refinedmods.refinedstorage.common.util.PlatformUtil; +import java.util.Optional; import javax.annotation.Nullable; import com.google.common.util.concurrent.RateLimiter; @@ -31,6 +36,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.codec.StreamEncoder; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; @@ -44,7 +50,7 @@ import org.slf4j.LoggerFactory; public class StorageMonitorBlockEntity extends AbstractBaseNetworkNodeContainerBlockEntity - implements NetworkNodeExtendedMenuProvider { + implements NetworkNodeExtendedMenuProvider, AutocraftingPreviewProvider { private static final Logger LOGGER = LoggerFactory.getLogger(StorageMonitorBlockEntity.class); private static final String TAG_CLIENT_FILTER = "cf"; @@ -57,6 +63,7 @@ public class StorageMonitorBlockEntity extends AbstractBaseNetworkNodeContainerB private long currentAmount; private boolean currentlyActive; + private long lastExtractTime; public StorageMonitorBlockEntity(final BlockPos pos, final BlockState state) { super(BlockEntities.INSTANCE.getStorageMonitor(), pos, state, new SimpleNetworkNode( @@ -109,7 +116,7 @@ private long getAmount(final Network network, final ResourceKey configuredResour .sum(); } - public void extract(final Player player) { + public void extract(final ServerPlayer player) { if (level == null) { return; } @@ -117,14 +124,34 @@ public void extract(final Player player) { if (network == null) { return; } - final ResourceKey configuredResource = getConfiguredResource(); + final PlatformResourceKey configuredResource = getConfiguredResource(); if (configuredResource == null) { return; } - doExtract(level, player, configuredResource, network); + final boolean extracted = doExtract(level, player, configuredResource, network); + if (extracted) { + lastExtractTime = System.currentTimeMillis(); + } + if (!extracted && System.currentTimeMillis() - lastExtractTime > 250) { + tryAutocrafting(player, network, configuredResource); + } } - private void doExtract( + private void tryAutocrafting(final ServerPlayer player, + final Network network, + final PlatformResourceKey configuredResource) { + final boolean autocraftable = network.getComponent(AutocraftingNetworkComponent.class) + .getOutputs() + .contains(configuredResource); + if (autocraftable) { + Platform.INSTANCE.getMenuOpener().openMenu( + player, + new AutocraftingStorageMonitorExtendedMenuProvider(configuredResource, this) + ); + } + } + + private boolean doExtract( final Level level, final Player player, final ResourceKey configuredResource, @@ -138,7 +165,7 @@ private void doExtract( network ); if (!success) { - return; + return false; } sendDisplayUpdate(); level.playSound( @@ -149,6 +176,7 @@ private void doExtract( .2f, ((level.random.nextFloat() - level.random.nextFloat()) * .7f + 1) * 2 ); + return true; } public void insert(final Player player, final InteractionHand hand) { @@ -249,7 +277,7 @@ public void setFuzzyMode(final boolean fuzzyMode) { } @Nullable - public ResourceKey getConfiguredResource() { + public PlatformResourceKey getConfiguredResource() { return filter.getFilterContainer().getResource(0); } @@ -337,4 +365,20 @@ protected boolean doesBlockStateChangeWarrantNetworkNodeUpdate(final BlockState final BlockState newBlockState) { return AbstractDirectionalBlock.didDirectionChange(oldBlockState, newBlockState); } + + @Override + public Optional getPreview(final ResourceKey resource, final long amount) { + return Optional.ofNullable(mainNetworkNode.getNetwork()) + .map(network -> network.getComponent(AutocraftingNetworkComponent.class)) + .flatMap(component -> component.getPreview(resource, amount)); + } + + @Override + public boolean start(final ResourceKey resource, final long amount) { + final Network network = mainNetworkNode.getNetwork(); + if (network == null) { + return false; + } + return network.getComponent(AutocraftingNetworkComponent.class).start(resource, amount); + } } diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/amount/AbstractAmountScreen.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/amount/AbstractAmountScreen.java index e585d2fcf..1743e4589 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/amount/AbstractAmountScreen.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/amount/AbstractAmountScreen.java @@ -109,7 +109,7 @@ private Button addCancelButton(final int x, final int y) { final int width = configuration.isHorizontalActionButtons() ? font.width(CANCEL_TEXT) + ACTION_BUTTON_SPACING : ACTION_BUTTON_WIDTH; - return addRenderableWidget(Button.builder(CANCEL_TEXT, btn -> tryCloseToParent()) + return addRenderableWidget(Button.builder(CANCEL_TEXT, btn -> close()) .pos(leftPos + x, topPos + y) .size(width, ACTION_BUTTON_HEIGHT) .build()); @@ -259,9 +259,7 @@ public boolean keyPressed(final int key, final int scanCode, final int modifiers protected final boolean tryClose(final int key) { if (key == GLFW.GLFW_KEY_ESCAPE) { - if (!tryCloseToParent()) { - onClose(); - } + close(); return true; } return false; @@ -286,7 +284,7 @@ private void tryConfirmAndCloseToParent() { }); } - protected final boolean tryCloseToParent() { + private boolean tryCloseToParent() { if (parent != null) { Minecraft.getInstance().setScreen(parent); return true; @@ -294,6 +292,12 @@ protected final boolean tryCloseToParent() { return false; } + protected final void close() { + if (!tryCloseToParent()) { + onClose(); + } + } + protected final Optional getAndValidateAmount() { if (amountField == null) { return Optional.empty(); diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/packet/c2s/AutocraftingPreviewRequestPacket.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/packet/c2s/AutocraftingPreviewRequestPacket.java index 3c5544aef..c7e7fb8d3 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/packet/c2s/AutocraftingPreviewRequestPacket.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/packet/c2s/AutocraftingPreviewRequestPacket.java @@ -1,8 +1,7 @@ package com.refinedmods.refinedstorage.common.support.packet.c2s; +import com.refinedmods.refinedstorage.api.autocrafting.AutocraftingPreviewProvider; import com.refinedmods.refinedstorage.common.api.support.resource.PlatformResourceKey; -import com.refinedmods.refinedstorage.common.autocrafting.preview.AutocraftingPreview; -import com.refinedmods.refinedstorage.common.autocrafting.preview.AutocraftingPreviewProvider; import com.refinedmods.refinedstorage.common.support.packet.PacketContext; import com.refinedmods.refinedstorage.common.support.packet.s2c.S2CPackets; import com.refinedmods.refinedstorage.common.support.resource.ResourceCodecs; @@ -36,8 +35,10 @@ public record AutocraftingPreviewRequestPacket(UUID id, public static void handle(final AutocraftingPreviewRequestPacket packet, final PacketContext ctx) { if (ctx.getPlayer().containerMenu instanceof AutocraftingPreviewProvider provider) { - final AutocraftingPreview preview = provider.getPreview(packet.resource(), packet.amount()); - S2CPackets.sendAutocraftingPreviewResponse((ServerPlayer) ctx.getPlayer(), packet.id, preview); + final ServerPlayer player = (ServerPlayer) ctx.getPlayer(); + provider.getPreview(packet.resource(), packet.amount()).ifPresent( + preview -> S2CPackets.sendAutocraftingPreviewResponse(player, packet.id, preview) + ); } } diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/packet/c2s/AutocraftingRequestPacket.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/packet/c2s/AutocraftingRequestPacket.java index 2b2ea00a0..18ba3b302 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/packet/c2s/AutocraftingRequestPacket.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/packet/c2s/AutocraftingRequestPacket.java @@ -1,7 +1,7 @@ package com.refinedmods.refinedstorage.common.support.packet.c2s; +import com.refinedmods.refinedstorage.api.autocrafting.AutocraftingPreviewProvider; import com.refinedmods.refinedstorage.common.api.support.resource.PlatformResourceKey; -import com.refinedmods.refinedstorage.common.autocrafting.preview.AutocraftingPreviewProvider; import com.refinedmods.refinedstorage.common.support.packet.PacketContext; import com.refinedmods.refinedstorage.common.support.packet.s2c.S2CPackets; import com.refinedmods.refinedstorage.common.support.resource.ResourceCodecs; diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/packet/s2c/AutocraftingPreviewResponsePacket.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/packet/s2c/AutocraftingPreviewResponsePacket.java index bd9c8a1f1..94114242c 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/packet/s2c/AutocraftingPreviewResponsePacket.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/packet/s2c/AutocraftingPreviewResponsePacket.java @@ -1,26 +1,46 @@ package com.refinedmods.refinedstorage.common.support.packet.s2c; -import com.refinedmods.refinedstorage.common.autocrafting.preview.AutocraftingPreview; +import com.refinedmods.refinedstorage.api.autocrafting.AutocraftingPreview; +import com.refinedmods.refinedstorage.api.autocrafting.AutocraftingPreviewItem; +import com.refinedmods.refinedstorage.api.autocrafting.AutocraftingPreviewType; +import com.refinedmods.refinedstorage.common.api.support.resource.PlatformResourceKey; +import com.refinedmods.refinedstorage.common.support.resource.ResourceCodecs; import com.refinedmods.refinedstorage.common.util.ClientPlatformUtil; +import java.util.ArrayList; import java.util.UUID; import net.minecraft.core.UUIDUtil; import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import static com.refinedmods.refinedstorage.common.util.IdentifierUtil.createIdentifier; +import static com.refinedmods.refinedstorage.common.util.PlatformUtil.enumStreamCodec; public record AutocraftingPreviewResponsePacket(UUID id, AutocraftingPreview preview) implements CustomPacketPayload { public static final Type PACKET_TYPE = new Type<>( createIdentifier("autocrafting_preview_response") ); - + private static final StreamCodec PREVIEW_ITEM_STREAM_CODEC = + StreamCodec.composite( + ResourceCodecs.STREAM_CODEC, item -> (PlatformResourceKey) item.resource(), + ByteBufCodecs.VAR_LONG, AutocraftingPreviewItem::available, + ByteBufCodecs.VAR_LONG, AutocraftingPreviewItem::missing, + ByteBufCodecs.VAR_LONG, AutocraftingPreviewItem::toCraft, + AutocraftingPreviewItem::new + ); + private static final StreamCodec PREVIEW_STREAM_CODEC = + StreamCodec.composite( + enumStreamCodec(AutocraftingPreviewType.values()), AutocraftingPreview::type, + ByteBufCodecs.collection(ArrayList::new, PREVIEW_ITEM_STREAM_CODEC), AutocraftingPreview::items, + AutocraftingPreview::new + ); public static final StreamCodec STREAM_CODEC = StreamCodec.composite( UUIDUtil.STREAM_CODEC, AutocraftingPreviewResponsePacket::id, - AutocraftingPreview.STREAM_CODEC, AutocraftingPreviewResponsePacket::preview, + PREVIEW_STREAM_CODEC, AutocraftingPreviewResponsePacket::preview, AutocraftingPreviewResponsePacket::new ); diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/packet/s2c/S2CPackets.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/packet/s2c/S2CPackets.java index 623a0bd79..08b365c36 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/packet/s2c/S2CPackets.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/support/packet/s2c/S2CPackets.java @@ -1,11 +1,11 @@ package com.refinedmods.refinedstorage.common.support.packet.s2c; +import com.refinedmods.refinedstorage.api.autocrafting.AutocraftingPreview; import com.refinedmods.refinedstorage.api.resource.ResourceAmount; import com.refinedmods.refinedstorage.api.storage.tracked.TrackedResource; import com.refinedmods.refinedstorage.common.Platform; import com.refinedmods.refinedstorage.common.api.storage.StorageInfo; import com.refinedmods.refinedstorage.common.api.support.resource.PlatformResourceKey; -import com.refinedmods.refinedstorage.common.autocrafting.preview.AutocraftingPreview; import com.refinedmods.refinedstorage.common.networking.NetworkTransmitterData; import java.util.Optional; diff --git a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/util/ClientPlatformUtil.java b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/util/ClientPlatformUtil.java index 065af4437..8d3f95629 100644 --- a/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/util/ClientPlatformUtil.java +++ b/refinedstorage-common/src/main/java/com/refinedmods/refinedstorage/common/util/ClientPlatformUtil.java @@ -1,6 +1,6 @@ package com.refinedmods.refinedstorage.common.util; -import com.refinedmods.refinedstorage.common.autocrafting.preview.AutocraftingPreview; +import com.refinedmods.refinedstorage.api.autocrafting.AutocraftingPreview; import com.refinedmods.refinedstorage.common.autocrafting.preview.AutocraftingPreviewScreen; import java.util.UUID; diff --git a/refinedstorage-network-api/src/main/java/com/refinedmods/refinedstorage/api/network/autocrafting/AutocraftingNetworkComponent.java b/refinedstorage-network-api/src/main/java/com/refinedmods/refinedstorage/api/network/autocrafting/AutocraftingNetworkComponent.java index 392287596..8bca0a60a 100644 --- a/refinedstorage-network-api/src/main/java/com/refinedmods/refinedstorage/api/network/autocrafting/AutocraftingNetworkComponent.java +++ b/refinedstorage-network-api/src/main/java/com/refinedmods/refinedstorage/api/network/autocrafting/AutocraftingNetworkComponent.java @@ -1,10 +1,11 @@ package com.refinedmods.refinedstorage.api.network.autocrafting; +import com.refinedmods.refinedstorage.api.autocrafting.AutocraftingPreviewProvider; import com.refinedmods.refinedstorage.api.autocrafting.PatternRepository; import com.refinedmods.refinedstorage.api.network.NetworkComponent; import org.apiguardian.api.API; @API(status = API.Status.STABLE, since = "2.0.0-milestone.4.8") -public interface AutocraftingNetworkComponent extends NetworkComponent, PatternRepository { +public interface AutocraftingNetworkComponent extends NetworkComponent, PatternRepository, AutocraftingPreviewProvider { } diff --git a/refinedstorage-network/src/main/java/com/refinedmods/refinedstorage/api/network/impl/autocrafting/AutocraftingNetworkComponentImpl.java b/refinedstorage-network/src/main/java/com/refinedmods/refinedstorage/api/network/impl/autocrafting/AutocraftingNetworkComponentImpl.java index 6d3db761e..0e7fe1329 100644 --- a/refinedstorage-network/src/main/java/com/refinedmods/refinedstorage/api/network/impl/autocrafting/AutocraftingNetworkComponentImpl.java +++ b/refinedstorage-network/src/main/java/com/refinedmods/refinedstorage/api/network/impl/autocrafting/AutocraftingNetworkComponentImpl.java @@ -1,5 +1,8 @@ package com.refinedmods.refinedstorage.api.network.impl.autocrafting; +import com.refinedmods.refinedstorage.api.autocrafting.AutocraftingPreview; +import com.refinedmods.refinedstorage.api.autocrafting.AutocraftingPreviewItem; +import com.refinedmods.refinedstorage.api.autocrafting.AutocraftingPreviewType; import com.refinedmods.refinedstorage.api.autocrafting.Pattern; import com.refinedmods.refinedstorage.api.autocrafting.PatternRepository; import com.refinedmods.refinedstorage.api.network.autocrafting.AutocraftingNetworkComponent; @@ -7,6 +10,9 @@ import com.refinedmods.refinedstorage.api.network.node.container.NetworkNodeContainer; import com.refinedmods.refinedstorage.api.resource.ResourceKey; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; import java.util.Set; public class AutocraftingNetworkComponentImpl implements AutocraftingNetworkComponent { @@ -44,4 +50,26 @@ public void remove(final Pattern pattern) { public Set getOutputs() { return patternRepository.getOutputs(); } + + @Override + public Optional getPreview(final ResourceKey resource, final long amount) { + final List items = new ArrayList<>(); + final boolean missing = amount == 404; + for (int i = 0; i < 31; ++i) { + items.add(new AutocraftingPreviewItem( + resource, + (i + 1), + (i % 2 == 0 && missing) ? amount : 0, + i % 2 == 0 ? 0 : amount + )); + } + return Optional.of(new AutocraftingPreview(missing + ? AutocraftingPreviewType.MISSING_RESOURCES + : AutocraftingPreviewType.SUCCESS, items)); + } + + @Override + public boolean start(final ResourceKey resource, final long amount) { + return true; + } }