From c4e7ce22160287a9f4b1b8652955309fc49a8b91 Mon Sep 17 00:00:00 2001 From: kappa_maintainer Date: Thu, 11 Jan 2024 19:35:38 +0800 Subject: [PATCH] Add ASM patch to FoamFix, I hate mods writing ASM not like everyone else --- README.md | 1 + gradle.properties | 2 +- .../com/cleanroommc/FugueLoadingPlugin.java | 7 +- .../transformer/FoamFixTransformer.java | 71 +++++++++++++++++++ 4 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/cleanroommc/transformer/FoamFixTransformer.java diff --git a/README.md b/README.md index e52c718..ed99366 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ Also check [The Fugue Plane](https://forgottenrealms.fandom.com/wiki/Fugue_Plane * Aqua Acrobatics * Advanced Rocketry * Entity Distance +* FoamFix ## Note Add ! to start of the file name to fix Lag Goggles. \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 186d106..66a8e1a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,7 +16,7 @@ mappings_version=39-1.12 mod_id=fugue mod_name=Fugue mod_main_class=Fugue -mod_version=0.3.2 +mod_version=0.3.3 mod_base_package=com.cleanroommc.fugue mod_authors=kappa_maintainer mod_description=A mod that patch dead mods for Cleanroom diff --git a/src/main/java/com/cleanroommc/FugueLoadingPlugin.java b/src/main/java/com/cleanroommc/FugueLoadingPlugin.java index cb14f89..fdf79b3 100644 --- a/src/main/java/com/cleanroommc/FugueLoadingPlugin.java +++ b/src/main/java/com/cleanroommc/FugueLoadingPlugin.java @@ -15,6 +15,10 @@ public class FugueLoadingPlugin implements IFMLLoadingPlugin, IEarlyMixinLoader Launch.classLoader.addTransformerExclusionFilter("com.github.terminatornl.laggoggles."); Launch.classLoader.addTransformerExclusionFilter("quaternary.botaniatweaks."); Launch.classLoader.addTransformerExclusionFilter("zmaster587.advancedRocketry.asm."); + Launch.classLoader.addTransformerExclusion("pl.asie.foamfix.shared."); + Launch.classLoader.addTransformerExclusion("pl.asie.patchy.handlers."); + Launch.classLoader.addTransformerExclusion("pl.asie.foamfix.coremod.patches.BlockPosPatch$BlockPosMethodVisitor"); + Launch.classLoader.addTransformerExclusionFilter("pl.asie.foamfix"); Launch.classLoader.registerTransformer("com.cleanroommc.transformer.InitializerTransformer"); } @@ -24,7 +28,8 @@ public String[] getASMTransformerClass() { return new String[]{ "com.cleanroommc.transformer.EnderCoreTransformerTransformer", "com.cleanroommc.transformer.InitializerTransformer", - "com.cleanroommc.transformer.ClassTransformerTransformer" + "com.cleanroommc.transformer.ClassTransformerTransformer", + "com.cleanroommc.transformer.FoamFixTransformer" }; } diff --git a/src/main/java/com/cleanroommc/transformer/FoamFixTransformer.java b/src/main/java/com/cleanroommc/transformer/FoamFixTransformer.java new file mode 100644 index 0000000..5402609 --- /dev/null +++ b/src/main/java/com/cleanroommc/transformer/FoamFixTransformer.java @@ -0,0 +1,71 @@ +package com.cleanroommc.transformer; + +import com.cleanroommc.Fugue; +import net.minecraft.launchwrapper.IClassTransformer; +import net.minecraft.launchwrapper.Launch; +import net.minecraft.launchwrapper.LaunchClassLoader; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.*; + +import java.util.LinkedHashMap; + +public class FoamFixTransformer implements IClassTransformer { + private int count = 4; + private static final LinkedHashMap classMap = new LinkedHashMap<>(); + static { + classMap.put("pl.asie.foamfix.coremod.patches.BlockPosPatch", "patchOtherClass"); + classMap.put("pl.asie.foamfix.coremod.patches.GhostBusterBlockStateAccessPatch", "apply"); + classMap.put("pl.asie.foamfix.coremod.patches.ClassGetSimpleNamePatch", "apply"); + classMap.put("pl.asie.patchy.helpers.ConstructorReplacingTransformer", "apply"); + } + @Override + public byte[] transform(String s, String s1, byte[] bytes) { + if (bytes == null) + { + return null; + } + + if (count == 0) + { + return bytes; + } + + for (String clazz : classMap.keySet()) { + if (s1.equals(clazz)) { + ClassNode classNode = new ClassNode(); + ClassReader classReader = new ClassReader(bytes); + classReader.accept(classNode, 0); + boolean modified = false; + if (classNode.methods != null) { + for (MethodNode methodNode : classNode.methods) { + if (methodNode.name.equals(classMap.get(clazz))) { + + InsnList instructions = methodNode.instructions; + if (instructions != null) { + for (AbstractInsnNode insnNode : instructions) { + if (insnNode instanceof LdcInsnNode ldcInsnNode) { + instructions.insert(ldcInsnNode, new LdcInsnNode(Opcodes.ASM9)); + instructions.remove(ldcInsnNode); + modified = true; + } + } + } + } + } + } + if (modified) { + Launch.classLoader.addTransformerExclusion(clazz); + count--; + ClassWriter classWriter = new ClassWriter(0); + + classNode.accept(classWriter); + return classWriter.toByteArray(); + } + return bytes; + } + } + return bytes; + } +}