依赖关系
在动手编写插件之前,建议先了解言出法随由哪些模块组成、它们之间怎样依赖,以便找到你真正需要依赖的那一个。各个模块的实现细节见深入其中,这里只讲它们的关系。
Numen API 与插件
ai、agent、lua、ui 和 api 合在一起就是 Numen API,模组 id 为 numen_api,前四个模块的代码都平铺在它的 jar 里。
Numen API 本身已经是一个完整的智能体。如果只装 Numen API 时会发生什么?
智能体照样能聊天、能运行 Lua 程序,甚至能执行指令,只是它对世界几乎什么都做不了,因为我们没有提供任何 Lua API。
Numen 是 Numen API 的第一个插件,模组 id 为 numen,在仓库里是 core 模块。它登记自己的 Lua API、技能和 Lua 模块时,用的是和其他插件完全相同的入口 NumenPlugins.register,没有任何特殊待遇;它要用的寻路,也由它自己依赖,而不是放进 Numen API。
所以 Numen、内置插件和你的插件是平级的,都是 Numen API 的插件。
区别只在于发布方式,Numen 和内置插件打包在一起发布,你的插件另行安装。
玩家安装的言出法随,就是把 Numen、内置插件和 Numen API 打包在一起的一个 jar,Numen API 以内嵌 jar 的形式放在里面。
该依赖哪一个
开发者可以依赖的坐标有三个,按你要做的事选择。
| 坐标 | 包含什么 | 什么时候用 |
|---|---|---|
精简 APInumen-api-<loader>-<mc>:<版本>:api | Numen API 里的公共部分 | 编写插件。绝大多数情况选它就够了 |
完整的 Numen APInumen-api-<loader>-<mc>:<版本> | Numen API 的全部代码 | 公共 API 满足不了,要用 Mixin 修改 Numen API 内部 |
Numennumen-<loader>-<mc>:<版本> | Numen 与内置插件,并自动带上完整的 Numen API | 要用 Mixin 修改 Numen 内置的 Lua API、任务或内置插件 |
ai、agent、lua、ui 另外单独发布,依赖上面任何一个坐标时都会自动带进来,不需要自己写。
0.1.4 的已知问题
本页描述的是自 0.1.5 起的结构。在 0.1.4 中,寻路 pathing 还平铺在 Numen API 里,智能体的身体 NumenPlayer 也依赖它,但寻路没有单独发布到 maven,而 Numen API 的依赖信息里却引用了它。所以照上面的写法依赖 0.1.4,Gradle 会报找不到 numen-pathing-<mc>。
在 0.1.4 上请改用下面的写法:依赖完整的 Numen API,并排除这条引用。完整的 Numen API 里已经带着寻路的类,调用 call.her() 的方法也能编译通过。
dependencies {
compileOnly("com.dwinovo.numen:numen-api-neoforge-1.21.1:0.1.4") {
exclude group: 'com.dwinovo.numen', module: 'numen-pathing-1.21.1'
}
}自 0.1.5 起,寻路归 Numen 所有,Numen API 不再引用它,按上面表格依赖精简 API 即可。
精简 API 之外的代码都是内部实现,任何一个版本都可能改变。如果你依赖了内部实现,请把言出法随的版本范围锁定在你测试过的版本上。更好的做法是,当你发现公共 API 缺了某样东西时,到 GitHub 提一个 issue,我们更愿意把它补进公共 API,让所有插件都能用上。
和 Numen 一样,你的插件在声明依赖时写的模组 id 是 numen_api;只有用 Mixin 修改 Numen 本身时,才需要依赖 numen。具体写法见插件。
