文件
BotStore/CHANGELOG.md
T
lyizai a12a24c716 feat: 用 Node.js + mineflayer 重构 AutoStore,UI 改为网页控制台并适配 Grim 反作弊
由 Fabric 客户端模组 AutoStore v1.3.1 重构为独立 Node.js 机器人,无需游戏客户端。

核心实现:
- 领土数据:Dynmap markers.json 拉取解析(奇偶填充识别国中飞地)、SimpCore 开放 API 第四数据源、
  带缓存击穿的时间戳请求与内容未变化跳过解析
- 扩地规划:四种策略(方形外扩 / 区域 S 形扫描 / 玩家周围 / 绕国一圈)逐行对照移植,
  接壤判定只算己方领土,飞地优先填补
- 扩地状态机:规划→寻路→等待开垦→成功/失败→下一目标→完成,含超时重试、
  往边上走两步自救、连续超时回城、耐久保护回城
- 生存辅助:自动进食、自动攻击(豁免中立生物)、自动游泳防溺水、自动用船(默认关闭)
- 寻路:Baritone → mineflayer-pathfinder,高度偏好用包装 Goal 等价移植

Grim 反作弊合规层(新增,核心差异点):
- 旋转不超前:接管 bot.look 按 ≤8.6°/tick 推进朝向,消除 mineflayer
  「本地朝向瞬间跳变、数据包滞后补发」导致的 Prediction 分歧
- 攻击三重校验:朝向已同步 + 距离 ≤3.0 格 + 视线可达 + 攻击冷却 + 非骑乘/进食
- 动作互斥:拦下疾跑+潜行、疾跑+使用物品等原版不可能出现的组合
- 物理参数只读自检 + 寻路约束(禁挖/禁放/禁跑酷/禁搭塔/限下落/绕开水域)

网页控制台(新增):
- 状态面板、Canvas 领土地图(缩放/平移/图层)、分组配置表单、实时日志流
- REST + WebSocket 接口,支持 WEB_TOKEN 令牌鉴权

修复:
- containsFuzzy 只取固定长度前缀的末行编辑距离,导致完全相同的子串也匹配不上
- 占领去重依赖 Set.add 返回值(JS 中恒为真),导致同一区块被重复计数
- 非法枚举值不再钳制到最近边界,改为回退默认值

测试:154 个用例,npm test 全绿;npm run check 语法自检通过。
2026-09-27 17:17:41 +08:00

3.8 KiB
原始文件 Blame 文件历史

更新日志

本项目遵循 约定式提交 与 语义化版本。

[1.0.0] - 2026-02-14

由 Fabric 客户端模组 AutoStore v1.3.1 重构为 Node.js + mineflayer 机器人,UI 改为网页控制台, 并新增 Grim 反作弊合规层。

新增

  • Grim 反作弊合规层(src/bot/grimCompat.js)
    • 旋转不超前:接管 bot.look,把朝向按 ≤ 8.6°/tick 逐步推进,保证本地朝向与服务端已收到的朝向一致, 消除 mineflayer「本地朝向瞬间跳变、数据包滞后补发」导致的 Prediction 分歧
    • 攻击三重校验:朝向已同步 + 距离 ≤ 3.0 格 + 视线可达 + 攻击冷却 + 非骑乘/进食状态
    • 动作互斥:拦下疾跑+潜行、疾跑+使用物品等原版不可能出现的组合(MultiActions)
    • 物理参数只读自检:核对 bot.physics 关键常量、physicsEnabled、游戏模式、鞘翅状态
    • 寻路约束:默认禁止挖方块 / 放方块 / 跑酷 / 1×1 搭塔,限制最大下落高度,推高液体代价优先绕开水域
  • 网页控制台(src/web/)
    • 实时状态面板(连接 / 任务状态机 / 领土数据源 / Grim 合规)
    • Canvas 领土地图:滚轮缩放、拖拽平移、图层开关、回到玩家、全图适配
    • 7 个分组的配置表单,保存即生效
    • 实时日志流、日志导出、手动指令发送
    • REST + WebSocket 接口,支持 WEB_TOKEN 令牌鉴权(定时安全比较)
  • SimpCore 开放 API 第四数据源:低频轮询己方邦国领土明细 + 王城兜底,支持手动拉取全服领土
  • 开垦时段可配置:enforceClaimTime / claimStartHour / claimEndHour(原版硬编码 11:00-22:00)
  • 战斗筛选可配置:combat 分组(索敌半径、末影人 / 蜘蛛 / 猪灵开关、高危生物跳过)
  • 断线自动重连与登录 / 注册指令模板(密码从 .env 读取,支持 {password} 占位符)
  • 154 个测试用例,覆盖坐标编解码、领土模型、规划器、数据解析、合规层、状态机、Web 接口

变更

  • 寻路引擎从 Baritone 换成 mineflayer-pathfinder;高度偏好(GoalXZAltitude)用包装 Goal 的 heuristic = max(0, base - weight × y) 等价移植
  • 区块坐标内部表示从对象改为整数键(x × 2^26 + z),避免数万区块产生海量临时对象
  • 扩地状态机、规划策略、超时重试与回城逻辑与原版逐行对照移植,行为保持一致

修复

  • 修正 containsFuzzy 的模糊匹配:原实现只取固定长度前缀的末行编辑距离, 导致 containsFuzzy('开垦中 50%', '开垦中', 0) 返回 false(完全相同的子串都匹配不上)。 现按注释语义改为「存在编辑距离 ≤ maxEdits 的子串」
  • 修正占领去重:原实现依赖 Set.add 的返回值判断重复,而 JS 的 Set.add 恒返回 Set 对象, 会导致同一区块被重复计数
  • 修正非法枚举值的处理:策略等枚举字段不再「钳制到最近边界」(把非法的 99 静默变成策略 4), 而是回退到默认值

已知限制

  • 自动用船默认关闭:mineflayer 使用的 prismarine-physics 没有载具物理,上船后本地物理预测被关闭, 位置完全由服务端下发的船实体位置决定,Grim 的 Vehicle 检查风险高。 用船逻辑已完整实现,需显式开启 waterMode: 'boat' + autoBoat: true
  • 末影人与蜘蛛默认不打:mineflayer 拿不到可靠的「是否被激怒」与「环境亮度」信息, 宁可漏打也不误打;可用 combat.attackEnderman / combat.attackSpiders 放开
  • 监守者 / 末影龙 / 凋灵默认跳过:原版会攻击它们,但那基本等于自杀