跳转到正文

驻留 Lua 状态模块 ​

配套版本

Lua 材料包含在 1.0.0 工具包中。Lua 接口最低要求 Host API 1.8;配套 1.0.0 Host 提供 API 1.9,旧 Host 需先核对支持范围。

Lua 模块在 Host 内维护小型持久状态,接收授权事件并发布 View,让 Python 插件读取或订阅。一个模块代际拥有一个 VM;它不启动独立 Worker,也不与其他模块共享全局变量。

能做什么 ​

入口用途
config.get()、state.get/set读取配置,私有暂存 JSON 状态;nil 删除键。
view.declare/publish声明并暂存 View;初始值在初始化时提供。
on_frame_event、on_packet初始化时声明授权事件或包回调。
event.declare/emit声明事件,在输入回调中暂存要发送的元素。
read.call使用完整结构合同调用授权 read;结果仍是 tagged Bus 值。

当前驻留 Lua 没有通用 service/op 调用,也不消费 View Watch。需要持续观察与世界动作时,以 Lua 保存统计,由 Python 使用 Bus 组合操作。

模块顶层只执行一次,承担初始化:声明输入与 View、恢复状态、提供全部初始值,没有第二个 on_init。Host 串行执行输入,原子保存状态与输入游标后才暴露 View 变化与暂存事件。失败回调不会发布这一批事件,故障 VM 不继续消费,不自动重启。

精确计数与完整性 ​

Lua number 是浮点数。宽整数以规范十进制字符串保留;例如 u64.add(count, "1") 返回精确十进制字符串。不要先 tonumber 或做 Lua 浮点加法再保存,否则精度已经丢失。越界整数会报错,不回绕。

examples/lua-stats/stats_commands 统计从首次接纳基线开始的唯一 command.execute 接纳数;失败或未知的命令也已发生接纳,因此计数不是游戏执行成功数。admission_cursor 保存最近实际观察到的序号,初始 0 表示尚未观察到,不是全局历史高水位。

两模块仅申请 event:operation.admitted 与 service:operation.admitted,不申请命令执行。View 的快照与增量都为当前累计值,Python 直接采用新值。

Host 重启或输入缺口保留 complete=false。重启 Lua、重新 Watch 或收到新接纳都不能自行清除缺口;有真实来源完整性恢复证据后才能恢复完整判断。需要完整值的业务暂停新决策,但可继续展示不完整观察。

安装与停止 ​

使用随包 checker 和每个目录的 package.files.json 分别打包。安装、配置、授权、启动分别完成;stats_commands 配置为 {},admission_cursor 没有配置 schema。完整路径见持续计数与一次发放,不需要另建 Lua runner。

同状态版本与兼容 View/Event 合同的替换使用现有管理入口。旧 Watch 以 instance_replaced 结束,消费者重新建立基线。提交不明时保留围栏,不用重试或删除状态解除。停止时先停止消费者,再停止 provider。

VM 不提供 io/os/package、动态加载、文件或网络 API;回调期限和托管状态配额不等于进程级内存隔离。宿主扩展的 Go read/log 回调仍须响应取消并真正返回。历史 lua_domain 是另一条固定命令桥路径,见兼容页。

Neomega · 使用、开发与参考文档