From 25520fae9965b046fee4e6870a42c14228171f76 Mon Sep 17 00:00:00 2001 From: arcade_kappa Date: Fri, 12 Jul 2024 18:04:18 +0800 Subject: [PATCH] Patch Ears --- .../fugue/common/FugueLoadingPlugin.java | 13 ++++++ .../fugue/config/ModPatchConfig.java | 3 ++ .../fugue/transformer/EarsASMTransformer.java | 44 +++++++++++++++++++ .../ExceptionMessageTransformer.java | 22 ++++++++++ 4 files changed, 82 insertions(+) create mode 100644 src/main/java/com/cleanroommc/fugue/transformer/EarsASMTransformer.java create mode 100644 src/main/java/com/cleanroommc/fugue/transformer/groovyscript/ExceptionMessageTransformer.java diff --git a/src/main/java/com/cleanroommc/fugue/common/FugueLoadingPlugin.java b/src/main/java/com/cleanroommc/fugue/common/FugueLoadingPlugin.java index ad84232..2881c07 100644 --- a/src/main/java/com/cleanroommc/fugue/common/FugueLoadingPlugin.java +++ b/src/main/java/com/cleanroommc/fugue/common/FugueLoadingPlugin.java @@ -3,6 +3,7 @@ import com.cleanroommc.fugue.config.FugueConfig; import com.cleanroommc.fugue.modifiers.IC2ExtraFixer; import com.cleanroommc.fugue.transformer.*; +import com.cleanroommc.fugue.transformer.groovyscript.ExceptionMessageTransformer; import com.cleanroommc.fugue.transformer.groovyscript.GroovyClassLoaderTransformer; import com.cleanroommc.fugue.transformer.logisticpipes.*; import com.cleanroommc.fugue.transformer.loliasm.JavaFixesTransformer; @@ -120,6 +121,7 @@ public class FugueLoadingPlugin implements IFMLLoadingPlugin { } if (FugueConfig.modPatchConfig.enableGroovyScript) { TransformerDelegate.registerExplicitTransformerByInstance(new GroovyClassLoaderTransformer(), "groovy.lang.GroovyClassLoader$ClassCollector"); + TransformerDelegate.registerExplicitTransformerByInstance(new ExceptionMessageTransformer(), "org.codehaus.groovy.control.messages.ExceptionMessage"); } if (FugueConfig.modPatchConfig.enableIC2CE) { Config.registerConfigModifier(new IC2ExtraFixer(), "mixins.ic2c_extras.json"); @@ -150,6 +152,17 @@ public class FugueLoadingPlugin implements IFMLLoadingPlugin { if (FugueConfig.modPatchConfig.enable5zig) { TransformerDelegate.registerExplicitTransformerByInstance(new ClassTweakerTransformer(), "eu.the5zig.mod.asm.ClassTweaker"); } + if (FugueConfig.modPatchConfig.enableEars) { + TransformerDelegate.registerExplicitTransformerByInstance(new EarsASMTransformer(), + "com.unascribed.ears.asm.ImageBufferDownloadTransformer", + "com.unascribed.ears.asm.LayerElytraTransformer", + "com.unascribed.ears.asm.RenderPlayerTransformer", + "com.unascribed.ears.asm.ThreadDownloadImageDataTransformer", + "com.unascribed.ears.common.agent.mini.MiniTransformer", + "com.unascribed.ears.common.agent.mini.PatchContext", + "com.unascribed.ears.common.agent.mini.PatchContext$SearchResult" + ); + } if (FugueConfig.getCodeSourcePatchTargets.length > 0) { TransformerDelegate.registerExplicitTransformerByInstance(new ITweakerTransformer(), FugueConfig.getCodeSourcePatchTargets); } diff --git a/src/main/java/com/cleanroommc/fugue/config/ModPatchConfig.java b/src/main/java/com/cleanroommc/fugue/config/ModPatchConfig.java index 477a79a..dd1880a 100644 --- a/src/main/java/com/cleanroommc/fugue/config/ModPatchConfig.java +++ b/src/main/java/com/cleanroommc/fugue/config/ModPatchConfig.java @@ -103,4 +103,7 @@ public class ModPatchConfig { public boolean enableBetterFC = true; @Config.Name("Enable 5zig Patch") public boolean enable5zig = true; + @Config.Name("Enable Ears Patch") + @Config.Comment("This mod is packing a copy of ASM itself") + public boolean enableEars = true; } diff --git a/src/main/java/com/cleanroommc/fugue/transformer/EarsASMTransformer.java b/src/main/java/com/cleanroommc/fugue/transformer/EarsASMTransformer.java new file mode 100644 index 0000000..4975193 --- /dev/null +++ b/src/main/java/com/cleanroommc/fugue/transformer/EarsASMTransformer.java @@ -0,0 +1,44 @@ +package com.cleanroommc.fugue.transformer; + +import net.minecraftforge.fml.common.FMLLog; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.commons.ClassRemapper; +import org.objectweb.asm.commons.Remapper; +import top.outlands.foundation.IExplicitTransformer; + +public class EarsASMTransformer implements IExplicitTransformer { + @Override + public byte[] transform(byte[] basicClass) { + ClassReader reader = new ClassReader(basicClass); + ClassWriter writer = new ClassWriter(0); + ClassVisitor visitor = new ClassRemapper(writer, new ASMRemapper()); + try { + reader.accept(visitor, ClassReader.EXPAND_FRAMES); + } catch (Exception e) { + FMLLog.log.warn("Couldn't remap class {}", reader.getClassName(), e); + return basicClass; + } + return writer.toByteArray(); + } + + static class ASMRemapper extends Remapper { + final String fromPrefixes = "com/unascribed/ears/common/agent/mini/asm/"; + + final String toPrefixes = "org/objectweb/asm/"; + + @Override + public String map(String typeName) { + if (typeName == null) { + return null; + } + if (typeName.startsWith(fromPrefixes)) { + return toPrefixes + typeName.substring(fromPrefixes.length()); + } + + + return typeName; + } + } +} diff --git a/src/main/java/com/cleanroommc/fugue/transformer/groovyscript/ExceptionMessageTransformer.java b/src/main/java/com/cleanroommc/fugue/transformer/groovyscript/ExceptionMessageTransformer.java new file mode 100644 index 0000000..a7c6752 --- /dev/null +++ b/src/main/java/com/cleanroommc/fugue/transformer/groovyscript/ExceptionMessageTransformer.java @@ -0,0 +1,22 @@ +package com.cleanroommc.fugue.transformer.groovyscript; + +import com.cleanroommc.fugue.common.Fugue; +import javassist.ClassPool; +import javassist.CtClass; +import top.outlands.foundation.IExplicitTransformer; + +import java.io.ByteArrayInputStream; + +public class ExceptionMessageTransformer implements IExplicitTransformer { + @Override + public byte[] transform(byte[] bytes) { + try { + CtClass cc = ClassPool.getDefault().makeClass(new ByteArrayInputStream(bytes)); + cc.getDeclaredMethod("write").setBody("{}"); + bytes = cc.toBytecode(); + } catch (Throwable t) { + Fugue.LOGGER.error("Exception {} on {}", t, this.getClass().getSimpleName()); + } + return bytes; + } +}