这一页写插件的底层:分层、通信、数据和开发约束。不看也不影响玩。
分层
第 0 层 引擎绑定 对 BDS 的安全封装
第 1 层 通用基建 存储层(SQLite) 网页服务
第 2 层 三个管理器 权限 世界 地皮
第 3 层 玩法与工具 RCC 核心 建筑工具 起床战争
依赖只能从上往下:玩法插件只通过各管理器的 SDK 调用第 2 层。只想列出世界的插件不用引入权限类型,改权限的内部结构也不用重新编译玩法插件。
| 部分 | 内容 |
|---|---|
| SDK | 契约类型和服务名,其他插件只依赖这一部分 |
| 内核 | 纯逻辑,不依赖游戏引擎,能离线跑测试 |
| 胶水 | 把内核接到游戏里,只有这一层要在真服务器上验证 |
内核不依赖引擎,所以权限判定、地皮几何、继承关系、准入规则都能离线测试。
插件间通信
通用通道:服务名加 JSON,任何语言写的插件都能用。
快车道:两边是同一次编译出来的 Rust 插件时,直接传函数表,省掉序列化。它用于批量查询(一次调用查 40 个节点,上下文只算一次),也能原样传递允许、拒绝、没有规则三种结果,不会因为 JSON 字段名写错被当成“没有权限”。
是否走快车道看指纹:编译器版本、目标平台、编译档位、优化等级、车道名、契约版本和函数表布局。任何一项不一致就退回 JSON 通道,功能不受影响。所以整棵代码树在一个工作区里统一编译。
数据
共用一个 SQLite 存储层,SQLite 编进二进制,不用另装。地皮归属、权限组、世界配置、在线时长都存在里面,地图瓦片单独存成文件。
网页管理界面
零依赖的小型 HTTP 服务,前端内嵌在二进制里。默认关闭,需要显式启用并填写非空 token;默认只监听回环地址。
开发约束
- 单个文件不超过 400 行。现有三百多个源文件,最长 394 行。
- 代码里不写注释,说明写在路径对应的单独文件里。
- 一条命令编译整棵代码树。
- 以上约束由脚本自动检查。
自研的原因
现成插件出了问题只能等作者更新。红石服务器对 tick、区块和实体的要求比一般服务器高,通用插件的取舍常常不合适。插件是自己写的,提问题的人和改代码的人在同一个群里,当天就能去看代码。
补充
- 服务器崩溃可能来自插件、引擎或某个电路,能定位到插件的会在群里说明。
- 插件暂未开源,具体实现可以在群里问。
- 用 Rust 写,是为了让坐标、维度号、判定结果等类型在编译阶段就分开,写错编译不过。
- 插件之间是可选依赖,一个插件不在时,其他插件按“离线”处理,退回默认值。