From 7d1f51a8937e0a86486267437d444696e81e8aa0 Mon Sep 17 00:00:00 2001 From: Jakub <53441451+kuba6000@users.noreply.github.com> Date: Mon, 29 Aug 2022 16:04:28 +0200 Subject: Buildscript + Spotless (#318) * Convert AES.java to readable class * Buildscript * Spotless --- .../ClassTransformer_CC_GuiContainerManager.java | 223 +- ...ClassTransformer_COFH_OreDictionaryArbiter.java | 331 +- .../ClassTransformer_Forge_ChunkLoading.java | 1653 +++++--- ...ansformer_Forge_EntityLivingBase_SetHealth.java | 221 +- .../ClassTransformer_GC_EntityAutoRocket.java | 1187 +++--- .../ClassTransformer_GC_FluidUtil.java | 525 +-- .../ClassTransformer_GC_FuelLoader.java | 1591 +++++--- .../ClassTransformer_GT_Achievements.java | 4272 +++++++++++--------- .../ClassTransformer_GT_Achievements_CrashFix.java | 440 +- .../ClassTransformer_GT_BaseMetaTileEntity.java | 313 +- ...ransformer_GT_BlockMachines_MetaPipeEntity.java | 512 +-- .../ClassTransformer_GT_BlockMachines_NBT.java | 387 +- .../ClassTransformer_GT_CharcoalPit.java | 353 +- .../transformers/ClassTransformer_GT_Client.java | 764 ++-- .../ClassTransformer_GT_ItemMachines_Tooltip.java | 268 +- .../ClassTransformer_GT_MetaGenerated_Tool.java | 184 +- .../ClassTransformer_GT_Packet_TileEntity.java | 636 +-- .../transformers/ClassTransformer_GT_Utility.java | 546 +-- .../ClassTransformer_IC2_GetHarvestTool.java | 404 +- .../transformers/ClassTransformer_IC2_Hazmat.java | 272 +- .../ClassTransformer_LWJGL_Keyboard.java | 532 +-- ...assTransformer_Railcraft_FluidCartHandling.java | 202 +- .../ClassTransformer_Railcraft_FluidHelper.java | 1688 +++++--- .../ClassTransformer_Railcraft_InvTools.java | 428 +- .../ClassTransformer_TC_ItemWispEssence.java | 476 ++- .../ClassTransformer_TT_ThaumicRestorer.java | 1216 +++--- .../transformers/ClassTransformer_TiConFluids.java | 296 +- .../transformers/Preloader_ClassTransformer.java | 115 +- .../transformers/Preloader_ClassTransformer2.java | 21 +- .../Preloader_Transformer_Handler.java | 563 +-- 30 files changed, 11467 insertions(+), 9152 deletions(-) (limited to 'src/main/java/gtPlusPlus/preloader/asm/transformers') diff --git a/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_CC_GuiContainerManager.java b/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_CC_GuiContainerManager.java index 8791d401c8..ee463d6cca 100644 --- a/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_CC_GuiContainerManager.java +++ b/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_CC_GuiContainerManager.java @@ -2,120 +2,121 @@ package gtPlusPlus.preloader.asm.transformers; import static org.objectweb.asm.Opcodes.*; +import gtPlusPlus.preloader.Preloader_Logger; import org.apache.logging.log4j.Level; import org.objectweb.asm.*; -import gtPlusPlus.preloader.Preloader_Logger; - public class ClassTransformer_CC_GuiContainerManager { - private final boolean isValid; - private final ClassReader reader; - private final ClassWriter writer; - - public ClassTransformer_CC_GuiContainerManager(byte[] basicClass) { - - ClassReader aTempReader = null; - ClassWriter aTempWriter = null; - - aTempReader = new ClassReader(basicClass); - aTempWriter = new ClassWriter(aTempReader, ClassWriter.COMPUTE_FRAMES); - localClassVisitor aTempMethodRemover = new localClassVisitor(aTempWriter); - aTempReader.accept(aTempMethodRemover, 0); - - if (aTempReader != null && aTempWriter != null) { - isValid = true; - } else { - isValid = false; - } - - Preloader_Logger.LOG("CodeChicken GuiContainerManager Patch", Level.INFO, "Valid patch? " + isValid + "."); - reader = aTempReader; - writer = aTempWriter; - - if (reader != null && writer != null) { - Preloader_Logger.LOG("CodeChicken GuiContainerManager Patch", Level.INFO, "Attempting Method Injection."); - injectMethod("mouseUp"); - } - - } - - public boolean isValidTransformer() { - return isValid; - } - - public ClassReader getReader() { - return reader; - } - - public ClassWriter getWriter() { - return writer; - } - - public boolean injectMethod(String aMethodName) { - MethodVisitor mv; - boolean didInject = false; - String aClassName = "codechicken/nei/guihook/GuiContainerManager"; - ClassWriter cw = getWriter(); - if (aMethodName.equals("mouseUp")) { - Preloader_Logger.LOG("CodeChicken GuiContainerManager Patch", Level.INFO, "Injecting " + aMethodName + ", static replacement call to "+aClassName+"."); - mv = cw.visitMethod(ACC_PUBLIC, "mouseUp", "(III)V", null, null); - mv.visitCode(); - Label l0 = new Label(); - mv.visitLabel(l0); - mv.visitLineNumber(12, l0); - mv.visitVarInsn(ILOAD, 1); - mv.visitVarInsn(ILOAD, 2); - mv.visitVarInsn(ILOAD, 3); - mv.visitMethodInsn(INVOKESTATIC, "gtPlusPlus/preloader/asm/helpers/MethodHelper_CC", "mouseUp", "(III)V", false); - Label l1 = new Label(); - mv.visitLabel(l1); - mv.visitLineNumber(13, l1); - mv.visitInsn(RETURN); - Label l2 = new Label(); - mv.visitLabel(l2); - mv.visitLocalVariable("this", "L+aClassName+;", null, l0, l2, 0); - mv.visitLocalVariable("mousex", "I", null, l0, l2, 1); - mv.visitLocalVariable("mousey", "I", null, l0, l2, 2); - mv.visitLocalVariable("button", "I", null, l0, l2, 3); - mv.visitMaxs(3, 4); - mv.visitEnd(); - didInject = true; - } - - Preloader_Logger.LOG("CodeChicken GuiContainerManager Patch", Level.INFO, "Method injection complete."); - return didInject; - } - - public final class localClassVisitor extends ClassVisitor { - - boolean obfuscated = false; - - public localClassVisitor(ClassVisitor cv) { - super(ASM5, cv); - } - - public boolean getObfuscatedRemoval() { - return obfuscated; - } - - @Override - public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { - MethodVisitor methodVisitor; - - if (name.equals("mouseUp")) { - methodVisitor = null; - } - else { - methodVisitor = super.visitMethod(access, name, desc, signature, exceptions); - } - - if (methodVisitor == null) { - Preloader_Logger.LOG("CodeChicken GuiContainerManager Patch", Level.INFO, "Found method " + name + ", removing."); - Preloader_Logger.LOG("CodeChicken GuiContainerManager Patch", Level.INFO, "Descriptor: "+desc); - } - return methodVisitor; - } - } - + private final boolean isValid; + private final ClassReader reader; + private final ClassWriter writer; + + public ClassTransformer_CC_GuiContainerManager(byte[] basicClass) { + + ClassReader aTempReader = null; + ClassWriter aTempWriter = null; + + aTempReader = new ClassReader(basicClass); + aTempWriter = new ClassWriter(aTempReader, ClassWriter.COMPUTE_FRAMES); + localClassVisitor aTempMethodRemover = new localClassVisitor(aTempWriter); + aTempReader.accept(aTempMethodRemover, 0); + + if (aTempReader != null && aTempWriter != null) { + isValid = true; + } else { + isValid = false; + } + + Preloader_Logger.LOG("CodeChicken GuiContainerManager Patch", Level.INFO, "Valid patch? " + isValid + "."); + reader = aTempReader; + writer = aTempWriter; + + if (reader != null && writer != null) { + Preloader_Logger.LOG("CodeChicken GuiContainerManager Patch", Level.INFO, "Attempting Method Injection."); + injectMethod("mouseUp"); + } + } + + public boolean isValidTransformer() { + return isValid; + } + + public ClassReader getReader() { + return reader; + } + + public ClassWriter getWriter() { + return writer; + } + + public boolean injectMethod(String aMethodName) { + MethodVisitor mv; + boolean didInject = false; + String aClassName = "codechicken/nei/guihook/GuiContainerManager"; + ClassWriter cw = getWriter(); + if (aMethodName.equals("mouseUp")) { + Preloader_Logger.LOG( + "CodeChicken GuiContainerManager Patch", + Level.INFO, + "Injecting " + aMethodName + ", static replacement call to " + aClassName + "."); + mv = cw.visitMethod(ACC_PUBLIC, "mouseUp", "(III)V", null, null); + mv.visitCode(); + Label l0 = new Label(); + mv.visitLabel(l0); + mv.visitLineNumber(12, l0); + mv.visitVarInsn(ILOAD, 1); + mv.visitVarInsn(ILOAD, 2); + mv.visitVarInsn(ILOAD, 3); + mv.visitMethodInsn( + INVOKESTATIC, "gtPlusPlus/preloader/asm/helpers/MethodHelper_CC", "mouseUp", "(III)V", false); + Label l1 = new Label(); + mv.visitLabel(l1); + mv.visitLineNumber(13, l1); + mv.visitInsn(RETURN); + Label l2 = new Label(); + mv.visitLabel(l2); + mv.visitLocalVariable("this", "L+aClassName+;", null, l0, l2, 0); + mv.visitLocalVariable("mousex", "I", null, l0, l2, 1); + mv.visitLocalVariable("mousey", "I", null, l0, l2, 2); + mv.visitLocalVariable("button", "I", null, l0, l2, 3); + mv.visitMaxs(3, 4); + mv.visitEnd(); + didInject = true; + } + + Preloader_Logger.LOG("CodeChicken GuiContainerManager Patch", Level.INFO, "Method injection complete."); + return didInject; + } + + public final class localClassVisitor extends ClassVisitor { + + boolean obfuscated = false; + + public localClassVisitor(ClassVisitor cv) { + super(ASM5, cv); + } + + public boolean getObfuscatedRemoval() { + return obfuscated; + } + + @Override + public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { + MethodVisitor methodVisitor; + + if (name.equals("mouseUp")) { + methodVisitor = null; + } else { + methodVisitor = super.visitMethod(access, name, desc, signature, exceptions); + } + + if (methodVisitor == null) { + Preloader_Logger.LOG( + "CodeChicken GuiContainerManager Patch", Level.INFO, "Found method " + name + ", removing."); + Preloader_Logger.LOG("CodeChicken GuiContainerManager Patch", Level.INFO, "Descriptor: " + desc); + } + return methodVisitor; + } + } } diff --git a/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_COFH_OreDictionaryArbiter.java b/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_COFH_OreDictionaryArbiter.java index 6f08dc4ff5..eea82c33e5 100644 --- a/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_COFH_OreDictionaryArbiter.java +++ b/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_COFH_OreDictionaryArbiter.java @@ -7,179 +7,186 @@ import static org.objectweb.asm.Opcodes.ASM5; import static org.objectweb.asm.Opcodes.INVOKESTATIC; import static org.objectweb.asm.Opcodes.RETURN; -import java.util.ArrayList; - -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 cofh.core.util.oredict.OreDictionaryArbiter; +import cofh.lib.util.ItemWrapper; import com.google.common.base.Strings; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; - -import cofh.core.util.oredict.OreDictionaryArbiter; -import cofh.lib.util.ItemWrapper; import cpw.mods.fml.relauncher.FMLRelaunchLog; import gnu.trove.map.TMap; import gnu.trove.map.hash.THashMap; import gtPlusPlus.core.util.reflect.ReflectionUtils; import gtPlusPlus.preloader.DevHelper; +import java.util.ArrayList; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; +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; public class ClassTransformer_COFH_OreDictionaryArbiter { - //The qualified name of the class we plan to transform. - private static final String className = "cofh.core.util.oredict.OreDictionaryArbiter"; - //cofh/core/util/oredict/OreDictionaryArbiter - - private final boolean isValid; - private final ClassReader reader; - private final ClassWriter writer; - - public ClassTransformer_COFH_OreDictionaryArbiter(byte[] basicClass) { - ClassReader aTempReader = null; - ClassWriter aTempWriter = null; - aTempReader = new ClassReader(basicClass); - aTempWriter = new ClassWriter(aTempReader, ClassWriter.COMPUTE_FRAMES); - aTempReader.accept(new localClassVisitor(aTempWriter), 0); - - if (aTempReader != null && aTempWriter != null) { - isValid = true; - } - else { - isValid = false; - } - reader = aTempReader; - writer = aTempWriter; - - if (reader != null && writer != null) { - injectMethod("registerOreDictionaryEntry"); - } - - } - - public boolean isValidTransformer() { - return isValid; - } - - public ClassReader getReader() { - return reader; - } - - public ClassWriter getWriter() { - return writer; - } - - public void injectMethod(String aMethodName) { - - boolean isObfuscated; - try { - isObfuscated = Class.forName("net.minecraft.item.ItemStack") != null ? false : true; - } catch (ClassNotFoundException e) { - isObfuscated = true; - } - String aItemStack = isObfuscated ? DevHelper.getObfuscated("net/minecraft/item/ItemStack") : "net/minecraft/item/ItemStack"; - MethodVisitor mv; - if (aMethodName.equals("registerOreDictionaryEntry")) { - FMLRelaunchLog.log("[GT++ ASM] COFH OreDictionaryArbiter Patch", Level.INFO, "Injecting "+aMethodName+" into "+className+". ItemStack: "+aItemStack); - mv = getWriter().visitMethod(ACC_PUBLIC + ACC_STATIC, "registerOreDictionaryEntry", "(L"+aItemStack+";Ljava/lang/String;)V", null, null); - mv.visitCode(); - Label l0 = new Label(); - mv.visitLabel(l0); - mv.visitLineNumber(61, l0); - mv.visitVarInsn(ALOAD, 0); - mv.visitVarInsn(ALOAD, 1); - mv.visitMethodInsn(INVOKESTATIC, "gtPlusPlus/preloader/asm/transformers/ClassTransformer_COFH_OreDictionaryArbiter$FixCOFH", "registerOreDictionaryEntry", "(L"+aItemStack+";Ljava/lang/String;)V", false); - Label l1 = new Label(); - mv.visitLabel(l1); - mv.visitLineNumber(62, l1); - mv.visitInsn(RETURN); - Label l2 = new Label(); - mv.visitLabel(l2); - mv.visitLocalVariable("arg", "L"+aItemStack+";", null, l0, l2, 0); - mv.visitLocalVariable("arg0", "Ljava/lang/String;", null, l0, l2, 1); - mv.visitMaxs(2, 2); - mv.visitEnd(); - } - FMLRelaunchLog.log("[GT++ ASM] COFH OreDictionaryArbiter 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("registerOreDictionaryEntry")) { - FMLRelaunchLog.log("[GT++ ASM] COFH OreDictionaryArbiter Patch", Level.INFO, "Removing method "+name); - return null; - } - MethodVisitor methodVisitor = super.visitMethod(access, name, desc, signature, exceptions); - return methodVisitor; - } - } - - - - - @SuppressWarnings("unchecked") - public static class FixCOFH{ - - private static BiMap oreIDs; - private static TMap> oreStacks; - private static TMap> stackIDs; - private static TMap> stackNames; - - static { - try { - oreIDs = (BiMap) ReflectionUtils.getField(OreDictionaryArbiter.class, "oreIDs").get(null); - oreStacks = (TMap>) ReflectionUtils.getField(OreDictionaryArbiter.class, "oreStacks").get(null); - stackIDs = (TMap>) ReflectionUtils.getField(OreDictionaryArbiter.class, "stackIDs").get(null); - stackNames = (TMap>) ReflectionUtils.getField(OreDictionaryArbiter.class, "stackNames").get(null); - } - catch (Throwable t) { - oreIDs = HashBiMap.create(); - oreStacks = new THashMap>(); - stackIDs = new THashMap>(); - stackNames = new THashMap>(); - } - } - - public static void registerOreDictionaryEntry(ItemStack arg, String arg0) { - try { - if (arg == null) { - return; - } - if (arg.getItem() != null && !Strings.isNullOrEmpty(arg0)) { - int arg1 = OreDictionary.getOreID(arg0); - oreIDs.put(arg0, Integer.valueOf(arg1)); - if (!oreStacks.containsKey(Integer.valueOf(arg1))) { - oreStacks.put(Integer.valueOf(arg1), new ArrayList()); - } - ((ArrayList) oreStacks.get(Integer.valueOf(arg1))).add(arg); - ItemWrapper arg2 = ItemWrapper.fromItemStack(arg); - if (!stackIDs.containsKey(arg2)) { - stackIDs.put(arg2, new ArrayList()); - stackNames.put(arg2, new ArrayList()); - } - ((ArrayList) stackIDs.get(arg2)).add(Integer.valueOf(arg1)); - ((ArrayList) stackNames.get(arg2)).add(arg0); - } - } - catch (Throwable t) { - return; - } - } - } - - - - + // The qualified name of the class we plan to transform. + private static final String className = "cofh.core.util.oredict.OreDictionaryArbiter"; + // cofh/core/util/oredict/OreDictionaryArbiter + + private final boolean isValid; + private final ClassReader reader; + private final ClassWriter writer; + + public ClassTransformer_COFH_OreDictionaryArbiter(byte[] basicClass) { + ClassReader aTempReader = null; + ClassWriter aTempWriter = null; + aTempReader = new ClassReader(basicClass); + aTempWriter = new ClassWriter(aTempReader, ClassWriter.COMPUTE_FRAMES); + aTempReader.accept(new localClassVisitor(aTempWriter), 0); + + if (aTempReader != null && aTempWriter != null) { + isValid = true; + } else { + isValid = false; + } + reader = aTempReader; + writer = aTempWriter; + + if (reader != null && writer != null) { + injectMethod("registerOreDictionaryEntry"); + } + } + + public boolean isValidTransformer() { + return isValid; + } + + public ClassReader getReader() { + return reader; + } + + public ClassWriter getWriter() { + return writer; + } + + public void injectMethod(String aMethodName) { + + boolean isObfuscated; + try { + isObfuscated = Class.forName("net.minecraft.item.ItemStack") != null ? false : true; + } catch (ClassNotFoundException e) { + isObfuscated = true; + } + String aItemStack = + isObfuscated ? DevHelper.getObfuscated("net/minecraft/item/ItemStack") : "net/minecraft/item/ItemStack"; + MethodVisitor mv; + if (aMethodName.equals("registerOreDictionaryEntry")) { + FMLRelaunchLog.log( + "[GT++ ASM] COFH OreDictionaryArbiter Patch", + Level.INFO, + "Injecting " + aMethodName + " into " + className + ". ItemStack: " + aItemStack); + mv = getWriter() + .visitMethod( + ACC_PUBLIC + ACC_STATIC, + "registerOreDictionaryEntry", + "(L" + aItemStack + ";Ljava/lang/String;)V", + null, + null); + mv.visitCode(); + Label l0 = new Label(); + mv.visitLabel(l0); + mv.visitLineNumber(61, l0); + mv.visitVarInsn(ALOAD, 0); + mv.visitVarInsn(ALOAD, 1); + mv.visitMethodInsn( + INVOKESTATIC, + "gtPlusPlus/preloader/asm/transformers/ClassTransformer_COFH_OreDictionaryArbiter$FixCOFH", + "registerOreDictionaryEntry", + "(L" + aItemStack + ";Ljava/lang/String;)V", + false); + Label l1 = new Label(); + mv.visitLabel(l1); + mv.visitLineNumber(62, l1); + mv.visitInsn(RETURN); + Label l2 = new Label(); + mv.visitLabel(l2); + mv.visitLocalVariable("arg", "L" + aItemStack + ";", null, l0, l2, 0); + mv.visitLocalVariable("arg0", "Ljava/lang/String;", null, l0, l2, 1); + mv.visitMaxs(2, 2); + mv.visitEnd(); + } + FMLRelaunchLog.log("[GT++ ASM] COFH OreDictionaryArbiter 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("registerOreDictionaryEntry")) { + FMLRelaunchLog.log("[GT++ ASM] COFH OreDictionaryArbiter Patch", Level.INFO, "Removing method " + name); + return null; + } + MethodVisitor methodVisitor = super.visitMethod(access, name, desc, signature, exceptions); + return methodVisitor; + } + } + + @SuppressWarnings("unchecked") + public static class FixCOFH { + + private static BiMap oreIDs; + private static TMap> oreStacks; + private static TMap> stackIDs; + private static TMap> stackNames; + + static { + try { + oreIDs = (BiMap) ReflectionUtils.getField(OreDictionaryArbiter.class, "oreIDs") + .get(null); + oreStacks = (TMap>) + ReflectionUtils.getField(OreDictionaryArbiter.class, "oreStacks") + .get(null); + stackIDs = (TMap>) + ReflectionUtils.getField(OreDictionaryArbiter.class, "stackIDs") + .get(null); + stackNames = (TMap>) + ReflectionUtils.getField(OreDictionaryArbiter.class, "stackNames") + .get(null); + } catch (Throwable t) { + oreIDs = HashBiMap.create(); + oreStacks = new THashMap>(); + stackIDs = new THashMap>(); + stackNames = new THashMap>(); + } + } + + public static void registerOreDictionaryEntry(ItemStack arg, String arg0) { + try { + if (arg == null) { + return; + } + if (arg.getItem() != null && !Strings.isNullOrEmpty(arg0)) { + int arg1 = OreDictionary.getOreID(arg0); + oreIDs.put(arg0, Integer.valueOf(arg1)); + if (!oreStacks.containsKey(Integer.valueOf(arg1))) { + oreStacks.put(Integer.valueOf(arg1), new ArrayList()); + } + ((ArrayList) oreStacks.get(Integer.valueOf(arg1))).add(arg); + ItemWrapper arg2 = ItemWrapper.fromItemStack(arg); + if (!stackIDs.containsKey(arg2)) { + stackIDs.put(arg2, new ArrayList()); + stackNames.put(arg2, new ArrayList()); + } + ((ArrayList) stackIDs.get(arg2)).add(Integer.valueOf(arg1)); + ((ArrayList) stackNames.get(arg2)).add(arg0); + } + } catch (Throwable t) { + return; + } + } + } } diff --git a/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_Forge_ChunkLoading.java b/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_Forge_ChunkLoading.java index 19648ae60c..cfb4663734 100644 --- a/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_Forge_ChunkLoading.java +++ b/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_Forge_ChunkLoading.java @@ -2,7 +2,8 @@ package gtPlusPlus.preloader.asm.transformers; import static org.objectweb.asm.Opcodes.*; -import java.io.IOException; +import cpw.mods.fml.relauncher.FMLRelaunchLog; +import gtPlusPlus.preloader.DevHelper; import org.apache.logging.log4j.Level; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; @@ -10,675 +11,1035 @@ 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_Forge_ChunkLoading { - - //The qualified name of the class we plan to transform. - private static final String className = "net.minecraftforge.common.ForgeChunkManager"; - //net/minecraftforge/common/ForgeChunkManager - - private final boolean isValid; - private final ClassReader reader; - private final ClassWriter writer; - - String aChunkCoordIntPair; - String aItemStack; - String aWorld; - String aEntity; +public class ClassTransformer_Forge_ChunkLoading { - private static boolean doesMethodAlreadyExist = false; + // The qualified name of the class we plan to transform. + private static final String className = "net.minecraftforge.common.ForgeChunkManager"; + // net/minecraftforge/common/ForgeChunkManager - public ClassTransformer_Forge_ChunkLoading(byte[] basicClass, boolean obfuscated) { - - ClassReader aTempReader = null; - ClassWriter aTempWriter = null; - - aTempReader = new ClassReader(basicClass); - aTempWriter = new ClassWriter(aTempReader, ClassWriter.COMPUTE_FRAMES); - aTempReader.accept(new localClassVisitor(aTempWriter), 0); - - if (aTempReader != null && aTempWriter != null) { - isValid = true; - } - else { - isValid = false; - } - reader = aTempReader; - writer = aTempWriter; + private final boolean isValid; + private final ClassReader reader; + private final ClassWriter writer; - if (reader != null && writer != null && !doesMethodAlreadyExist) { - - aChunkCoordIntPair = obfuscated ? DevHelper.getObfuscated("net/minecraft/world/ChunkCoordIntPair") : "net/minecraft/world/ChunkCoordIntPair"; - aWorld = obfuscated ? DevHelper.getObfuscated("net/minecraft/world/World") : "net/minecraft/world/World"; - aEntity = obfuscated ? DevHelper.getObfuscated("net/minecraft/entity/Entity") : "net/minecraft/entity/Entity"; - - injectMethod("forceChunk"); - injectMethod("unforceChunk"); - injectMethod("requestTicket"); - injectMethod("releaseTicket"); - } + String aChunkCoordIntPair; + String aItemStack; + String aWorld; + String aEntity; - } + private static boolean doesMethodAlreadyExist = false; - public boolean isValidTransformer() { - return isValid; - } + public ClassTransformer_Forge_ChunkLoading(byte[] basicClass, boolean obfuscated) { - public ClassReader getReader() { - return reader; - } + ClassReader aTempReader = null; + ClassWriter aTempWriter = null; - public ClassWriter getWriter() { - return writer; - } + aTempReader = new ClassReader(basicClass); + aTempWriter = new ClassWriter(aTempReader, ClassWriter.COMPUTE_FRAMES); + aTempReader.accept(new localClassVisitor(aTempWriter), 0); - public void injectMethod(String aMethodName) { - MethodVisitor mv; - FMLRelaunchLog.log("[GT++ ASM] Chunkloading Patch", Level.INFO, "Injecting "+aMethodName+" into "+className+"."); - if (aMethodName.equals("forceChunk")) { + if (aTempReader != null && aTempWriter != null) { + isValid = true; + } else { + isValid = false; + } + reader = aTempReader; + writer = aTempWriter; - mv = getWriter().visitMethod(ACC_PUBLIC + ACC_STATIC, "forceChunk", "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;L"+aChunkCoordIntPair+";)V", null, null); - mv.visitCode(); - Label l0 = new Label(); - mv.visitLabel(l0); - mv.visitLineNumber(730, l0); - mv.visitVarInsn(ALOAD, 0); - Label l1 = new Label(); - mv.visitJumpInsn(IFNULL, l1); - mv.visitVarInsn(ALOAD, 1); - Label l2 = new Label(); - mv.visitJumpInsn(IFNONNULL, l2); - mv.visitLabel(l1); - mv.visitLineNumber(732, l1); - mv.visitFrame(F_SAME, 0, null, 0, null); - mv.visitInsn(RETURN); - mv.visitLabel(l2); - mv.visitLineNumber(734, l2); - mv.visitFrame(F_SAME, 0, null, 0, null); - mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn(INVOKESTATIC, "net/minecraftforge/common/ForgeChunkManager$Ticket", "access$500", "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;)Lnet/minecraftforge/common/ForgeChunkManager$Type;", false); - mv.visitFieldInsn(GETSTATIC, "net/minecraftforge/common/ForgeChunkManager$Type", "ENTITY", "Lnet/minecraftforge/common/ForgeChunkManager$Type;"); - Label l3 = new Label(); - mv.visitJumpInsn(IF_ACMPNE, l3); - mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn(INVOKESTATIC, "net/minecraftforge/common/ForgeChunkManager$Ticket", "access$600", "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;)L"+aEntity+";", false); - mv.visitJumpInsn(IFNONNULL, l3); - Label l4 = new Label(); - mv.visitLabel(l4); - mv.visitLineNumber(736, l4); - mv.visitTypeInsn(NEW, "java/lang/RuntimeException"); - mv.visitInsn(DUP); - mv.visitLdcInsn("Attempted to use an entity ticket to force a chunk, without an entity"); - mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "", "(Ljava/lang/String;)V", false); - mv.visitInsn(ATHROW); - mv.visitLabel(l3); - mv.visitLineNumber(738, l3); - mv.visitFrame(F_SAME, 0, null, 0, null); - mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn(INVOKEVIRTUAL, "net/minecraftforge/common/ForgeChunkManager$Ticket", "isPlayerTicket", "()Z", false); - Label l5 = new Label(); - mv.visitJumpInsn(IFEQ, l5); - mv.visitFieldInsn(GETSTATIC, "net/minecraftforge/common/ForgeChunkManager", "playerTickets", "Lcom/google/common/collect/SetMultimap;"); - mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn(INVOKEINTERFACE, "com/google/common/collect/SetMultimap", "containsValue", "(Ljava/lang/Object;)Z", true); - Label l6 = new Label(); - mv.visitJumpInsn(IFNE, l6); - Label l7 = new Label(); - mv.visitJumpInsn(GOTO, l7); - mv.visitLabel(l5); - mv.visitFrame(F_SAME, 0, null, 0, null); - mv.visitFieldInsn(GETSTATIC, "net/minecraftforge/common/ForgeChunkManager", "tickets", "Ljava/util/Map;"); - mv.visitVarInsn(ALOAD, 0); - mv.visitFieldInsn(GETFIELD, "net/minecraftforge/common/ForgeChunkManager$Ticket", "world", "L"+aWorld+";"); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "get", "(Ljava/lang/Object;)Ljava/lang/Object;", true); - mv.visitTypeInsn(CHECKCAST, "com/google/common/collect/Multimap"); - mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn(INVOKESTATIC, "net/minecraftforge/common/ForgeChunkManager$Ticket", "access$200", "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;)Ljava/lang/String;", false); - mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn(INVOKEINTERFACE, "com/google/common/collect/Multimap", "containsEntry", "(Ljava/lang/Object;Ljava/lang/Object;)Z", true); - mv.visitJumpInsn(IFNE, l6); - mv.visitLabel(l7); - mv.visitLineNumber(740, l7); - mv.visitFrame(F_SAME, 0, null, 0, null); - mv.visitLdcInsn("The mod %s attempted to force load a chunk with an invalid ticket. This is not permitted."); - mv.visitInsn(ICONST_1); - mv.visitTypeInsn(ANEWARRAY, "java/lang/Object"); - mv.visitInsn(DUP); - mv.visitInsn(ICONST_0); - mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn(INVOKESTATIC, "net/minecraftforge/common/ForgeChunkManager$Ticket", "access$200", "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;)Ljava/lang/String;", false); - mv.visitInsn(AASTORE); - mv.visitMethodInsn(INVOKESTATIC, "cpw/mods/fml/common/FMLLog", "severe", "(Ljava/lang/String;[Ljava/lang/Object;)V", false); - Label l8 = new Label(); - mv.visitLabel(l8); - mv.visitLineNumber(741, l8); - mv.visitInsn(RETURN); - mv.visitLabel(l6); - mv.visitLineNumber(743, l6); - mv.visitFrame(F_SAME, 0, null, 0, null); - mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn(INVOKESTATIC, "net/minecraftforge/common/ForgeChunkManager$Ticket", "access$700", "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;)Ljava/util/LinkedHashSet;", false); - mv.visitVarInsn(ALOAD, 1); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/util/LinkedHashSet", "add", "(Ljava/lang/Object;)Z", false); - mv.visitInsn(POP); - Label l9 = new Label(); - mv.visitLabel(l9); - mv.visitLineNumber(744, l9); - mv.visitVarInsn(ALOAD, 0); - mv.visitVarInsn(ALOAD, 1); - mv.visitMethodInsn(INVOKESTATIC, "gtPlusPlus/preloader/ChunkDebugger", "storeLoadChunkToCache", "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;L"+aChunkCoordIntPair+";)V", false); - Label l10 = new Label(); - mv.visitLabel(l10); - mv.visitLineNumber(745, l10); - mv.visitFieldInsn(GETSTATIC, "net/minecraftforge/common/MinecraftForge", "EVENT_BUS", "Lcpw/mods/fml/common/eventhandler/EventBus;"); - mv.visitTypeInsn(NEW, "net/minecraftforge/common/ForgeChunkManager$ForceChunkEvent"); - mv.visitInsn(DUP); - mv.visitVarInsn(ALOAD, 0); - mv.visitVarInsn(ALOAD, 1); - mv.visitMethodInsn(INVOKESPECIAL, "net/minecraftforge/common/ForgeChunkManager$ForceChunkEvent", "", "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;L"+aChunkCoordIntPair+";)V", false); - mv.visitMethodInsn(INVOKEVIRTUAL, "cpw/mods/fml/common/eventhandler/EventBus", "post", "(Lcpw/mods/fml/common/eventhandler/Event;)Z", false); - mv.visitInsn(POP); - Label l11 = new Label(); - mv.visitLabel(l11); - mv.visitLineNumber(747, l11); - mv.visitMethodInsn(INVOKESTATIC, "com/google/common/collect/ImmutableSetMultimap", "builder", "()Lcom/google/common/collect/ImmutableSetMultimap$Builder;", false); - mv.visitFieldInsn(GETSTATIC, "net/minecraftforge/common/ForgeChunkManager", "forcedChunks", "Ljava/util/Map;"); - mv.visitVarInsn(ALOAD, 0); - mv.visitFieldInsn(GETFIELD, "net/minecraftforge/common/ForgeChunkManager$Ticket", "world", "L"+aWorld+";"); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "get", "(Ljava/lang/Object;)Ljava/lang/Object;", true); - mv.visitTypeInsn(CHECKCAST, "com/google/common/collect/Multimap"); - mv.visitMethodInsn(INVOKEVIRTUAL, "com/google/common/collect/ImmutableSetMultimap$Builder", "putAll", "(Lcom/google/common/collect/Multimap;)Lcom/google/common/collect/ImmutableSetMultimap$Builder;", false); - mv.visitVarInsn(ALOAD, 1); - mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn(INVOKEVIRTUAL, "com/google/common/collect/ImmutableSetMultimap$Builder", "put", "(Ljava/lang/Object;Ljava/lang/Object;)Lcom/google/common/collect/ImmutableSetMultimap$Builder;", false); - mv.visitMethodInsn(INVOKEVIRTUAL, "com/google/common/collect/ImmutableSetMultimap$Builder", "build", "()Lcom/google/common/collect/ImmutableSetMultimap;", false); - mv.visitVarInsn(ASTORE, 2); - Label l12 = new Label(); - mv.visitLabel(l12); - mv.visitLineNumber(748, l12); - mv.visitFieldInsn(GETSTATIC, "net/minecraftforge/common/ForgeChunkManager", "forcedChunks", "Ljava/util/Map;"); - mv.visitVarInsn(ALOAD, 0); - mv.visitFieldInsn(GETFIELD, "net/minecraftforge/common/ForgeChunkManager$Ticket", "world", "L"+aWorld+";"); - mv.visitVarInsn(ALOAD, 2); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", true); - mv.visitInsn(POP); - Label l13 = new Label(); - mv.visitLabel(l13); - mv.visitLineNumber(749, l13); - mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn(INVOKESTATIC, "net/minecraftforge/common/ForgeChunkManager$Ticket", "access$800", "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;)I", false); - Label l14 = new Label(); - mv.visitJumpInsn(IFLE, l14); - mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn(INVOKESTATIC, "net/minecraftforge/common/ForgeChunkManager$Ticket", "access$700", "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;)Ljava/util/LinkedHashSet;", false); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/util/LinkedHashSet", "size", "()I", false); - mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn(INVOKESTATIC, "net/minecraftforge/common/ForgeChunkManager$Ticket", "access$800", "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;)I", false); - mv.visitJumpInsn(IF_ICMPLE, l14); - Label l15 = new Label(); - mv.visitLabel(l15); - mv.visitLineNumber(751, l15); - mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn(INVOKESTATIC, "net/minecraftforge/common/ForgeChunkManager$Ticket", "access$700", "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;)Ljava/util/LinkedHashSet;", false); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/util/LinkedHashSet", "iterator", "()Ljava/util/Iterator;", false); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "next", "()Ljava/lang/Object;", true); - mv.visitTypeInsn(CHECKCAST, ""+aChunkCoordIntPair+""); - mv.visitVarInsn(ASTORE, 3); - Label l16 = new Label(); - mv.visitLabel(l16); - mv.visitLineNumber(752, l16); - mv.visitVarInsn(ALOAD, 0); - mv.visitVarInsn(ALOAD, 3); - mv.visitMethodInsn(INVOKESTATIC, "net/minecraftforge/common/ForgeChunkManager", "unforceChunk", "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;L"+aChunkCoordIntPair+";)V", false); - mv.visitLabel(l14); - mv.visitLineNumber(754, l14); - mv.visitFrame(F_APPEND,1, new Object[] {"com/google/common/collect/ImmutableSetMultimap"}, 0, null); - mv.visitInsn(RETURN); - Label l17 = new Label(); - mv.visitLabel(l17); - mv.visitLocalVariable("ticket", "Lnet/minecraftforge/common/ForgeChunkManager$Ticket;", null, l0, l17, 0); - mv.visitLocalVariable("chunk", "L"+aChunkCoordIntPair+";", null, l0, l17, 1); - mv.visitLocalVariable("newMap", "Lcom/google/common/collect/ImmutableSetMultimap;", "Lcom/google/common/collect/ImmutableSetMultimap;", l12, l17, 2); - mv.visitLocalVariable("removed", "L"+aChunkCoordIntPair+";", null, l16, l14, 3); - mv.visitMaxs(5, 4); - mv.visitEnd(); + if (reader != null && writer != null && !doesMethodAlreadyExist) { - } - else if (aMethodName.equals("unforceChunk")) { + aChunkCoordIntPair = obfuscated + ? DevHelper.getObfuscated("net/minecraft/world/ChunkCoordIntPair") + : "net/minecraft/world/ChunkCoordIntPair"; + aWorld = obfuscated ? DevHelper.getObfuscated("net/minecraft/world/World") : "net/minecraft/world/World"; + aEntity = + obfuscated ? DevHelper.getObfuscated("net/minecraft/entity/Entity") : "net/minecraft/entity/Entity"; - mv = getWriter().visitMethod(ACC_PUBLIC + ACC_STATIC, "unforceChunk", "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;L"+aChunkCoordIntPair+";)V", null, null); - mv.visitCode(); - Label l0 = new Label(); - mv.visitLabel(l0); - mv.visitLineNumber(781, l0); - mv.visitVarInsn(ALOAD, 0); - Label l1 = new Label(); - mv.visitJumpInsn(IFNULL, l1); - mv.visitVarInsn(ALOAD, 1); - Label l2 = new Label(); - mv.visitJumpInsn(IFNONNULL, l2); - mv.visitLabel(l1); - mv.visitLineNumber(783, l1); - mv.visitFrame(F_SAME, 0, null, 0, null); - mv.visitInsn(RETURN); - mv.visitLabel(l2); - mv.visitLineNumber(785, l2); - mv.visitFrame(F_SAME, 0, null, 0, null); - mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn(INVOKESTATIC, "net/minecraftforge/common/ForgeChunkManager$Ticket", "access$700", "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;)Ljava/util/LinkedHashSet;", false); - mv.visitVarInsn(ALOAD, 1); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/util/LinkedHashSet", "remove", "(Ljava/lang/Object;)Z", false); - mv.visitInsn(POP); - Label l3 = new Label(); - mv.visitLabel(l3); - mv.visitLineNumber(786, l3); - mv.visitVarInsn(ALOAD, 1); - mv.visitMethodInsn(INVOKESTATIC, "gtPlusPlus/preloader/ChunkDebugger", "removeLoadedChunkFromCache", "(L"+aChunkCoordIntPair+";)V", false); - Label l4 = new Label(); - mv.visitLabel(l4); - mv.visitLineNumber(787, l4); - mv.visitFieldInsn(GETSTATIC, "net/minecraftforge/common/MinecraftForge", "EVENT_BUS", "Lcpw/mods/fml/common/eventhandler/EventBus;"); - mv.visitTypeInsn(NEW, "net/minecraftforge/common/ForgeChunkManager$UnforceChunkEvent"); - mv.visitInsn(DUP); - mv.visitVarInsn(ALOAD, 0); - mv.visitVarInsn(ALOAD, 1); - mv.visitMethodInsn(INVOKESPECIAL, "net/minecraftforge/common/ForgeChunkManager$UnforceChunkEvent", "", "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;L"+aChunkCoordIntPair+";)V", false); - mv.visitMethodInsn(INVOKEVIRTUAL, "cpw/mods/fml/common/eventhandler/EventBus", "post", "(Lcpw/mods/fml/common/eventhandler/Event;)Z", false); - mv.visitInsn(POP); - Label l5 = new Label(); - mv.visitLabel(l5); - mv.visitLineNumber(788, l5); - mv.visitFieldInsn(GETSTATIC, "net/minecraftforge/common/ForgeChunkManager", "forcedChunks", "Ljava/util/Map;"); - mv.visitVarInsn(ALOAD, 0); - mv.visitFieldInsn(GETFIELD, "net/minecraftforge/common/ForgeChunkManager$Ticket", "world", "L"+aWorld+";"); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "get", "(Ljava/lang/Object;)Ljava/lang/Object;", true); - mv.visitTypeInsn(CHECKCAST, "com/google/common/collect/Multimap"); - mv.visitMethodInsn(INVOKESTATIC, "com/google/common/collect/LinkedHashMultimap", "create", "(Lcom/google/common/collect/Multimap;)Lcom/google/common/collect/LinkedHashMultimap;", false); - mv.visitVarInsn(ASTORE, 2); - Label l6 = new Label(); - mv.visitLabel(l6); - mv.visitLineNumber(789, l6); - mv.visitVarInsn(ALOAD, 2); - mv.visitVarInsn(ALOAD, 1); - mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn(INVOKEVIRTUAL, "com/google/common/collect/LinkedHashMultimap", "remove", "(Ljava/lang/Object;Ljava/lang/Object;)Z", false); - mv.visitInsn(POP); - Label l7 = new Label(); - mv.visitLabel(l7); - mv.visitLineNumber(790, l7); - mv.visitVarInsn(ALOAD, 2); - mv.visitMethodInsn(INVOKESTATIC, "com/google/common/collect/ImmutableSetMultimap", "copyOf", "(Lcom/google/common/collect/Multimap;)Lcom/google/common/collect/ImmutableSetMultimap;", false); - mv.visitVarInsn(ASTORE, 3); - Label l8 = new Label(); - mv.visitLabel(l8); - mv.visitLineNumber(791, l8); - mv.visitFieldInsn(GETSTATIC, "net/minecraftforge/common/ForgeChunkManager", "forcedChunks", "Ljava/util/Map;"); - mv.visitVarInsn(ALOAD, 0); - mv.visitFieldInsn(GETFIELD, "net/minecraftforge/common/ForgeChunkManager$Ticket", "world", "L"+aWorld+";"); - mv.visitVarInsn(ALOAD, 3); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", true); - mv.visitInsn(POP); - Label l9 = new Label(); - mv.visitLabel(l9); - mv.visitLineNumber(792, l9); - mv.visitInsn(RETURN); - Label l10 = new Label(); - mv.visitLabel(l10); - mv.visitLocalVariable("ticket", "Lnet/minecraftforge/common/ForgeChunkManager$Ticket;", null, l0, l10, 0); - mv.visitLocalVariable("chunk", "L"+aChunkCoordIntPair+";", null, l0, l10, 1); - mv.visitLocalVariable("copy", "Lcom/google/common/collect/LinkedHashMultimap;", "Lcom/google/common/collect/LinkedHashMultimap;", l6, l10, 2); - mv.visitLocalVariable("newMap", "Lcom/google/common/collect/ImmutableSetMultimap;", "Lcom/google/common/collect/ImmutableSetMultimap;", l8, l10, 3); - mv.visitMaxs(5, 4); - mv.visitEnd(); + injectMethod("forceChunk"); + injectMethod("unforceChunk"); + injectMethod("requestTicket"); + injectMethod("releaseTicket"); + } + } - } + public boolean isValidTransformer() { + return isValid; + } - else if (aMethodName.equals("requestTicket")) { + public ClassReader getReader() { + return reader; + } - mv = getWriter().visitMethod(ACC_PUBLIC + ACC_STATIC, "requestTicket", "(Ljava/lang/Object;L"+aWorld+";Lnet/minecraftforge/common/ForgeChunkManager$Type;)Lnet/minecraftforge/common/ForgeChunkManager$Ticket;", null, null); - mv.visitCode(); - Label l0 = new Label(); - mv.visitLabel(l0); - mv.visitLineNumber(656, l0); - mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn(INVOKESTATIC, "net/minecraftforge/common/ForgeChunkManager", "getContainer", "(Ljava/lang/Object;)Lcpw/mods/fml/common/ModContainer;", false); - mv.visitVarInsn(ASTORE, 3); - Label l1 = new Label(); - mv.visitLabel(l1); - mv.visitLineNumber(657, l1); - mv.visitVarInsn(ALOAD, 3); - Label l2 = new Label(); - mv.visitJumpInsn(IFNONNULL, l2); - Label l3 = new Label(); - mv.visitLabel(l3); - mv.visitLineNumber(659, l3); - mv.visitFieldInsn(GETSTATIC, "org/apache/logging/log4j/Level", "ERROR", "Lorg/apache/logging/log4j/Level;"); - mv.visitLdcInsn("Failed to locate the container for mod instance %s (%s : %x)"); - mv.visitInsn(ICONST_3); - mv.visitTypeInsn(ANEWARRAY, "java/lang/Object"); - mv.visitInsn(DUP); - mv.visitInsn(ICONST_0); - mv.visitVarInsn(ALOAD, 0); - mv.visitInsn(AASTORE); - mv.visitInsn(DUP); - mv.visitInsn(ICONST_1); - mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false); - mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;", false); - mv.visitInsn(AASTORE); - mv.visitInsn(DUP); - mv.visitInsn(ICONST_2); - mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn(INVOKESTATIC, "java/lang/System", "identityHashCode", "(Ljava/lang/Object;)I", false); - mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;", false); - mv.visitInsn(AASTORE); - mv.visitMethodInsn(INVOKESTATIC, "cpw/mods/fml/common/FMLLog", "log", "(Lorg/apache/logging/log4j/Level;Ljava/lang/String;[Ljava/lang/Object;)V", false); - Label l4 = new Label(); - mv.visitLabel(l4); - mv.visitLineNumber(660, l4); - mv.visitInsn(ACONST_NULL); - mv.visitInsn(ARETURN); - mv.visitLabel(l2); - mv.visitLineNumber(662, l2); - mv.visitFrame(F_APPEND,1, new Object[] {"cpw/mods/fml/common/ModContainer"}, 0, null); - mv.visitVarInsn(ALOAD, 3); - mv.visitMethodInsn(INVOKEINTERFACE, "cpw/mods/fml/common/ModContainer", "getModId", "()Ljava/lang/String;", true); - mv.visitVarInsn(ASTORE, 4); - Label l5 = new Label(); - mv.visitLabel(l5); - mv.visitLineNumber(663, l5); - mv.visitFieldInsn(GETSTATIC, "net/minecraftforge/common/ForgeChunkManager", "callbacks", "Ljava/util/Map;"); - mv.visitVarInsn(ALOAD, 4); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "containsKey", "(Ljava/lang/Object;)Z", true); - Label l6 = new Label(); - mv.visitJumpInsn(IFNE, l6); - Label l7 = new Label(); - mv.visitLabel(l7); - mv.visitLineNumber(665, l7); - mv.visitLdcInsn("The mod %s has attempted to request a ticket without a listener in place"); - mv.visitInsn(ICONST_1); - mv.visitTypeInsn(ANEWARRAY, "java/lang/Object"); - mv.visitInsn(DUP); - mv.visitInsn(ICONST_0); - mv.visitVarInsn(ALOAD, 4); - mv.visitInsn(AASTORE); - mv.visitMethodInsn(INVOKESTATIC, "cpw/mods/fml/common/FMLLog", "severe", "(Ljava/lang/String;[Ljava/lang/Object;)V", false); - Label l8 = new Label(); - mv.visitLabel(l8); - mv.visitLineNumber(666, l8); - mv.visitTypeInsn(NEW, "java/lang/RuntimeException"); - mv.visitInsn(DUP); - mv.visitLdcInsn("Invalid ticket request"); - mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "", "(Ljava/lang/String;)V", false); - mv.visitInsn(ATHROW); - mv.visitLabel(l6); - mv.visitLineNumber(669, l6); - mv.visitFrame(F_APPEND,1, new Object[] {"java/lang/String"}, 0, null); - mv.visitVarInsn(ALOAD, 4); - mv.visitMethodInsn(INVOKESTATIC, "net/minecraftforge/common/ForgeChunkManager", "getMaxTicketLengthFor", "(Ljava/lang/String;)I", false); - mv.visitVarInsn(ISTORE, 5); - Label l9 = new Label(); - mv.visitLabel(l9); - mv.visitLineNumber(671, l9); - mv.visitFieldInsn(GETSTATIC, "net/minecraftforge/common/ForgeChunkManager", "tickets", "Ljava/util/Map;"); - mv.visitVarInsn(ALOAD, 1); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "get", "(Ljava/lang/Object;)Ljava/lang/Object;", true); - mv.visitTypeInsn(CHECKCAST, "com/google/common/collect/Multimap"); - mv.visitVarInsn(ALOAD, 4); - mv.visitMethodInsn(INVOKEINTERFACE, "com/google/common/collect/Multimap", "get", "(Ljava/lang/Object;)Ljava/util/Collection;", true); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Collection", "size", "()I", true); - mv.visitVarInsn(ILOAD, 5); - Label l10 = new Label(); - mv.visitJumpInsn(IF_ICMPLT, l10); - Label l11 = new Label(); - mv.visitLabel(l11); - mv.visitLineNumber(673, l11); - mv.visitFieldInsn(GETSTATIC, "net/minecraftforge/common/ForgeChunkManager", "warnedMods", "Ljava/util/Set;"); - mv.visitVarInsn(ALOAD, 4); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Set", "contains", "(Ljava/lang/Object;)Z", true); - Label l12 = new Label(); - mv.visitJumpInsn(IFNE, l12); - Label l13 = new Label(); - mv.visitLabel(l13); - mv.visitLineNumber(675, l13); - mv.visitLdcInsn("The mod %s has attempted to allocate a chunkloading ticket beyond it's currently allocated maximum : %d"); - mv.visitInsn(ICONST_2); - mv.visitTypeInsn(ANEWARRAY, "java/lang/Object"); - mv.visitInsn(DUP); - mv.visitInsn(ICONST_0); - mv.visitVarInsn(ALOAD, 4); - mv.visitInsn(AASTORE); - mv.visitInsn(DUP); - mv.visitInsn(ICONST_1); - mv.visitVarInsn(ILOAD, 5); - mv.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;", false); - mv.visitInsn(AASTORE); - mv.visitMethodInsn(INVOKESTATIC, "cpw/mods/fml/common/FMLLog", "info", "(Ljava/lang/String;[Ljava/lang/Object;)V", false); - Label l14 = new Label(); - mv.visitLabel(l14); - mv.visitLineNumber(676, l14); - mv.visitFieldInsn(GETSTATIC, "net/minecraftforge/common/ForgeChunkManager", "warnedMods", "Ljava/util/Set;"); - mv.visitVarInsn(ALOAD, 4); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Set", "add", "(Ljava/lang/Object;)Z", true); - mv.visitInsn(POP); - mv.visitLabel(l12); - mv.visitLineNumber(678, l12); - mv.visitFrame(F_APPEND,1, new Object[] {INTEGER}, 0, null); - mv.visitInsn(ACONST_NULL); - mv.visitInsn(ARETURN); - mv.visitLabel(l10); - mv.visitLineNumber(680, l10); - mv.visitFrame(F_SAME, 0, null, 0, null); - mv.visitTypeInsn(NEW, "net/minecraftforge/common/ForgeChunkManager$Ticket"); - mv.visitInsn(DUP); - mv.visitVarInsn(ALOAD, 4); - mv.visitVarInsn(ALOAD, 2); - mv.visitVarInsn(ALOAD, 1); - mv.visitMethodInsn(INVOKESPECIAL, "net/minecraftforge/common/ForgeChunkManager$Ticket", "", "(Ljava/lang/String;Lnet/minecraftforge/common/ForgeChunkManager$Type;L"+aWorld+";)V", false); - mv.visitVarInsn(ASTORE, 6); - Label l15 = new Label(); - mv.visitLabel(l15); - mv.visitLineNumber(681, l15); - mv.visitVarInsn(ALOAD, 6); - mv.visitVarInsn(ALOAD, 1); - mv.visitMethodInsn(INVOKESTATIC, "gtPlusPlus/preloader/ChunkDebugger", "storeTicketToCache", "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;L"+aWorld+";)V", false); - Label l16 = new Label(); - mv.visitLabel(l16); - mv.visitLineNumber(682, l16); - mv.visitFieldInsn(GETSTATIC, "net/minecraftforge/common/ForgeChunkManager", "tickets", "Ljava/util/Map;"); - mv.visitVarInsn(ALOAD, 1); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "get", "(Ljava/lang/Object;)Ljava/lang/Object;", true); - mv.visitTypeInsn(CHECKCAST, "com/google/common/collect/Multimap"); - mv.visitVarInsn(ALOAD, 4); - mv.visitVarInsn(ALOAD, 6); - mv.visitMethodInsn(INVOKEINTERFACE, "com/google/common/collect/Multimap", "put", "(Ljava/lang/Object;Ljava/lang/Object;)Z", true); - mv.visitInsn(POP); - Label l17 = new Label(); - mv.visitLabel(l17); - mv.visitLineNumber(683, l17); - mv.visitVarInsn(ALOAD, 6); - mv.visitInsn(ARETURN); - Label l18 = new Label(); - mv.visitLabel(l18); - mv.visitLocalVariable("mod", "Ljava/lang/Object;", null, l0, l18, 0); - mv.visitLocalVariable("world", "L"+aWorld+";", null, l0, l18, 1); - mv.visitLocalVariable("type", "Lnet/minecraftforge/common/ForgeChunkManager$Type;", null, l0, l18, 2); - mv.visitLocalVariable("container", "Lcpw/mods/fml/common/ModContainer;", null, l1, l18, 3); - mv.visitLocalVariable("modId", "Ljava/lang/String;", null, l5, l18, 4); - mv.visitLocalVariable("allowedCount", "I", null, l9, l18, 5); - mv.visitLocalVariable("ticket", "Lnet/minecraftforge/common/ForgeChunkManager$Ticket;", null, l15, l18, 6); - mv.visitMaxs(6, 7); - mv.visitEnd(); + public ClassWriter getWriter() { + return writer; + } - } + public void injectMethod(String aMethodName) { + MethodVisitor mv; + FMLRelaunchLog.log( + "[GT++ ASM] Chunkloading Patch", Level.INFO, "Injecting " + aMethodName + " into " + className + "."); + if (aMethodName.equals("forceChunk")) { + mv = getWriter() + .visitMethod( + ACC_PUBLIC + ACC_STATIC, + "forceChunk", + "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;L" + aChunkCoordIntPair + ";)V", + null, + null); + mv.visitCode(); + Label l0 = new Label(); + mv.visitLabel(l0); + mv.visitLineNumber(730, l0); + mv.visitVarInsn(ALOAD, 0); + Label l1 = new Label(); + mv.visitJumpInsn(IFNULL, l1); + mv.visitVarInsn(ALOAD, 1); + Label l2 = new Label(); + mv.visitJumpInsn(IFNONNULL, l2); + mv.visitLabel(l1); + mv.visitLineNumber(732, l1); + mv.visitFrame(F_SAME, 0, null, 0, null); + mv.visitInsn(RETURN); + mv.visitLabel(l2); + mv.visitLineNumber(734, l2); + mv.visitFrame(F_SAME, 0, null, 0, null); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn( + INVOKESTATIC, + "net/minecraftforge/common/ForgeChunkManager$Ticket", + "access$500", + "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;)Lnet/minecraftforge/common/ForgeChunkManager$Type;", + false); + mv.visitFieldInsn( + GETSTATIC, + "net/minecraftforge/common/ForgeChunkManager$Type", + "ENTITY", + "Lnet/minecraftforge/common/ForgeChunkManager$Type;"); + Label l3 = new Label(); + mv.visitJumpInsn(IF_ACMPNE, l3); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn( + INVOKESTATIC, + "net/minecraftforge/common/ForgeChunkManager$Ticket", + "access$600", + "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;)L" + aEntity + ";", + false); + mv.visitJumpInsn(IFNONNULL, l3); + Label l4 = new Label(); + mv.visitLabel(l4); + mv.visitLineNumber(736, l4); + mv.visitTypeInsn(NEW, "java/lang/RuntimeException"); + mv.visitInsn(DUP); + mv.visitLdcInsn("Attempted to use an entity ticket to force a chunk, without an entity"); + mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "", "(Ljava/lang/String;)V", false); + mv.visitInsn(ATHROW); + mv.visitLabel(l3); + mv.visitLineNumber(738, l3); + mv.visitFrame(F_SAME, 0, null, 0, null); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn( + INVOKEVIRTUAL, + "net/minecraftforge/common/ForgeChunkManager$Ticket", + "isPlayerTicket", + "()Z", + false); + Label l5 = new Label(); + mv.visitJumpInsn(IFEQ, l5); + mv.visitFieldInsn( + GETSTATIC, + "net/minecraftforge/common/ForgeChunkManager", + "playerTickets", + "Lcom/google/common/collect/SetMultimap;"); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn( + INVOKEINTERFACE, + "com/google/common/collect/SetMultimap", + "containsValue", + "(Ljava/lang/Object;)Z", + true); + Label l6 = new Label(); + mv.visitJumpInsn(IFNE, l6); + Label l7 = new Label(); + mv.visitJumpInsn(GOTO, l7); + mv.visitLabel(l5); + mv.visitFrame(F_SAME, 0, null, 0, null); + mv.visitFieldInsn(GETSTATIC, "net/minecraftforge/common/ForgeChunkManager", "tickets", "Ljava/util/Map;"); + mv.visitVarInsn(ALOAD, 0); + mv.visitFieldInsn( + GETFIELD, "net/minecraftforge/common/ForgeChunkManager$Ticket", "world", "L" + aWorld + ";"); + mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "get", "(Ljava/lang/Object;)Ljava/lang/Object;", true); + mv.visitTypeInsn(CHECKCAST, "com/google/common/collect/Multimap"); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn( + INVOKESTATIC, + "net/minecraftforge/common/ForgeChunkManager$Ticket", + "access$200", + "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;)Ljava/lang/String;", + false); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn( + INVOKEINTERFACE, + "com/google/common/collect/Multimap", + "containsEntry", + "(Ljava/lang/Object;Ljava/lang/Object;)Z", + true); + mv.visitJumpInsn(IFNE, l6); + mv.visitLabel(l7); + mv.visitLineNumber(740, l7); + mv.visitFrame(F_SAME, 0, null, 0, null); + mv.visitLdcInsn( + "The mod %s attempted to force load a chunk with an invalid ticket. This is not permitted."); + mv.visitInsn(ICONST_1); + mv.visitTypeInsn(ANEWARRAY, "java/lang/Object"); + mv.visitInsn(DUP); + mv.visitInsn(ICONST_0); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn( + INVOKESTATIC, + "net/minecraftforge/common/ForgeChunkManager$Ticket", + "access$200", + "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;)Ljava/lang/String;", + false); + mv.visitInsn(AASTORE); + mv.visitMethodInsn( + INVOKESTATIC, + "cpw/mods/fml/common/FMLLog", + "severe", + "(Ljava/lang/String;[Ljava/lang/Object;)V", + false); + Label l8 = new Label(); + mv.visitLabel(l8); + mv.visitLineNumber(741, l8); + mv.visitInsn(RETURN); + mv.visitLabel(l6); + mv.visitLineNumber(743, l6); + mv.visitFrame(F_SAME, 0, null, 0, null); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn( + INVOKESTATIC, + "net/minecraftforge/common/ForgeChunkManager$Ticket", + "access$700", + "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;)Ljava/util/LinkedHashSet;", + false); + mv.visitVarInsn(ALOAD, 1); + mv.visitMethodInsn(INVOKEVIRTUAL, "java/util/LinkedHashSet", "add", "(Ljava/lang/Object;)Z", false); + mv.visitInsn(POP); + Label l9 = new Label(); + mv.visitLabel(l9); + mv.visitLineNumber(744, l9); + mv.visitVarInsn(ALOAD, 0); + mv.visitVarInsn(ALOAD, 1); + mv.visitMethodInsn( + INVOKESTATIC, + "gtPlusPlus/preloader/ChunkDebugger", + "storeLoadChunkToCache", + "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;L" + aChunkCoordIntPair + ";)V", + false); + Label l10 = new Label(); + mv.visitLabel(l10); + mv.visitLineNumber(745, l10); + mv.visitFieldInsn( + GETSTATIC, + "net/minecraftforge/common/MinecraftForge", + "EVENT_BUS", + "Lcpw/mods/fml/common/eventhandler/EventBus;"); + mv.visitTypeInsn(NEW, "net/minecraftforge/common/ForgeChunkManager$ForceChunkEvent"); + mv.visitInsn(DUP); + mv.visitVarInsn(ALOAD, 0); + mv.visitVarInsn(ALOAD, 1); + mv.visitMethodInsn( + INVOKESPECIAL, + "net/minecraftforge/common/ForgeChunkManager$ForceChunkEvent", + "", + "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;L" + aChunkCoordIntPair + ";)V", + false); + mv.visitMethodInsn( + INVOKEVIRTUAL, + "cpw/mods/fml/common/eventhandler/EventBus", + "post", + "(Lcpw/mods/fml/common/eventhandler/Event;)Z", + false); + mv.visitInsn(POP); + Label l11 = new Label(); + mv.visitLabel(l11); + mv.visitLineNumber(747, l11); + mv.visitMethodInsn( + INVOKESTATIC, + "com/google/common/collect/ImmutableSetMultimap", + "builder", + "()Lcom/google/common/collect/ImmutableSetMultimap$Builder;", + false); + mv.visitFieldInsn( + GETSTATIC, "net/minecraftforge/common/ForgeChunkManager", "forcedChunks", "Ljava/util/Map;"); + mv.visitVarInsn(ALOAD, 0); + mv.visitFieldInsn( + GETFIELD, "net/minecraftforge/common/ForgeChunkManager$Ticket", "world", "L" + aWorld + ";"); + mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "get", "(Ljava/lang/Object;)Ljava/lang/Object;", true); + mv.visitTypeInsn(CHECKCAST, "com/google/common/collect/Multimap"); + mv.visitMethodInsn( + INVOKEVIRTUAL, + "com/google/common/collect/ImmutableSetMultimap$Builder", + "putAll", + "(Lcom/google/common/collect/Multimap;)Lcom/google/common/collect/ImmutableSetMultimap$Builder;", + false); + mv.visitVarInsn(ALOAD, 1); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn( + INVOKEVIRTUAL, + "com/google/common/collect/ImmutableSetMultimap$Builder", + "put", + "(Ljava/lang/Object;Ljava/lang/Object;)Lcom/google/common/collect/ImmutableSetMultimap$Builder;", + false); + mv.visitMethodInsn( + INVOKEVIRTUAL, + "com/google/common/collect/ImmutableSetMultimap$Builder", + "build", + "()Lcom/google/common/collect/ImmutableSetMultimap;", + false); + mv.visitVarInsn(ASTORE