From daf49105488df9d5ef0c8a848454a6ddaf517725 Mon Sep 17 00:00:00 2001 From: PrototypeTrousers Date: Mon, 17 Oct 2022 23:56:59 -0300 Subject: [PATCH 1/3] start work. --- .../modules/jei/JEIMissingItem.java | 32 +++++++++++++++++++ .../modules/jei/RecipeTransferHandler.java | 3 ++ 2 files changed, 35 insertions(+) create mode 100644 src/main/java/appeng/integration/modules/jei/JEIMissingItem.java diff --git a/src/main/java/appeng/integration/modules/jei/JEIMissingItem.java b/src/main/java/appeng/integration/modules/jei/JEIMissingItem.java new file mode 100644 index 000000000..a6158bcdb --- /dev/null +++ b/src/main/java/appeng/integration/modules/jei/JEIMissingItem.java @@ -0,0 +1,32 @@ +package appeng.integration.modules.jei; + +import appeng.container.implementations.ContainerPatternTerm; +import mezz.jei.api.gui.IGuiIngredient; +import mezz.jei.api.gui.IRecipeLayout; +import mezz.jei.api.recipe.transfer.IRecipeTransferError; +import net.minecraft.client.Minecraft; +import net.minecraft.inventory.Container; + +import javax.annotation.Nonnull; +import java.awt.*; + +import static mezz.jei.api.recipe.transfer.IRecipeTransferError.Type.USER_FACING; + +public class JEIMissingItem implements IRecipeTransferError { + + @Nonnull + @Override + public Type getType() { + return USER_FACING; + } + + @Override + public void showError(Minecraft minecraft, int mouseX, int mouseY, @Nonnull IRecipeLayout recipeLayout, int recipeX, int recipeY) { + Container c = minecraft.player.openContainer; + if (c instanceof ContainerPatternTerm) { + for (IGuiIngredient i : recipeLayout.getItemStacks().getGuiIngredients().values()) { + i.drawHighlight(minecraft, new Color(1.0f, 0.0f, 0.0f, 0.4f), recipeX, recipeY); + } + } + } +} diff --git a/src/main/java/appeng/integration/modules/jei/RecipeTransferHandler.java b/src/main/java/appeng/integration/modules/jei/RecipeTransferHandler.java index c3af96d49..1778fe523 100644 --- a/src/main/java/appeng/integration/modules/jei/RecipeTransferHandler.java +++ b/src/main/java/appeng/integration/modules/jei/RecipeTransferHandler.java @@ -70,6 +70,9 @@ class RecipeTransferHandler implements IRecipeTransferHandl } if (!doTransfer) { + if (recipeType.equals(VanillaRecipeCategoryUid.CRAFTING)) { + return new JEIMissingItem(); + } return null; } From 9b263c55016bf8706134fd7d67ae48fbca42f2b0 Mon Sep 17 00:00:00 2001 From: PrototypeTrousers Date: Tue, 18 Oct 2022 05:20:55 -0300 Subject: [PATCH 2/3] add tooltip callback. Paint craftables in blue. middle click to craft from JEI --- .../gui/implementations/GuiCraftingTerm.java | 5 + .../gui/implementations/GuiMEMonitorable.java | 2 +- src/main/java/appeng/client/me/ItemRepo.java | 4 + .../ContainerCraftingTerm.java | 5 + .../ContainerMEMonitorable.java | 4 +- .../implementations/ContainerPatternTerm.java | 16 ++- .../modules/jei/CraftableCallBack.java | 41 ++++++ .../modules/jei/JEIMissingItem.java | 126 +++++++++++++++++- .../modules/jei/RecipeTransferHandler.java | 7 +- 9 files changed, 201 insertions(+), 9 deletions(-) create mode 100644 src/main/java/appeng/integration/modules/jei/CraftableCallBack.java diff --git a/src/main/java/appeng/client/gui/implementations/GuiCraftingTerm.java b/src/main/java/appeng/client/gui/implementations/GuiCraftingTerm.java index 4de1c8859..e2189f45e 100644 --- a/src/main/java/appeng/client/gui/implementations/GuiCraftingTerm.java +++ b/src/main/java/appeng/client/gui/implementations/GuiCraftingTerm.java @@ -23,6 +23,7 @@ import appeng.api.config.ActionItems; import appeng.api.config.Settings; import appeng.api.storage.ITerminalHost; import appeng.client.gui.widgets.GuiImgButton; +import appeng.client.me.ItemRepo; import appeng.container.implementations.ContainerCraftingTerm; import appeng.container.slot.SlotCraftingMatrix; import appeng.core.localization.GuiText; @@ -81,4 +82,8 @@ public class GuiCraftingTerm extends GuiMEMonitorable { protected String getBackground() { return "guis/crafting.png"; } + + public ItemRepo getRepo() { + return this.repo; + } } diff --git a/src/main/java/appeng/client/gui/implementations/GuiMEMonitorable.java b/src/main/java/appeng/client/gui/implementations/GuiMEMonitorable.java index 392a29086..b08aedb76 100644 --- a/src/main/java/appeng/client/gui/implementations/GuiMEMonitorable.java +++ b/src/main/java/appeng/client/gui/implementations/GuiMEMonitorable.java @@ -73,7 +73,7 @@ public class GuiMEMonitorable extends AEBaseMEGui implements ISortSource, IConfi private static int craftingGridOffsetY; private static String memoryText = ""; - private final ItemRepo repo; + protected final ItemRepo repo; private final int offsetX = 9; private final int lowerTextureOffset = 0; private final IConfigManager configSrc; diff --git a/src/main/java/appeng/client/me/ItemRepo.java b/src/main/java/appeng/client/me/ItemRepo.java index 168a8c860..e02657149 100644 --- a/src/main/java/appeng/client/me/ItemRepo.java +++ b/src/main/java/appeng/client/me/ItemRepo.java @@ -268,4 +268,8 @@ public class ItemRepo { this.updateJEI(this.searchString); } } + + public IItemList getList() { + return list; + } } diff --git a/src/main/java/appeng/container/implementations/ContainerCraftingTerm.java b/src/main/java/appeng/container/implementations/ContainerCraftingTerm.java index b55bbbba3..82965ca3f 100644 --- a/src/main/java/appeng/container/implementations/ContainerCraftingTerm.java +++ b/src/main/java/appeng/container/implementations/ContainerCraftingTerm.java @@ -26,6 +26,7 @@ import appeng.container.slot.SlotCraftingTerm; import appeng.helpers.IContainerCraftingPacket; import appeng.parts.reporting.PartCraftingTerminal; import appeng.tile.inventory.AppEngInternalInventory; +import appeng.util.IConfigManagerHost; import appeng.util.inv.IAEAppEngInventory; import appeng.util.inv.InvOperation; import appeng.util.inv.WrapperInvItemHandler; @@ -119,4 +120,8 @@ public class ContainerCraftingTerm extends ContainerMEMonitorable implements IAE public IRecipe getCurrentRecipe() { return this.currentRecipe; } + + public IConfigManagerHost getGui() { + return super.getGui(); + } } diff --git a/src/main/java/appeng/container/implementations/ContainerMEMonitorable.java b/src/main/java/appeng/container/implementations/ContainerMEMonitorable.java index 928ee7f74..e03142caa 100644 --- a/src/main/java/appeng/container/implementations/ContainerMEMonitorable.java +++ b/src/main/java/appeng/container/implementations/ContainerMEMonitorable.java @@ -70,7 +70,7 @@ public class ContainerMEMonitorable extends AEBaseContainer implements IConfigMa private final SlotRestrictedInput[] cellView = new SlotRestrictedInput[5]; private final IMEMonitor monitor; - private final IItemList items = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); + public final IItemList items = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); private final IConfigManager clientCM; private final ITerminalHost host; @GuiSync(99) @@ -357,7 +357,7 @@ public class ContainerMEMonitorable extends AEBaseContainer implements IConfigMa this.hasPower = isPowered; } - private IConfigManagerHost getGui() { + protected IConfigManagerHost getGui() { return this.gui; } diff --git a/src/main/java/appeng/container/implementations/ContainerPatternTerm.java b/src/main/java/appeng/container/implementations/ContainerPatternTerm.java index 5b1e146b6..0a0ac7d97 100644 --- a/src/main/java/appeng/container/implementations/ContainerPatternTerm.java +++ b/src/main/java/appeng/container/implementations/ContainerPatternTerm.java @@ -29,7 +29,15 @@ import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; import appeng.container.ContainerNull; import appeng.container.guisync.GuiSync; -import appeng.container.slot.*; +import appeng.container.slot.AppEngSlot; +import appeng.container.slot.IOptionalSlotHost; +import appeng.container.slot.OptionalSlotFake; +import appeng.container.slot.SlotFakeCraftingMatrix; +import appeng.container.slot.SlotPatternOutputs; +import appeng.container.slot.SlotPatternTerm; +import appeng.container.slot.SlotPlayerHotBar; +import appeng.container.slot.SlotPlayerInv; +import appeng.container.slot.SlotRestrictedInput; import appeng.core.sync.packets.PacketPatternSlot; import appeng.helpers.IContainerCraftingPacket; import appeng.items.storage.ItemViewCell; @@ -46,7 +54,11 @@ import appeng.util.item.AEItemStack; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.inventory.*; +import net.minecraft.inventory.IContainerListener; +import net.minecraft.inventory.InventoryCraftResult; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.inventory.Slot; +import net.minecraft.inventory.SlotCrafting; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.CraftingManager; import net.minecraft.item.crafting.IRecipe; diff --git a/src/main/java/appeng/integration/modules/jei/CraftableCallBack.java b/src/main/java/appeng/integration/modules/jei/CraftableCallBack.java new file mode 100644 index 000000000..fbafa048f --- /dev/null +++ b/src/main/java/appeng/integration/modules/jei/CraftableCallBack.java @@ -0,0 +1,41 @@ +package appeng.integration.modules.jei; + +import appeng.api.storage.data.IAEItemStack; +import appeng.api.storage.data.IItemList; +import appeng.container.AEBaseContainer; +import appeng.core.sync.network.NetworkHandler; +import appeng.core.sync.packets.PacketInventoryAction; +import appeng.helpers.InventoryAction; +import appeng.util.item.AEItemStack; +import mezz.jei.api.gui.ITooltipCallback; +import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; +import net.minecraft.util.text.translation.I18n; +import org.lwjgl.input.Mouse; + +import java.util.List; + +public class CraftableCallBack implements ITooltipCallback { + private final IItemList list; + private final Container container; + + public CraftableCallBack(Container container, IItemList ir) { + this.list = ir; + this.container = container; + } + + @Override + public void onTooltip(int slotIndex, boolean input, ItemStack ingredient, List tooltip) { + if (list != null) { + AEItemStack stack = AEItemStack.fromItemStack(ingredient); + if (list.findPrecise(stack) != null) { + tooltip.add(I18n.translateToLocalFormatted("gui.tooltips.appliedenergistics2.Craftable")); + if (Mouse.isButtonDown(2)) { + ((AEBaseContainer) container).setTargetStack(stack); + final PacketInventoryAction p = new PacketInventoryAction(InventoryAction.AUTO_CRAFT, container.getInventory().size(), 0); + NetworkHandler.instance().sendToServer(p); + } + } + } + } +} diff --git a/src/main/java/appeng/integration/modules/jei/JEIMissingItem.java b/src/main/java/appeng/integration/modules/jei/JEIMissingItem.java index a6158bcdb..e25ce52bb 100644 --- a/src/main/java/appeng/integration/modules/jei/JEIMissingItem.java +++ b/src/main/java/appeng/integration/modules/jei/JEIMissingItem.java @@ -1,19 +1,81 @@ package appeng.integration.modules.jei; +import appeng.api.config.FuzzyMode; +import appeng.api.storage.data.IAEItemStack; +import appeng.api.storage.data.IItemList; +import appeng.client.gui.implementations.GuiCraftingTerm; +import appeng.client.gui.implementations.GuiPatternTerm; +import appeng.container.implementations.ContainerCraftingTerm; import appeng.container.implementations.ContainerPatternTerm; +import appeng.util.Platform; +import appeng.util.item.AEItemStack; import mezz.jei.api.gui.IGuiIngredient; import mezz.jei.api.gui.IRecipeLayout; import mezz.jei.api.recipe.transfer.IRecipeTransferError; import net.minecraft.client.Minecraft; import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; import javax.annotation.Nonnull; import java.awt.*; +import java.util.Collection; import static mezz.jei.api.recipe.transfer.IRecipeTransferError.Type.USER_FACING; public class JEIMissingItem implements IRecipeTransferError { + private boolean errored; + + JEIMissingItem(Container container, @Nonnull IRecipeLayout recipeLayout) { + if (container instanceof ContainerCraftingTerm) { + ContainerCraftingTerm craftingTerm = (ContainerCraftingTerm) container; + GuiCraftingTerm g = (GuiCraftingTerm) craftingTerm.getGui(); + + IItemList ir = g.getRepo().getList(); + boolean found; + this.errored = false; + + recipeLayout.getItemStacks().addTooltipCallback(new CraftableCallBack(container, ir)); + + for (IGuiIngredient i : recipeLayout.getItemStacks().getGuiIngredients().values()) { + found = false; + if (i.isInput() && i.getAllIngredients().size() > 0) { + for (Object o : i.getAllIngredients()) { + if (o instanceof ItemStack) { + ItemStack stack = (ItemStack) o; + if (!stack.isEmpty()) { + if (stack.getItem().isDamageable() || Platform.isGTDamageableItem(stack.getItem())) { + Collection fuzzy = ir.findFuzzy(AEItemStack.fromItemStack(stack), FuzzyMode.IGNORE_ALL); + if (fuzzy.size() > 0) { + for (IAEItemStack itemStack : fuzzy) { + if (itemStack.getStackSize() > 0) { + if (itemStack.isSameType(stack)) { + found = true; + break; + } + } + } + } + } else { + IAEItemStack ext = ir.findPrecise(AEItemStack.fromItemStack(stack)); + if (ext != null) { + if (ext.getStackSize() > 0) { + found = true; + break; + } + } + } + } + } + } + if (!found) { + this.errored = true; + } + } + } + } + } + @Nonnull @Override public Type getType() { @@ -23,10 +85,70 @@ public class JEIMissingItem implements IRecipeTransferError { @Override public void showError(Minecraft minecraft, int mouseX, int mouseY, @Nonnull IRecipeLayout recipeLayout, int recipeX, int recipeY) { Container c = minecraft.player.openContainer; - if (c instanceof ContainerPatternTerm) { + if (c instanceof ContainerCraftingTerm) { + ContainerCraftingTerm craftingTerm = (ContainerCraftingTerm) c; + GuiCraftingTerm g = (GuiCraftingTerm) craftingTerm.getGui(); + + IItemList ir = g.getRepo().getList(); + boolean found; + boolean craftable; + this.errored = false; + for (IGuiIngredient i : recipeLayout.getItemStacks().getGuiIngredients().values()) { - i.drawHighlight(minecraft, new Color(1.0f, 0.0f, 0.0f, 0.4f), recipeX, recipeY); + found = false; + craftable = false; + if (i.isInput() && i.getAllIngredients().size() > 0) { + for (Object o : i.getAllIngredients()) { + if (o instanceof ItemStack) { + ItemStack stack = (ItemStack) o; + if (!stack.isEmpty()) { + if (stack.getItem().isDamageable() || Platform.isGTDamageableItem(stack.getItem())) { + Collection fuzzy = ir.findFuzzy(AEItemStack.fromItemStack(stack), FuzzyMode.IGNORE_ALL); + if (fuzzy.size() > 0) { + for (IAEItemStack itemStack : fuzzy) { + if (itemStack.getStackSize() > 0) { + if (itemStack.fuzzyComparison(AEItemStack.fromItemStack(stack), FuzzyMode.IGNORE_ALL)) { + found = true; + break; + } + } else { + if (itemStack.isCraftable()) { + craftable = true; + } + } + } + } + } else { + IAEItemStack ext = ir.findPrecise(AEItemStack.fromItemStack(stack)); + if (ext != null) { + if (ext.getStackSize() > 0) { + break; + } else { + if (ext.isCraftable()) { + craftable = true; + } + } + } + } + } + } + if (!found) { + if (craftable) { + i.drawHighlight(minecraft, new Color(0.0f, 0.0f, 1.0f, 0.4f), recipeX, recipeY); + } else { + i.drawHighlight(minecraft, new Color(1.0f, 0.0f, 0.0f, 0.4f), recipeX, recipeY); + } + this.errored = true; + } else { + this.errored = false; + } + } + } } } } + + public boolean errored() { + return this.errored; + } } diff --git a/src/main/java/appeng/integration/modules/jei/RecipeTransferHandler.java b/src/main/java/appeng/integration/modules/jei/RecipeTransferHandler.java index 1778fe523..f641da43c 100644 --- a/src/main/java/appeng/integration/modules/jei/RecipeTransferHandler.java +++ b/src/main/java/appeng/integration/modules/jei/RecipeTransferHandler.java @@ -19,6 +19,7 @@ package appeng.integration.modules.jei; +import appeng.container.implementations.ContainerCraftingTerm; import appeng.container.implementations.ContainerPatternTerm; import appeng.container.slot.SlotCraftingMatrix; import appeng.container.slot.SlotFakeCraftingMatrix; @@ -70,8 +71,10 @@ class RecipeTransferHandler implements IRecipeTransferHandl } if (!doTransfer) { - if (recipeType.equals(VanillaRecipeCategoryUid.CRAFTING)) { - return new JEIMissingItem(); + if (container instanceof ContainerCraftingTerm && recipeType.equals(VanillaRecipeCategoryUid.CRAFTING)) { + JEIMissingItem error = new JEIMissingItem(container, recipeLayout); + if (error.errored()) + return error; } return null; } From 486a68d06b4f6e65c088406b86079d6556842b2c Mon Sep 17 00:00:00 2001 From: PrototypeTrousers Date: Tue, 18 Oct 2022 06:50:37 -0300 Subject: [PATCH 3/3] update items while JEI GUI is active --- .../gui/implementations/GuiCraftConfirm.java | 1 + .../gui/implementations/GuiCraftingCPU.java | 1 + .../gui/implementations/GuiMEMonitorable.java | 6 +++- .../gui/implementations/GuiNetworkStatus.java | 4 +++ .../ContainerCraftConfirm.java | 11 +++++++ .../implementations/ContainerCraftingCPU.java | 12 ++++++++ .../ContainerCraftingTerm.java | 5 +--- .../ContainerMEMonitorable.java | 12 +++++++- .../ContainerNetworkStatus.java | 11 +++++++ .../sync/packets/PacketMEInventoryUpdate.java | 29 +++++++++---------- .../modules/jei/CraftableCallBack.java | 3 ++ .../modules/jei/JEIMissingItem.java | 10 ++++--- .../modules/jei/RecipeTransferHandler.java | 3 +- 13 files changed, 82 insertions(+), 26 deletions(-) diff --git a/src/main/java/appeng/client/gui/implementations/GuiCraftConfirm.java b/src/main/java/appeng/client/gui/implementations/GuiCraftConfirm.java index c379e4666..d60bbf623 100644 --- a/src/main/java/appeng/client/gui/implementations/GuiCraftConfirm.java +++ b/src/main/java/appeng/client/gui/implementations/GuiCraftConfirm.java @@ -81,6 +81,7 @@ public class GuiCraftConfirm extends AEBaseGui { this.setScrollBar(scrollbar); this.ccc = (ContainerCraftConfirm) this.inventorySlots; + this.ccc.setGui(this); if (te instanceof WirelessTerminalGuiObject) { this.OriginalGui = GuiBridge.GUI_WIRELESS_TERM; diff --git a/src/main/java/appeng/client/gui/implementations/GuiCraftingCPU.java b/src/main/java/appeng/client/gui/implementations/GuiCraftingCPU.java index 0cf30218b..6b45ca179 100644 --- a/src/main/java/appeng/client/gui/implementations/GuiCraftingCPU.java +++ b/src/main/java/appeng/client/gui/implementations/GuiCraftingCPU.java @@ -95,6 +95,7 @@ public class GuiCraftingCPU extends AEBaseGui implements ISortSource { protected GuiCraftingCPU(final ContainerCraftingCPU container) { super(container); this.craftingCpu = container; + this.craftingCpu.setGui(this); this.ySize = GUI_HEIGHT; this.xSize = GUI_WIDTH; diff --git a/src/main/java/appeng/client/gui/implementations/GuiMEMonitorable.java b/src/main/java/appeng/client/gui/implementations/GuiMEMonitorable.java index b08aedb76..da75b2b73 100644 --- a/src/main/java/appeng/client/gui/implementations/GuiMEMonitorable.java +++ b/src/main/java/appeng/client/gui/implementations/GuiMEMonitorable.java @@ -31,7 +31,11 @@ import appeng.api.util.IConfigManager; import appeng.api.util.IConfigurableObject; import appeng.client.ActionKey; import appeng.client.gui.AEBaseMEGui; -import appeng.client.gui.widgets.*; +import appeng.client.gui.widgets.GuiImgButton; +import appeng.client.gui.widgets.GuiScrollbar; +import appeng.client.gui.widgets.GuiTabButton; +import appeng.client.gui.widgets.ISortSource; +import appeng.client.gui.widgets.MEGuiTextField; import appeng.client.me.InternalSlotME; import appeng.client.me.ItemRepo; import appeng.client.me.SlotME; diff --git a/src/main/java/appeng/client/gui/implementations/GuiNetworkStatus.java b/src/main/java/appeng/client/gui/implementations/GuiNetworkStatus.java index 301eabc6a..907a90dcd 100644 --- a/src/main/java/appeng/client/gui/implementations/GuiNetworkStatus.java +++ b/src/main/java/appeng/client/gui/implementations/GuiNetworkStatus.java @@ -51,6 +51,7 @@ public class GuiNetworkStatus extends AEBaseGui implements ISortSource { private final ItemRepo repo; private final int rows = 4; + private final ContainerNetworkStatus cns; private GuiImgButton units; private int tooltip = -1; @@ -65,6 +66,9 @@ public class GuiNetworkStatus extends AEBaseGui implements ISortSource { this.ySize = 153; this.xSize = 195; this.repo.setRowSize(5); + + this.cns = (ContainerNetworkStatus) this.inventorySlots; + this.cns.setGui(this); } @Override diff --git a/src/main/java/appeng/container/implementations/ContainerCraftConfirm.java b/src/main/java/appeng/container/implementations/ContainerCraftConfirm.java index 7a9c9501c..b4d2dc323 100644 --- a/src/main/java/appeng/container/implementations/ContainerCraftConfirm.java +++ b/src/main/java/appeng/container/implementations/ContainerCraftConfirm.java @@ -35,6 +35,7 @@ import appeng.api.storage.ITerminalHost; import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; +import appeng.client.gui.implementations.GuiCraftConfirm; import appeng.container.AEBaseContainer; import appeng.container.guisync.GuiSync; import appeng.core.AELog; @@ -61,6 +62,7 @@ import javax.annotation.Nonnull; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; +import java.util.List; import java.util.concurrent.Future; @@ -85,6 +87,7 @@ public class ContainerCraftConfirm extends AEBaseContainer { public boolean noCPU = true; @GuiSync(7) public String myName = ""; + private GuiCraftConfirm guiCraftConfirm; public ContainerCraftConfirm(final InventoryPlayer ip, final ITerminalHost te) { super(ip, te); @@ -403,4 +406,12 @@ public class ContainerCraftConfirm extends AEBaseContainer { public void setJob(final Future job) { this.job = job; } + + public void postUpdate(final List list, final byte ref) { + this.guiCraftConfirm.postUpdate(list, ref); + } + + public void setGui(GuiCraftConfirm guiCraftConfirm) { + this.guiCraftConfirm = guiCraftConfirm; + } } diff --git a/src/main/java/appeng/container/implementations/ContainerCraftingCPU.java b/src/main/java/appeng/container/implementations/ContainerCraftingCPU.java index 4954d7428..3358c9ece 100644 --- a/src/main/java/appeng/container/implementations/ContainerCraftingCPU.java +++ b/src/main/java/appeng/container/implementations/ContainerCraftingCPU.java @@ -30,6 +30,8 @@ import appeng.api.storage.IMEMonitorHandlerReceiver; import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; +import appeng.client.gui.implementations.GuiCraftConfirm; +import appeng.client.gui.implementations.GuiCraftingCPU; import appeng.container.AEBaseContainer; import appeng.container.guisync.GuiSync; import appeng.core.AELog; @@ -47,6 +49,7 @@ import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.IContainerListener; import java.io.IOException; +import java.util.List; public class ContainerCraftingCPU extends AEBaseContainer implements IMEMonitorHandlerReceiver, ICustomNameObject { @@ -58,6 +61,7 @@ public class ContainerCraftingCPU extends AEBaseContainer implements IMEMonitorH @GuiSync(0) public long eta = -1; + private GuiCraftingCPU guiCraftingCPU; public ContainerCraftingCPU(final InventoryPlayer ip, final Object te) { super(ip, te); @@ -232,4 +236,12 @@ public class ContainerCraftingCPU extends AEBaseContainer implements IMEMonitorH private void setNetwork(final IGrid network) { this.network = network; } + + public void postUpdate(final List list, final byte ref) { + this.guiCraftingCPU.postUpdate(list, ref); + } + + public void setGui(GuiCraftingCPU guiCraftingCPU) { + this.guiCraftingCPU = guiCraftingCPU; + } } diff --git a/src/main/java/appeng/container/implementations/ContainerCraftingTerm.java b/src/main/java/appeng/container/implementations/ContainerCraftingTerm.java index 82965ca3f..c87ad806b 100644 --- a/src/main/java/appeng/container/implementations/ContainerCraftingTerm.java +++ b/src/main/java/appeng/container/implementations/ContainerCraftingTerm.java @@ -24,6 +24,7 @@ import appeng.container.ContainerNull; import appeng.container.slot.SlotCraftingMatrix; import appeng.container.slot.SlotCraftingTerm; import appeng.helpers.IContainerCraftingPacket; +import appeng.parts.reporting.AbstractPartTerminal; import appeng.parts.reporting.PartCraftingTerminal; import appeng.tile.inventory.AppEngInternalInventory; import appeng.util.IConfigManagerHost; @@ -120,8 +121,4 @@ public class ContainerCraftingTerm extends ContainerMEMonitorable implements IAE public IRecipe getCurrentRecipe() { return this.currentRecipe; } - - public IConfigManagerHost getGui() { - return super.getGui(); - } } diff --git a/src/main/java/appeng/container/implementations/ContainerMEMonitorable.java b/src/main/java/appeng/container/implementations/ContainerMEMonitorable.java index e03142caa..7bf98bcb6 100644 --- a/src/main/java/appeng/container/implementations/ContainerMEMonitorable.java +++ b/src/main/java/appeng/container/implementations/ContainerMEMonitorable.java @@ -42,6 +42,7 @@ import appeng.api.storage.data.IItemList; import appeng.api.util.AEPartLocation; import appeng.api.util.IConfigManager; import appeng.api.util.IConfigurableObject; +import appeng.client.gui.implementations.GuiMEMonitorable; import appeng.container.AEBaseContainer; import appeng.container.guisync.GuiSync; import appeng.container.slot.SlotRestrictedInput; @@ -64,6 +65,7 @@ import net.minecraftforge.fml.common.Loader; import javax.annotation.Nonnull; import java.io.IOException; import java.nio.BufferOverflowException; +import java.util.List; public class ContainerMEMonitorable extends AEBaseContainer implements IConfigManagerHost, IConfigurableObject, IMEMonitorHandlerReceiver { @@ -357,11 +359,19 @@ public class ContainerMEMonitorable extends AEBaseContainer implements IConfigMa this.hasPower = isPowered; } - protected IConfigManagerHost getGui() { + public IConfigManagerHost getGui() { return this.gui; } public void setGui(@Nonnull final IConfigManagerHost gui) { this.gui = gui; } + + public IItemList getItems() { + return items; + } + + public void postUpdate(final List list) { + ((GuiMEMonitorable) this.gui).postUpdate(list); + } } diff --git a/src/main/java/appeng/container/implementations/ContainerNetworkStatus.java b/src/main/java/appeng/container/implementations/ContainerNetworkStatus.java index a30165032..eb54f5d10 100644 --- a/src/main/java/appeng/container/implementations/ContainerNetworkStatus.java +++ b/src/main/java/appeng/container/implementations/ContainerNetworkStatus.java @@ -30,6 +30,7 @@ import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; import appeng.api.util.AEPartLocation; +import appeng.client.gui.implementations.GuiNetworkStatus; import appeng.container.AEBaseContainer; import appeng.container.guisync.GuiSync; import appeng.core.sync.network.NetworkHandler; @@ -42,6 +43,7 @@ import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; import java.io.IOException; +import java.util.List; public class ContainerNetworkStatus extends AEBaseContainer { @@ -56,6 +58,7 @@ public class ContainerNetworkStatus extends AEBaseContainer { public long maxPower; private IGrid network; private int delay = 40; + private GuiNetworkStatus guiNetworkStatus; public ContainerNetworkStatus(final InventoryPlayer ip, final INetworkTool te) { super(ip, null, null); @@ -160,4 +163,12 @@ public class ContainerNetworkStatus extends AEBaseContainer { private void setPowerUsage(final long powerUsage) { this.powerUsage = powerUsage; } + + public void postUpdate(final List list) { + this.guiNetworkStatus.postUpdate(list); + } + + public void setGui(GuiNetworkStatus guiNetworkStatus) { + this.guiNetworkStatus = guiNetworkStatus; + } } diff --git a/src/main/java/appeng/core/sync/packets/PacketMEInventoryUpdate.java b/src/main/java/appeng/core/sync/packets/PacketMEInventoryUpdate.java index 0bb6f49f2..63503dccb 100644 --- a/src/main/java/appeng/core/sync/packets/PacketMEInventoryUpdate.java +++ b/src/main/java/appeng/core/sync/packets/PacketMEInventoryUpdate.java @@ -20,19 +20,18 @@ package appeng.core.sync.packets; import appeng.api.storage.data.IAEItemStack; -import appeng.client.gui.implementations.GuiCraftConfirm; -import appeng.client.gui.implementations.GuiCraftingCPU; -import appeng.client.gui.implementations.GuiMEMonitorable; -import appeng.client.gui.implementations.GuiNetworkStatus; +import appeng.container.implementations.ContainerCraftConfirm; +import appeng.container.implementations.ContainerCraftingCPU; +import appeng.container.implementations.ContainerMEMonitorable; +import appeng.container.implementations.ContainerNetworkStatus; import appeng.core.AELog; import appeng.core.sync.AppEngPacket; import appeng.core.sync.network.INetworkInfo; import appeng.util.item.AEItemStack; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; import net.minecraftforge.fml.common.network.internal.FMLProxyPacket; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -132,22 +131,22 @@ public class PacketMEInventoryUpdate extends AppEngPacket { @Override @SideOnly(Side.CLIENT) public void clientPacketData(final INetworkInfo network, final AppEngPacket packet, final EntityPlayer player) { - final GuiScreen gs = Minecraft.getMinecraft().currentScreen; + final Container c = player.openContainer; - if (gs instanceof GuiCraftConfirm) { - ((GuiCraftConfirm) gs).postUpdate(this.list, this.ref); + if (c instanceof ContainerCraftConfirm) { + ((ContainerCraftConfirm) c).postUpdate(this.list, this.ref); } - if (gs instanceof GuiCraftingCPU) { - ((GuiCraftingCPU) gs).postUpdate(this.list, this.ref); + if (c instanceof ContainerCraftingCPU) { + ((ContainerCraftingCPU) c).postUpdate(this.list, this.ref); } - if (gs instanceof GuiMEMonitorable) { - ((GuiMEMonitorable) gs).postUpdate(this.list); + if (c instanceof ContainerMEMonitorable) { + ((ContainerMEMonitorable) c).postUpdate(this.list); } - if (gs instanceof GuiNetworkStatus) { - ((GuiNetworkStatus) gs).postUpdate(this.list); + if (c instanceof ContainerNetworkStatus) { + ((ContainerNetworkStatus) c).postUpdate(this.list); } } diff --git a/src/main/java/appeng/integration/modules/jei/CraftableCallBack.java b/src/main/java/appeng/integration/modules/jei/CraftableCallBack.java index fbafa048f..3d14cb807 100644 --- a/src/main/java/appeng/integration/modules/jei/CraftableCallBack.java +++ b/src/main/java/appeng/integration/modules/jei/CraftableCallBack.java @@ -29,12 +29,15 @@ public class CraftableCallBack implements ITooltipCallback { if (list != null) { AEItemStack stack = AEItemStack.fromItemStack(ingredient); if (list.findPrecise(stack) != null) { + tooltip.add(I18n.translateToLocalFormatted("gui.appliedenergistics2.Missing")); tooltip.add(I18n.translateToLocalFormatted("gui.tooltips.appliedenergistics2.Craftable")); if (Mouse.isButtonDown(2)) { ((AEBaseContainer) container).setTargetStack(stack); final PacketInventoryAction p = new PacketInventoryAction(InventoryAction.AUTO_CRAFT, container.getInventory().size(), 0); NetworkHandler.instance().sendToServer(p); } + } else { + tooltip.add(I18n.translateToLocalFormatted("gui.appliedenergistics2.Missing")); } } } diff --git a/src/main/java/appeng/integration/modules/jei/JEIMissingItem.java b/src/main/java/appeng/integration/modules/jei/JEIMissingItem.java index e25ce52bb..346ac0958 100644 --- a/src/main/java/appeng/integration/modules/jei/JEIMissingItem.java +++ b/src/main/java/appeng/integration/modules/jei/JEIMissingItem.java @@ -4,14 +4,13 @@ import appeng.api.config.FuzzyMode; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; import appeng.client.gui.implementations.GuiCraftingTerm; -import appeng.client.gui.implementations.GuiPatternTerm; import appeng.container.implementations.ContainerCraftingTerm; -import appeng.container.implementations.ContainerPatternTerm; import appeng.util.Platform; import appeng.util.item.AEItemStack; import mezz.jei.api.gui.IGuiIngredient; import mezz.jei.api.gui.IRecipeLayout; import mezz.jei.api.recipe.transfer.IRecipeTransferError; +import mezz.jei.gui.recipes.RecipeLayout; import net.minecraft.client.Minecraft; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; @@ -49,7 +48,7 @@ public class JEIMissingItem implements IRecipeTransferError { if (fuzzy.size() > 0) { for (IAEItemStack itemStack : fuzzy) { if (itemStack.getStackSize() > 0) { - if (itemStack.isSameType(stack)) { + if (itemStack.fuzzyComparison(AEItemStack.fromItemStack(stack), FuzzyMode.IGNORE_ALL)) { found = true; break; } @@ -87,8 +86,8 @@ public class JEIMissingItem implements IRecipeTransferError { Container c = minecraft.player.openContainer; if (c instanceof ContainerCraftingTerm) { ContainerCraftingTerm craftingTerm = (ContainerCraftingTerm) c; - GuiCraftingTerm g = (GuiCraftingTerm) craftingTerm.getGui(); + GuiCraftingTerm g = (GuiCraftingTerm) craftingTerm.getGui(); IItemList ir = g.getRepo().getList(); boolean found; boolean craftable; @@ -145,6 +144,9 @@ public class JEIMissingItem implements IRecipeTransferError { } } } + if (!this.errored) { + ((RecipeLayout) recipeLayout).getRecipeTransferButton().init(Minecraft.getMinecraft().player.openContainer, Minecraft.getMinecraft().player); + } } } diff --git a/src/main/java/appeng/integration/modules/jei/RecipeTransferHandler.java b/src/main/java/appeng/integration/modules/jei/RecipeTransferHandler.java index f641da43c..637187417 100644 --- a/src/main/java/appeng/integration/modules/jei/RecipeTransferHandler.java +++ b/src/main/java/appeng/integration/modules/jei/RecipeTransferHandler.java @@ -41,6 +41,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.IOException; import java.util.ArrayList; @@ -63,7 +64,7 @@ class RecipeTransferHandler implements IRecipeTransferHandl @Nullable @Override - public IRecipeTransferError transferRecipe(T container, IRecipeLayout recipeLayout, EntityPlayer player, boolean maxTransfer, boolean doTransfer) { + public IRecipeTransferError transferRecipe(@Nonnull T container, IRecipeLayout recipeLayout, @Nonnull EntityPlayer player, boolean maxTransfer, boolean doTransfer) { final String recipeType = recipeLayout.getRecipeCategory().getUid(); if (recipeType.equals(VanillaRecipeCategoryUid.INFORMATION) || recipeType.equals(VanillaRecipeCategoryUid.FUEL)) {