From 7537fca4c62af85f8c0d3150b4749cbacd941198 Mon Sep 17 00:00:00 2001 From: arcade_kappa Date: Thu, 4 Apr 2024 09:08:53 +0800 Subject: [PATCH] Move ccl patch from mixin to transformer --- gradle.properties | 2 +- .../cleanroommc/fugue/FugueLoadingPlugin.java | 3 ++ .../ClassHierarchyManagerMixin.java | 27 --------------- .../ClassHierarchyManagerTransformer.java | 34 +++++++++++++++++++ src/main/resources/fugue.mixin.preinit.json | 12 ------- 5 files changed, 38 insertions(+), 40 deletions(-) delete mode 100644 src/main/java/com/cleanroommc/fugue/mixin/codechickenlib/ClassHierarchyManagerMixin.java create mode 100644 src/main/java/com/cleanroommc/fugue/transformer/ClassHierarchyManagerTransformer.java delete mode 100644 src/main/resources/fugue.mixin.preinit.json diff --git a/gradle.properties b/gradle.properties index 16fff9d..6e2def5 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.12.4-beta +mod_version=0.12.5-beta 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/fugue/FugueLoadingPlugin.java b/src/main/java/com/cleanroommc/fugue/FugueLoadingPlugin.java index bb65c51..d7db5b7 100644 --- a/src/main/java/com/cleanroommc/fugue/FugueLoadingPlugin.java +++ b/src/main/java/com/cleanroommc/fugue/FugueLoadingPlugin.java @@ -86,6 +86,9 @@ public class FugueLoadingPlugin implements IFMLLoadingPlugin { if (FugueConfig.modPatchConfig.enableXNet) { TransformerDelegate.registerExplicitTransformerByInstance(new EnergyConnectorSettingsTransformer(), "mcjty.xnet.apiimpl.energy.EnergyConnectorSettings"); } + if (FugueConfig.modPatchConfig.enableCCL) { + TransformerDelegate.registerExplicitTransformerByInstance(new ClassHierarchyManagerTransformer(), "codechicken.asm.ClassHierarchyManager"); + } if (FugueConfig.getCodeSourcePatchTargets.length > 0) { TransformerDelegate.registerExplicitTransformerByInstance(new ITweakerTransformer(), FugueConfig.getCodeSourcePatchTargets); } diff --git a/src/main/java/com/cleanroommc/fugue/mixin/codechickenlib/ClassHierarchyManagerMixin.java b/src/main/java/com/cleanroommc/fugue/mixin/codechickenlib/ClassHierarchyManagerMixin.java deleted file mode 100644 index 82c55ea..0000000 --- a/src/main/java/com/cleanroommc/fugue/mixin/codechickenlib/ClassHierarchyManagerMixin.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.cleanroommc.fugue.mixin.codechickenlib; - -import codechicken.asm.ClassHierarchyManager; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import java.util.HashMap; - -@Mixin(value = ClassHierarchyManager.class, remap = false) -public class ClassHierarchyManagerMixin { - @Shadow public static HashMap superclasses; - - @Inject(method = "getOrCreateCache", at = @At("HEAD"), cancellable = true) - private static void threadSafe(String name, CallbackInfoReturnable cir) { - ClassHierarchyManager.SuperCache cache; - if (!superclasses.containsKey(name)) { - cache = new ClassHierarchyManager.SuperCache(); - superclasses.put(name, cache); - } else { - cache = superclasses.get(name); - } - cir.setReturnValue(cache); - } -} diff --git a/src/main/java/com/cleanroommc/fugue/transformer/ClassHierarchyManagerTransformer.java b/src/main/java/com/cleanroommc/fugue/transformer/ClassHierarchyManagerTransformer.java new file mode 100644 index 0000000..77e5b7d --- /dev/null +++ b/src/main/java/com/cleanroommc/fugue/transformer/ClassHierarchyManagerTransformer.java @@ -0,0 +1,34 @@ +package com.cleanroommc.fugue.transformer; + +import com.cleanroommc.fugue.Fugue; +import javassist.ClassPool; +import javassist.CtClass; +import top.outlands.foundation.IExplicitTransformer; + +import java.io.ByteArrayInputStream; + +public class ClassHierarchyManagerTransformer implements IExplicitTransformer { + @Override + public byte[] transform(byte[] bytes) { + try { + CtClass cc = ClassPool.getDefault().makeClass(new ByteArrayInputStream(bytes)); + cc.getMethod("getOrCreateCache", "(Ljava/lang/String;)Lcodechicken/asm/ClassHierarchyManager$SuperCache;").setBody( + """ + { + SuperCache cache; + if (!superclasses.containsKey(name)) { + cache = new SuperCache(); + superclasses.put(name, cache); + } else { + cache = superclasses.get(name); + } + return cache; + } + """); + bytes = cc.toBytecode(); + } catch (Throwable t) { + Fugue.LOGGER.error(t); + } + return bytes; + } +} diff --git a/src/main/resources/fugue.mixin.preinit.json b/src/main/resources/fugue.mixin.preinit.json deleted file mode 100644 index 0ca4a70..0000000 --- a/src/main/resources/fugue.mixin.preinit.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "required": true, - "package": "com.cleanroommc.fugue.mixin", - "compatibilityLevel": "JAVA_8", - "refmap": "fugue.mixin.refmap.json", - "target": "@env(PREINIT)", - "plugin": "com.cleanroommc.fugue.FugueMixinConfigPlugin", - "mixins": [ - "codechickenlib.ClassHierarchyManagerMixin" - ], - "minVersion": "0.8" -} \ No newline at end of file