fix: 修复实机运行才暴露的 8 个缺陷,新增控制台添加玩家与移动测试
首次真正连上线上服务器(Debian 12 + pm2 + 端口 78)后暴露的问题,单元测试全绿但机器人干不了活: 致命 - 寻路插件从未加载:项目从没调用 bot.loadPlugin(pathfinder),bot.pathfinder 恒为 undefined、isReady() 恒为 false,扩地任务连启动都启动不了,界面只显示含糊的 「机器人尚未就绪」。现在 createBot 后立刻加载,失败时明确报错。 登录门禁相关(三处死锁) - preLoginCommands 白名单:/login、/register、简幻通的 /auth 本身就是登录流程的一部分, 原先被门禁一并拦下,形成「要先登录才能发登录指令」 - 验证码常被要求直接当聊天内容发出(不是指令),原先被 sendChat 的门禁挡住; 现在服务器明确要求验证时自动放行,另有 server.allowChatBeforeLogin 兜底 - 配置了登录指令却没有密码时 loggedIn 永久为 false,控制台连手动指令都发不出; 现在走与其他「服务器不回提示」一致的超时兜底并给出说明 可用性 - 离线时指令被静默丢弃却回报「已发送」;现在要求已连接并进入世界,失败信息区分 「未连接」「登录被拒」「未通过验证」 - 「被服务器传送」日志洪水:实测 3 分钟 748 行,会冲光日志缓冲并打满 WebSocket; 现在按 30 秒窗口聚合,断开时刷出未汇总计数 - 识别外站账号绑定流程并给出可操作告警,新增 server.authCommand 模板 - 重连指数退避(server.reconnectMaxDelayMs) - 控制台瓦片 URL 与后端路由不一致 新增 - 控制台添加 / 移除玩家:不必改 .env 重启。密码只写入 data/bots.credentials.json (强制 0600),不进仓库、不出现在任何响应里;.env 与凭据文件同名时以 .env 为准, .env 里的账号不允许从控制台移除 - 手动移动测试接口与按钮:绕开寻路器直接按方向键,返回真实位移, 用于区分「算不出路径」与「根本走不动」 - 位置同步诊断:位置包收发计数、onGround、游戏模式、维度、脚下方块与六向实心 - grim.reportOnGroundFromWorld:按世界数据修正出站 onGround(默认开启) - scripts/check-protocol.js:核对包名与字段名同目标版本协议是否一致 文档 - README 新增「部署到服务器」与「机器人走不动的排查方法」两章 已知限制:实测本服上 mineflayer 客户端无法移动(按方向键 2 秒位移 0.00~0.02 格, 服务端每 tick 回弹一次),已排除区块数据、onGround、Grim 层、游戏模式、物理引擎、 寻路插件、teleport_confirm 协议字段等因素,彻底定位需与原生客户端逐字节对比移动包。 连接 / 登录 / 指令 / 聊天 / 公屏日志 / 大地图均正常。 测试从 263 增至 290,全部通过。
这个提交包含在:
+62
@@ -2,6 +2,68 @@
|
||||
|
||||
本项目遵循 [约定式提交](https://www.conventionalcommits.org/zh-hans/) 与 [语义化版本](https://semver.org/lang/zh-CN/)。
|
||||
|
||||
## [1.2.0] - 2026-09-27
|
||||
|
||||
首次真正连上线上服务器(Debian 12 + pm2 + 端口 78)后,暴露并修掉了一批
|
||||
**只有实机运行才会发现**的缺陷。这些问题的共同点是:单元测试全绿,但机器人根本干不了活。
|
||||
|
||||
### 修复
|
||||
|
||||
- **寻路插件从未加载(致命)**:项目从没调用过 `bot.loadPlugin(pathfinder)`,
|
||||
导致 `bot.pathfinder` 恒为 `undefined`、`isReady()` 恒为 false,
|
||||
扩地任务连启动都启动不了,而界面上只显示一句含糊的「机器人尚未就绪」。
|
||||
现在在 `createBot` 之后立刻加载,失败时明确报错
|
||||
- **登录门禁死锁**:`/login`、`/register`、简幻通的 `/auth` 本身就是登录流程的一部分,
|
||||
原先的门禁把它们一并拦下,形成「要先登录才能发登录指令」,账号永远卡在未验证状态。
|
||||
新增 `server.preLoginCommands` 白名单(默认 `login,l,register,reg,auth`)
|
||||
- **验证码发不出去**:部分服务器要求把验证码**直接当聊天内容**发出去(不是指令),
|
||||
而 `sendChat` 同样被登录门禁挡住。现在服务器明确要求验证时会自动放行聊天,
|
||||
另有 `server.allowChatBeforeLogin` 给无提示的服务器兜底
|
||||
- **配置了登录指令却没密码时永久卡死**:`.env` 里没有密码时程序无法发送任何登录指令,
|
||||
却把 `loggedIn` 永久置为 false,控制台连手动指令都发不出去。
|
||||
现在走与「服务器不回提示」一致的兜底逻辑(超时后按无需登录放行),并在日志里说明
|
||||
- **离线时指令被静默丢弃却回报「已发送」**:`bot.chat()` 在未连接时无处可发。
|
||||
现在 `canSendCommand()` 要求已连接并进入世界,失败信息区分
|
||||
「未连接」「登录被服务器拒绝」「未通过登录验证」三种情况
|
||||
- **「被服务器传送」日志洪水**:账号未完成服务器验证时服务端每 tick 强推一次位置,
|
||||
实测 3 分钟刷出 748 行日志,几十分钟就会冲光日志环形缓冲并把 WebSocket 打满。
|
||||
现在首次立即记录、其余按 30 秒窗口聚合,断开连接时刷出未汇总计数
|
||||
- **外站账号绑定流程无法识别**:原先只认 `/login` 与 `/register`,
|
||||
遇到要求 `/auth <UID> <验证码>` 或扫码绑定的服务器时,表现只是静默的死循环。
|
||||
现在命中相关提示会输出可操作的中文告警(每个连接只提示一次),
|
||||
并新增 `server.authCommand` 模板供有固定验证码的服务器自动过验证
|
||||
- **重连无退避**:连续被踢时每 10 秒硬撞服务器。现在按指数退避
|
||||
(`server.reconnectMaxDelayMs`,默认上限 120 秒),成功进入世界后计数清零
|
||||
- **控制台瓦片 URL 与后端路由不一致**:前端请求 `/api/bigmap/tile/:z/:x_y.png`,
|
||||
后端路由为 `/api/bigmap/tile/:z/:x/:y.png`
|
||||
|
||||
### 新增
|
||||
|
||||
- **控制台添加 / 移除玩家**:不必改 `.env` 重启,直接在界面上填玩家名 + 密码即可挂新账号。
|
||||
密码只写入服务器本地凭据文件 `data/bots.credentials.json`(权限强制 0600),
|
||||
不进仓库、不出现在任何接口响应里;`.env` 与凭据文件同名时以 `.env` 为准。
|
||||
`.env` 里配置的账号不允许从控制台移除(否则重启后会「复活」)
|
||||
- **手动移动测试**:控制台可按前 / 后 / 左 / 右 / 跳 2 秒并显示真实位移,
|
||||
用于区分「寻路器算不出路径」与「客户端根本走不动」这两种完全不同的故障
|
||||
(绕开寻路器直接走控制键)
|
||||
- **位置同步诊断**:`snapshot` 暴露位置包收发计数、onGround、游戏模式、维度、
|
||||
脚下方块与六向实心情况,`/api/bots/:id/status` 可直接看到
|
||||
- **按世界数据修正出站 onGround**(`grim.reportOnGroundFromWorld`,默认开启):
|
||||
mineflayer 收到服务端 `position` 包时会把 `entity.onGround` 置为 false,
|
||||
在频繁下发位置包的服务器上会导致客户端持续上报「站在地上却在空中」。
|
||||
现在发包前用脚下方块复核,只有确实不一致时才改写
|
||||
- `scripts/check-protocol.js`:核对 mineflayer 写出的包名 / 字段名与目标版本协议是否一致
|
||||
|
||||
### 已知限制(重要)
|
||||
|
||||
- **本服上 mineflayer 客户端无法移动**:实测(`DiLiDaLaDaLa`,已绑定简幻通、登录正常)
|
||||
按方向键 2 秒位移 0.00~0.02 格;服务端每 tick 回弹一次(入站 ~17/s、出站 ~19/s)。
|
||||
已系统性排除:区块数据缺失、onGround 不一致、Grim 合规层、游戏模式(survival)、
|
||||
物理引擎未启用、寻路插件缺失、`teleport_confirm` 协议字段不匹配。
|
||||
连接、登录、收发指令、收发聊天、公屏日志、大地图爬取均正常,**唯独移动被服务端拒绝**。
|
||||
彻底定位需要把客户端的移动包与原生客户端逐字节对比,属于独立的排查工作
|
||||
- 同机上原有的 `minecraft-bot`(端口 91)与该机器人不能同时使用同一账号,会互相踢下线
|
||||
|
||||
## [1.1.0] - 2026-09-27
|
||||
|
||||
新增多机器人挂机、开拓日志、游戏公屏完整日志与大地图。
|
||||
|
||||
在新工单中引用
屏蔽一个用户