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/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..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; @@ -73,7 +77,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/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/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/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 b55bbbba3..c87ad806b 100644 --- a/src/main/java/appeng/container/implementations/ContainerCraftingTerm.java +++ b/src/main/java/appeng/container/implementations/ContainerCraftingTerm.java @@ -24,8 +24,10 @@ 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; import appeng.util.inv.IAEAppEngInventory; import appeng.util.inv.InvOperation; import appeng.util.inv.WrapperInvItemHandler; diff --git a/src/main/java/appeng/container/implementations/ContainerMEMonitorable.java b/src/main/java/appeng/container/implementations/ContainerMEMonitorable.java index 928ee7f74..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,13 +65,14 @@ 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 { 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,11 +359,19 @@ public class ContainerMEMonitorable extends AEBaseContainer implements IConfigMa this.hasPower = isPowered; } - private 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/container/implementations/ContainerPatternTerm.java b/src/main/java/appeng/container/implementations/ContainerPatternTerm.java index 3c7429b01..ba597944d 100644 --- a/src/main/java/appeng/container/implementations/ContainerPatternTerm.java +++ b/src/main/java/appeng/container/implementations/ContainerPatternTerm.java @@ -27,10 +27,15 @@ import appeng.api.storage.channels.IItemStorageChannel; 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.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.items.storage.ItemViewCell; @@ -43,8 +48,10 @@ 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.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; 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 new file mode 100644 index 000000000..3d14cb807 --- /dev/null +++ b/src/main/java/appeng/integration/modules/jei/CraftableCallBack.java @@ -0,0 +1,44 @@ +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.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 new file mode 100644 index 000000000..346ac0958 --- /dev/null +++ b/src/main/java/appeng/integration/modules/jei/JEIMissingItem.java @@ -0,0 +1,156 @@ +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.container.implementations.ContainerCraftingTerm; +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; + +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.fuzzyComparison(AEItemStack.fromItemStack(stack), FuzzyMode.IGNORE_ALL)) { + 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() { + 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 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()) { + 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; + } + } + } + } + if (!this.errored) { + ((RecipeLayout) recipeLayout).getRecipeTransferButton().init(Minecraft.getMinecraft().player.openContainer, Minecraft.getMinecraft().player); + } + } + } + + 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 c3af96d49..637187417 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; @@ -40,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; @@ -62,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)) { @@ -70,6 +72,11 @@ class RecipeTransferHandler implements IRecipeTransferHandl } if (!doTransfer) { + if (container instanceof ContainerCraftingTerm && recipeType.equals(VanillaRecipeCategoryUid.CRAFTING)) { + JEIMissingItem error = new JEIMissingItem(container, recipeLayout); + if (error.errored()) + return error; + } return null; }