From 3c3873a36141f040aca303a28b728fd8f2e8f4eb Mon Sep 17 00:00:00 2001 From: Ramid Khan Date: Thu, 17 Oct 2024 21:04:03 +1100 Subject: [PATCH 1/4] Add all viewable items in MEStorageMenus to Emi inventory --- .../emi/EmiUseCraftingRecipeHandler.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/main/java/appeng/integration/modules/emi/EmiUseCraftingRecipeHandler.java b/src/main/java/appeng/integration/modules/emi/EmiUseCraftingRecipeHandler.java index 43306d32953..6557f1ef1f7 100644 --- a/src/main/java/appeng/integration/modules/emi/EmiUseCraftingRecipeHandler.java +++ b/src/main/java/appeng/integration/modules/emi/EmiUseCraftingRecipeHandler.java @@ -1,11 +1,14 @@ package appeng.integration.modules.emi; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Optional; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.core.NonNullList; +import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.CraftingBookCategory; import net.minecraft.world.item.crafting.Ingredient; @@ -14,11 +17,14 @@ import net.minecraft.world.item.crafting.ShapedRecipe; import net.minecraft.world.item.crafting.ShapedRecipePattern; +import dev.emi.emi.api.recipe.EmiPlayerInventory; import dev.emi.emi.api.recipe.EmiRecipe; import dev.emi.emi.api.stack.EmiStack; +import appeng.api.stacks.GenericStack; import appeng.core.localization.ItemModText; import appeng.integration.modules.itemlists.CraftingHelper; +import appeng.menu.me.common.GridInventoryEntry; import appeng.menu.me.items.CraftingTermMenu; /** @@ -41,6 +47,25 @@ public EmiUseCraftingRecipeHandler(Class containerClass) { super(containerClass); } + @Override + public EmiPlayerInventory getInventory(AbstractContainerScreen screen) { + List list = new ArrayList<>(); + + for (Slot slot : getInputSources(screen.getMenu())) { + list.add(EmiStack.of(slot.getItem())); + } + + var repo = screen.getMenu().getClientRepo(); + + if (repo != null) { + for (GridInventoryEntry entry : repo.getAllEntries()) { + list.add(EmiStackHelper.toEmiStack(new GenericStack(entry.getWhat(), entry.getStoredAmount()))); + } + } + + return new EmiPlayerInventory(list); + } + @Override protected Result transferRecipe(T menu, RecipeHolder holder, EmiRecipe emiRecipe, boolean doTransfer) { From 783e65f668a27f3b9a97abcd7fd93e2516225d9f Mon Sep 17 00:00:00 2001 From: Ramid Khan Date: Thu, 17 Oct 2024 21:04:26 +1100 Subject: [PATCH 2/4] Add crafting slots to input sources --- .../appeng/integration/modules/emi/AbstractRecipeHandler.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/appeng/integration/modules/emi/AbstractRecipeHandler.java b/src/main/java/appeng/integration/modules/emi/AbstractRecipeHandler.java index 5e5df2ee678..dd97c7372a3 100644 --- a/src/main/java/appeng/integration/modules/emi/AbstractRecipeHandler.java +++ b/src/main/java/appeng/integration/modules/emi/AbstractRecipeHandler.java @@ -51,6 +51,7 @@ public List getInputSources(T menu) { var slots = new ArrayList(); slots.addAll(menu.getSlots(SlotSemantics.PLAYER_INVENTORY)); slots.addAll(menu.getSlots(SlotSemantics.PLAYER_HOTBAR)); + slots.addAll(menu.getSlots(SlotSemantics.CRAFTING_GRID)); return slots; } From c5e59b853753f1354e14185675fcdca522e71d66 Mon Sep 17 00:00:00 2001 From: Ramid Khan Date: Thu, 17 Oct 2024 21:13:26 +1100 Subject: [PATCH 3/4] Let it work with PatternEncodingTermMenus --- .../modules/emi/AbstractRecipeHandler.java | 26 +++++++++++++++++++ .../emi/EmiUseCraftingRecipeHandler.java | 25 ------------------ 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/main/java/appeng/integration/modules/emi/AbstractRecipeHandler.java b/src/main/java/appeng/integration/modules/emi/AbstractRecipeHandler.java index dd97c7372a3..ba17289317b 100644 --- a/src/main/java/appeng/integration/modules/emi/AbstractRecipeHandler.java +++ b/src/main/java/appeng/integration/modules/emi/AbstractRecipeHandler.java @@ -13,6 +13,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; import net.minecraft.network.chat.Component; import net.minecraft.world.inventory.Slot; @@ -20,20 +21,24 @@ import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.level.Level; +import dev.emi.emi.api.recipe.EmiPlayerInventory; import dev.emi.emi.api.recipe.EmiRecipe; import dev.emi.emi.api.recipe.VanillaEmiRecipeCategories; import dev.emi.emi.api.recipe.handler.EmiCraftContext; import dev.emi.emi.api.recipe.handler.StandardRecipeHandler; import dev.emi.emi.api.stack.EmiIngredient; +import dev.emi.emi.api.stack.EmiStack; import dev.emi.emi.api.widget.Bounds; import dev.emi.emi.api.widget.SlotWidget; import dev.emi.emi.api.widget.Widget; import appeng.api.stacks.AEKey; +import appeng.api.stacks.GenericStack; import appeng.integration.modules.itemlists.EncodingHelper; import appeng.integration.modules.itemlists.TransferHelper; import appeng.menu.AEBaseMenu; import appeng.menu.SlotSemantics; +import appeng.menu.me.common.MEStorageMenu; import appeng.menu.me.items.CraftingTermMenu; abstract class AbstractRecipeHandler implements StandardRecipeHandler { @@ -68,6 +73,27 @@ public List getCraftingSlots(T menu) { return null; } + @Override + public EmiPlayerInventory getInventory(AbstractContainerScreen screen) { + var list = new ArrayList(); + + for (Slot slot : getInputSources(screen.getMenu())) { + list.add(EmiStack.of(slot.getItem())); + } + + if (screen.getMenu() instanceof MEStorageMenu menu) { + var repo = menu.getClientRepo(); + + if (repo != null) { + for (var entry : repo.getAllEntries()) { + list.add(EmiStackHelper.toEmiStack(new GenericStack(entry.getWhat(), entry.getStoredAmount()))); + } + } + } + + return new EmiPlayerInventory(list); + } + @Override public boolean canCraft(EmiRecipe recipe, EmiCraftContext context) { if (context.getType() == EmiCraftContext.Type.FILL_BUTTON) { diff --git a/src/main/java/appeng/integration/modules/emi/EmiUseCraftingRecipeHandler.java b/src/main/java/appeng/integration/modules/emi/EmiUseCraftingRecipeHandler.java index 6557f1ef1f7..43306d32953 100644 --- a/src/main/java/appeng/integration/modules/emi/EmiUseCraftingRecipeHandler.java +++ b/src/main/java/appeng/integration/modules/emi/EmiUseCraftingRecipeHandler.java @@ -1,14 +1,11 @@ package appeng.integration.modules.emi; -import java.util.ArrayList; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Optional; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.core.NonNullList; -import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.CraftingBookCategory; import net.minecraft.world.item.crafting.Ingredient; @@ -17,14 +14,11 @@ import net.minecraft.world.item.crafting.ShapedRecipe; import net.minecraft.world.item.crafting.ShapedRecipePattern; -import dev.emi.emi.api.recipe.EmiPlayerInventory; import dev.emi.emi.api.recipe.EmiRecipe; import dev.emi.emi.api.stack.EmiStack; -import appeng.api.stacks.GenericStack; import appeng.core.localization.ItemModText; import appeng.integration.modules.itemlists.CraftingHelper; -import appeng.menu.me.common.GridInventoryEntry; import appeng.menu.me.items.CraftingTermMenu; /** @@ -47,25 +41,6 @@ public EmiUseCraftingRecipeHandler(Class containerClass) { super(containerClass); } - @Override - public EmiPlayerInventory getInventory(AbstractContainerScreen screen) { - List list = new ArrayList<>(); - - for (Slot slot : getInputSources(screen.getMenu())) { - list.add(EmiStack.of(slot.getItem())); - } - - var repo = screen.getMenu().getClientRepo(); - - if (repo != null) { - for (GridInventoryEntry entry : repo.getAllEntries()) { - list.add(EmiStackHelper.toEmiStack(new GenericStack(entry.getWhat(), entry.getStoredAmount()))); - } - } - - return new EmiPlayerInventory(list); - } - @Override protected Result transferRecipe(T menu, RecipeHolder holder, EmiRecipe emiRecipe, boolean doTransfer) { From 4c7f91b339d21aede0366e066eca2c52e3f5649c Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Sun, 8 Dec 2024 03:48:08 +0100 Subject: [PATCH 4/4] Add config --- src/main/java/appeng/core/AEConfig.java | 7 +++++++ .../integration/modules/emi/AbstractRecipeHandler.java | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/src/main/java/appeng/core/AEConfig.java b/src/main/java/appeng/core/AEConfig.java index 4ff15161955..a1b419f63ef 100644 --- a/src/main/java/appeng/core/AEConfig.java +++ b/src/main/java/appeng/core/AEConfig.java @@ -228,6 +228,10 @@ public boolean isEnableFacadeRecipesInRecipeViewer() { return client.enableFacadeRecipesInRecipeViewer.getAsBoolean(); } + public boolean isExposeNetworkInventoryToEmi() { + return client.exposeNetworkInventoryToEmi.getAsBoolean(); + } + public int getCraftingCalculationTimePerTick() { return common.craftingCalculationTimePerTick.get(); } @@ -424,6 +428,7 @@ private static class ClientConfig { public final BooleanValue disableColoredCableRecipesInRecipeViewer; public final BooleanValue enableFacadesInRecipeViewer; public final BooleanValue enableFacadeRecipesInRecipeViewer; + public final BooleanValue exposeNetworkInventoryToEmi; public final EnumValue selectedPowerUnit; public final BooleanValue debugGuiOverlays; public final BooleanValue showPlacementPreview; @@ -458,6 +463,8 @@ public ClientConfig() { "Show facades in REI/JEI/EMI item list"); this.enableFacadeRecipesInRecipeViewer = define(builder, "enableFacadeRecipesInRecipeViewer", true, "Show facade recipes in REI/JEI/EMI for supported blocks"); + this.exposeNetworkInventoryToEmi = define(builder, "provideNetworkInventoryToEmi", false, + "Expose the full network inventory to EMI, which might cause performance problems."); builder.pop(); builder.push("client"); diff --git a/src/main/java/appeng/integration/modules/emi/AbstractRecipeHandler.java b/src/main/java/appeng/integration/modules/emi/AbstractRecipeHandler.java index ba17289317b..62815932913 100644 --- a/src/main/java/appeng/integration/modules/emi/AbstractRecipeHandler.java +++ b/src/main/java/appeng/integration/modules/emi/AbstractRecipeHandler.java @@ -34,6 +34,7 @@ import appeng.api.stacks.AEKey; import appeng.api.stacks.GenericStack; +import appeng.core.AEConfig; import appeng.integration.modules.itemlists.EncodingHelper; import appeng.integration.modules.itemlists.TransferHelper; import appeng.menu.AEBaseMenu; @@ -75,6 +76,10 @@ public List getCraftingSlots(T menu) { @Override public EmiPlayerInventory getInventory(AbstractContainerScreen screen) { + if (!AEConfig.instance().isExposeNetworkInventoryToEmi()) { + return StandardRecipeHandler.super.getInventory(screen); + } + var list = new ArrayList(); for (Slot slot : getInputSources(screen.getMenu())) { @@ -86,6 +91,9 @@ public EmiPlayerInventory getInventory(AbstractContainerScreen screen) { if (repo != null) { for (var entry : repo.getAllEntries()) { + if (entry.getStoredAmount() <= 0) { + continue; // Skip items that are only craftable + } list.add(EmiStackHelper.toEmiStack(new GenericStack(entry.getWhat(), entry.getStoredAmount()))); } }