引导
有关Mixin引导部分的说明可以参考 Introduction to Mixins The Mixin Environment。
由于Mixin是为CoreMod服务的,所以Mixin需要使用CoreMod引导。 由于LiteLoader和Fabric已经做好了引导工作,因此不需要由模组手动引导。 也可以使用-javaagent参数引导(参见MixinAgent)。
引导的时机
借用Mixin wiki的一张图来说明这个问题:

因为Mixin自带一个 Tweaker 需要被添加,所以需要在LaunchWrapper还在调用实现ITweaker的类的阶段引导Mixin,也就是上图的过程①,所以需要在CoreMod入口类合适的方法中引导。
再回顾LaunchWarpper的加载流程,因为Mixin会在TweakClasses中添加一个Tweaker,所以不能在循环tweakClassNames时(也就是在Tweaker的构造方法中)引导Mixin,否则会抛出java.util.ConcurrentModificationException。
所以,Mixin需要在ITweaker中的acceptOptions或者injectIntoClassLoader中引导。一个基本的Mixin引导方法如下所示:
TweakClass or FMLCorePlugin?
我们知道,FML提供了一个对ITweaker的封装接口,也就是IFMLLoadingPlugin,但是,MixinBootstrap不能在这里被直接调用
为什么?
因为IFMLLoadingPlugin的实现类是通过LaunchClassLoader加载的,ITweaker的实现类是通过sun.misc.Launcher$AppClassLoader加载的,而Mixin引导相关的类都会通过AppClassLoader加载(参见MixinServiceLaunchWrapperBootstrap),所以如果直接调用,会抛出如下异常:
怎么办?
那就让IFMLLoadingPlugin实现类也用AppClassLoader加载一次。
不推荐这么做,因为这样打破了FML加载模组的规则
在Tweaker-Mod中使用@Mod注解
@Mod注解在FMLCoreMod中,只需要在清单文件中添加FMLCorePluginContainsFMLMod属性就能让这个模组也能作为普通模组加载,但是在Tweaker-Mod中是不行的,按照加载流程,FML在读取到有TweakClass属性后就不再继续读取其他的属性了(也就是只有FMLAT属性会被读到,其他都会被忽略)。
按照ReplayMod的方法,只需要获取到CoreModManager类中的ignoredModFiles字段,并从中移除模组自身文件名即可。
所以,现在应该这样:
现在,就可以让这个模组的@Mod注解也被识别了。
Last updated
Was this helpful?