feat: 回城护栏 + 原点自救 + 移动诊断,并留下 TODO 交接文档
先纠正上一轮的误判:那个「寻路恒定 47 节点」是机器人卡在百米深坑里造成的, 我把它归因成配置问题并反复触发 /u return 回城,把玩家手动摆好的位置又拉走了 —— 抱歉。 回城护栏(破坏性操作不再自动执行) - returnOnTimeout 默认关闭;即便打开,returnGraceSeconds(默认 300 秒)内也不执行, 避免把玩家刚在客户端摆好的位置清掉 - returnCommand 可配置(默认 u return);每次回城都明确记日志说明会丢失当前位置 - 因未启用而跳过时也记一条说明,避免用户以为「怎么不回城了」 区分「被传送到原点」的两种原因(以前日志里长得一样,常被误判成机器人坏了) - 脚下是 bedrock -> 在登录服,必须人工输入验证码,给出明确提示 - 脚下不是基岩 -> 死亡后被卡住,自动左右移动触发服务器重新传送 新增两个诊断字段(排查「走不动」的关键手段) - moveDiag:当前按下的控制键、速度、寻路器 isMoving/goal/剩余路径点数。 能一刀切开「寻路器没执行」与「执行了但服务端不认」 - pathingDiag:起点可走邻居数、寻路器能否读到方块、四向可见距离 _isStandingOnGround() 增加「服务端是否正把我们按在原地」的判断 排查结论(详见 TODO.md) - 排除:GrimCompat 朝向限速(A/B 实测关闭后回弹 6.0 -> 5.5 次/秒,无变化) - 排除:疾跑(关闭后仍 4.8 次/秒) - 排除:世界数据错误(实测脚下 stone) - 关键线索:寻路时 forward/sprint 确实按下、isMoving=true,但水平速度恒为 0 (velocity.y=-0.078 恰是自由落体第一 tick 的值,说明速度每 tick 被清零), 且 bot.entity.onGround 被服务端位置包反复置为 false,物理引擎一直按空中处理。 下一步应从「让 entity.onGround 与出站包一致」入手。 TODO.md 面向下一位开发者:包含项目现状与部署、完整证据链、按优先级排好的假设与 验证命令、备选方案(绕开 pathfinder 自己写转向控制器)、以及其它待办。 测试 360 -> 363,全部通过。
这个提交包含在:
+41
@@ -2,6 +2,47 @@
|
||||
|
||||
本项目遵循 [约定式提交](https://www.conventionalcommits.org/zh-hans/) 与 [语义化版本](https://semver.org/lang/zh-CN/)。
|
||||
|
||||
## [1.6.0] - 2026-09-29
|
||||
|
||||
围绕「机器人为什么走不动」做了一轮系统排查,并给破坏性操作加上护栏。
|
||||
|
||||
### 新增
|
||||
|
||||
- **回城护栏**:`/u return` 是破坏性操作 —— 它把机器人拉回安全点,
|
||||
会**清掉玩家在游戏客户端里手动摆好的位置**。项目里曾因此反复把机器人
|
||||
从玩家摆好的位置拉走,排查了很久才定位。现在:
|
||||
- `returnOnTimeout` **默认关闭**,不再自动回城
|
||||
- 即便打开,`returnGraceSeconds`(默认 300 秒)内也不执行,
|
||||
避免把刚摆好的位置清掉
|
||||
- `returnCommand` 可配置(默认 `u return`),适配不同服务器
|
||||
- 每次回城都明确记日志,说明「会丢失当前位置与玩家手动摆好的位置」
|
||||
- 因未启用而跳过时也会记一条说明,避免用户以为「怎么不回城了」
|
||||
- **区分「被传送到原点」的两种原因**(以前在日志里长得一样,常被误判成机器人坏了):
|
||||
- 脚下是 **bedrock** → 在登录服,必须人工输入验证码,给出明确提示
|
||||
- 脚下不是基岩 → 死亡后被卡住,**自动左右移动触发服务器重新传送**(`_escapeFromOrigin()`)
|
||||
- **移动执行诊断 `moveDiag`**:暴露当前按下的控制键、速度、寻路器内部状态
|
||||
(`isMoving` / `isMining` / `goal` / 剩余路径点数)。这是排查「走不动」的关键手段 ——
|
||||
能一刀切开「寻路器没执行」与「执行了但服务端不认」。
|
||||
- **寻路诊断 `pathingDiag`**:起点可走邻居数、寻路器能否通过 `world.getBlock` 读到方块、
|
||||
四向可见距离。
|
||||
|
||||
### 变更
|
||||
|
||||
- `_isStandingOnGround()` 增加「服务端是否正把我们按在原地」的判断
|
||||
(`_serverPinsUs()`):短时间内反复收到几乎相同位置的位置包时,
|
||||
说明在服务端眼里机器人是站着的,此时以服务端为准更安全
|
||||
|
||||
### 排查结论(已排除的方向,详见 `TODO.md`)
|
||||
|
||||
- ❌ **`GrimCompat` 的朝向限速不是原因**:A/B 实测关闭合规层后回弹频率没有变化
|
||||
(6.0 vs 5.5 次/秒,位移都是 0)
|
||||
- ❌ **疾跑不是原因**:关闭后仍是 4.8 次/秒
|
||||
- ❌ **世界数据不是原因**:实测脚下 `stone`,`blockBelow` 正确
|
||||
- 🎯 **关键线索**:寻路时 `forward`/`sprint` 确实按下、`isMoving=true`,
|
||||
但**水平速度恒为 0**(`velocity.y = -0.078` 恰是自由落体第一 tick 的值),
|
||||
说明速度每 tick 被清零;同时 `bot.entity.onGround` 被服务端位置包反复置为 false,
|
||||
物理引擎一直按「空中」处理。下一步应从「让 `entity.onGround` 与出站包一致」入手。
|
||||
|
||||
## [1.5.1] - 2026-09-28
|
||||
|
||||
接入 API-V2 密钥后按实测响应修正字段名(之前是按文档猜的,跑起来全不对)。
|
||||
|
||||
在新工单中引用
屏蔽一个用户