fix: 修复登录按钮死锁,移植旧版 player_input 补包解决「机器人走不动」
控制台登录按钮点不动(致命) - bindEvents() 只在 startApp() 里执行,而 startApp() 只在登录成功后才跑, 未登录时登录按钮根本没绑上事件,形成死锁。现在在 main() 里无条件绑定。 机器人走不动(致命,根因定位并修复) - mineflayer 不发 player_input 包:1.21.2+ 服务端的移动预测依赖它,原版客户端每 tick 都发, 而 mineflayer 只在骑乘/跳下/潜行时发,地面移动的 forward/jump/sprint 完全不发。 带反作弊的服务器判定「没有任何输入却发生位移」,每 tick 把玩家拉回原位置。 实测:修复前入站强制位置同步约 17 次/秒、按方向键 2 秒位移 0.00 格; 修复后入站降到 0 次、位移 0.53~1.40 格。该修复来自旧版机器人(感谢原作者)。 - 同时补发 tick_end(原版每 tick 末尾发送,反作弊用它判定 tick 边界,mineflayer 完全不发) - 资源包未自动接受会卡在加载界面进不了世界,现自动接受 - configure() 每次配置变更都重复注册寻路事件监听,导致同一事件被处理多次 长距离分段寻路 - mineflayer-pathfinder 只能规划已加载区块范围(实测约 8 区块 ≈ 130 格), 扩地目标常在几十个区块外,A* 瞬间 noPath。现在自动拆段:走到已加载范围边缘 → 新区块加载 → 再规划。 段长用 bot.blockAt 对未加载区块返回 null 的特性二分探测,不依赖世界内部结构。 新增 - pathing.thinkTimeoutMs / tickTimeoutMs / searchRadius(负值表示不限制剪枝) - 位置包收发计数、player_input/tick_end 计数、游戏模式、维度、脚下方块、 六向「脚部/头部/地面」与可通行判定等诊断字段 - 手动移动测试按钮(绕开寻路器直接按方向键并回报真实位移) 已知限制 - 机器人当前所在位置 (6759,72,11926) 无法寻路:A* 恒定只展开 47 个节点就 noPath。 已逐项排除挖方块/放方块/跑酷/搭塔/开门/最大下落(试到 64 格)/高度偏好/水域代价/ 搜索半径(试到不限制)/时间预算/依赖版本(与能正常移动的旧机器人完全一致)。 旧机器人日志证明寻路可用(2 次 goal_reached、2 秒走 8.7 格),但它当时在 y=-59, 本机器人被 /spawn 放到了 y=72。下一步需把机器人挪到开阔地再试。 测试 290 -> 308,全部通过。
这个提交包含在:
+45
@@ -2,6 +2,51 @@
|
||||
|
||||
本项目遵循 [约定式提交](https://www.conventionalcommits.org/zh-hans/) 与 [语义化版本](https://semver.org/lang/zh-CN/)。
|
||||
|
||||
## [1.3.0] - 2026-09-27
|
||||
|
||||
按线上实测结果修复「机器人走不动」,并移植旧版机器人已验证的关键补包。
|
||||
|
||||
### 修复
|
||||
|
||||
- **控制台登录按钮点不动(致命)**:`bindEvents()` 只在 `startApp()` 里执行,而 `startApp()`
|
||||
只在登录成功后才跑 —— 未登录时登录按钮根本没绑上事件,形成死锁。
|
||||
现在登录相关按钮在 `main()` 里无条件绑定
|
||||
- **机器人走不动(致命,根因已定位并修复)**:mineflayer **不发 `player_input` 包**。
|
||||
1.21.2+ 服务端的移动预测依赖它,原版客户端每 tick 都发,而 mineflayer 只在
|
||||
骑乘 / 跳下 / 潜行时发,地面移动的 forward / jump / sprint 完全不发。
|
||||
带反作弊的服务器因此判定「没有任何输入却发生了位移」,**每 tick 把玩家拉回原位置**。
|
||||
实测:修复前入站强制位置同步约 **17 次/秒**、按方向键 2 秒位移 0.00 格;
|
||||
修复后入站降到 **0 次**、位移 0.53~1.40 格。
|
||||
同时补发原版每 tick 末尾的 **`tick_end`** 包(反作弊用它判定 tick 边界,mineflayer 完全不发)
|
||||
- **寻路插件从未加载**:项目从没调用 `bot.loadPlugin(pathfinder)`,`bot.pathfinder` 恒为
|
||||
`undefined`、`isReady()` 恒为 false,扩地任务连启动都启动不了
|
||||
- **寻路事件监听重复注册**:`configure()` 每次配置变更都会重跑并再挂一遍监听,
|
||||
导致同一事件被处理多次(日志里同一秒出现多条相同事件)
|
||||
- **资源包未自动接受**:服务器要求资源包时不接会卡在加载界面进不了世界
|
||||
|
||||
### 新增
|
||||
|
||||
- **长距离分段寻路**:mineflayer-pathfinder 只能规划**已加载区块**范围(实测约 8 区块 ≈ 130 格),
|
||||
而扩地目标常在几十个区块之外,A* 会瞬间返回 noPath。现在会把旅程拆段:
|
||||
走到已加载范围边缘附近 → 新区块加载 → 再规划下一段。
|
||||
段长用 `bot.blockAt` 对未加载区块返回 null 的特性**二分探测**得到,不依赖世界内部结构
|
||||
- **寻路预算可配置**:`pathing.thinkTimeoutMs` / `tickTimeoutMs` / `searchRadius`
|
||||
(`searchRadius` 为负表示不限制剪枝)
|
||||
- **位置同步诊断**:位置包收发计数、`player_input` / `tick_end` 计数、`onGround`、
|
||||
游戏模式、维度、脚下方块、六向「脚部 / 头部 / 地面」与可通行判定
|
||||
- **手动移动测试**:控制台按钮绕开寻路器直接按方向键并回报真实位移
|
||||
- 配置界面新增协议补包与寻路预算相关字段
|
||||
|
||||
### 已知限制(重要)
|
||||
|
||||
- **当前所在位置无法寻路**:实测机器人站在 (6759, 72, 11926) 时,A* **恒定只展开 47 个节点**
|
||||
就返回 noPath。已逐项排除:挖方块 / 放方块 / 跑酷 / 搭塔 / 开门 / 最大下落(试到 64 格)/
|
||||
高度偏好 / 水域代价 / 搜索半径(试到不限制)/ 时间预算 / 依赖版本
|
||||
(与能正常移动的旧机器人完全一致:mineflayer 4.39.0 + pathfinder 2.4.5 + prismarine-world 3.7.0)。
|
||||
旧机器人日志证明寻路本身可用(2 次 `goal_reached`、2 秒走过 8.7 格),
|
||||
但它当时在 **y=-59**,而本机器人被 `/spawn` 放到了 **y=72**,怀疑是新位置的地形让移动生成器
|
||||
找不到任何可行走分支。**下一步需要把机器人挪到开阔地再试**
|
||||
|
||||
## [1.2.0] - 2026-09-27
|
||||
|
||||
首次真正连上线上服务器(Debian 12 + pm2 + 端口 78)后,暴露并修掉了一批
|
||||
|
||||
在新工单中引用
屏蔽一个用户