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。
这个提交包含在:
@@ -256,6 +256,20 @@ function defaultConfig() {
|
||||
* 开启后发包前会用脚下方块复核,只有确实不一致时才改写。
|
||||
*/
|
||||
reportOnGroundFromWorld: true,
|
||||
/**
|
||||
* 是否把物理引擎的 `isCollidedHorizontally` 如实写进出站包的
|
||||
* `flags.hasHorizontalCollision`(默认开启)。
|
||||
*
|
||||
* mineflayer 在 `physics.js` 里把这个位标志写成 `undefined`,序列化后**恒为 0**
|
||||
* —— 而原版客户端在水平碰到方块时会上报 1。机器人在崎岖地形上几乎一直在
|
||||
* 水平碰撞,却始终上报「没碰撞」,正是反作弊 Prediction 最容易判错的形态:
|
||||
* 服务端按「该碰撞」预测,客户端说「没碰撞」,于是被判异常并拉回。
|
||||
* 实测(2026-10-01)机器人一直按着 forward+sprint,物理速度约 2 格/秒,
|
||||
* 但净位移只有 0.4~0.5 格/秒,差额正是被服务端拉回的部分。
|
||||
*
|
||||
* 物理引擎已经算出了真实值(`bot.entity.isCollidedHorizontally`),只是没发出去。
|
||||
*/
|
||||
reportHorizontalCollision: true,
|
||||
/**
|
||||
* 【方案 A】是否把物理引擎的 onGround 与本地世界数据对齐(默认开启)。
|
||||
*
|
||||
|
||||
在新工单中引用
屏蔽一个用户