diff options
author | Draknyte1 <Draknyte1@hotmail.com> | 2017-08-12 21:56:42 +1000 |
---|---|---|
committer | Draknyte1 <Draknyte1@hotmail.com> | 2017-08-12 21:56:42 +1000 |
commit | 2f204855239daa14c085fd74cb34a02fbbf36d73 (patch) | |
tree | ceb621923538b9c6bbf7eca87f337ab1ca1c2f8f /src/Java/gtPlusPlus/preloader/asm/Preloader_ClassTransformer.java | |
parent | 25c74de08a9f7510da2f9f32a0e91bc9636ac9a2 (diff) | |
download | GT5-Unofficial-2f204855239daa14c085fd74cb34a02fbbf36d73.tar.gz GT5-Unofficial-2f204855239daa14c085fd74cb34a02fbbf36d73.tar.bz2 GT5-Unofficial-2f204855239daa14c085fd74cb34a02fbbf36d73.zip |
+ Added Lava Filter recipe.
+ Added Thermal Boiler manual recipe.
$ Fixed OreDict ASM.
% Changed recipe handling for the Thermal Boiler.
Diffstat (limited to 'src/Java/gtPlusPlus/preloader/asm/Preloader_ClassTransformer.java')
-rw-r--r-- | src/Java/gtPlusPlus/preloader/asm/Preloader_ClassTransformer.java | 132 |
1 files changed, 56 insertions, 76 deletions
diff --git a/src/Java/gtPlusPlus/preloader/asm/Preloader_ClassTransformer.java b/src/Java/gtPlusPlus/preloader/asm/Preloader_ClassTransformer.java index 330aef318a..e3a022dd6a 100644 --- a/src/Java/gtPlusPlus/preloader/asm/Preloader_ClassTransformer.java +++ b/src/Java/gtPlusPlus/preloader/asm/Preloader_ClassTransformer.java @@ -1,88 +1,68 @@ package gtPlusPlus.preloader.asm; -import static org.objectweb.asm.Opcodes.ALOAD; -import static org.objectweb.asm.Opcodes.INVOKESTATIC; - -import java.util.Iterator; +import static org.objectweb.asm.Opcodes.*; +import org.apache.logging.log4j.Level; import org.objectweb.asm.*; -import org.objectweb.asm.tree.*; -import gtPlusPlus.core.util.Utils; +import cpw.mods.fml.relauncher.FMLRelaunchLog; import net.minecraft.launchwrapper.IClassTransformer; public class Preloader_ClassTransformer implements IClassTransformer { @Override - public byte[] transform(String name, String transformedName, byte[] basicClass) { - - /*if (name.equals("abq")) { - Utils.LOG_ASM("[ASM] INSIDE OBFUSCATED EXPLOSION TRANSFORMER ABOUT TO PATCH: " + name); - return patchClassASM(name, basicClass, true); - } - - else if (name.equals("net.minecraftforge.oredict.OreDictionary")) { - Utils.LOG_ASM("[ASM] INSIDE OREDICT TRANSFORMER ABOUT TO PATCH: " + name); - return patchClassASM(name, basicClass, false); - }*/ - return basicClass; - } - - public byte[] patchClassASM(String name, byte[] bytes, boolean obfuscated) { - - String targetMethodName = ""; - - if(obfuscated == true) - targetMethodName ="a"; - else - targetMethodName ="registerOreImpl"; - - - //set up ASM class manipulation stuff. Consult the ASM docs for details - ClassNode classNode = new ClassNode(); - ClassReader classReader = new ClassReader(bytes); - classReader.accept(classNode, 0); - - - - //Now we loop over all of the methods declared inside the Explosion class until we get to the targetMethodName "doExplosionB" - - // find method to inject into - Iterator<MethodNode> methods = classNode.methods.iterator(); - while(methods.hasNext()) - { - MethodNode m = methods.next(); - Utils.LOG_ASM("[ASM] Method Name: "+m.name + " Desc:" + m.desc); - - //Check if this is doExplosionB and it's method signature is (Z)V which means that it accepts a boolean (Z) and returns a void (V) - if ((m.name.equals(targetMethodName) && m.desc.equals("(Ljava/lang/String;Lnet/minecraft/item/ItemStack;)V"))) - { - Utils.LOG_ASM("[ASM] Inside target method!"); - // find interesting instructions in method, there is a single FDIV instruction we use as target - - // make new instruction list - InsnList toInject = new InsnList(); - - //toInject.add(new VarInsnNode(ALOAD, 0)); - - toInject.add(new VarInsnNode(ALOAD, 1)); - toInject.add(new MethodInsnNode(INVOKESTATIC, "gtPlusPlus/preloader/Preloader_GT_OreDict", "removeCircuit", "(Lnet/minecraft/item/ItemStack;)Z, false")); - toInject.add(new VarInsnNode(Opcodes.IFEQ, 1)); - toInject.add(new VarInsnNode(Opcodes.RETURN, 0)); - //toInject.add(new VarInsnNode(org.objectweb.asm.Opcodes.LABEL END, 0)); - - // inject new instruction list into method instruction list - m.instructions.insert(toInject); - - Utils.LOG_ASM("Patching Complete!"); - break; - } - } - - //ASM specific for cleaning up and returning the final bytes for JVM processing. - ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); - classNode.accept(writer); - return writer.toByteArray(); - } + public byte[] transform(String name, String transformedName, byte[] basicClass) { + if(transformedName.equals("net.minecraftforge.oredict.OreDictionary")) { + FMLRelaunchLog.log("[GT++] OreDictTransformer", Level.INFO, "Transforming %s", transformedName); + ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES); + new ClassReader(basicClass).accept(new OreDictionaryVisitor(classWriter), 0); + return classWriter.toByteArray(); + } + return basicClass; + } + +private static final class OreDictionaryVisitor extends ClassVisitor { + + public OreDictionaryVisitor(ClassVisitor cv) { + super(ASM5, cv); + } + + @Override + public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { + MethodVisitor methodVisitor = super.visitMethod(access, name, desc, signature, exceptions); + if(name.equals("registerOreImpl") && desc.equals("(Ljava/lang/String;Lnet/minecraft/item/ItemStack;)V")) { + FMLRelaunchLog.log("[GT++] OreDictTransformer", Level.INFO, "Found target method."); + return new RegisterOreImplVisitor(methodVisitor); + } + return methodVisitor; + } + + } + + private static final class RegisterOreImplVisitor extends MethodVisitor { + + public RegisterOreImplVisitor(MethodVisitor mv) { + super(ASM5, mv); + } + + @SuppressWarnings("deprecation") + @Override + public void visitCode() { + super.visitCode(); + super.visitVarInsn(ALOAD, 0); + super.visitVarInsn(ALOAD, 1); + super.visitMethodInsn(INVOKESTATIC, + //"gtPlusPlus/preloader/Preloader_GT_OreDict", "removeCircuit", "(Lnet/minecraft/item/ItemStack;)Z, false"); + "gtPlusPlus/preloader/Preloader_GT_OreDict", + "shouldPreventRegistration", + "(Ljava/lang/String;Lnet/minecraft/item/ItemStack;)Z", + false); + Label endLabel = new Label(); + super.visitJumpInsn(IFEQ, endLabel); + super.visitInsn(RETURN); + super.visitLabel(endLabel); + } + + } } |