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