Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.rebelkeithy.dualhotbar;
- import java.util.Iterator;
- import org.objectweb.asm.ClassReader;
- import org.objectweb.asm.ClassWriter;
- import org.objectweb.asm.Opcodes;
- import org.objectweb.asm.tree.AbstractInsnNode;
- import org.objectweb.asm.tree.ClassNode;
- import org.objectweb.asm.tree.FieldInsnNode;
- import org.objectweb.asm.tree.InsnList;
- import org.objectweb.asm.tree.IntInsnNode;
- import org.objectweb.asm.tree.MethodInsnNode;
- import org.objectweb.asm.tree.MethodNode;
- import org.objectweb.asm.tree.VarInsnNode;
- import com.rebelkeithy.dualhotbar.compatability.Compatability;
- import net.minecraft.launchwrapper.IClassTransformer;
- import net.minecraftforge.common.ForgeVersion;
- public class DualHotbarTransformer implements IClassTransformer
- {
- @Override
- public byte[] transform(String className, String newClassName, byte[] data)
- {
- //System.out.println("DUALHOTBAR TEST: MC VERSION " + ForgeVersion.mcVersion);
- boolean isObfuscated = !className.equals(newClassName);
- if (newClassName.equals("net.minecraft.entity.player.InventoryPlayer"))
- {
- System.out.println("********* INSIDE InventoryPlayer TRANSFORMER ABOUT TO PATCH: " + className);
- if(!isObfuscated)
- {
- data = patchBipush(className, "isHotbar", "(I)Z", data);
- data = patchBipush(className, "getHotbarSize", "()I", data);
- data = patchBipush(className, "changeCurrentItem", "(I)V", data);
- return patchBipush(className, "getBestHotbarSlot", "()I", data);
- }
- else if(ForgeVersion.mcVersion.startsWith("1.11"))
- {
- data = patchBipush(className, "e", "(I)Z", data);
- data = patchBipush(className, "j", "()I", data);
- data = patchBipush(className, "f", "(I)V", data);
- return patchBipush(className, "l", "()I", data);
- }
- else if(ForgeVersion.mcVersion.startsWith("1.10"))
- {
- data = patchBipush(className, "e", "(I)Z", data);
- data = patchBipush(className, "i", "()I", data);
- data = patchBipush(className, "f", "(I)V", data);
- return patchBipush(className, "k", "()I", data);
- }
- }
- if(className.equals("net.minecraftforge.client.GuiIngameForge"))
- {
- System.out.println("********* INSIDE GuiIngameForge TRANSFORMER ABOUT TO PATCH: " + className);
- return patchShift(className, "renderToolHighlight", null, data);
- }
- return data;
- }
- private byte[] patchBipush(String className, String methodName, String methodDesc, byte[] data)
- {
- ClassNode classNode = new ClassNode();
- ClassReader classReader = new ClassReader(data);
- classReader.accept(classNode, 0);
- Iterator<MethodNode> iter = classNode.methods.iterator();
- while(iter.hasNext())
- {
- MethodNode methodNode = iter.next();
- if(methodNode.name.equals(methodName) && (methodDesc == null || methodNode.desc.equals(methodDesc)))
- {
- System.out.println("In " + methodName);
- Iterator<AbstractInsnNode> insnIter = methodNode.instructions.iterator();
- AbstractInsnNode insnNode = insnIter.next();
- while(insnIter.hasNext())
- {
- if(insnNode.getOpcode() == Opcodes.BIPUSH)
- {
- System.out.println("found instruction to replace");
- AbstractInsnNode newInstruction = new FieldInsnNode(Opcodes.GETSTATIC, "com/rebelkeithy/dualhotbar/DualHotbarMod", "hotbarSize", "I");
- methodNode.instructions.insert(insnNode, newInstruction);
- methodNode.instructions.remove(insnNode);
- }
- insnNode = insnIter.next();
- }
- }
- }
- ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
- classNode.accept(writer);
- return writer.toByteArray();
- }
- private byte[] patchShift(String className, String methodName, String methodDesc, byte[] data)
- {
- ClassNode classNode = new ClassNode();
- ClassReader classReader = new ClassReader(data);
- classReader.accept(classNode, 0);
- Iterator<MethodNode> iter = classNode.methods.iterator();
- while(iter.hasNext())
- {
- MethodNode methodNode = iter.next();
- if(methodNode.name.equals(methodName) && (methodNode.desc.equals(methodDesc) || methodDesc == null))
- {
- System.out.println("In " + methodName);
- Iterator<AbstractInsnNode> insnIter = methodNode.instructions.iterator();
- AbstractInsnNode insnNode = insnIter.next();
- AbstractInsnNode newInstruction = new MethodInsnNode(Opcodes.INVOKESTATIC, "com/rebelkeithy/dualhotbar/RenderHandler", "shiftUp", "()V");
- methodNode.instructions.insertBefore(insnNode, newInstruction);
- while(insnNode.getOpcode() != Opcodes.RETURN)
- {
- insnNode = insnIter.next();
- }
- newInstruction = new MethodInsnNode(Opcodes.INVOKESTATIC, "com/rebelkeithy/dualhotbar/RenderHandler", "shiftDown", "()V");
- methodNode.instructions.insertBefore(insnNode, newInstruction);
- }
- }
- ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
- classNode.accept(writer);
- return writer.toByteArray();
- }
- private boolean containsMethod(String methodName, String methodDesc, byte[] data)
- {
- ClassNode classNode = new ClassNode();
- ClassReader classReader = new ClassReader(data);
- classReader.accept(classNode, 0);
- Iterator<MethodNode> iter = classNode.methods.iterator();
- while(iter.hasNext())
- {
- MethodNode methodNode = iter.next();
- if(methodNode.name.equals(methodName) && methodNode.desc.equals(methodDesc))
- {
- return true;
- }
- }
- return false;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement