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); + } + + } + }