From 2ffdef91bbb16a4bff43c19e172b4d30452455f3 Mon Sep 17 00:00:00 2001 From: asdflj <854865755@qq.com> Date: Thu, 29 Sep 2022 15:27:06 +0800 Subject: [PATCH] update --- .../github/coremod/FCClassTransformer.java | 13 ++-- .../github/coremod/hooker/CoreModHooks.java | 7 ++ ...ContainerInterfaceTerminalTransformer.java | 3 +- .../transform/CraftingCpuTransformer.java | 3 +- .../CraftingTreeNodeTransformer.java | 3 +- .../DualityInterfaceTransformer.java | 3 +- .../transform/GuiCraftingTransformer.java | 3 +- .../coremod/transform/NEITransfermer.java | 72 ++++++++++--------- 8 files changed, 66 insertions(+), 41 deletions(-) diff --git a/src/main/java/com/glodblock/github/coremod/FCClassTransformer.java b/src/main/java/com/glodblock/github/coremod/FCClassTransformer.java index 80c52cae..9068d8fc 100644 --- a/src/main/java/com/glodblock/github/coremod/FCClassTransformer.java +++ b/src/main/java/com/glodblock/github/coremod/FCClassTransformer.java @@ -5,6 +5,10 @@ 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 { @@ -49,17 +53,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 31257a40..84e7f6c0 100644 --- a/src/main/java/com/glodblock/github/coremod/hooker/CoreModHooks.java +++ b/src/main/java/com/glodblock/github/coremod/hooker/CoreModHooks.java @@ -172,5 +172,12 @@ public class CoreModHooks { } return null; } + public boolean shouldShowTooltip(GuiContainer gui) { + 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 2c3c8a74..0f04ea25 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 index d70274ff..b1bf66be 100644 --- a/src/main/java/com/glodblock/github/coremod/transform/NEITransfermer.java +++ b/src/main/java/com/glodblock/github/coremod/transform/NEITransfermer.java @@ -2,11 +2,12 @@ package com.glodblock.github.coremod.transform; import com.glodblock.github.coremod.FCClassTransformer; 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.*; -import static org.objectweb.asm.Opcodes.ACC_SUPER; - +import static org.objectweb.asm.Opcodes.*; public class NEITransfermer extends FCClassTransformer.ClassMapper{ @@ -15,45 +16,52 @@ public class NEITransfermer extends FCClassTransformer.ClassMapper{ private NEITransfermer(){} @Override - protected ClassVisitor getClassMapper(ClassVisitor downstream) { + protected ClassVisitor getClassMapper(ClassVisitor downstream, ClassNode classNode) { + for (MethodNode method : classNode.methods){ + if(method.name.equals("getStackUnderMouse") || method.name.equals("shouldShowTooltip")){ + AbstractInsnNode targetNode = null; + for (AbstractInsnNode instruction : method.instructions.toArray()) + { + if (instruction.getOpcode() == ALOAD) + { + targetNode = instruction; + break; + } + } + InsnList toInsert = new InsnList(); + toInsert.add(new VarInsnNode(ALOAD, 1)); + toInsert.add(new TypeInsnNode(INSTANCEOF, "com/glodblock/github/client/gui/GuiFluidCraftConfirm")); + LabelNode label0 = new LabelNode(); + toInsert.add(new JumpInsnNode(IFEQ, label0)); + toInsert.add(new VarInsnNode(ALOAD, 1)); + toInsert.add(new TypeInsnNode(CHECKCAST, "com/glodblock/github/client/gui/GuiFluidCraftConfirm")); + toInsert.add(new MethodInsnNode(INVOKEVIRTUAL, "com/glodblock/github/client/gui/GuiFluidCraftConfirm", "getHoveredStack", "()Lnet/minecraft/item/ItemStack;", false)); + if(method.name.equals("getStackUnderMouse")){ + toInsert.add(new InsnNode(ARETURN)); + }else{ + LabelNode label1 = new LabelNode(); + toInsert.add(new JumpInsnNode(IFNONNULL, label1)); + toInsert.add(new InsnNode(ICONST_1)); + LabelNode label2 = new LabelNode(); + toInsert.add(new JumpInsnNode(GOTO, label2)); + toInsert.add(label1); + toInsert.add(new InsnNode(ICONST_0)); + toInsert.add(label2); + toInsert.add(new InsnNode(IRETURN)); + } + toInsert.add(label0); + method.instructions.insertBefore(targetNode,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) { - if ("getStackUnderMouse".equals(name)) { - return new NEITransfermer.TransformUnderMouse(api, super.visitMethod(access, name, desc, signature, exceptions)); - } return super.visitMethod(access, name, desc, signature, exceptions); } - - } - - private static class TransformUnderMouse extends MethodVisitor { - - TransformUnderMouse(int api, MethodVisitor mv) { - super(api, mv); - } - - @Override - public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { - if (opcode == Opcodes.INVOKEINTERFACE) { -// super.visitMethodInsn(Opcodes.INVOKEVIRTUAL, -// "com/glodblock/github/coremod/hooker/CoreModHooks", -// "getStackUnderMouse", -// "(Lnet/minecraft/client/gui/inventory/GuiContainer;II)Lnet/minecraft/item/ItemStack;", -// false); - super.visitMethodInsn(opcode, owner, name, desc, itf); - } - else { - super.visitMethodInsn(opcode, owner, name, desc, itf); - } - } - } }