From 8cafbceed757dd5a2f7a6b793fe427fb41992479 Mon Sep 17 00:00:00 2001 From: asdflj <854865755@qq.com> Date: Thu, 29 Sep 2022 19:50:22 +0800 Subject: [PATCH 1/3] add crafting preview screen support nei bookmark --- .../client/gui/GuiFluidCraftConfirm.java | 8 +++- .../github/coremod/FCClassTransformer.java | 15 +++++-- .../github/coremod/hooker/CoreModHooks.java | 24 ++++++++++ ...ContainerInterfaceTerminalTransformer.java | 3 +- .../transform/CraftingCpuTransformer.java | 3 +- .../CraftingTreeNodeTransformer.java | 3 +- .../DualityInterfaceTransformer.java | 3 +- .../transform/GuiCraftingTransformer.java | 3 +- .../coremod/transform/NEITransfermer.java | 45 +++++++++++++++++++ 9 files changed, 96 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/glodblock/github/coremod/transform/NEITransfermer.java diff --git a/src/main/java/com/glodblock/github/client/gui/GuiFluidCraftConfirm.java b/src/main/java/com/glodblock/github/client/gui/GuiFluidCraftConfirm.java index 465b915c..1b0632d9 100644 --- a/src/main/java/com/glodblock/github/client/gui/GuiFluidCraftConfirm.java +++ b/src/main/java/com/glodblock/github/client/gui/GuiFluidCraftConfirm.java @@ -48,6 +48,7 @@ public class GuiFluidCraftConfirm extends AEBaseGui { private GuiButton start; private GuiButton selectCPU; private int tooltip = -1; + private ItemStack hoveredStack; public GuiFluidCraftConfirm(final InventoryPlayer inventoryPlayer, final ITerminalHost te ) { @@ -202,7 +203,7 @@ public class GuiFluidCraftConfirm extends AEBaseGui { final List lineList = new LinkedList(); int toolPosX = 0; int toolPosY = 0; - + hoveredStack = null; final int offY = 23; for( int z = viewStart; z < Math.min( viewEnd, this.visual.size() ); z++ ) @@ -324,6 +325,7 @@ public class GuiFluidCraftConfirm extends AEBaseGui { toolPosX = x * ( 1 + sectionLength ) + xo + sectionLength - 8; toolPosY = y * offY + yo; + hoveredStack = is; } this.drawItem( posX, posY, is ); @@ -550,5 +552,7 @@ public class GuiFluidCraftConfirm extends AEBaseGui { lineList.add(GuiText.HoldShiftForTooltip.getLocal()); } } - + public ItemStack getHoveredStack() { + return hoveredStack; + } } diff --git a/src/main/java/com/glodblock/github/coremod/FCClassTransformer.java b/src/main/java/com/glodblock/github/coremod/FCClassTransformer.java index 413d8625..9ceb9c2c 100644 --- a/src/main/java/com/glodblock/github/coremod/FCClassTransformer.java +++ b/src/main/java/com/glodblock/github/coremod/FCClassTransformer.java @@ -5,6 +5,9 @@ import net.minecraft.launchwrapper.IClassTransformer; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.tree.ClassNode; +import static org.objectweb.asm.ClassWriter.COMPUTE_FRAMES; +import static org.objectweb.asm.ClassWriter.COMPUTE_MAXS; public class FCClassTransformer implements IClassTransformer { @@ -29,6 +32,9 @@ public class FCClassTransformer implements IClassTransformer { case "net.p455w0rd.wirelesscraftingterminal.client.gui.GuiCraftConfirm": tform = GuiCraftingTransformer.INSTANCE; break; + case "appeng.integration.modules.NEI": + tform = NEITransfermer.INSTANCE; + break; default: return code; } @@ -46,17 +52,18 @@ public class FCClassTransformer implements IClassTransformer { @Override public byte[] transformClass(byte[] code) { + ClassNode classNode = new ClassNode(); ClassReader reader = new ClassReader(code); + reader.accept(classNode, 0); ClassWriter writer = new ClassWriter(reader, getWriteFlags()); - reader.accept(getClassMapper(writer), 0); + classNode.accept(getClassMapper(writer,classNode)); return writer.toByteArray(); } protected int getWriteFlags() { - return 0; + return COMPUTE_FRAMES|COMPUTE_MAXS; } - protected abstract ClassVisitor getClassMapper(ClassVisitor downstream); - + protected abstract ClassVisitor getClassMapper(ClassVisitor downstream, ClassNode classNode); } } diff --git a/src/main/java/com/glodblock/github/coremod/hooker/CoreModHooks.java b/src/main/java/com/glodblock/github/coremod/hooker/CoreModHooks.java index 380f8bb2..df89cc46 100644 --- a/src/main/java/com/glodblock/github/coremod/hooker/CoreModHooks.java +++ b/src/main/java/com/glodblock/github/coremod/hooker/CoreModHooks.java @@ -9,12 +9,15 @@ import appeng.api.networking.storage.IStorageGrid; import appeng.api.storage.IMEInventory; import appeng.api.storage.data.IAEFluidStack; import appeng.api.storage.data.IAEItemStack; +import appeng.client.gui.implementations.GuiCraftConfirm; +import appeng.client.gui.implementations.GuiCraftingCPU; import appeng.crafting.MECraftingInventory; import appeng.me.MachineSet; import appeng.me.cluster.implementations.CraftingCPUCluster; import appeng.parts.misc.PartInterface; import appeng.tile.misc.TileInterface; import appeng.util.InventoryAdaptor; +import com.glodblock.github.client.gui.GuiFluidCraftConfirm; import com.glodblock.github.common.item.ItemFluidDrop; import com.glodblock.github.common.item.ItemFluidPacket; import com.glodblock.github.common.parts.PartFluidInterface; @@ -26,6 +29,7 @@ import com.glodblock.github.util.Ae2Reflect; import com.glodblock.github.util.SetBackedMachineSet; import com.glodblock.github.util.Util; import com.google.common.collect.Sets; +import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -169,4 +173,24 @@ public class CoreModHooks { Ae2Reflect.markCPUDirty(instance); } + public static ItemStack getStackUnderMouse(GuiContainer gui, int mousex, int mousey) { + if (gui instanceof GuiCraftConfirm){ + return ((GuiCraftConfirm)gui).getHoveredStack(); + } else if (gui instanceof GuiFluidCraftConfirm) { + return ((GuiFluidCraftConfirm)gui).getHoveredStack(); + } else if (gui instanceof GuiCraftingCPU){ + return ((GuiCraftingCPU)gui).getHoveredStack(); + } + return null; + } + public static boolean shouldShowTooltip(GuiContainer gui) { + if (gui instanceof GuiFluidCraftConfirm) + return ((GuiFluidCraftConfirm)gui).getHoveredStack() == null; + if (gui instanceof GuiCraftConfirm) + return ((GuiCraftConfirm)gui).getHoveredStack() == null; + if (gui instanceof GuiCraftingCPU) + return ((GuiCraftingCPU)gui).getHoveredStack() == null; + return true; + } + } diff --git a/src/main/java/com/glodblock/github/coremod/transform/ContainerInterfaceTerminalTransformer.java b/src/main/java/com/glodblock/github/coremod/transform/ContainerInterfaceTerminalTransformer.java index a2cfd941..6ba6891e 100644 --- a/src/main/java/com/glodblock/github/coremod/transform/ContainerInterfaceTerminalTransformer.java +++ b/src/main/java/com/glodblock/github/coremod/transform/ContainerInterfaceTerminalTransformer.java @@ -4,6 +4,7 @@ import com.glodblock.github.coremod.FCClassTransformer; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.ClassNode; public class ContainerInterfaceTerminalTransformer extends FCClassTransformer.ClassMapper { @@ -14,7 +15,7 @@ public class ContainerInterfaceTerminalTransformer extends FCClassTransformer.Cl } @Override - protected ClassVisitor getClassMapper(ClassVisitor downstream) { + protected ClassVisitor getClassMapper(ClassVisitor downstream, ClassNode classNode) { return new TransformContainerInterfaceTerminal(Opcodes.ASM5, downstream); } diff --git a/src/main/java/com/glodblock/github/coremod/transform/CraftingCpuTransformer.java b/src/main/java/com/glodblock/github/coremod/transform/CraftingCpuTransformer.java index 21c8c25b..706ef57b 100644 --- a/src/main/java/com/glodblock/github/coremod/transform/CraftingCpuTransformer.java +++ b/src/main/java/com/glodblock/github/coremod/transform/CraftingCpuTransformer.java @@ -5,6 +5,7 @@ import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.ClassNode; public class CraftingCpuTransformer extends FCClassTransformer.ClassMapper { @@ -15,7 +16,7 @@ public class CraftingCpuTransformer extends FCClassTransformer.ClassMapper { } @Override - protected ClassVisitor getClassMapper(ClassVisitor downstream) { + protected ClassVisitor getClassMapper(ClassVisitor downstream, ClassNode classNode) { return new TransformCraftingCPUCluster(Opcodes.ASM5, downstream); } diff --git a/src/main/java/com/glodblock/github/coremod/transform/CraftingTreeNodeTransformer.java b/src/main/java/com/glodblock/github/coremod/transform/CraftingTreeNodeTransformer.java index 901423af..7a0e9ab4 100644 --- a/src/main/java/com/glodblock/github/coremod/transform/CraftingTreeNodeTransformer.java +++ b/src/main/java/com/glodblock/github/coremod/transform/CraftingTreeNodeTransformer.java @@ -5,6 +5,7 @@ import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.ClassNode; public class CraftingTreeNodeTransformer extends FCClassTransformer.ClassMapper { @@ -15,7 +16,7 @@ public class CraftingTreeNodeTransformer extends FCClassTransformer.ClassMapper } @Override - protected ClassVisitor getClassMapper(ClassVisitor downstream) { + protected ClassVisitor getClassMapper(ClassVisitor downstream, ClassNode classNode) { return new TransformCraftingTreeNode(Opcodes.ASM5, downstream); } diff --git a/src/main/java/com/glodblock/github/coremod/transform/DualityInterfaceTransformer.java b/src/main/java/com/glodblock/github/coremod/transform/DualityInterfaceTransformer.java index 00cf5131..c4e4cb91 100644 --- a/src/main/java/com/glodblock/github/coremod/transform/DualityInterfaceTransformer.java +++ b/src/main/java/com/glodblock/github/coremod/transform/DualityInterfaceTransformer.java @@ -4,6 +4,7 @@ import com.glodblock.github.coremod.FCClassTransformer; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.ClassNode; public class DualityInterfaceTransformer extends FCClassTransformer.ClassMapper { @@ -14,7 +15,7 @@ public class DualityInterfaceTransformer extends FCClassTransformer.ClassMapper } @Override - protected ClassVisitor getClassMapper(ClassVisitor downstream) { + protected ClassVisitor getClassMapper(ClassVisitor downstream, ClassNode classNode) { return new TransformDualityInterface(Opcodes.ASM5, downstream); } diff --git a/src/main/java/com/glodblock/github/coremod/transform/GuiCraftingTransformer.java b/src/main/java/com/glodblock/github/coremod/transform/GuiCraftingTransformer.java index 5fb3344d..9ec22c49 100644 --- a/src/main/java/com/glodblock/github/coremod/transform/GuiCraftingTransformer.java +++ b/src/main/java/com/glodblock/github/coremod/transform/GuiCraftingTransformer.java @@ -4,6 +4,7 @@ import com.glodblock.github.coremod.FCClassTransformer; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.ClassNode; public class GuiCraftingTransformer extends FCClassTransformer.ClassMapper { @@ -14,7 +15,7 @@ public class GuiCraftingTransformer extends FCClassTransformer.ClassMapper { } @Override - protected ClassVisitor getClassMapper(ClassVisitor downstream) { + protected ClassVisitor getClassMapper(ClassVisitor downstream, ClassNode classNode) { return new TransformGuiCrafting(Opcodes.ASM5, downstream); } diff --git a/src/main/java/com/glodblock/github/coremod/transform/NEITransfermer.java b/src/main/java/com/glodblock/github/coremod/transform/NEITransfermer.java new file mode 100644 index 00000000..fabbe3c7 --- /dev/null +++ b/src/main/java/com/glodblock/github/coremod/transform/NEITransfermer.java @@ -0,0 +1,45 @@ +package com.glodblock.github.coremod.transform; +import com.glodblock.github.coremod.FCClassTransformer; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.*; +import static org.objectweb.asm.Opcodes.*; + +public class NEITransfermer extends FCClassTransformer.ClassMapper{ + + public static final NEITransfermer INSTANCE = new NEITransfermer(); + + private NEITransfermer(){} + + @Override + protected ClassVisitor getClassMapper(ClassVisitor downstream, ClassNode classNode) { + for (MethodNode method : classNode.methods){ + if(method.name.equals("getStackUnderMouse")){ + InsnList toInsert = new InsnList(); + toInsert.add(new VarInsnNode(ALOAD, 1)); + toInsert.add(new VarInsnNode(ILOAD, 2)); + toInsert.add(new VarInsnNode(ILOAD, 3)); + toInsert.add(new MethodInsnNode(INVOKESTATIC, "com/glodblock/github/coremod/hooker/CoreModHooks", "getStackUnderMouse", "(Lnet/minecraft/client/gui/inventory/GuiContainer;II)Lnet/minecraft/item/ItemStack;", false)); + toInsert.add(new InsnNode(ARETURN)); + method.instructions = toInsert; + }else if(method.name.equals("shouldShowTooltip")){ + InsnList toInsert = new InsnList(); + toInsert.add(new VarInsnNode(ALOAD, 1)); + toInsert.add(new MethodInsnNode(INVOKESTATIC, "com/glodblock/github/coremod/hooker/CoreModHooks", "shouldShowTooltip", "(Lnet/minecraft/client/gui/inventory/GuiContainer;)Z", false)); + toInsert.add(new InsnNode(IRETURN)); + method.instructions = toInsert; + } + } + return new NEITransfermer.TransformNEI(Opcodes.ASM5, downstream); + } + private static class TransformNEI extends ClassVisitor { + TransformNEI(int api, ClassVisitor cv) { + super(api, cv); + } + @Override + public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { + return super.visitMethod(access, name, desc, signature, exceptions); + } + } +} From 989cd173fbe4ef978862a1c10ff772cf43c33e50 Mon Sep 17 00:00:00 2001 From: GlodBlock <1356392126@qq.com> Date: Thu, 29 Sep 2022 21:42:27 +0800 Subject: [PATCH 2/3] more sanity asm --- .../client/gui/GuiFluidCraftConfirm.java | 1 + .../github/coremod/FCClassTransformer.java | 12 +-- .../github/coremod/hooker/CoreModHooks.java | 16 +--- ...ContainerInterfaceTerminalTransformer.java | 3 +- .../transform/CraftingCpuTransformer.java | 3 +- .../CraftingTreeNodeTransformer.java | 3 +- .../DualityInterfaceTransformer.java | 3 +- .../transform/GuiCraftingTransformer.java | 3 +- .../coremod/transform/NEITransfermer.java | 96 ++++++++++++++----- 9 files changed, 87 insertions(+), 53 deletions(-) diff --git a/src/main/java/com/glodblock/github/client/gui/GuiFluidCraftConfirm.java b/src/main/java/com/glodblock/github/client/gui/GuiFluidCraftConfirm.java index 1b0632d9..d32c3757 100644 --- a/src/main/java/com/glodblock/github/client/gui/GuiFluidCraftConfirm.java +++ b/src/main/java/com/glodblock/github/client/gui/GuiFluidCraftConfirm.java @@ -552,6 +552,7 @@ public class GuiFluidCraftConfirm extends AEBaseGui { lineList.add(GuiText.HoldShiftForTooltip.getLocal()); } } + public ItemStack getHoveredStack() { return hoveredStack; } diff --git a/src/main/java/com/glodblock/github/coremod/FCClassTransformer.java b/src/main/java/com/glodblock/github/coremod/FCClassTransformer.java index 9ceb9c2c..80c52cae 100644 --- a/src/main/java/com/glodblock/github/coremod/FCClassTransformer.java +++ b/src/main/java/com/glodblock/github/coremod/FCClassTransformer.java @@ -5,9 +5,6 @@ import net.minecraft.launchwrapper.IClassTransformer; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.tree.ClassNode; -import static org.objectweb.asm.ClassWriter.COMPUTE_FRAMES; -import static org.objectweb.asm.ClassWriter.COMPUTE_MAXS; public class FCClassTransformer implements IClassTransformer { @@ -52,18 +49,17 @@ public class FCClassTransformer implements IClassTransformer { @Override public byte[] transformClass(byte[] code) { - ClassNode classNode = new ClassNode(); ClassReader reader = new ClassReader(code); - reader.accept(classNode, 0); ClassWriter writer = new ClassWriter(reader, getWriteFlags()); - classNode.accept(getClassMapper(writer,classNode)); + reader.accept(getClassMapper(writer), 0); return writer.toByteArray(); } protected int getWriteFlags() { - return COMPUTE_FRAMES|COMPUTE_MAXS; + return 0; } - protected abstract ClassVisitor getClassMapper(ClassVisitor downstream, ClassNode classNode); + protected abstract ClassVisitor getClassMapper(ClassVisitor downstream); + } } diff --git a/src/main/java/com/glodblock/github/coremod/hooker/CoreModHooks.java b/src/main/java/com/glodblock/github/coremod/hooker/CoreModHooks.java index df89cc46..4edbd4b9 100644 --- a/src/main/java/com/glodblock/github/coremod/hooker/CoreModHooks.java +++ b/src/main/java/com/glodblock/github/coremod/hooker/CoreModHooks.java @@ -174,22 +174,16 @@ public class CoreModHooks { } public static ItemStack getStackUnderMouse(GuiContainer gui, int mousex, int mousey) { - if (gui instanceof GuiCraftConfirm){ - return ((GuiCraftConfirm)gui).getHoveredStack(); - } else if (gui instanceof GuiFluidCraftConfirm) { - return ((GuiFluidCraftConfirm)gui).getHoveredStack(); - } else if (gui instanceof GuiCraftingCPU){ - return ((GuiCraftingCPU)gui).getHoveredStack(); + if (gui instanceof GuiFluidCraftConfirm) { + return ((GuiFluidCraftConfirm) gui).getHoveredStack(); } return null; } + public static boolean shouldShowTooltip(GuiContainer gui) { - if (gui instanceof GuiFluidCraftConfirm) + if (gui instanceof GuiFluidCraftConfirm) { return ((GuiFluidCraftConfirm)gui).getHoveredStack() == null; - if (gui instanceof GuiCraftConfirm) - return ((GuiCraftConfirm)gui).getHoveredStack() == null; - if (gui instanceof GuiCraftingCPU) - return ((GuiCraftingCPU)gui).getHoveredStack() == null; + } return true; } diff --git a/src/main/java/com/glodblock/github/coremod/transform/ContainerInterfaceTerminalTransformer.java b/src/main/java/com/glodblock/github/coremod/transform/ContainerInterfaceTerminalTransformer.java index 6ba6891e..a2cfd941 100644 --- a/src/main/java/com/glodblock/github/coremod/transform/ContainerInterfaceTerminalTransformer.java +++ b/src/main/java/com/glodblock/github/coremod/transform/ContainerInterfaceTerminalTransformer.java @@ -4,7 +4,6 @@ import com.glodblock.github.coremod.FCClassTransformer; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; -import org.objectweb.asm.tree.ClassNode; public class ContainerInterfaceTerminalTransformer extends FCClassTransformer.ClassMapper { @@ -15,7 +14,7 @@ public class ContainerInterfaceTerminalTransformer extends FCClassTransformer.Cl } @Override - protected ClassVisitor getClassMapper(ClassVisitor downstream, ClassNode classNode) { + protected ClassVisitor getClassMapper(ClassVisitor downstream) { return new TransformContainerInterfaceTerminal(Opcodes.ASM5, downstream); } diff --git a/src/main/java/com/glodblock/github/coremod/transform/CraftingCpuTransformer.java b/src/main/java/com/glodblock/github/coremod/transform/CraftingCpuTransformer.java index 706ef57b..21c8c25b 100644 --- a/src/main/java/com/glodblock/github/coremod/transform/CraftingCpuTransformer.java +++ b/src/main/java/com/glodblock/github/coremod/transform/CraftingCpuTransformer.java @@ -5,7 +5,6 @@ import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; -import org.objectweb.asm.tree.ClassNode; public class CraftingCpuTransformer extends FCClassTransformer.ClassMapper { @@ -16,7 +15,7 @@ public class CraftingCpuTransformer extends FCClassTransformer.ClassMapper { } @Override - protected ClassVisitor getClassMapper(ClassVisitor downstream, ClassNode classNode) { + protected ClassVisitor getClassMapper(ClassVisitor downstream) { return new TransformCraftingCPUCluster(Opcodes.ASM5, downstream); } diff --git a/src/main/java/com/glodblock/github/coremod/transform/CraftingTreeNodeTransformer.java b/src/main/java/com/glodblock/github/coremod/transform/CraftingTreeNodeTransformer.java index 7a0e9ab4..901423af 100644 --- a/src/main/java/com/glodblock/github/coremod/transform/CraftingTreeNodeTransformer.java +++ b/src/main/java/com/glodblock/github/coremod/transform/CraftingTreeNodeTransformer.java @@ -5,7 +5,6 @@ import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; -import org.objectweb.asm.tree.ClassNode; public class CraftingTreeNodeTransformer extends FCClassTransformer.ClassMapper { @@ -16,7 +15,7 @@ public class CraftingTreeNodeTransformer extends FCClassTransformer.ClassMapper } @Override - protected ClassVisitor getClassMapper(ClassVisitor downstream, ClassNode classNode) { + protected ClassVisitor getClassMapper(ClassVisitor downstream) { return new TransformCraftingTreeNode(Opcodes.ASM5, downstream); } diff --git a/src/main/java/com/glodblock/github/coremod/transform/DualityInterfaceTransformer.java b/src/main/java/com/glodblock/github/coremod/transform/DualityInterfaceTransformer.java index c4e4cb91..00cf5131 100644 --- a/src/main/java/com/glodblock/github/coremod/transform/DualityInterfaceTransformer.java +++ b/src/main/java/com/glodblock/github/coremod/transform/DualityInterfaceTransformer.java @@ -4,7 +4,6 @@ import com.glodblock.github.coremod.FCClassTransformer; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; -import org.objectweb.asm.tree.ClassNode; public class DualityInterfaceTransformer extends FCClassTransformer.ClassMapper { @@ -15,7 +14,7 @@ public class DualityInterfaceTransformer extends FCClassTransformer.ClassMapper } @Override - protected ClassVisitor getClassMapper(ClassVisitor downstream, ClassNode classNode) { + protected ClassVisitor getClassMapper(ClassVisitor downstream) { return new TransformDualityInterface(Opcodes.ASM5, downstream); } diff --git a/src/main/java/com/glodblock/github/coremod/transform/GuiCraftingTransformer.java b/src/main/java/com/glodblock/github/coremod/transform/GuiCraftingTransformer.java index 9ec22c49..5fb3344d 100644 --- a/src/main/java/com/glodblock/github/coremod/transform/GuiCraftingTransformer.java +++ b/src/main/java/com/glodblock/github/coremod/transform/GuiCraftingTransformer.java @@ -4,7 +4,6 @@ import com.glodblock.github.coremod.FCClassTransformer; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; -import org.objectweb.asm.tree.ClassNode; public class GuiCraftingTransformer extends FCClassTransformer.ClassMapper { @@ -15,7 +14,7 @@ public class GuiCraftingTransformer extends FCClassTransformer.ClassMapper { } @Override - protected ClassVisitor getClassMapper(ClassVisitor downstream, ClassNode classNode) { + protected ClassVisitor getClassMapper(ClassVisitor downstream) { return new TransformGuiCrafting(Opcodes.ASM5, downstream); } diff --git a/src/main/java/com/glodblock/github/coremod/transform/NEITransfermer.java b/src/main/java/com/glodblock/github/coremod/transform/NEITransfermer.java index fabbe3c7..95c28705 100644 --- a/src/main/java/com/glodblock/github/coremod/transform/NEITransfermer.java +++ b/src/main/java/com/glodblock/github/coremod/transform/NEITransfermer.java @@ -1,45 +1,93 @@ package com.glodblock.github.coremod.transform; + import com.glodblock.github.coremod.FCClassTransformer; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; -import org.objectweb.asm.tree.*; -import static org.objectweb.asm.Opcodes.*; -public class NEITransfermer extends FCClassTransformer.ClassMapper{ +public class NEITransfermer extends FCClassTransformer.ClassMapper { public static final NEITransfermer INSTANCE = new NEITransfermer(); - private NEITransfermer(){} + private NEITransfermer() { + // NO-OP + } @Override - protected ClassVisitor getClassMapper(ClassVisitor downstream, ClassNode classNode) { - for (MethodNode method : classNode.methods){ - if(method.name.equals("getStackUnderMouse")){ - InsnList toInsert = new InsnList(); - toInsert.add(new VarInsnNode(ALOAD, 1)); - toInsert.add(new VarInsnNode(ILOAD, 2)); - toInsert.add(new VarInsnNode(ILOAD, 3)); - toInsert.add(new MethodInsnNode(INVOKESTATIC, "com/glodblock/github/coremod/hooker/CoreModHooks", "getStackUnderMouse", "(Lnet/minecraft/client/gui/inventory/GuiContainer;II)Lnet/minecraft/item/ItemStack;", false)); - toInsert.add(new InsnNode(ARETURN)); - method.instructions = toInsert; - }else if(method.name.equals("shouldShowTooltip")){ - InsnList toInsert = new InsnList(); - toInsert.add(new VarInsnNode(ALOAD, 1)); - toInsert.add(new MethodInsnNode(INVOKESTATIC, "com/glodblock/github/coremod/hooker/CoreModHooks", "shouldShowTooltip", "(Lnet/minecraft/client/gui/inventory/GuiContainer;)Z", false)); - toInsert.add(new InsnNode(IRETURN)); - method.instructions = toInsert; - } - } - return new NEITransfermer.TransformNEI(Opcodes.ASM5, downstream); + protected ClassVisitor getClassMapper(ClassVisitor downstream) { + return new TransformNEI(Opcodes.ASM5, downstream); } + private static class TransformNEI extends ClassVisitor { + TransformNEI(int api, ClassVisitor cv) { super(api, cv); } + @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { - return super.visitMethod(access, name, desc, signature, exceptions); + switch (name) { + case "getStackUnderMouse": + return new TransformStackUnderMouse(api, super.visitMethod(access, name, desc, signature, exceptions)); + case "shouldShowTooltip": + return new TransformShowTooltip(api, super.visitMethod(access, name, desc, signature, exceptions)); + default: + return super.visitMethod(access, name, desc, signature, exceptions); + } } } + + private static class TransformStackUnderMouse extends MethodVisitor { + + TransformStackUnderMouse(int api, MethodVisitor mv) { + super(api, mv); + } + + @Override + public void visitInsn(int opcode) { + if (opcode == Opcodes.ACONST_NULL) { + super.visitVarInsn(Opcodes.ALOAD, 1); + super.visitVarInsn(Opcodes.ILOAD, 2); + super.visitVarInsn(Opcodes.ILOAD, 3); + super.visitMethodInsn(Opcodes.INVOKESTATIC, + "com/glodblock/github/coremod/hooker/CoreModHooks", + "getStackUnderMouse", + "(Lnet/minecraft/client/gui/inventory/GuiContainer;II)Lnet/minecraft/item/ItemStack;", + false + ); + return; + } + super.visitInsn(opcode); + } + } + + private static class TransformShowTooltip extends MethodVisitor { + + int const_1 = 0; + + TransformShowTooltip(int api, MethodVisitor mv) { + super(api, mv); + } + + @Override + public void visitInsn(int opcode) { + if (opcode == Opcodes.ICONST_1 && const_1 == 2) { + super.visitVarInsn(Opcodes.ALOAD, 1); + super.visitMethodInsn(Opcodes.INVOKESTATIC, + "com/glodblock/github/coremod/hooker/CoreModHooks", + "shouldShowTooltip", + "(Lnet/minecraft/client/gui/inventory/GuiContainer;)Z", + false + ); + const_1 ++; + return; + } + if (opcode == Opcodes.ICONST_1) { + const_1 ++; + } + super.visitInsn(opcode); + } + + } + } From 61ac42d2700a1d1104e5740a0fe2cd6d634694dd Mon Sep 17 00:00:00 2001 From: asdflj <854865755@qq.com> Date: Fri, 30 Sep 2022 14:39:24 +0800 Subject: [PATCH 3/3] fix MouseRegionManager can't display tooltip. when ingredient buffer outputting fluid, the current slot is used continuously,not from first slot to start output. --- .../com/glodblock/github/inventory/AEFluidInventory.java | 5 ++++- .../glodblock/github/inventory/gui/MouseRegionManager.java | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/glodblock/github/inventory/AEFluidInventory.java b/src/main/java/com/glodblock/github/inventory/AEFluidInventory.java index 7365fba2..2e17578c 100644 --- a/src/main/java/com/glodblock/github/inventory/AEFluidInventory.java +++ b/src/main/java/com/glodblock/github/inventory/AEFluidInventory.java @@ -17,6 +17,7 @@ public class AEFluidInventory implements IAEFluidTank private final IAEFluidStack[] fluids; private final IAEFluidInventory handler; private final int capacity; + public int lastIndex; public AEFluidInventory( final IAEFluidInventory handler, final int slots, final int capcity ) { @@ -253,9 +254,10 @@ public class AEFluidInventory implements IAEFluidTank FluidStack totalDrained = null; int toDrain = maxDrain; - for( int slot = 0; slot < this.getSlots(); ++slot ) + for( int slot = lastIndex; slot < this.getSlots(); ++slot ) { if (this.getFluidInSlot(slot) == null) { + if(slot == this.getSlots()-1) lastIndex = 0; continue; } @@ -264,6 +266,7 @@ public class AEFluidInventory implements IAEFluidTank totalDrained = this.drain( slot, toDrain, doDrain ); if( totalDrained != null ) { + lastIndex = slot; toDrain -= totalDrained.amount; } } diff --git a/src/main/java/com/glodblock/github/inventory/gui/MouseRegionManager.java b/src/main/java/com/glodblock/github/inventory/gui/MouseRegionManager.java index 15cd3c3b..a4609837 100644 --- a/src/main/java/com/glodblock/github/inventory/gui/MouseRegionManager.java +++ b/src/main/java/com/glodblock/github/inventory/gui/MouseRegionManager.java @@ -1,5 +1,6 @@ package com.glodblock.github.inventory.gui; +import appeng.client.gui.AEBaseGui; import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.util.ResourceLocation; @@ -39,6 +40,7 @@ public class MouseRegionManager { if (region.containsMouse(mX, mY)) { List tooltip = region.handler.getTooltip(); if (tooltip != null) { + ((AEBaseGui)gui).drawTooltip(mX,mY,0,String.join("\n",tooltip)); return; } }