This commit is contained in:
asdflj committed 2022-09-29 15:27:06 +08:00
1 parent c3fec4fd26
commit 2ffdef91bb
8 files changed
+66 -41

No files matched your search

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