模组加载检测

基本信息

属性 值
类 com.gtnewhorizon.gtnhlib.compat.Mods
源码 src/main/java/com/gtnewhorizon/gtnhlib/compat/Mods.java
常量数 4
判定方式 cpw.mods.fml.common.Loader.isModLoaded(String)

⚠️ 本 mod 中没有名为 ModTags 的类。compat/Mods.java 全文只有 4 个 public static final boolean,是 GTNHLib 实际提供的 mod 检测入口。

常量

compat/Mods.java 全文:

public class Mods {

    public static final boolean FALSETWEAKS = Loader.isModLoaded("falsetweaks");
    public static final boolean NEI = Loader.isModLoaded("NotEnoughItems");
    public static final boolean ANGELICA = Loader.isModLoaded("angelica");

    // Covers both Baubles and Baubles-Expanded.
    public static final boolean BAUBLES = Loader.isModLoaded("Baubles");
}
常量 检测的 modid 说明
FALSETWEAKS falsetweaks FalseTweaks
NEI NotEnoughItems NotEnoughItems
ANGELICA angelica Angelica
BAUBLES Baubles 同时覆盖 Baubles 与 Baubles-Expanded(源码注释明确说明)

关键陷阱:这些是 static final,值在类加载时冻结

四个常量都是 static final boolean 并在静态初始化时调用 Loader.isModLoaded。由于 GTNHLib 的 coremod 早在 mod 加载前就运行,一旦 Mods 类被加载,值即固定。BAUBLES 字段的注释之所以要专门说明"同时覆盖两者",正是因为 Baubles-Expanded 复用了 Baubles 这个 modid。

因此:

  • 在 coremod / mixin 早期阶段引用 Mods.BAUBLES 可能得到错误的 false
  • 需要在 FML 生命周期内、mod 列表确定之后再求值时,应改用 Loader.isModLoaded(...) 直接调用

对比:GTNHLib 自身的 GTNHLib 类用的是可变的非 final 静态字段(GTNHLib.java:32-34),在 preInit 中赋值:

public static boolean isMFRLoaded;
public static boolean isCoFHCoreLoaded;
public static boolean isMui2Loaded;

这正是为了避开上面的冻结问题。

数值

数值名 值
常量数 4
static final 常量 4(全部)
覆盖的外部 mod 4(falsetweaks、NotEnoughItems、angelica、Baubles)
额外覆盖的 fork 1(Baubles-Expanded,与 Baubles 共用 modid)

GTNHLib 类的 3 个可变标志(isMFRLoaded、isCoFHCoreLoaded、isMui2Loaded)不在 Mods 中,而是在 preInit 单独赋值,覆盖 MineFactory Reloaded、CoFH Core、ModularUI 2 三个 mod。

交互

Mods.NEI 与 GTNHLibConfig.ignoreNEIVersion 配合:后者为 true 时跳过 NEI 版本检查(见 第三方模组兼容)。

Mods.BAUBLES 供 compat/BaublesCompat.java 使用,后者在类加载失败时静默降级。

相关条目