AddonPlugin 系统

Estimated reading time: 3 minutes

Addon 是一种特殊的 Mod,作为功能扩展的中间层存在。通过将常用功能集中在一个 Mod 中供其他 Mod 调用,避免 ModLoader 本身过于臃肿,同时方便独立更新。

设计理念

类似于 RimWorld 中的「身体扩展」「战斗扩展」「发饰扩展」等 Mod,Addon 通过注入和修改游戏并扩展出新功能供其他 Mod 调用。

将功能独立为 Addon 的好处:

  • 保持 ModLoader 核心的轻量与通用
  • 将特定游戏相关的功能与 SC2 引擎绑定的 ModLoader 分离
  • 方便快速更新和升级
  • Mod 作者可以 fork 实现更复杂的功能而无需修改 ModLoader

注册 Addon

Addon Mod 需要在 EarlyLoad 阶段(或 InjectEarlyLoad 阶段)调用以下 API 注册自己:

window.modAddonPluginManager.registerAddonPlugin(
  "AddonModName", // 提供插件的 Mod 名称
  "addonName", // 插件名称
  addonInstance, // 插件实例(实现了 AddonPluginHookPointEx 接口的对象)
);

使用 Addon

普通 Mod 在 boot.jsonaddonPlugin 字段中声明依赖:

{
  "addonPlugin": [
    {
      "modName": "AddonModName",
      "addonName": "addonName",
      "modVersion": "1.0.0",
      "params": []
    }
  ]
}

ModLoader 会在 EarlyLoad 之后、PatchModToGame 之前,将所有声明了 addonPlugin 的 Mod 注册到对应的 Addon Mod。

注册流程

1. Addon Mod 在 EarlyLoad 阶段调用 registerAddonPlugin() 注册自身

2. ModLoader 调用 registerMod2Addon() 将普通 Mod 注册到对应 Addon

3. Addon Mod 通过 registerMod 回调收到通知

4. Addon Mod 根据自身设计执行记录或操作

Addon 示例

ImageLoaderHook

ImageLoaderHook 通过挂钩 DoL 游戏中的图片加载器(Renderer.ImageLoader),实现将 Mod 中的图片加载到游戏中。游戏加载图片时会自动读取 Mod 中的替换图片。

ReplacePatch / TweeReplacer

ReplacePatchTweeReplacer 实现 Passage 和 JS/CSS 的字符串替换功能。大部分需要修改游戏逻辑的 Mod 可以直接使用这两个 Addon 而无需自行编写修改代码。

CheckDoLCompressorDictionaries

CheckDoLCompressorDictionaries 检查 DoL 的数据压缩字典结构,在发现变化后发出警告,提示开发者和用户避免影响存档有效性。