Skip to content

依赖关系 ​

在动手编写插件之前,建议先了解言出法随由哪些模块组成、它们之间怎样依赖,以便找到你真正需要依赖的那一个。各个模块的实现细节见深入其中,这里只讲它们的关系。

言出法随的依赖关系

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 的形式放在里面。

该依赖哪一个 ​

开发者可以依赖的坐标有三个,按你要做的事选择。

坐标包含什么什么时候用
精简 API
numen-api-<loader>-<mc>:<版本>:api
Numen API 里的公共部分编写插件。绝大多数情况选它就够了
完整的 Numen API
numen-api-<loader>-<mc>:<版本>
Numen API 的全部代码公共 API 满足不了,要用 Mixin 修改 Numen API 内部
Numen
numen-<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() 的方法也能编译通过。

gradle
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。具体写法见插件。