diff options
author | Alkalus <3060479+draknyte1@users.noreply.github.com> | 2018-10-24 15:23:33 +0100 |
---|---|---|
committer | Alkalus <3060479+draknyte1@users.noreply.github.com> | 2018-10-24 15:23:33 +0100 |
commit | 5ea5183724134c5ca6259ef7efcf46209661ecc7 (patch) | |
tree | 42c8633394c05f74a00ff508e16f878e7a779fa0 /src/Java/gtPlusPlus/preloader/asm | |
parent | 77988b402385ebdb5becc80c6c178648cb5f5642 (diff) | |
download | GT5-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')
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; } |