From 9b263c55016bf8706134fd7d67ae48fbca42f2b0 Mon Sep 17 00:00:00 2001 From: PrototypeTrousers Date: Tue, 18 Oct 2022 05:20:55 -0300 Subject: [PATCH] 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; }