跳转至

兼容性

版本号

Pier 的版本号是 <BDS 大版本>.<BDS 小版本>.<第几版>,前两段就是这一版针对的 BDS, 第三段是针对它的第几次发布。

Pier BDS LeviLamina 备注
26.51.2 1.26.51 26.51.5
26.51.1 1.26.51 26.51.5
26.40.3 1.26.40 26.40.0
26.40.2 1.26.40 26.40.0
26.40.1 1.26.40 26.40.0
26.40.0 1.26.40 26.40.0 Pre-release
26.32.2 1.26.32 26.32.1 Pre-release
26.32.1 1.26.32 26.32.1
26.20.2 1.26.20 26.20.4
26.20.1 1.26.20 26.20.4

一行不是一个区间。 每个版本只对着它标明的那个 BDS 构建,换一个跑不了: Mojang 的 26.32 构建内联掉了大约三成 LeviLamina 在 26.20 上还能声明的函数, 所以 26.32 的宿主会调用 26.20 引擎没有的东西,反过来也一样。对着表格选,别在两行之间猜。

ABI 版本和发布版本是两回事

ABI 有自己的版本号,目前是 v2,它比发布版本号动得慢得多。新增能力只是追加一个槽, 不会推动它。

这就是按老版本 Pier 编的模组照常能用的原因:

  • 新增能力是在表尾追加的槽。你的模组够不着它,也不关心。
  • 删除或重排会推动 PIER_ABI_VERSION。26.32.2 做过一次:26.20.3 起废弃的四个槽 被删掉,PIER_ABI_VERSION 和 PIER_ABI_MIN_SUPPORTED 一起推进到 2。按 v1 编的模组 在装载时被明确拒绝,而不是被放进去在之后某处崩掉,需要用 v2 的 SDK 重编。

兼容是区间不是相等:PIER_ABI_MIN_SUPPORTED <= 你的 abi_version <= 宿主的 PIER_ABI_VERSION。

模组能看到什么

Rust
let (abi_version, table_bytes) = ctx.host_abi();

报 bug 时把这两个数带上。「你的 pier 太老了」这句话,只有带上它们才可操作。

SDK 替你查每一个非核心调用,并把「能力缺席」翻成一条指名道姓的错误。两种情况是分开的:

  • 槽位超出表长。 宿主早于那个能力。升级 Pier。
  • 槽位在表内但为空。 那个能力包没有编进这个构建。升级没用,得换一个构建。

客户端与服务端构建

同一份源码两边都编得过。客户端专属的槽在服务端宿主上也存在,只是为空, 所以调它得到的是一个错误,而不是编译不过。

模组面向哪个目标,写在 mod_flags 里,宿主在握手时比对 bit 0。不匹配会被明确拒绝 并说明原因——放它进来、然后在第一个只有一侧才有的槽上崩掉,是查不出来的。

可选的外部依赖

LegacyMoney 走延迟加载。没装它的服务器 照常启动,money 相关调用返回失败值,其余不受影响。每个调用返回什么,money 模块里写着。

什么不做保证

ABI 只增不减。但 Rust SDK 的 API 面可能在 Pier 版本之间变化: 一个方法可能被改名,或者一个签名被收紧,因为旧的那个让人容易犯错。 把你依赖的 tag 钉死,升级前读发布说明。