diff options
Diffstat (limited to 'src/main/java/gtPlusPlus')
4 files changed, 134 insertions, 1256 deletions
diff --git a/src/main/java/gtPlusPlus/preloader/asm/AsmConfig.java b/src/main/java/gtPlusPlus/preloader/asm/AsmConfig.java index 8cdc772c39..b11eb66801 100644 --- a/src/main/java/gtPlusPlus/preloader/asm/AsmConfig.java +++ b/src/main/java/gtPlusPlus/preloader/asm/AsmConfig.java @@ -19,7 +19,6 @@ public class AsmConfig { public static boolean enableGtTooltipFix; public static boolean enableGtNbtFix; public static boolean enableGtCharcoalPitFix; - public static boolean enableChunkDebugging; public static boolean enableCofhPatch; public static boolean enableTcAspectSafety; public static boolean enabledLwjglKeybindingFix; @@ -64,12 +63,6 @@ public class AsmConfig { enabledFixEntitySetHealth = prop.getBoolean(false); propOrderDebug.add(prop.getName()); - prop = config.get("debug", "enableChunkDebugging", false); - prop.comment = "Enable/Disable Chunk Debugging Features, Must Be enabled on Client and Server."; - prop.setLanguageKey("gtpp.enableChunkDebugging").setRequiresMcRestart(true); - enableChunkDebugging = prop.getBoolean(false); - propOrderDebug.add(prop.getName()); - prop = config.get("debug", "enableGtNbtFix", true); prop.comment = "Enable/Disable GT NBT Persistency Fix"; prop.setLanguageKey("gtpp.enableGtNbtFix").setRequiresMcRestart(true); @@ -126,7 +119,6 @@ public class AsmConfig { config.save(); } - Preloader_Logger.INFO("Chunk Debugging - Enabled: " + enableChunkDebugging); Preloader_Logger.INFO("Gt Nbt Fix - Enabled: " + enableGtNbtFix); Preloader_Logger.INFO("Gt Tooltip Fix - Enabled: " + enableGtTooltipFix); Preloader_Logger.INFO("COFH Patch - Enabled: " + enableCofhPatch); 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 deleted file mode 100644 index 9b6ec4bb25..0000000000 --- a/src/main/java/gtPlusPlus/preloader/asm/transformers/ClassTransformer_Forge_ChunkLoading.java +++ /dev/null @@ -1,1242 +0,0 @@ -package gtPlusPlus.preloader.asm.transformers; - -import static org.objectweb.asm.Opcodes.AASTORE; -import static org.objectweb.asm.Opcodes.ACC_PUBLIC; -import static org.objectweb.asm.Opcodes.ACC_STATIC; -import static org.objectweb.asm.Opcodes.ACONST_NULL; -import static org.objectweb.asm.Opcodes.ALOAD; -import static org.objectweb.asm.Opcodes.ANEWARRAY; -import static org.objectweb.asm.Opcodes.ARETURN; -import static org.objectweb.asm.Opcodes.ASM5; -import static org.objectweb.asm.Opcodes.ASTORE; -import static org.objectweb.asm.Opcodes.ATHROW; -import static org.objectweb.asm.Opcodes.CHECKCAST; -import static org.objectweb.asm.Opcodes.DUP; -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.GETFIELD; -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.ICONST_2; -import static org.objectweb.asm.Opcodes.ICONST_3; -import static org.objectweb.asm.Opcodes.IFEQ; -import static org.objectweb.asm.Opcodes.IFLE; -import static org.objectweb.asm.Opcodes.IFNE; -import static org.objectweb.asm.Opcodes.IFNONNULL; -import static org.objectweb.asm.Opcodes.IFNULL; -import static org.objectweb.asm.Opcodes.IF_ACMPNE; -import static org.objectweb.asm.Opcodes.IF_ICMPLE; -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.NEW; -import static org.objectweb.asm.Opcodes.POP; -import static org.objectweb.asm.Opcodes.RETURN; -import static org.objectweb.asm.Opcodes.TOP; - -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; - -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; - - private static boolean doesMethodAlreadyExist = false; - - public ClassTransformer_Forge_ChunkLoading(byte[] basicClass, boolean obfuscated) { - - ClassReader aTempReader; - ClassWriter aTempWriter; - - 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 && !doesMethodAlreadyExist) { - - aChunkCoordIntPair = "net/minecraft/world/ChunkCoordIntPair"; - aWorld = "net/minecraft/world/World"; - aEntity = "net/minecraft/entity/Entity"; - - injectMethod("forceChunk"); - injectMethod("unforceChunk"); - injectMethod("requestTicket"); - injectMethod("releaseTicket"); - } - } - - public ClassWriter getWriter() { - return writer; - } - - public void injectMethod(String aMethodName) { - MethodVisitor mv; - FMLRelaunchLog.log( - "[GT++ ASM] Chunkloading Patch", - Level.INFO, - "Injecting " + aMethodName + " into " + className + "."); - switch (aMethodName) { - case "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", - "<init>", - "(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", - "<init>", - "(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<L" + aChunkCoordIntPair - + ";Lnet/minecraftforge/common/ForgeChunkManager$Ticket;>;", - l12, - l17, - 2); - mv.visitLocalVariable("removed", "L" + aChunkCoordIntPair + ";", null, l16, l14, 3); - mv.visitMaxs(5, 4); - mv.visitEnd(); - - } - case "unforceChunk" -> { - - 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", - "<init>", - "(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<L" + aChunkCoordIntPair - + ";Lnet/minecraftforge/common/ForgeChunkManager$Ticket;>;", - l6, - l10, - 2); - mv.visitLocalVariable( - "newMap", - "Lcom/google/common/collect/ImmutableSetMultimap;", - "Lcom/google/common/collect/ImmutableSetMultimap<L" + aChunkCoordIntPair - + ";Lnet/minecraftforge/common/ForgeChunkManager$Ticket;>;", - l8, - l10, - 3); - mv.visitMaxs(5, 4); - mv.visitEnd(); - - } - case "requestTicket" -> { - - 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", - "<init>", - "(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", - "<init>", - "(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(); - - } - case "releaseTicket" -> { - - mv = getWriter().visitMethod( - ACC_PUBLIC + ACC_STATIC, - "releaseTicket", - "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;)V", - null, - null); - mv.visitCode(); - Label l0 = new Label(); - mv.visitLabel(l0); - mv.visitLineNumber(693, l0); - mv.visitVarInsn(ALOAD, 0); - Label l1 = new Label(); - mv.visitJumpInsn(IFNONNULL, l1); - Label l2 = new Label(); - mv.visitLabel(l2); - mv.visitLineNumber(695, l2); - mv.visitInsn(RETURN); - mv.visitLabel(l1); - mv.visitLineNumber(697, l1); - mv.visitFrame(F_SAME, 0, null, 0, null); - mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn( - INVOKEVIRTUAL, - "net/minecraftforge/common/ForgeChunkManager$Ticket", - "isPlayerTicket", - "()Z", - false); - Label l3 = new Label(); - mv.visitJumpInsn(IFEQ, l3); - 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 l4 = new Label(); - mv.visitJumpInsn(IFNE, l4); - Label l5 = new Label(); - mv.visitJumpInsn(GOTO, l5); - mv.visitLabel(l3); - 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, l4); - mv.visitLabel(l5); - mv.visitLineNumber(699, l5); - mv.visitFrame(F_SAME, 0, null, 0, null); - mv.visitInsn(RETURN); - mv.visitLabel(l4); - mv.visitLineNumber(701, l4); - 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); - Label l6 = new Label(); - mv.visitJumpInsn(IFNULL, l6); - Label l7 = new Label(); - mv.visitLabel(l7); - mv.visitLineNumber(703, l7); - 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( - INVOKESTATIC, - "com/google/common/collect/ImmutableSet", - "copyOf", - "(Ljava/util/Collection;)Lcom/google/common/collect/ImmutableSet;", - false); - mv.visitMethodInsn( - INVOKEVIRTUAL, - "com/google/common/collect/ImmutableSet", - "iterator", - "()Ljava/util/Iterator;", - false); - mv.visitVarInsn(ASTORE, 2); - Label l8 = new Label(); - mv.visitJumpInsn(GOTO, l8); - Label l9 = new Label(); - mv.visitLabel(l9); - mv.visitFrame( - F_FULL, - 3, - new Object[] { "net/minecraftforge/common/ForgeChunkManager$Ticket", TOP, - "java/util/Iterator" }, - 0, - new Object[] {}); - mv.visitVarInsn(ALOAD, 2); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "next", "()Ljava/lang/Object;", true); - mv.visitTypeInsn(CHECKCAST, "" + aChunkCoordIntPair + ""); - mv.visitVarInsn(ASTORE, 1); - Label l10 = new Label(); - mv.visitLabel(l10); - mv.visitLineNumber(705, l10); - mv.visitVarInsn(ALOAD, 0); - mv.visitVarInsn(ALOAD, 1); - mv.visitMethodInsn( - INVOKESTATIC, - "net/minecraftforge/common/ForgeChunkManager", - "unforceChunk", - "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;L" + aChunkCoordIntPair + ";)V", - false); - mv.visitLabel(l8); - mv.visitLineNumber(703, l8); - mv.visitFrame(F_SAME, 0, null, 0, null); - mv.visitVarInsn(ALOAD, 2); - mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "hasNext", "()Z", true); - mv.visitJumpInsn(IFNE, l9); - mv.visitLabel(l6); - mv.visitLineNumber(708, l6); - mv.visitFrame( - F_FULL, - 1, - new Object[] { "net/minecraftforge/common/ForgeChunkManager$Ticket" }, - 0, - new Object[] {}); - mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn( - INVOKESTATIC, - "gtPlusPlus/preloader/ChunkDebugger", - "removeTicketFromCache", - "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;)V", - false); - Label l11 = new Label(); - mv.visitLabel(l11); - mv.visitLineNumber(709, l11); - mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn( - INVOKEVIRTUAL, - "net/minecraftforge/common/ForgeChunkManager$Ticket", - "isPlayerTicket", - "()Z", - false); - Label l12 = new Label(); - mv.visitJumpInsn(IFEQ, l12); - Label l13 = new Label(); - mv.visitLabel(l13); - mv.visitLineNumber(711, l13); - mv.visitFieldInsn( - GETSTATIC, - "net/minecraftforge/common/ForgeChunkManager", - "playerTickets", - "Lcom/google/common/collect/SetMultimap;"); - mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn( - INVOKESTATIC, - "net/minecraftforge/common/ForgeChunkManager$Ticket", - "access$100", - "(Lnet/minecraftforge/common/ForgeChunkManager$Ticket;)Ljava/lang/String;", - false); - mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn( - INVOKEINTERFACE, - "com/google/common/collect/SetMultimap", - "remove", - "(Ljava/lang/Object;Ljava/lang/Object;)Z", - true); - mv.visitInsn(POP); - Label l14 = new Label(); - mv.visitLabel(l14); - mv.visitLineNumber(712, l14); - 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.visitLdcInsn("Forge"); - mv.visitVarInsn(ALOAD, 0); - mv.visitMethodInsn( - INVOKEINTERFACE, - "com/google/common/collect/Multimap", - "remove", - "(Ljava/lang/Object;Ljava/lang/Object;)Z", - true); - mv.visitInsn(POP); - Label l15 = new Label(); - mv.visitLabel(l15); - mv.visitLineNumber(713, l15); - Label l16 = new Label(); - mv.visitJumpInsn(GOTO, l16); - mv.visitLabel(l12); - mv.visitLineNumber(716, l12); - 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", - "remove", - "(Ljava/lang/Object;Ljava/lang/Object;)Z", - true); - mv.visitInsn(POP); - mv.visitLabel(l16); - mv.visitLineNumber(718, l16); - mv.visitFrame(F_SAME, 0, null, 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, l10, l8, 1); - mv.visitMaxs(3, 3); - mv.visitEnd(); - } - } - - FMLRelaunchLog.log("[GT++ ASM] Chunkloading 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("forceChunk") || name.equals("unforceChunk") - || name.equals("requestTicket") - || name.equals("releaseTicket")) { - FMLRelaunchLog.log("[GT++ ASM] Chunkloading Patch", Level.INFO, "Found method " + name + ", Patching."); - return null; - } - return super.visitMethod(access, name, desc, signature, exceptions); - } - } -} diff --git a/src/main/java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java b/src/main/java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java index 30a5bae031..abdff476ea 100644 --- a/src/main/java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java +++ b/src/main/java/gtPlusPlus/preloader/asm/transformers/Preloader_Transformer_Handler.java @@ -55,12 +55,6 @@ public class Preloader_Transformer_Handler implements IClassTransformer { return new ClassTransformer_LWJGL_Keyboard(basicClass, isClientSettingsClass).getWriter().toByteArray(); } - // Enable mapping of Tickets and loaded chunks. - Forge - if (transformedName.equals(FORGE_CHUNK_MANAGER) && AsmConfig.enableChunkDebugging) { - Preloader_Logger.INFO("Chunkloading Patch", "Transforming " + transformedName); - return new ClassTransformer_Forge_ChunkLoading(basicClass, false).getWriter().toByteArray(); - } - // Fix the OreDictionary - Forge if (transformedName.equals(FORGE_ORE_DICTIONARY) && AsmConfig.enableOreDictPatch) { Preloader_Logger.INFO("OreDictTransformer", "Transforming " + transformedName); diff --git a/src/main/java/gtPlusPlus/preloader/keyboard/BetterKeyboard.java b/src/main/java/gtPlusPlus/preloader/keyboard/BetterKeyboard.java new file mode 100644 index 0000000000..c18cd2d714 --- /dev/null +++ b/src/main/java/gtPlusPlus/preloader/keyboard/BetterKeyboard.java @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2002-2008 LWJGL Project All rights reserved. Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following conditions are met: * Redistributions of source code + * must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in + * binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * Neither the name of 'LWJGL' nor the names of + * its contributors may be used to endorse or promote products derived from this software without specific prior written + * permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package gtPlusPlus.preloader.keyboard; + +import java.lang.reflect.Field; +import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.Map; + +import net.minecraft.client.resources.I18n; + +import org.apache.logging.log4j.Level; +import org.lwjgl.BufferUtils; +import org.lwjgl.input.Keyboard; + +import cpw.mods.fml.relauncher.FMLRelaunchLog; +import gtPlusPlus.core.util.reflect.ReflectionUtils; +import gtPlusPlus.preloader.asm.transformers.ClassTransformer_LWJGL_Keyboard; + +/** + * <br> + * A raw Keyboard interface. This can be used to poll the current state of the keys, or read all the keyboard presses / + * releases since the last read. + * + * DO NOT REMOVE. CALLED BY ASM CODE. + * + * @author cix_foo <cix_foo@users.sourceforge.net> + * @author elias_naur <elias_naur@users.sourceforge.net> + * @author Brian Matzon <brian@matzon.dk> + * @version $Revision$ $Id$ + */ +@SuppressWarnings("unused") +public class BetterKeyboard { + + public static final int KEYBOARD_SIZE = Short.MAX_VALUE; + + private static boolean init = false; + + public static void init() { + if (!init) { + FMLRelaunchLog.log( + "[GT++ ASM] LWJGL Keybinding index out of bounds fix", + Level.INFO, + "Trying to patch out LWJGL internal arrays with larger ones."); + Field aKeyNameSize = ReflectionUtils.getField(Keyboard.class, "keyName"); + Field aKeyMapSize = ReflectionUtils.getField(Keyboard.class, "keyMap"); + Field aKeyDownBuffer = ReflectionUtils.getField(Keyboard.class, "keyDownBuffer"); + String[] aOldKeyNameArray = ReflectionUtils.getFieldValue(aKeyNameSize); + if (aOldKeyNameArray != null && aOldKeyNameArray.length < Short.MAX_VALUE) { + String[] aNewKeyNameArray = new String[Short.MAX_VALUE]; + for (int i = 0; i < aOldKeyNameArray.length; i++) { + aNewKeyNameArray[i] = aOldKeyNameArray[i]; + } + try { + ReflectionUtils.setFinalFieldValue(Keyboard.class, aKeyNameSize.getName(), aNewKeyNameArray); + FMLRelaunchLog.log( + "[GT++ ASM] LWJGL Keybinding index out of bounds fix", + Level.INFO, + "Patched Field: " + aKeyNameSize.getName()); + } catch (Throwable t) { + FMLRelaunchLog.log( + "[GT++ ASM] LWJGL Keybinding index out of bounds fix", + Level.INFO, + "Failed Patching Field: " + aKeyDownBuffer.getName()); + } + } + Map<String, Integer> aOldKeyMapArray = ReflectionUtils.getFieldValue(aKeyMapSize); + if (aOldKeyNameArray != null && aOldKeyMapArray.size() < Short.MAX_VALUE) { + Map<String, Integer> aNewKeyMapArray = new HashMap<String, Integer>(Short.MAX_VALUE); + aNewKeyMapArray.putAll(aOldKeyMapArray); + try { + ReflectionUtils.setFinalFieldValue(Keyboard.class, aKeyMapSize.getName(), aNewKeyMapArray); + FMLRelaunchLog.log( + "[GT++ ASM] LWJGL Keybinding index out of bounds fix", + Level.INFO, + "Patched Field: " + aKeyMapSize.getName()); + } catch (Throwable t) { + FMLRelaunchLog.log( + "[GT++ ASM] LWJGL Keybinding index out of bounds fix", + Level.INFO, + "Failed Patching Field: " + aKeyDownBuffer.getName()); + } + } + ByteBuffer aOldByteBuffer = ReflectionUtils.getFieldValue(aKeyDownBuffer); + if (aOldByteBuffer != null && aOldByteBuffer.capacity() == Keyboard.KEYBOARD_SIZE) { + ByteBuffer aNewByteBuffer = BufferUtils.createByteBuffer(Short.MAX_VALUE); + try { + ReflectionUtils.setFinalFieldValue(Keyboard.class, aKeyDownBuffer.getName(), aNewByteBuffer); + FMLRelaunchLog.log( + "[GT++ ASM] LWJGL Keybinding index out of bounds fix", + Level.INFO, + "Patched Field: " + aKeyDownBuffer.getName()); + } catch (Throwable t) { + FMLRelaunchLog.log( + "[GT++ ASM] LWJGL Keybinding index out of bounds fix", + Level.INFO, + "Failed Patching Field: " + aKeyDownBuffer.getName()); + } + } + init = true; + } + } + + /** + * Gets a key's name + * + * @param key The key + * @return a String with the key's human readable name in it or null if the key is unnamed + */ + public static synchronized String getKeyName(int key) { + return ClassTransformer_LWJGL_Keyboard.getKeyName(key); + } + + /** + * Represents a key or mouse button as a string. Args: key + */ + public static String getKeyDisplayString(int aKeyValue) { + return aKeyValue < 0 ? I18n.format("key.mouseButton", new Object[] { Integer.valueOf(aKeyValue + 101) }) + : getKeyName(aKeyValue); + } +} |