feat: 补上出站包一直漏报的 hasHorizontalCollision(1.10.0)

针对「机器人一直在走、净位移却只有物理速度的 1/5」这个现象。

mineflayer 在 physics.js 里把 flags.hasHorizontalCollision 写成 undefined
(源码注释还标着「1.21.3+」),位标志序列化后恒为 0 —— 而原版客户端在水平碰到
方块时会上报 1。机器人在崎岖地形上几乎一直在水平碰撞,却始终上报「没碰撞」,
正是反作弊 Prediction 最容易判错的形态:服务端按「该碰撞」预测、客户端说
「没碰撞」,于是被判异常并拉回。

物理引擎其实早已算出真实值(moveEntity 里给 entity.isCollidedHorizontally 赋值),
只是从没被发出去。现在在 _fixOutboundOnGround 里按真实值补上,由
grim.reportHorizontalCollision(默认开)控制。

实测依据(王城外山区,2 秒粒度采样 120 秒):
- controls 几乎每 tick 都是 forward+sprint,velocity 约 0.2~3 格/秒;
- 净位移只有 48.6 格 / 120 秒 = 0.405 格/秒,差额就是被服务端拉回的部分。

顺带把 _fixOutboundOnGround 拆成 _fixOnGroundFlag / _fixHorizontalCollisionFlag
两个职责单一的方法;控制台配置面板新增对应开关,
packetStats.horizontalCollisionFixed 暴露补写次数。

测试 473 → 477。
这个提交包含在:
lyizai
2026-10-01 17:04:25 +08:00
父节点 ed55308885
当前提交 2ae2833568
共修改 7 个文件,包含 139 行新增和 5 行删除
+27
查看文件
@@ -2,6 +2,33 @@
本项目遵循 [约定式提交](https://www.conventionalcommits.org/zh-hans/) 与 [语义化版本](https://semver.org/lang/zh-CN/)。
## [1.10.0] - 2026-10-01
补上出站包一直漏报的 `hasHorizontalCollision`,针对「机器人一直在走、却只走出
物理速度的 1/5」这个现象。
### 新增
- **`grim.reportHorizontalCollision`(默认开启)**:把物理引擎算出的
`bot.entity.isCollidedHorizontally` 如实写进出站位置包的
`flags.hasHorizontalCollision`。
- mineflayer 在 `physics.js` 里把这个位标志写成 `undefined`(源码注释还标着
「1.21.3+」),序列化后**恒为 0** —— 而原版客户端在水平碰到方块时会上报 1;
- 机器人在崎岖地形上几乎一直在水平碰撞,却始终上报「没碰撞」,
正是反作弊 Prediction 最容易判错的形态:服务端按「该碰撞」预测、
客户端说「没碰撞」,于是被判异常并拉回;
- 实测(2026-10-01,王城外山区):机器人 `controls` 几乎每 tick 都是
`forward+sprint`,`velocity` 约 0.2~3 格/秒,但 2 秒粒度采样的**净位移只有
0.405 格/秒**(48.6 格 / 120 秒)—— 差额正是被服务端拉回的部分。
- 物理引擎早已算出真实值(`moveEntity` 里赋值),只是从没被发出去。
- 控制台「Grim 合规」配置面板新增对应开关;`packetStats.horizontalCollisionFixed`
暴露补写次数。
### 测试
新增 4 个用例(473 → 477):按真实值补写、已一致时不重复计数、开关可关闭、
物理引擎没给出状态时不瞎猜。
## [1.9.3] - 2026-10-01
**掉线重连后自动恢复扩地任务** —— 这是让扩地能真正连续跑起来的最后一环。