aboutsummaryrefslogtreecommitdiff
path: root/src/Java/gtPlusPlus/preloader/asm
diff options
context:
space:
mode:
authorAlkalus <3060479+draknyte1@users.noreply.github.com>2018-10-24 15:23:33 +0100
committerAlkalus <3060479+draknyte1@users.noreply.github.com>2018-10-24 15:23:33 +0100
commit5ea5183724134c5ca6259ef7efcf46209661ecc7 (patch)
tree42c8633394c05f74a00ff508e16f878e7a779fa0 /src/Java/gtPlusPlus/preloader/asm
parent77988b402385ebdb5becc80c6c178648cb5f5642 (diff)
downloadGT5-Unofficial-5ea5183724134c5ca6259ef7efcf46209661ecc7.tar.gz
GT5-Unofficial-5ea5183724134c5ca6259ef7efcf46209661ecc7.tar.bz2
GT5-Unofficial-5ea5183724134c5ca6259ef7efcf46209661ecc7.zip
+ Added ASM patch for GT MetaTile Tooltips.
% Improve GT ASM.
Diffstat (limited to 'src/Java/gtPlusPlus/preloader/asm')
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_BlockMachines_NBT.java2
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_ItemMachines_Tooltip.java138
-rw-r--r--src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java5
3 files changed, 144 insertions, 1 deletions
diff --git a/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_BlockMachines_NBT.java b/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_BlockMachines_NBT.java
index e65d9d11eb..0d2fcc70a4 100644
--- a/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_BlockMachines_NBT.java
+++ b/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_BlockMachines_NBT.java
@@ -16,7 +16,7 @@ import gtPlusPlus.preloader.DevHelper;
public class ClassTransformer_GT_BlockMachines_NBT {
//The qualified name of the class we plan to transform.
- private static final String className = "micdoodle8.mods.galacticraft.core.util.FluidUtil";
+ private static final String className = "gregtech.common.blocks.GT_Block_Machines";
//gregtech/common/blocks/GT_Block_Machines
private final boolean isValid;
diff --git a/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_ItemMachines_Tooltip.java b/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_ItemMachines_Tooltip.java
new file mode 100644
index 0000000000..49981d134e
--- /dev/null
+++ b/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_ItemMachines_Tooltip.java
@@ -0,0 +1,138 @@
+package gtPlusPlus.preloader.asm.transformers;
+
+import static org.objectweb.asm.Opcodes.*;
+
+import java.io.IOException;
+import org.apache.logging.log4j.Level;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+
+import cpw.mods.fml.relauncher.FMLRelaunchLog;
+import gtPlusPlus.preloader.DevHelper;
+
+public class ClassTransformer_GT_ItemMachines_Tooltip {
+
+ //The qualified name of the class we plan to transform.
+ private static final String className = "gregtech.common.blocks.GT_Item_Machines";
+ //gregtech/common/blocks/GT_Item_Machines
+
+ private final boolean isValid;
+ private final ClassReader reader;
+ private final ClassWriter writer;
+
+ String aEntityPlayer;
+ String aItemStack;
+ String aWorld;
+
+ private static boolean doesMethodAlreadyExist = false;
+
+ public ClassTransformer_GT_ItemMachines_Tooltip(byte[] basicClass, boolean obfuscated) {
+ ClassReader aTempReader = null;
+ ClassWriter aTempWriter = null;
+ try {
+ aTempReader = new ClassReader(className);
+ aTempWriter = new ClassWriter(aTempReader, ClassWriter.COMPUTE_FRAMES);
+ new ClassReader(basicClass).accept(new localClassVisitor(aTempWriter), 0);
+ } catch (IOException e) {}
+ if (aTempReader != null && aTempWriter != null) {
+ isValid = true;
+ }
+ else {
+ isValid = false;
+ }
+ reader = aTempReader;
+ writer = aTempWriter;
+
+ if (reader != null && writer != null && !doesMethodAlreadyExist) {
+ aEntityPlayer = obfuscated ? DevHelper.getObfuscated("net/minecraft/entity/player/EntityPlayer") : "net/minecraft/entity/player/EntityPlayer";
+ aItemStack = obfuscated ? DevHelper.getObfuscated("net/minecraft/item/ItemStack") : "net/minecraft/item/ItemStack";
+ aWorld = obfuscated ? DevHelper.getObfuscated("net/minecraft/world/World") : "net/minecraft/world/World";
+
+ injectMethod("addInformation");
+ }
+
+ }
+
+ public boolean isValidTransformer() {
+ return isValid;
+ }
+
+ public ClassReader getReader() {
+ return reader;
+ }
+
+ public ClassWriter getWriter() {
+ return writer;
+ }
+
+ public void injectMethod(String aMethodName) {
+ MethodVisitor mv;
+ FMLRelaunchLog.log("[GT++ ASM] Gregtech Tooltip Patch", Level.INFO, "Injecting "+aMethodName+" into "+className+".");
+ if (aMethodName.equals("addInformation")) {
+
+ mv = getWriter().visitMethod(ACC_PUBLIC, "addInformation", "(L"+aItemStack+";L"+aEntityPlayer+";Ljava/util/List;Z)V", null, null);
+ mv.visitCode();
+ Label l0 = new Label();
+ Label l1 = new Label();
+ Label l2 = new Label();
+ mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Throwable");
+ mv.visitLabel(l0);
+ mv.visitLineNumber(120, l0);
+ mv.visitVarInsn(ALOAD, 1);
+ mv.visitVarInsn(ALOAD, 2);
+ mv.visitVarInsn(ALOAD, 3);
+ mv.visitVarInsn(ILOAD, 4);
+ mv.visitMethodInsn(INVOKESTATIC, "gtPlusPlus/xmod/gregtech/common/Meta_GT_Proxy", "conStructGtTileBlockTooltip", "(L"+aItemStack+";L"+aEntityPlayer+";Ljava/util/List;Z)V", false);
+ mv.visitLabel(l1);
+ mv.visitLineNumber(121, l1);
+ Label l3 = new Label();
+ mv.visitJumpInsn(GOTO, l3);
+ mv.visitLabel(l2);
+ mv.visitFrame(F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+ mv.visitVarInsn(ASTORE, 5);
+ Label l4 = new Label();
+ mv.visitLabel(l4);
+ mv.visitLineNumber(122, l4);
+ mv.visitVarInsn(ALOAD, 5);
+ mv.visitFieldInsn(GETSTATIC, "gregtech/api/util/GT_Log", "err", "Ljava/io/PrintStream;");
+ mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Throwable", "printStackTrace", "(Ljava/io/PrintStream;)V", false);
+ mv.visitLabel(l3);
+ mv.visitLineNumber(124, l3);
+ mv.visitFrame(F_SAME, 0, null, 0, null);
+ mv.visitInsn(RETURN);
+ Label l5 = new Label();
+ mv.visitLabel(l5);
+ mv.visitLocalVariable("this", "Lgregtech/common/blocks/GT_Item_Machines;", null, l0, l5, 0);
+ mv.visitLocalVariable("aStack", "L"+aItemStack+";", null, l0, l5, 1);
+ mv.visitLocalVariable("aPlayer", "L"+aEntityPlayer+";", null, l0, l5, 2);
+ mv.visitLocalVariable("aList", "Ljava/util/List;", null, l0, l5, 3);
+ mv.visitLocalVariable("par4", "Z", null, l0, l5, 4);
+ mv.visitLocalVariable("e", "Ljava/lang/Throwable;", null, l4, l3, 5);
+ mv.visitMaxs(4, 6);
+ mv.visitEnd();
+}
+ FMLRelaunchLog.log("[GT++ ASM] Gregtech Tooltip Patch", Level.INFO, "Method injection complete.");
+
+ }
+
+ public static final class localClassVisitor extends ClassVisitor {
+
+ public localClassVisitor(ClassVisitor cv) {
+ super(ASM5, cv);
+ }
+
+ @Override
+ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
+ if (name.equals("addInformation")) {
+ FMLRelaunchLog.log("[GT++ ASM] Gregtech Tooltip Patch", Level.INFO, "Found method "+name+", Patching.");
+ return null;
+ }
+ MethodVisitor methodVisitor = super.visitMethod(access, name, desc, signature, exceptions);
+ return methodVisitor;
+ }
+ }
+
+}
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 3738140b0d..c54f81c456 100644
--- a/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java
+++ b/src/Java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java
@@ -77,6 +77,11 @@ public class Preloader_Transformer_Handler implements IClassTransformer {
FMLRelaunchLog.log("[GT++ ASM] Gregtech NBT Persistency Patch", Level.INFO, "Transforming %s", transformedName);
return new ClassTransformer_GT_BlockMachines_NBT(basicClass, obfuscated).getWriter().toByteArray();
}
+ //Patching Meta Tile Tooltips
+ if (transformedName.equals("gregtech.common.blocks.GT_Item_Machines")) {
+ FMLRelaunchLog.log("[GT++ ASM] Gregtech Tooltip Patch", Level.INFO, "Transforming %s", transformedName);
+ return new ClassTransformer_GT_ItemMachines_Tooltip(basicClass, obfuscated).getWriter().toByteArray();
+ }
return basicClass;
}