aboutsummaryrefslogtreecommitdiff
path: root/src/Java/gtPlusPlus/preloader/asm
diff options
context:
space:
mode:
Diffstat (limited to 'src/Java/gtPlusPlus/preloader/asm')
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_OB_Sprinkler.java79
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java115
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;
+ }
+ }
}