aboutsummaryrefslogtreecommitdiff
path: root/src/Java/gtPlusPlus/preloader/asm/Preloader_ClassTransformer.java
diff options
context:
space:
mode:
authorDraknyte1 <Draknyte1@hotmail.com>2017-08-12 21:56:42 +1000
committerDraknyte1 <Draknyte1@hotmail.com>2017-08-12 21:56:42 +1000
commit2f204855239daa14c085fd74cb34a02fbbf36d73 (patch)
treeceb621923538b9c6bbf7eca87f337ab1ca1c2f8f /src/Java/gtPlusPlus/preloader/asm/Preloader_ClassTransformer.java
parent25c74de08a9f7510da2f9f32a0e91bc9636ac9a2 (diff)
downloadGT5-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.java132
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);
+ }
+
+ }
}