底层与自研

不看也不影响玩,这一页写的是插件底层的结构。

这一页写插件的底层:分层、通信、数据和开发约束。不看也不影响玩。

分层

第 0 层  引擎绑定      对 BDS 的安全封装
第 1 层  通用基建      存储层(SQLite)  网页服务
第 2 层  三个管理器    权限   世界   地皮
第 3 层  玩法与工具    RCC 核心   建筑工具   起床战争

依赖只能从上往下:玩法插件只通过各管理器的 SDK 调用第 2 层。只想列出世界的插件不用引入权限类型,改权限的内部结构也不用重新编译玩法插件。

部分 内容
SDK 契约类型和服务名,其他插件只依赖这一部分
内核 纯逻辑,不依赖游戏引擎,能离线跑测试
胶水 把内核接到游戏里,只有这一层要在真服务器上验证

内核不依赖引擎,所以权限判定、地皮几何、继承关系、准入规则都能离线测试。

插件间通信

通用通道:服务名加 JSON,任何语言写的插件都能用。

快车道:两边是同一次编译出来的 Rust 插件时,直接传函数表,省掉序列化。它用于批量查询(一次调用查 40 个节点,上下文只算一次),也能原样传递允许、拒绝、没有规则三种结果,不会因为 JSON 字段名写错被当成“没有权限”。

是否走快车道看指纹:编译器版本、目标平台、编译档位、优化等级、车道名、契约版本和函数表布局。任何一项不一致就退回 JSON 通道,功能不受影响。所以整棵代码树在一个工作区里统一编译。

数据

共用一个 SQLite 存储层,SQLite 编进二进制,不用另装。地皮归属、权限组、世界配置、在线时长都存在里面,地图瓦片单独存成文件。

网页管理界面

零依赖的小型 HTTP 服务,前端内嵌在二进制里。默认关闭,需要显式启用并填写非空 token;默认只监听回环地址。

开发约束

  • 单个文件不超过 400 行。现有三百多个源文件,最长 394 行。
  • 代码里不写注释,说明写在路径对应的单独文件里。
  • 一条命令编译整棵代码树。
  • 以上约束由脚本自动检查。

自研的原因

现成插件出了问题只能等作者更新。红石服务器对 tick、区块和实体的要求比一般服务器高,通用插件的取舍常常不合适。插件是自己写的,提问题的人和改代码的人在同一个群里,当天就能去看代码。

补充

  • 服务器崩溃可能来自插件、引擎或某个电路,能定位到插件的会在群里说明。
  • 插件暂未开源,具体实现可以在群里问。
  • 用 Rust 写,是为了让坐标、维度号、判定结果等类型在编译阶段就分开,写错编译不过。
  • 插件之间是可选依赖,一个插件不在时,其他插件按“离线”处理,退回默认值。