Theseus 模组文档
开发指南

依赖声明


模组间依赖分两层:硬依赖决定「能不能加载」,软约束只决定「同阶段内的遍历次序」。

9.1 硬依赖:ModInfo.dependsOn(List<String>)

ModInfo 是 record,dependsOn 是第 6 个分量,声明本模组依赖的模组 id 列表;不声明依赖的模组用工厂方法 ModInfo.of(id, name, version, authors, description) 构造,此时 dependsOn 为空列表。

语义:

java
@Override
public ModInfo info() {
    return new ModInfo(
            "my_hud",
            "My HUD",
            "0.1.0",
            List.of("You"),
            "依赖 core_lib 提供的状态",
            List.of("core_lib")     // 硬依赖:core_lib 未注册 / 未启用则本模组 LOAD_FAILED
    );
}

9.2 软依赖:Mod.loadOrder() 与 LoadStage

Mod.loadOrder() 默认返回 null,等价于落在 LoadStage.INIT 阶段、无软依赖。返回 ModLoadOrder 可声明加载阶段与软依赖:

java
public record ModLoadOrder(
        LoadStage stage,
        List<String> loadAfter,
        List<String> loadBefore
) {
    public static ModLoadOrder of(LoadStage stage);
    public static ModLoadOrder init();
}

LoadStage 取值:CORE → PRE_INIT → INIT → POST_INIT,宿主按阶段升序激活,未声明阶段的模组默认落在 INIT。

关键语义:

java
@Override
public ModLoadOrder loadOrder() {
    // 落在 INIT 阶段,并在 other_mod 参与本次加载时排在它之后(目标不在则自动失效)
    return new ModLoadOrder(LoadStage.INIT, List.of("other_mod"), List.of());
}

9.3 依赖声明写错时的现象

写法现象
dependsOn 写了一个未安装 / 未启用的 id本模组 LOAD_FAILED,getLoadError(id) 给出 Missing dependencies: [...];其余模组不受影响
两个模组互相 dependsOn两者(或环上成员)LOAD_FAILED,原因为 Circular dependency: A -> B -> A
把软依赖当硬依赖用(只写 loadAfter 却没写 dependsOn)目标模组未启用时不报错,只是次序约束失效;若代码假定目标一定存在,会在运行期取到 null(如 modServices().find(...) 返回 null)
无消费者却声明 LoadStage.CORE宿主自动降级为 INIT 并记录告警,不加载失败
依赖了一个「加载失败」的模组视为依赖不满足,本模组同样 LOAD_FAILED

需要「目标模组的服务一定已注册」这类保证时,正确做法是硬依赖 + 软依赖一起声明(dependsOn 保证它在,loadAfter 保证它先跑完);不要依赖加载顺序碰运气。