add tooltip callback. Paint craftables in blue. middle click to craft

from JEI
This commit is contained in:
PrototypeTrousers
2022-10-18 05:20:55 -03:00
parent daf4910548
commit 9b263c5501
9 changed files with 201 additions and 9 deletions
@@ -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<ItemStack> {
private final IItemList<IAEItemStack> list;
private final Container container;
public CraftableCallBack(Container container, IItemList<IAEItemStack> ir) {
this.list = ir;
this.container = container;
}
@Override
public void onTooltip(int slotIndex, boolean input, ItemStack ingredient, List<String> 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);
}
}
}
}
}
@@ -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<IAEItemStack> 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<IAEItemStack> 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<IAEItemStack> 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<IAEItemStack> 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;
}
}
@@ -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<T extends Container> 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;
}