Advertisement
Guest User

Untitled

a guest
Dec 28th, 2016
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.40 KB | None | 0 0
  1. package com.rebelkeithy.dualhotbar;
  2.  
  3. import java.util.Iterator;
  4.  
  5. import org.objectweb.asm.ClassReader;
  6. import org.objectweb.asm.ClassWriter;
  7. import org.objectweb.asm.Opcodes;
  8. import org.objectweb.asm.tree.AbstractInsnNode;
  9. import org.objectweb.asm.tree.ClassNode;
  10. import org.objectweb.asm.tree.FieldInsnNode;
  11. import org.objectweb.asm.tree.InsnList;
  12. import org.objectweb.asm.tree.IntInsnNode;
  13. import org.objectweb.asm.tree.MethodInsnNode;
  14. import org.objectweb.asm.tree.MethodNode;
  15. import org.objectweb.asm.tree.VarInsnNode;
  16.  
  17. import com.rebelkeithy.dualhotbar.compatability.Compatability;
  18.  
  19. import net.minecraft.launchwrapper.IClassTransformer;
  20. import net.minecraftforge.common.ForgeVersion;
  21.  
  22. public class DualHotbarTransformer implements IClassTransformer
  23. {
  24.  
  25.     @Override
  26.     public byte[] transform(String className, String newClassName, byte[] data)
  27.     {      
  28.         //System.out.println("DUALHOTBAR TEST: MC VERSION " + ForgeVersion.mcVersion);
  29.        
  30.         boolean isObfuscated = !className.equals(newClassName);
  31.        
  32.         if (newClassName.equals("net.minecraft.entity.player.InventoryPlayer"))
  33.         {
  34.             System.out.println("********* INSIDE InventoryPlayer TRANSFORMER ABOUT TO PATCH: " + className);
  35.  
  36.             if(!isObfuscated)
  37.             {
  38.                 data = patchBipush(className, "isHotbar", "(I)Z", data);
  39.                 data = patchBipush(className, "getHotbarSize", "()I", data);
  40.                 data = patchBipush(className, "changeCurrentItem", "(I)V", data);
  41.                 return patchBipush(className, "getBestHotbarSlot", "()I", data);
  42.             }
  43.             else if(ForgeVersion.mcVersion.startsWith("1.11"))
  44.             {
  45.                 data = patchBipush(className, "e", "(I)Z", data);              
  46.                 data = patchBipush(className, "j", "()I", data);
  47.                 data = patchBipush(className, "f", "(I)V", data);
  48.                 return patchBipush(className, "l", "()I", data);
  49.             }
  50.             else if(ForgeVersion.mcVersion.startsWith("1.10"))
  51.             {
  52.                 data = patchBipush(className, "e", "(I)Z", data);              
  53.                 data = patchBipush(className, "i", "()I", data);
  54.                 data = patchBipush(className, "f", "(I)V", data);
  55.                 return patchBipush(className, "k", "()I", data);
  56.             }
  57.         }
  58.        
  59.         if(className.equals("net.minecraftforge.client.GuiIngameForge"))
  60.         {
  61.             System.out.println("********* INSIDE GuiIngameForge TRANSFORMER ABOUT TO PATCH: " + className);
  62.             return patchShift(className, "renderToolHighlight", null, data);
  63.         }
  64.        
  65.         return data;
  66.     }
  67.  
  68.     private byte[] patchBipush(String className, String methodName, String methodDesc, byte[] data)
  69.     {
  70.         ClassNode classNode = new ClassNode();
  71.         ClassReader classReader = new ClassReader(data);
  72.         classReader.accept(classNode, 0);
  73.        
  74.         Iterator<MethodNode> iter = classNode.methods.iterator();
  75.         while(iter.hasNext())
  76.         {
  77.             MethodNode methodNode = iter.next();
  78.            
  79.             if(methodNode.name.equals(methodName) && (methodDesc == null || methodNode.desc.equals(methodDesc)))
  80.             {
  81.                 System.out.println("In " + methodName);
  82.  
  83.                 Iterator<AbstractInsnNode> insnIter = methodNode.instructions.iterator();
  84.                 AbstractInsnNode insnNode = insnIter.next();
  85.                
  86.                 while(insnIter.hasNext())
  87.                 {
  88.                     if(insnNode.getOpcode() == Opcodes.BIPUSH)
  89.                     {
  90.                         System.out.println("found instruction to replace");
  91.  
  92.                         AbstractInsnNode newInstruction = new FieldInsnNode(Opcodes.GETSTATIC, "com/rebelkeithy/dualhotbar/DualHotbarMod", "hotbarSize", "I");
  93.                        
  94.                         methodNode.instructions.insert(insnNode, newInstruction);
  95.                         methodNode.instructions.remove(insnNode);
  96.                     }
  97.                     insnNode = insnIter.next();
  98.                 }
  99.             }
  100.         }
  101.  
  102.         ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
  103.         classNode.accept(writer);
  104.         return writer.toByteArray();
  105.     }
  106.  
  107.     private byte[] patchShift(String className, String methodName, String methodDesc, byte[] data)
  108.     {
  109.         ClassNode classNode = new ClassNode();
  110.         ClassReader classReader = new ClassReader(data);
  111.         classReader.accept(classNode, 0);
  112.        
  113.         Iterator<MethodNode> iter = classNode.methods.iterator();
  114.         while(iter.hasNext())
  115.         {
  116.             MethodNode methodNode = iter.next();
  117.            
  118.             if(methodNode.name.equals(methodName) && (methodNode.desc.equals(methodDesc) || methodDesc == null))
  119.             {
  120.                 System.out.println("In " + methodName);
  121.  
  122.                 Iterator<AbstractInsnNode> insnIter = methodNode.instructions.iterator();
  123.                
  124.  
  125.                 AbstractInsnNode insnNode = insnIter.next();
  126.  
  127.                 AbstractInsnNode newInstruction = new MethodInsnNode(Opcodes.INVOKESTATIC, "com/rebelkeithy/dualhotbar/RenderHandler", "shiftUp", "()V");
  128.                 methodNode.instructions.insertBefore(insnNode, newInstruction);
  129.                
  130.                 while(insnNode.getOpcode() != Opcodes.RETURN)
  131.                 {
  132.                     insnNode = insnIter.next();
  133.                 }
  134.  
  135.                 newInstruction = new MethodInsnNode(Opcodes.INVOKESTATIC, "com/rebelkeithy/dualhotbar/RenderHandler", "shiftDown", "()V");
  136.                 methodNode.instructions.insertBefore(insnNode, newInstruction);
  137.             }
  138.         }
  139.        
  140.  
  141.         ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
  142.         classNode.accept(writer);
  143.         return writer.toByteArray();
  144.     }
  145.  
  146.     private boolean containsMethod(String methodName, String methodDesc, byte[] data)
  147.     {
  148.         ClassNode classNode = new ClassNode();
  149.         ClassReader classReader = new ClassReader(data);
  150.         classReader.accept(classNode, 0);
  151.        
  152.         Iterator<MethodNode> iter = classNode.methods.iterator();
  153.         while(iter.hasNext())
  154.         {
  155.             MethodNode methodNode = iter.next();
  156.            
  157.             if(methodNode.name.equals(methodName) && methodNode.desc.equals(methodDesc))
  158.             {
  159.                 return true;
  160.             }
  161.         }
  162.        
  163.         return false;
  164.     }
  165. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement