diff options
author | Alkalus <3060479+draknyte1@users.noreply.github.com> | 2019-04-24 18:18:24 +1000 |
---|---|---|
committer | Alkalus <3060479+draknyte1@users.noreply.github.com> | 2019-04-24 18:18:24 +1000 |
commit | a38eb45ceabfad207592ceece8c8c81965157c50 (patch) | |
tree | e6708e73044974267fd3ca22c7b2d065d6399406 /src/Java/gtPlusPlus/preloader/asm/transformers | |
parent | ddefc4f7b11a3c0fab7f89416beac017634e58e0 (diff) | |
download | GT5-Unofficial-a38eb45ceabfad207592ceece8c8c81965157c50.tar.gz GT5-Unofficial-a38eb45ceabfad207592ceece8c8c81965157c50.tar.bz2 GT5-Unofficial-a38eb45ceabfad207592ceece8c8c81965157c50.zip |
$ Fixed another small derp in GT's Client Proxy.
Diffstat (limited to 'src/Java/gtPlusPlus/preloader/asm/transformers')
-rw-r--r-- | src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_Client.java | 449 |
1 files changed, 174 insertions, 275 deletions
diff --git a/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_Client.java b/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_Client.java index eb33366401..58e1d4277b 100644 --- a/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_Client.java +++ b/src/Java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_Client.java @@ -1,15 +1,36 @@ package gtPlusPlus.preloader.asm.transformers; +import static org.objectweb.asm.Opcodes.AALOAD; import static org.objectweb.asm.Opcodes.ACC_PUBLIC; +import static org.objectweb.asm.Opcodes.ACONST_NULL; import static org.objectweb.asm.Opcodes.ALOAD; +import static org.objectweb.asm.Opcodes.ARRAYLENGTH; import static org.objectweb.asm.Opcodes.ASM5; +import static org.objectweb.asm.Opcodes.ASTORE; +import static org.objectweb.asm.Opcodes.F_APPEND; +import static org.objectweb.asm.Opcodes.F_FULL; +import static org.objectweb.asm.Opcodes.F_SAME; +import static org.objectweb.asm.Opcodes.F_SAME1; +import static org.objectweb.asm.Opcodes.GETSTATIC; +import static org.objectweb.asm.Opcodes.GOTO; +import static org.objectweb.asm.Opcodes.ICONST_0; +import static org.objectweb.asm.Opcodes.ICONST_1; +import static org.objectweb.asm.Opcodes.IFNULL; +import static org.objectweb.asm.Opcodes.IF_ICMPLT; +import static org.objectweb.asm.Opcodes.ILOAD; +import static org.objectweb.asm.Opcodes.INTEGER; +import static org.objectweb.asm.Opcodes.INVOKEINTERFACE; +import static org.objectweb.asm.Opcodes.INVOKESPECIAL; import static org.objectweb.asm.Opcodes.INVOKESTATIC; +import static org.objectweb.asm.Opcodes.INVOKEVIRTUAL; +import static org.objectweb.asm.Opcodes.ISTORE; +import static org.objectweb.asm.Opcodes.LCONST_1; +import static org.objectweb.asm.Opcodes.POP; import static org.objectweb.asm.Opcodes.RETURN; import java.io.File; import java.io.FileInputStream; import java.io.IOException; -import java.lang.reflect.Field; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; @@ -46,7 +67,6 @@ import gregtech.api.util.GT_Recipe.GT_Recipe_Map; import gregtech.api.util.GT_Utility; import gtPlusPlus.api.objects.Logger; import gtPlusPlus.core.util.minecraft.ItemUtils; -import gtPlusPlus.core.util.reflect.ReflectionUtils; import gtPlusPlus.xmod.gregtech.common.StaticFields59; import gtPlusPlus.xmod.gregtech.loaders.misc.AssLineAchievements; import net.minecraft.client.Minecraft; @@ -73,11 +93,12 @@ public class ClassTransformer_GT_Client { * Let's just read the GT archive for some info */ mModern = findAssemblyLineClass(); - FMLRelaunchLog.log("[GT++ ASM] Gregtech Achievements Patch", Level.INFO, "Found Assembly Line? "+mModern+"."); + FMLRelaunchLog.log("[GT++ ASM] Gregtech Client Proxy Patch", Level.INFO, "Found Assembly Line? "+mModern+"."); if (mModern) { aTempReader.accept(new MethodAdaptor2(aTempWriter), 0); - FMLRelaunchLog.log("[GT++ ASM] Gregtech Achievements Patch", Level.INFO, "Patching Client handling of Assembly Line recipe visibility for GT 5.09"); - injectMethod(aTempWriter); + FMLRelaunchLog.log("[GT++ ASM] Gregtech Client Proxy Patch", Level.INFO, "Patching Client handling of Assembly Line recipe visibility for GT 5.09"); + injectMethod(aTempWriter, "onPlayerTickEventClient"); + injectMethod(aTempWriter, "onPostLoad"); if (aTempReader != null && aTempWriter != null) { valid = true; mTooledClass = aTempWriter.toByteArray(); @@ -90,7 +111,7 @@ public class ClassTransformer_GT_Client { mTooledClass = basicClass; valid = true; } - FMLRelaunchLog.log("[GT++ ASM] Gregtech Achievements Patch", Level.INFO, "Valid? "+valid+"."); + FMLRelaunchLog.log("[GT++ ASM] Gregtech Client Proxy Patch", Level.INFO, "Valid? "+valid+"."); read = aTempReader; write = aTempWriter; } @@ -114,7 +135,7 @@ public class ClassTransformer_GT_Client { if (classesInPackage != null && classesInPackage.size() > 0) { for (ClassInfo x : classesInPackage) { if (x.getResourceName().contains("GT_MetaTileEntity_AssemblyLine")) { - FMLRelaunchLog.log("[GT++ ASM] Gregtech Achievements Patch", Level.INFO, + FMLRelaunchLog.log("[GT++ ASM] Gregtech Client Proxy Patch", Level.INFO, "Patchable class | " + x.getResourceName()); return true; } @@ -123,7 +144,7 @@ public class ClassTransformer_GT_Client { } catch (IOException e) { } - FMLRelaunchLog.log("[GT++ ASM] Gregtech Achievements Patch", Level.INFO, "Failed to find Gregtech classes using prefered method, using backup."); + FMLRelaunchLog.log("[GT++ ASM] Gregtech Client Proxy Patch", Level.INFO, "Failed to find Gregtech classes using prefered method, using backup."); cl = ClassLoader.getSystemClassLoader(); ImmutableMap<File, ClassLoader> g = getClassPathEntries(cl); @@ -136,7 +157,7 @@ public class ClassTransformer_GT_Client { aName = aF.getName(); if (aName != null && aName.length() > 0) { if (aName.toLowerCase().contains("gregtech")) { - FMLRelaunchLog.log("[GT++ ASM] Gregtech Achievements Patch", Level.INFO, "Patchable class | "+aName); + FMLRelaunchLog.log("[GT++ ASM] Gregtech Client Proxy Patch", Level.INFO, "Patchable class | "+aName); aGregtech = aF; } } @@ -154,7 +175,7 @@ public class ClassTransformer_GT_Client { JarEntry je; while((je=jis.getNextJarEntry())!=null){ if (je.getName().contains("GT_MetaTileEntity_AssemblyLine")) { - FMLRelaunchLog.log("[GT++ ASM] Gregtech Achievements Patch", Level.INFO, "Patchable class | "+je.getName()); + FMLRelaunchLog.log("[GT++ ASM] Gregtech Client Proxy Patch", Level.INFO, "Patchable class | "+je.getName()); return true; } } @@ -163,7 +184,7 @@ public class ClassTransformer_GT_Client { } catch (IOException e1) { } } - FMLRelaunchLog.log("[GT++ ASM] Gregtech Achievements Patch", Level.INFO, "Failed to find Gregtech classes using backup method, probably using GT 5.08"); + FMLRelaunchLog.log("[GT++ ASM] Gregtech Client Proxy Patch", Level.INFO, "Failed to find Gregtech classes using backup method, probably using GT 5.08"); return false; } @@ -189,277 +210,154 @@ public class ClassTransformer_GT_Client { return ImmutableMap.copyOf(entries); } - public boolean injectMethod(ClassWriter cw) { + public boolean injectMethod(ClassWriter cw, String string) { MethodVisitor mv; boolean didInject = false; - FMLRelaunchLog.log("[GT++ ASM] Gregtech Achievements Patch", Level.INFO, "Injecting " + "onPlayerTickEventClient" + "."); - - /** - * Inject new, safer code - */ - - AnnotationVisitor av0; - - - /** - * Full Patch ASM - Original Idea, now second to static injection of a custom handler. - */ - - /*mv = cw.visitMethod(ACC_PUBLIC, "onPlayerTickEventClient", "(Lcpw/mods/fml/common/gameevent/TickEvent$PlayerTickEvent;)V", null, null); - { + FMLRelaunchLog.log("[GT++ ASM] Gregtech Client Proxy Patch", Level.INFO, "Injecting " + string + "."); + + if (string.equals("onPlayerTickEventClient")) { + /** + * Inject new, safer code + */ + AnnotationVisitor av0; + /** + * Static invocation of custom handler instead + */ + mv = cw.visitMethod(ACC_PUBLIC, "onPlayerTickEventClient", "(Lcpw/mods/fml/common/gameevent/TickEvent$PlayerTickEvent;)V", null, null); av0 = mv.visitAnnotation("Lcpw/mods/fml/common/eventhandler/SubscribeEvent;", true); av0.visitEnd(); + mv.visitCode(); + Label l0 = new Label(); + mv.visitLabel(l0); + mv.visitLineNumber(371, l0); + mv.visitVarInsn(ALOAD, 1); + mv.visitMethodInsn(INVOKESTATIC, "gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_Client", "onPlayerTickEventClient", "(Lcpw/mods/fml/common/gameevent/TickEvent$PlayerTickEvent;)V", false); + Label l1 = new Label(); + mv.visitLabel(l1); + mv.visitLineNumber(372, l1); + mv.visitInsn(RETURN); + Label l2 = new Label(); + mv.visitLabel(l2); + mv.visitLocalVariable("this", "Lgregtech/common/GT_Client;", null, l0, l2, 0); + mv.visitLocalVariable("aEvent", "Lcpw/mods/fml/common/gameevent/TickEvent$PlayerTickEvent;", null, l0, l2, 1); + mv.visitMaxs(1, 2); + mv.visitEnd(); } - mv.visitCode(); - Label l0 = new Label(); - Label l1 = new Label(); - Label l2 = new Label(); - mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Exception"); - Label l3 = new Label(); - mv.visitLabel(l3); - mv.visitLineNumber(370, l3); - mv.visitVarInsn(ALOAD, 1); - mv.visitFieldInsn(GETFIELD, "cpw/mods/fml/common/gameevent/TickEvent$PlayerTickEvent", "side", "Lcpw/mods/fml/relauncher/Side;"); - mv.visitMethodInsn(INVOKEVIRTUAL, "cpw/mods/fml/relauncher/Side", "isClient", "()Z", false); - Label l4 = new Label(); - mv.visitJumpInsn(IFEQ, l4); - mv.visitVarInsn(ALOAD, 1); - mv.visitFieldInsn(GETFIELD, "cpw/mods/fml/common/gameevent/TickEvent$PlayerTickEvent", "phase", "Lcpw/mods/fml/common/gameevent/TickEvent$Phase;"); - mv.visitFieldInsn(GETSTATIC, "cpw/mods/fml/common/gameevent/TickEvent$Phase", "END", "Lcpw/mods/fml/common/gameevent/TickEvent$Phase;"); - mv.visitJumpInsn(IF_ACMPNE, l4); - mv.visitVarInsn(ALOAD, 1); - mv.visitFieldInsn(GETFIELD, "cpw/mods/fml/common/gameevent/TickEvent$PlayerTickEvent", "player", "Lnet/minecraft/entity/player/EntityPlayer;"); - mv.visitFieldInsn(GETFIELD, "net/minecraft/entity/player/EntityPlayer", "isDead", "Z"); - mv.visitJumpInsn(IFNE, l4); - Label l5 = new Label(); - mv.visitLabel(l5); - mv.visitLineNumber(371, l5); - mv.visitVarInsn(ALOAD, 0); - mv.visitInsn(DUP); - mv.visitFieldInsn(GETFIELD, "gregtech/common/GT_Client", "afterSomeTime", "J"); - mv.visitInsn(LCONST_1); - mv.visitInsn(LADD); - mv.visitFieldInsn(PUTFIELD, "gregtech/common/GT_Client", "afterSomeTime", "J"); - Label l6 = new Label(); - mv.visitLabel(l6); - mv.visitLineNumber(372, l6); - mv.visitVarInsn(ALOAD, 0); - mv.visitFieldInsn(GETFIELD, "gregtech/common/GT_Client", "afterSomeTime", "J"); - mv.visitLdcInsn(new Long(100L)); - mv.visitInsn(LCMP); - Label l7 = new Label(); - mv.visitJumpInsn(IFLT, l7); - Label l8 = new Label(); - mv.visitLabel(l8); - mv.visitLineNumber(373, l8); - mv.visitVarInsn(ALOAD, 0); - mv.visitInsn(LCONST_0); - mv.visitFieldInsn(PUTFIELD, "gregtech/common/GT_Client", "afterSomeTime", "J"); - Label l9 = new Label(); - mv.visitLabel(l9); - mv.visitLineNumber(374, l9); - mv.visitMethodInsn(INVOKESTATIC, "net/minecraft/client/Minecraft", "getMinecraft", "()Lnet/minecraft/client/Minecraft;", false); - mv.visitFieldInsn(GETFIELD, "net/minecraft/client/Minecraft", "thePlayer", "Lnet/minecraft/client/entity/EntityClientPlayerMP;"); - mv.visitMethodInsn(INVOKEVIRTUAL, "net/minecraft/client/entity/EntityClientPlayerMP", "getStatFileWriter", "()Lnet/minecraft/stats/StatFileWriter;", false); - mv.visitVarInsn(ASTORE, 2); - mv.visitLabel(l0); - mv.visitLineNumber(376, l0); - mv.visitFieldInsn(GETSTATIC, "gregtech/api/util/GT_Recipe$GT_Recipe_Map", "sAssemblylineVisualRecipes", "Lgregtech/api/util/GT_Recipe$GT_Recipe_Map;"); - mv.visitFieldInsn(GETFIELD, "gregtech/api/util/GT_Recipe$GT_Recipe_Map", "mRecipeList", "Ljava/util/Collection;"); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Collection", "iterator", "()Ljava/util/Iterator;", true); - mv.visitVarInsn(ASTORE, 4); - Label l10 = new Label(); - mv.visitJumpInsn(GOTO, l10); - Label l11 = new Label(); - mv.visitLabel(l11); - mv.visitFrame(F_FULL, 5, new Object[] {"gregtech/common/GT_Client", "cpw/mods/fml/common/gameevent/TickEvent$PlayerTickEvent", "net/minecraft/stats/StatFileWriter", TOP, "java/util/Iterator"}, 0, new Object[] {}); - mv.visitVarInsn(ALOAD, 4); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "next", "()Ljava/lang/Object;", true); - mv.visitTypeInsn(CHECKCAST, "gregtech/api/util/GT_Recipe"); - mv.visitVarInsn(ASTORE, 3); - Label l12 = new Label(); - mv.visitLabel(l12); - mv.visitLineNumber(377, l12); - mv.visitVarInsn(ALOAD, 3); - mv.visitVarInsn(ALOAD, 2); - mv.visitVarInsn(ALOAD, 3); - mv.visitInsn(ICONST_0); - mv.visitMethodInsn(INVOKEVIRTUAL, "gregtech/api/util/GT_Recipe", "getOutput", "(I)Lnet/minecraft/item/ItemStack;", false); - mv.visitMethodInsn(INVOKEVIRTUAL, "net/minecraft/item/ItemStack", "getUnlocalizedName", "()Ljava/lang/String;", false); - mv.visitMethodInsn(INVOKESTATIC, "gtPlusPlus/xmod/gregtech/loaders/misc/AssLineAchievements", "getAchievement", "(Ljava/lang/String;)Lnet/minecraft/stats/Achievement;", false); - mv.visitMethodInsn(INVOKEVIRTUAL, "net/minecraft/stats/StatFileWriter", "hasAchievementUnlocked", "(Lnet/minecraft/stats/Achievement;)Z", false); - Label l13 = new Label(); - mv.visitJumpInsn(IFEQ, l13); - mv.visitInsn(ICONST_0); - Label l14 = new Label(); - mv.visitJumpInsn(GOTO, l14); - mv.visitLabel(l13); - mv.visitFrame(F_FULL, 5, new Object[] {"gregtech/common/GT_Client", "cpw/mods/fml/common/gameevent/TickEvent$PlayerTickEvent", "net/minecraft/stats/StatFileWriter", "gregtech/api/util/GT_Recipe", "java/util/Iterator"}, 1, new Object[] {"gregtech/api/util/GT_Recipe"}); - mv.visitInsn(ICONST_1); - mv.visitLabel(l14); - mv.visitFrame(F_FULL, 5, new Object[] {"gregtech/common/GT_Client", "cpw/mods/fml/common/gameevent/TickEvent$PlayerTickEvent", "net/minecraft/stats/StatFileWriter", "gregtech/api/util/GT_Recipe", "java/util/Iterator"}, 2, new Object[] {"gregtech/api/util/GT_Recipe", INTEGER}); - mv.visitFieldInsn(PUTFIELD, "gregtech/api/util/GT_Recipe", "mHidden", "Z"); - mv.visitLabel(l10); - mv.visitLineNumber(376, l10); - mv.visitFrame(F_FULL, 5, new Object[] {"gregtech/common/GT_Client", "cpw/mods/fml/common/gameevent/TickEvent$PlayerTickEvent", "net/minecraft/stats/StatFileWriter", TOP, "java/util/Iterator"}, 0, new Object[] {}); - mv.visitVarInsn(ALOAD, 4); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "hasNext", "()Z", true); - mv.visitJumpInsn(IFNE, l11); - mv.visitLabel(l1); - mv.visitLineNumber(379, l1); - mv.visitJumpInsn(GOTO, l7); - mv.visitLabel(l2); - mv.visitFrame(F_FULL, 3, new Object[] {"gregtech/common/GT_Client", "cpw/mods/fml/common/gameevent/TickEvent$PlayerTickEvent", "net/minecraft/stats/StatFileWriter"}, 1, new Object[] {"java/lang/Exception"}); - mv.visitVarInsn(ASTORE, 3); - mv.visitLabel(l7); - mv.visitLineNumber(381, l7); - mv.visitFrame(F_CHOP,1, null, 0, null); - mv.visitTypeInsn(NEW, "java/util/ArrayList"); - mv.visitInsn(DUP); - mv.visitMethodInsn(INVOKESPECIAL, "java/util/ArrayList", "<init>", "()V", false); - mv.visitVarInsn(ASTORE, 2); - Label l15 = new Label(); - mv.visitLabel(l15); - mv.visitLineNumber(382, l15); - mv.visitFieldInsn(GETSTATIC, "gregtech/api/util/GT_Utility", "sPlayedSoundMap", "Ljava/util/Map;"); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "entrySet", "()Ljava/util/Set;", true); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Set", "iterator", "()Ljava/util/Iterator;", true); - mv.visitVarInsn(ASTORE, 4); - Label l16 = new Label(); - mv.visitJumpInsn(GOTO, l16); - Label l17 = new Label(); - mv.visitLabel(l17); - mv.visitFrame(F_FULL, 5, new Object[] {"gregtech/common/GT_Client", "cpw/mods/fml/common/gameevent/TickEvent$PlayerTickEvent", "java/util/ArrayList", TOP, "java/util/Iterator"}, 0, new Object[] {}); - mv.visitVarInsn(ALOAD, 4); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "next", "()Ljava/lang/Object;", true); - mv.visitTypeInsn(CHECKCAST, "java/util/Map$Entry"); - mv.visitVarInsn(ASTORE, 3); - Label l18 = new Label(); - mv.visitLabel(l18); - mv.visitLineNumber(383, l18); - mv.visitVarInsn(ALOAD, 3); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map$Entry", "getValue", "()Ljava/lang/Object;", true); - mv.visitTypeInsn(CHECKCAST, "java/lang/Integer"); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Integer", "intValue", "()I", false); - Label l19 = new Label(); - mv.visitJumpInsn(IFGE, l19); - Label l20 = new Label(); - mv.visitLabel(l20); - mv.visitLineNumber(384, l20); - mv.visitVarInsn(ALOAD, 2); - mv.visitVarInsn(ALOAD, 3); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map$Entry", "getKey", "()Ljava/lang/Object;", true); - mv.visitTypeInsn(CHECKCAST, "gregtech/api/util/GT_PlayedSound"); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/util/ArrayList", "add", "(Ljava/lang/Object;)Z", false); - mv.visitInsn(POP); - Label l21 = new Label(); - mv.visitLabel(l21); - mv.visitLineNumber(385, l21); - mv.visitJumpInsn(GOTO, l16); - mv.visitLabel(l19); - mv.visitLineNumber(386, l19); - mv.visitFrame(F_FULL, 5, new Object[] {"gregtech/common/GT_Client", "cpw/mods/fml/common/gameevent/TickEvent$PlayerTickEvent", "java/util/ArrayList", "java/util/Map$Entry", "java/util/Iterator"}, 0, new Object[] {}); - mv.visitVarInsn(ALOAD, 3); - mv.visitVarInsn(ALOAD, 3); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map$Entry", "getValue", "()Ljava/lang/Object;", true); - mv.visitTypeInsn(CHECKCAST, "java/lang/Integer"); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Integer", "intValue", "()I", false); - mv.visitInsn(ICONST_1); - mv.visitInsn(ISUB); - mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;", false); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map$Entry", "setValue", "(Ljava/lang/Object;)Ljava/lang/Object;", true); - mv.visitInsn(POP); - mv.visitLabel(l16); - mv.visitLineNumber(382, l16); - mv.visitFrame(F_FULL, 5, new Object[] {"gregtech/common/GT_Client", "cpw/mods/fml/common/gameevent/TickEvent$PlayerTickEvent", "java/util/ArrayList", TOP, "java/util/Iterator"}, 0, new Object[] {}); - mv.visitVarInsn(ALOAD, 4); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "hasNext", "()Z", true); - mv.visitJumpInsn(IFNE, l17); - Label l22 = new Label(); - mv.visitLabel(l22); - mv.visitLineNumber(390, l22); - mv.visitVarInsn(ALOAD, 2); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/util/ArrayList", "iterator", "()Ljava/util/Iterator;", false); - mv.visitVarInsn(ASTORE, 4); - Label l23 = new Label(); - mv.visitLabel(l23); - Label l24 = new Label(); - mv.visitJumpInsn(GOTO, l24); - Label l25 = new Label(); - mv.visitLabel(l25); - mv.visitLineNumber(391, l25); - mv.visitFrame(F_SAME, 0, null, 0, null); - mv.visitVarInsn(ALOAD, 4); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "next", "()Ljava/lang/Object;", true); - mv.visitTypeInsn(CHECKCAST, "gregtech/api/util/GT_PlayedSound"); - mv.visitVarInsn(ASTORE, 3); - Label l26 = new Label(); - mv.visitLabel(l26); - mv.visitLineNumber(390, l26); - mv.visitFieldInsn(GETSTATIC, "gregtech/api/util/GT_Utility", "sPlayedSoundMap", "Ljava/util/Map;"); - mv.visitVarInsn(ALOAD, 3); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "remove", "(Ljava/lang/Object;)Ljava/lang/Object;", true); - mv.visitInsn(POP); - mv.visitLabel(l24); - mv.visitFrame(F_SAME, 0, null, 0, null); - mv.visitVarInsn(ALOAD, 4); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "hasNext", "()Z", true); - mv.visitJumpInsn(IFNE, l25); - Label l27 = new Label(); - mv.visitLabel(l27); - mv.visitLineNumber(393, l27); - mv.visitFieldInsn(GETSTATIC, "gregtech/api/GregTech_API", "mServerStarted", "Z"); - mv.visitJumpInsn(IFNE, l4); - Label l28 = new Label(); - mv.visitLabel(l28); - mv.visitLineNumber(394, l28); - mv.visitInsn(ICONST_1); - mv.visitFieldInsn(PUTSTATIC, "gregtech/api/GregTech_API", "mServerStarted", "Z"); - mv.visitLabel(l4); - mv.visitLineNumber(397, l4); - mv.visitFrame(F_FULL, 2, new Object[] {"gregtech/common/GT_Client", "cpw/mods/fml/common/gameevent/TickEvent$PlayerTickEvent"}, 0, new Object[] {}); - mv.visitInsn(RETURN); - Label l29 = new Label(); - mv.visitLabel(l29); - mv.visitLocalVariable("this", "Lgregtech/common/GT_Client;", null, l3, l29, 0); - mv.visitLocalVariable("aEvent", "Lcpw/mods/fml/common/gameevent/TickEvent$PlayerTickEvent;", null, l3, l29, 1); - mv.visitLocalVariable("sfw", "Lnet/minecraft/stats/StatFileWriter;", null, l0, l7, 2); - mv.visitLocalVariable("recipe", "Lgregtech/api/util/GT_Recipe;", null, l12, l10, 3); - mv.visitLocalVariable("tList", "Ljava/util/ArrayList;", "Ljava/util/ArrayList<Lgregtech/api/util/GT_PlayedSound;>;", l15, l4, 2); - mv.visitLocalVariable("tEntry", "Ljava/util/Map$Entry;", "Ljava/util/Map$Entry<Lgregtech/api/util/GT_PlayedSound;Ljava/lang/Integer;>;", l18, l16, 3); - mv.visitLocalVariable("tKey", "Lgregtech/api/util/GT_PlayedSound;", null, l26, l24, 3); - mv.visitLocalVariable("i", "Ljava/util/Iterator;", "Ljava/util/Iterator<Lgregtech/api/util/GT_PlayedSound;>;", l23, l27, 4); - mv.visitMaxs(5, 5); - mv.visitEnd();*/ - - /** - * Static invocation of custom handler instead - */ + else if (string.equals("onPostLoad")) { + String aItemStackClassName; + String aEntityPlayerClassName; + + try { + aItemStackClassName = Class.forName("net/minecraft/item/ItemStack") != null ? "net/minecraft/item/ItemStack" : "add"; + } catch (ClassNotFoundException e) { + aItemStackClassName = "add"; + } + + try { + aEntityPlayerClassName = Class.forName("net/minecraft/entity/player/EntityPlayer") != null ? "net/minecraft/entity/player/EntityPlayer" : "yz"; + } catch (ClassNotFoundException e) { + aEntityPlayerClassName = "yz"; + } + + mv = cw.visitMethod(ACC_PUBLIC, "onPostLoad", "()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"); + Label l3 = new Label(); + Label l4 = new Label(); + Label l5 = new Label(); + mv.visitTryCatchBlock(l3, l4, l5, "java/lang/Throwable"); + Label l6 = new Label(); + mv.visitLabel(l6); + mv.visitLineNumber(315, l6); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn(INVOKESPECIAL, "gregtech/common/GT_Proxy", "onPostLoad", "()V", false); + mv.visitLabel(l3); + mv.visitLineNumber(317, l3); + mv.visitInsn(ICONST_0); + mv.visitVarInsn(ISTORE, 1); + Label l7 = new Label(); + mv.visitLabel(l7); + Label l8 = new Label(); + mv.visitJumpInsn(GOTO, l8); + mv.visitLabel(l0); + mv.visitLineNumber(319, l0); + mv.visitFrame(F_APPEND,1, new Object[] {INTEGER}, 0, null); + mv.visitFieldInsn(GETSTATIC, "gregtech/api/GregTech_API", "METATILEENTITIES", "[Lgregtech/api/interfaces/metatileentity/IMetaTileEntity;"); + mv.visitVarInsn(ILOAD, 1); + mv.visitInsn(AALOAD); + Label l9 = new Label(); + mv.visitJumpInsn(IFNULL, l9); + Label l10 = new Label(); + mv.visitLabel(l10); + mv.visitLineNumber(320, l10); + mv.visitFieldInsn(GETSTATIC, "gregtech/api/GregTech_API", "METATILEENTITIES", "[Lgregtech/api/interfaces/metatileentity/IMetaTileEntity;"); + mv.visitVarInsn(ILOAD, 1); + mv.visitInsn(AALOAD); + mv.visitInsn(LCONST_1); + mv.visitMethodInsn(INVOKEINTERFACE, "gregtech/api/interfaces/metatileentity/IMetaTileEntity", "getStackForm", "(J)L"+aItemStackClassName+";", true); + mv.visitInsn(ACONST_NULL); + mv.visitInsn(ICONST_1); + mv.visitMethodInsn(INVOKEVIRTUAL, ""+aItemStackClassName+"", "getTooltip", "(L"+aEntityPlayerClassName+";Z)Ljava/util/List;", false); + mv.visitInsn(POP); + mv.visitLabel(l1); + mv.visitLineNumber(322, l1); + mv.visitJumpInsn(GOTO, l9); + mv.visitLabel(l2); + mv.visitLineNumber(323, l2); + mv.visitFrame(F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"}); + mv.visitVarInsn(ASTORE, 2); + Label l11 = new Label(); + mv.visitLabel(l11); + mv.visitLineNumber(324, l11); + mv.visitVarInsn(ALOAD, 2); + 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(l9); + mv.visitLineNumber(317, l9); + mv.visitFrame(F_SAME, 0, null, 0, null); + mv.visitIincInsn(1, 1); + mv.visitLabel(l8); + mv.visitFrame(F_SAME, 0, null, 0, null); + mv.visitVarInsn(ILOAD, 1); + mv.visitFieldInsn(GETSTATIC, "gregtech/api/GregTech_API", "METATILEENTITIES", "[Lgregtech/api/interfaces/metatileentity/IMetaTileEntity;"); + mv.visitInsn(ARRAYLENGTH); + mv.visitJumpInsn(IF_ICMPLT, l0); + mv.visitLabel(l4); + mv.visitLineNumber(327, l4); + Label l12 = new Label(); + mv.visitJumpInsn(GOTO, l12); + mv.visitLabel(l5); + mv.visitFrame(F_FULL, 1, new Object[] {"gregtech/common/GT_Client"}, 1, new Object[] {"java/lang/Throwable"}); + mv.visitVarInsn(ASTORE, 1); + Label l13 = new Label(); + mv.visitLabel(l13); + mv.visitLineNumber(328, l13); + mv.visitVarInsn(ALOAD, 1); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Throwable", "printStackTrace", "()V", false); + mv.visitLabel(l12); + mv.visitLineNumber(330, l12); + mv.visitFrame(F_SAME, 0, null, 0, null); + mv.visitInsn(RETURN); + Label l14 = new Label(); + mv.visitLabel(l14); + mv.visitLocalVariable("this", "Lgregtech/common/GT_Client;", null, l6, l14, 0); + mv.visitLocalVariable("i", "I", null, l7, l4, 1); + mv.visitLocalVariable("t", "Ljava/lang/Throwable;", null, l11, l9, 2); + mv.visitLocalVariable("var2", "Ljava/lang/Throwable;", null, l13, l12, 1); + mv.visitMaxs(3, 3); + mv.visitEnd(); + } + + - mv = cw.visitMethod(ACC_PUBLIC, "onPlayerTickEventClient", "(Lcpw/mods/fml/common/gameevent/TickEvent$PlayerTickEvent;)V", null, null); - av0 = mv.visitAnnotation("Lcpw/mods/fml/common/eventhandler/SubscribeEvent;", true); - av0.visitEnd(); - mv.visitCode(); - Label l0 = new Label(); - mv.visitLabel(l0); - mv.visitLineNumber(371, l0); - mv.visitVarInsn(ALOAD, 1); - mv.visitMethodInsn(INVOKESTATIC, "gtPlusPlus/preloader/asm/transformers/ClassTransformer_GT_Client", "onPlayerTickEventClient", "(Lcpw/mods/fml/common/gameevent/TickEvent$PlayerTickEvent;)V", false); - Label l1 = new Label(); - mv.visitLabel(l1); - mv.visitLineNumber(372, l1); - mv.visitInsn(RETURN); - Label l2 = new Label(); - mv.visitLabel(l2); - mv.visitLocalVariable("this", "Lgregtech/common/GT_Client;", null, l0, l2, 0); - mv.visitLocalVariable("aEvent", "Lcpw/mods/fml/common/gameevent/TickEvent$PlayerTickEvent;", null, l0, l2, 1); - mv.visitMaxs(1, 2); - mv.visitEnd(); didInject = true; - FMLRelaunchLog.log("[GT++ ASM] Gregtech Achievements Patch", Level.INFO, "Method injection complete."); + FMLRelaunchLog.log("[GT++ ASM] Gregtech Client Proxy Patch", Level.INFO, "Method injection complete."); return didInject; } @@ -474,11 +372,12 @@ public class ClassTransformer_GT_Client { @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor methodVisitor; - if (name.equals("onPlayerTickEventClient")) { - FMLRelaunchLog.log("[GT++ ASM] Gregtech Achievements Patch", Level.INFO, + if (name.equals("onPlayerTickEventClient") || name.equals("onPostLoad")) { + FMLRelaunchLog.log("[GT++ ASM] Gregtech Client Proxy Patch", Level.INFO, "Found method " + name + ", removing."); methodVisitor = null; - } else { + } + else { methodVisitor = super.visitMethod(access, name, desc, signature, exceptions); } return methodVisitor; |