fix: 修掉 yaw 无界增长 —— 它让机器人原地走之字形、净位移恒为 0(1.11.0)
mineflayer 收到服务端 position 包时会直接 bot.entity.yaw = conv.fromNotchianYaw(…) 不做取模,而 GrimCompat 又在它基础上逐 tick 累加,两者叠加让 yaw 一路涨到 19254°(≈336 弧度)。 抓包实测的后果: yaw°: -1373 → 19254 → -1650 → -1407 → -1373 → 19254 → … 坐标: (6757.50, 11953.70) ⇄ (6757.89, 11954.12) 0.4 格内反复振荡 相邻两包的朝向折合相差约 114°,而机器人一直按着前进键 —— 于是它原地走之字形、净位移恒为 0,看起来像「卡在墙前反复起跳」 (物理录制里 jump 74/240、水平碰撞 195/240、onGround 只有 79/240)。 这是扩地跑不完那 763 格长途的直接原因,也解释了出站包里 look 包(38490) 比 position_look(23804)还多。 修复:新增 wrapAngle,_onPhysicsTick 每 tick 归一化 entity.yaw 到 (-π, π], setLook 也归一化传入的目标角度。归一化只改表示不改朝向 (shortestAngleDelta(huge, wrapped) === 0),对旋转逻辑完全透明。 测试 478 → 480。
这个提交包含在:
+31
@@ -2,6 +2,37 @@
|
||||
|
||||
本项目遵循 [约定式提交](https://www.conventionalcommits.org/zh-hans/) 与 [语义化版本](https://semver.org/lang/zh-CN/)。
|
||||
|
||||
## [1.11.0] - 2026-10-01
|
||||
|
||||
**修掉「机器人原地走之字形、净位移恒为 0」的朝向 bug** —— 这是扩地跑不完
|
||||
那 763 格长途的直接原因。
|
||||
|
||||
### 修复
|
||||
|
||||
- **`bot.entity.yaw` 无界增长,导致发包朝向在两个方向间来回跳**。
|
||||
mineflayer 收到服务端的 `position` 包时会直接 `bot.entity.yaw = conv.fromNotchianYaw(…)`
|
||||
**不做取模**,而 `GrimCompat` 又在它基础上逐 tick 累加 —— 两者叠加让 yaw 一路涨到
|
||||
**19254°(≈336 弧度)**。
|
||||
抓包实测的后果:
|
||||
|
||||
```
|
||||
yaw°: -1373 → 19254 → -1650 → -1407 → -1373 → 19254 → …
|
||||
坐标: (6757.50, 11953.70) ⇄ (6757.89, 11954.12) 0.4 格内反复振荡
|
||||
```
|
||||
|
||||
相邻两包的朝向折合相差约 **114°**,而机器人一直按着前进键 ——
|
||||
于是它**原地走之字形、净位移恒为 0**,看起来像「卡在墙前反复起跳」
|
||||
(物理录制里 `jump 74/240`、`水平碰撞 195/240`、`onGround` 只有 79/240)。
|
||||
|
||||
现在 `_onPhysicsTick` 每 tick 都调 `wrapAngle` 把 yaw 归一化到 `(-π, π]`,
|
||||
`setLook` 也会归一化传入的目标角度。归一化只改变表示、不改变朝向
|
||||
(`shortestAngleDelta(huge, wrapped) === 0`),所以对旋转逻辑完全透明。
|
||||
|
||||
### 测试
|
||||
|
||||
新增 2 个用例(478 → 480):`wrapAngle` 的归一化与边界(含 19254° 这个实测值、
|
||||
NaN / Infinity),以及「从未归一化的巨大 yaw 出发、推进 40 tick 后仍归一化且朝向正确」。
|
||||
|
||||
## [1.10.1] - 2026-10-01
|
||||
|
||||
修掉 1.9.3 自动恢复里的一个会让恢复永久丢失的缺陷。
|
||||
|
||||
在新工单中引用
屏蔽一个用户