From f02b2acde52798127711593f7cdce1741f581443 Mon Sep 17 00:00:00 2001 From: CPTProgrammer <46586216+CPTProgrammer@users.noreply.github.com> Date: Tue, 24 Jun 2025 21:49:43 +0800 Subject: [PATCH] Fix #10 Use `ASM` instead of `Class.forName` to check `shouldApplyMixin` --- .../chatplus/plugin/MixinConfigPlugin.java | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/main/java/cn/revaria/chatplus/plugin/MixinConfigPlugin.java b/src/main/java/cn/revaria/chatplus/plugin/MixinConfigPlugin.java index 8d14fa2..935cb8d 100644 --- a/src/main/java/cn/revaria/chatplus/plugin/MixinConfigPlugin.java +++ b/src/main/java/cn/revaria/chatplus/plugin/MixinConfigPlugin.java @@ -2,11 +2,14 @@ package cn.revaria.chatplus.plugin; import cn.revaria.chatplus.plugin.annotation.DisableIfModsLoaded; import net.fabricmc.loader.api.FabricLoader; +import org.objectweb.asm.tree.AnnotationNode; import org.objectweb.asm.tree.ClassNode; import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; import org.spongepowered.asm.mixin.extensibility.IMixinInfo; +import org.spongepowered.asm.service.MixinService; +import org.spongepowered.asm.util.Annotations; -import java.util.Arrays; +import java.io.IOException; import java.util.List; import java.util.Set; @@ -23,14 +26,17 @@ public class MixinConfigPlugin implements IMixinConfigPlugin { @Override public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { try { - Class mixinClass = Class.forName(mixinClassName); - DisableIfModsLoaded annotation = mixinClass.getAnnotation(DisableIfModsLoaded.class); - if (annotation != null) { - return Arrays.stream(annotation.value()).noneMatch(modId -> FabricLoader.getInstance().isModLoaded(modId)); + ClassNode classNode = MixinService.getService().getBytecodeProvider().getClassNode(mixinClassName); + AnnotationNode annotationNode = Annotations.getVisible(classNode, DisableIfModsLoaded.class); + + if (annotationNode == null) { + return true; } - return true; - } catch (Exception e) { - return true; + + List modIds = Annotations.getValue(annotationNode); + return modIds.stream().noneMatch(modId -> FabricLoader.getInstance().isModLoaded(modId)); + } catch (IOException | ClassNotFoundException e) { + return false; } }