引导

有关Mixin引导部分的说明可以参考 Introduction to Mixins The Mixin Environmentarrow-up-right

由于Mixin是为CoreMod服务的,所以Mixin需要使用CoreMod引导。 由于LiteLoader和Fabric已经做好了引导工作,因此不需要由模组手动引导。 也可以使用-javaagent参数引导(参见MixinAgentarrow-up-right)。

引导的时机

借用Mixin wiki的一张图来说明这个问题:

因为Mixin自带一个 Tweakerarrow-up-right 需要被添加,所以需要在LaunchWrapper还在调用实现ITweaker的类的阶段引导Mixin,也就是上图的过程①,所以需要在CoreMod入口类合适的方法中引导。

再回顾LaunchWarpper的加载流程,因为Mixin会在TweakClasses添加一个Tweakerarrow-up-right,所以不能在循环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加载(参见MixinServiceLaunchWrapperBootstraparrow-up-right),所以如果直接调用,会抛出如下异常:

怎么办?

那就让IFMLLoadingPlugin实现类也用AppClassLoader加载一次。 不推荐这么做,因为这样打破了FML加载模组的规则

在Tweaker-Mod中使用@Mod注解

在FMLCoreMod中,只需要在清单文件中添加FMLCorePluginContainsFMLMod属性就能让这个模组也能作为普通模组加载,但是在Tweaker-Mod中是不行的,按照加载流程,FML在读取到有TweakClass属性后就不再继续读取其他的属性了(也就是只有FMLAT属性会被读到,其他都会被忽略)。

按照ReplayModarrow-up-right方法arrow-up-right,只需要获取到CoreModManager类中的ignoredModFiles字段,并从中移除模组自身文件名即可。

所以,现在应该这样:

现在,就可以让这个模组的@Mod注解也被识别了。

Last updated

Was this helpful?