diff options
Diffstat (limited to 'src/Java/gtPlusPlus/preloader/asm/transformers')
-rw-r--r-- | src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_OB_Sprinkler.java | 79 | ||||
-rw-r--r-- | src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java | 115 |
2 files changed, 162 insertions, 32 deletions
diff --git a/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_OB_Sprinkler.java b/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_OB_Sprinkler.java index 7877315939..7bb3779b6a 100644 --- a/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_OB_Sprinkler.java +++ b/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_OB_Sprinkler.java @@ -65,6 +65,8 @@ public class ClassTransformer_OB_Sprinkler { injectMethod("getRealInventory"); injectMethod("generateInventory"); injectMethod("updateEntity"); + //injectMethod("createInventoryCallback"); + //injectMethod("registerInventoryCallback"); } } @@ -202,7 +204,7 @@ public class ClassTransformer_OB_Sprinkler { mv.visitLabel(l0); mv.visitLineNumber(156, l0); mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn(INVOKESPECIAL, "openblocks/common/tileentity/TileEntitySprinkler", "updateEntity", "()V", false); + mv.visitMethodInsn(INVOKESPECIAL, "net/minecraft/tileentity/TileEntity", "updateEntity", "()V", false); Label l1 = new Label(); mv.visitLabel(l1); mv.visitLineNumber(157, l1); @@ -418,30 +420,33 @@ public class ClassTransformer_OB_Sprinkler { else if (aMethodName.equals("generateInventory")) { FMLRelaunchLog.log("[GT++ ASM] OpenBlocks Sprinkler Patch", Level.INFO, "Injecting "+aMethodName+" into "+className+"."); mv = getWriter().visitMethod(ACC_PRIVATE, "generateInventory", "()Lopenmods/inventory/GenericInventory;", null, null); + mv.visitCode(); Label l0 = new Label(); mv.visitLabel(l0); - mv.visitLineNumber(278, l0); - mv.visitVarInsn(ALOAD, 0); - Label l1 = new Label(); - mv.visitLabel(l1); - mv.visitLineNumber(279, l1); - mv.visitTypeInsn(NEW, "openblocks/common/tileentity/TileEntitySprinkler$2"); + mv.visitLineNumber(281, l0); + mv.visitTypeInsn(NEW, "gtPlusPlus/xmod/ob/CustomSprinklerInventory"); mv.visitInsn(DUP); mv.visitVarInsn(ALOAD, 0); - mv.visitVarInsn(ALOAD, 0); mv.visitLdcInsn("sprinkler"); mv.visitInsn(ICONST_1); mv.visitIntInsn(BIPUSH, 9); - mv.visitMethodInsn(INVOKESPECIAL, "openblocks/common/tileentity/TileEntitySprinkler$2", "<init>", "(Lopenblocks/common/tileentity/TileEntitySprinkler;L"+mTileEntityName+";Ljava/lang/String;ZI)V", false); - Label l2 = new Label(); - mv.visitLabel(l2); - mv.visitLineNumber(278, l2); - mv.visitMethodInsn(INVOKEVIRTUAL, "openblocks/common/tileentity/TileEntitySprinkler", "registerInventoryCallback", "(Lopenmods/inventory/GenericInventory;)Lopenmods/inventory/GenericInventory;", false); + mv.visitMethodInsn(INVOKESPECIAL, "gtPlusPlus/xmod/ob/CustomSprinklerInventory", "<init>", "(L"+mTileEntityName+";Ljava/lang/String;ZI)V", false); mv.visitVarInsn(ASTORE, 1); + Label l1 = new Label(); + mv.visitLabel(l1); + mv.visitLineNumber(282, l1); + mv.visitVarInsn(ALOAD, 1); + Label l2 = new Label(); + mv.visitJumpInsn(IFNULL, l2); Label l3 = new Label(); mv.visitLabel(l3); - mv.visitLineNumber(292, l3); + mv.visitLineNumber(283, l3); + mv.visitLdcInsn("Created Custom Inventory for OB Sprinkler."); + mv.visitMethodInsn(INVOKESTATIC, "gtPlusPlus/api/objects/Logger", "INFO", "(Ljava/lang/String;)V", false); + mv.visitLabel(l2); + mv.visitLineNumber(285, l2); + mv.visitFrame(F_APPEND,1, new Object[] {"openmods/inventory/GenericInventory"}, 0, null); mv.visitVarInsn(ALOAD, 1); Label l4 = new Label(); mv.visitJumpInsn(IFNULL, l4); @@ -449,7 +454,7 @@ public class ClassTransformer_OB_Sprinkler { Label l5 = new Label(); mv.visitJumpInsn(GOTO, l5); mv.visitLabel(l4); - mv.visitFrame(F_APPEND,1, new Object[] {"openmods/inventory/GenericInventory"}, 0, null); + mv.visitFrame(F_SAME, 0, null, 0, null); mv.visitInsn(ACONST_NULL); mv.visitLabel(l5); mv.visitFrame(F_SAME1, 0, null, 1, new Object[] {"openmods/inventory/GenericInventory"}); @@ -457,10 +462,9 @@ public class ClassTransformer_OB_Sprinkler { Label l6 = new Label(); mv.visitLabel(l6); mv.visitLocalVariable("this", "Lopenblocks/common/tileentity/TileEntitySprinkler;", null, l0, l6, 0); - mv.visitLocalVariable("x", "Lopenmods/inventory/GenericInventory;", null, l3, l6, 1); - mv.visitMaxs(8, 2); + mv.visitLocalVariable("x", "Lopenmods/inventory/GenericInventory;", null, l1, l6, 1); + mv.visitMaxs(6, 2); mv.visitEnd(); - } else if (aMethodName.equals("getRealInventory")) { FMLRelaunchLog.log("[GT++ ASM] OpenBlocks Sprinkler Patch", Level.INFO, "Injecting "+aMethodName+" into "+className+"."); @@ -513,6 +517,45 @@ public class ClassTransformer_OB_Sprinkler { mv.visitMaxs(2, 1); mv.visitEnd(); } + else if (aMethodName.equals("createInventoryCallback")) { + FMLRelaunchLog.log("[GT++ ASM] OpenBlocks Sprinkler Patch", Level.INFO, "Injecting "+aMethodName+" into "+className+"."); + mv = getWriter().visitMethod(ACC_PROTECTED, "createInventoryCallback", "()Lopenmods/api/IInventoryCallback;", null, null); + mv.visitCode(); + Label l0 = new Label(); + mv.visitLabel(l0); + mv.visitLineNumber(289, l0); + mv.visitTypeInsn(NEW, "gtPlusPlus/xmod/ob/CallbackObject"); + mv.visitInsn(DUP); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn(INVOKESPECIAL, "gtPlusPlus/xmod/ob/CallbackObject", "<init>", "(L"+mTileEntityName+";)V", false); + mv.visitInsn(ARETURN); + Label l1 = new Label(); + mv.visitLabel(l1); + mv.visitLocalVariable("this", "Lopenblocks/common/tileentity/TileEntitySprinkler;", null, l0, l1, 0); + mv.visitMaxs(3, 1); + mv.visitEnd(); + } + else if (aMethodName.equals("registerInventoryCallback")) { + FMLRelaunchLog.log("[GT++ ASM] OpenBlocks Sprinkler Patch", Level.INFO, "Injecting "+aMethodName+" into "+className+"."); + mv = getWriter().visitMethod(ACC_PROTECTED, "registerInventoryCallback", "(Lopenmods/inventory/GenericInventory;)Lopenmods/inventory/GenericInventory;", null, null); + mv.visitCode(); + Label l0 = new Label(); + mv.visitLabel(l0); + mv.visitLineNumber(293, l0); + mv.visitVarInsn(ALOAD, 1); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn(INVOKEVIRTUAL, "openblocks/common/tileentity/TileEntitySprinkler", "createInventoryCallback", "()Lopenmods/api/IInventoryCallback;", false); + mv.visitMethodInsn(INVOKEVIRTUAL, "openmods/inventory/GenericInventory", "addCallback", "(Lopenmods/api/IInventoryCallback;)Lopenmods/inventory/GenericInventory;", false); + mv.visitInsn(ARETURN); + Label l1 = new Label(); + mv.visitLabel(l1); + mv.visitLocalVariable("this", "Lopenblocks/common/tileentity/TileEntitySprinkler;", null, l0, l1, 0); + mv.visitLocalVariable("inventory", "Lopenmods/inventory/GenericInventory;", null, l0, l1, 1); + mv.visitMaxs(2, 2); + mv.visitEnd(); + } + + FMLRelaunchLog.log("[GT++ ASM] OpenBlocks Sprinkler Patch", Level.INFO, "Method injection complete."); } diff --git a/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java b/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java index 485599cef6..525db7e961 100644 --- a/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java +++ b/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java @@ -1,6 +1,14 @@ package gtPlusPlus.preloader.asm.transformers; +import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.IOException; +import java.io.ObjectOutputStream; +import java.lang.instrument.ClassFileTransformer; +import java.lang.instrument.IllegalClassFormatException; +import java.lang.instrument.Instrumentation; +import java.lang.instrument.UnmodifiableClassException; +import java.security.ProtectionDomain; import org.apache.logging.log4j.Level; import org.objectweb.asm.ClassReader; @@ -21,7 +29,7 @@ public class Preloader_Transformer_Handler implements IClassTransformer { public byte[] transform(String name, String transformedName, byte[] basicClass) { - + // Is this environment obfuscated? (Extra checks just in case some weird shit happens during the check) boolean obfuscated = false; try { @@ -51,14 +59,18 @@ public class Preloader_Transformer_Handler implements IClassTransformer { } // Fix Tinkers Fluids - if (doesPackageExist("tconstruct.smeltery")) + if (findMod("TConstruct")) { if (transformedName.equals("tconstruct.smeltery.blocks.TConstructFluid")) { FMLRelaunchLog.log("[GT++ ASM] Bright Fluids", Level.INFO, "Transforming %s", transformedName); return new ClassTransformer_TiConFluids("getLightValue", obfuscated, basicClass).getWriter().toByteArray(); } - + } + else { + FMLRelaunchLog.log("[GT++ ASM] Bright Fluids", Level.INFO, "TiCon Bright Fluids ASM not loaded."); + } + //Fix GC stuff - if (doesPackageExist("micdoodle8.mods.galacticraft")) { + if (findMod("GalacticraftCore")) { if (transformedName.equals("micdoodle8.mods.galacticraft.core.util.FluidUtil")) { FMLRelaunchLog.log("[GT++ ASM] Galacticraft FluidUtils Patch", Level.INFO, "Transforming %s", transformedName); return new ClassTransformer_GC_FluidUtil(basicClass).getWriter().toByteArray(); @@ -68,13 +80,40 @@ public class Preloader_Transformer_Handler implements IClassTransformer { return new ClassTransformer_GC_FuelLoader(basicClass).getWriter().toByteArray(); } } - + else { + FMLRelaunchLog.log("[GT++ ASM] GC Fuel Patch", Level.INFO, "GC Fuel Loader ASM not loaded."); + } + //Improve OB Sprinklers - if (doesPackageExist("openblocks.common")) + if (findMod("OpenBlocks-1.7.10")) { if (transformedName.equals("openblocks.common.tileentity.TileEntitySprinkler")) { FMLRelaunchLog.log("[GT++ ASM] OpenBlocks Sprinkler Patch", Level.INFO, "Transforming %s", transformedName); + /*try { + ClassLoader aCustom = new gtPlusPlus.preloader.CustomClassLoader(); + Class aCustomClass = aCustom.loadClass(gtPlusPlus.xmod.ob.TileEntitySprinkler_ASM.class.getName()); + if (aCustomClass == null) { + aCustomClass = aCustom.loadClass(gtPlusPlus.xmod.ob.TileEntitySprinkler_ASM.class.getCanonicalName()); + } + if (aCustomClass == null) { + aCustomClass = aCustom.loadClass(gtPlusPlus.xmod.ob.TileEntitySprinkler_ASM.class.getSimpleName()); + } + if (aCustomClass == null) { + byte[] mCustomClassData = GetBytecode.getClassFile(aCustomClass); + if (mCustomClassData != null) { + FMLRelaunchLog.log("[GT++ ASM] OpenBlocks Sprinkler Patch", Level.INFO, "Custom Class Loaded in place."); + return mCustomClassData; + } + } + + } catch (ClassNotFoundException | UnmodifiableClassException e) { + e.printStackTrace(); + }*/ return new ClassTransformer_OB_Sprinkler(obfuscated, basicClass).getWriter().toByteArray(); - } + } + } + else { + FMLRelaunchLog.log("[GT++ ASM] OpenBlocks Sprinkler Patch", Level.INFO, "OpenBlocks Sprinkler ASM not loaded."); + } if (mEnabled) { if (transformedName.equals("gregtech.api.metatileentity.BaseMetaTileEntity")) { @@ -94,14 +133,62 @@ public class Preloader_Transformer_Handler implements IClassTransformer { } return basicClass; } - - public static boolean doesPackageExist(final String packageName) { - boolean exists = false; - Package f = Package.getPackage(packageName); - if (f != null) { - exists = true; - } + + public static boolean findMod(final String aModName) { + + /*File mMods = new File(Launch.minecraftHome, "mods"); + if (mMods.isDirectory()) { + for (File modFile : mMods.listFiles()) { + if (modFile != null && modFile.getName().toLowerCase().contains(aModName.toLowerCase())) { + FMLRelaunchLog.log("[GT++ ASM]", Level.INFO, "Found "+aModName); + return true; + } + else { + //FMLRelaunchLog.log("[GT++ ASM]", Level.INFO, "Found mod: "+modFile.getName()); + } + } + } */ + boolean exists = true; return exists; } + public byte[] toByteArray(String aClassName) throws IOException { + return Launch.classLoader.getClassBytes(aClassName); + } + + public static class GetBytecode implements ClassFileTransformer { + private static Instrumentation inst; + + public static synchronized void agentmain(String args, Instrumentation inst) { + GetBytecode.inst = inst; + } + + public static synchronized void premain(String args, Instrumentation inst) { + GetBytecode.inst = inst; + } + + public static synchronized byte[] getClassFile(Class cls) throws UnmodifiableClassException { + Instrumentation inst = GetBytecode.inst; + if (inst == null) { + throw new IllegalStateException("Agent has not been loaded"); + } + + GetBytecode transformer = new GetBytecode(); + inst.addTransformer(transformer, true); + inst.retransformClasses(cls); + inst.removeTransformer(transformer); + return transformer.classFile; + } + + private byte[] classFile; + + @Override + public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, + ProtectionDomain pd, byte[] classFile) throws IllegalClassFormatException { + if (classBeingRedefined != null) { + this.classFile = classFile; + } + return null; + } + } } |