文件
BotStore/CHANGELOG.md
T
lyizai d6b1339867 fix: 修正服务器反复传送刷屏日志、识别外站账号绑定流程、重连指数退避
部署到 Debian 服务器时暴露的三个真实缺陷:

1. 「被服务器传送」日志洪水
   账号未完成服务器验证时服务端每 tick 强推一次位置,实测 3 分钟刷出 748 行日志,
   几十分钟就会冲光 2000 条的日志环形缓冲并把 WebSocket 打满。
   现改为首次立即记录、其余按 30 秒窗口聚合成一条,断开连接时刷出未汇总计数。

2. 外站账号绑定流程无法识别
   原先只认 /login 与 /register,遇到简幻通这类要求 /auth <UID> <验证码> 或扫码绑定的
   服务器时,表现只是「连上→被传送→120 秒后被踢→重连」的静默死循环。
   现新增 NEED_AUTH_PATTERN 识别并输出可操作的中文告警(每连接一次),
   新增 server.authCommand 模板供有固定验证码的服务器自动过验证。

3. 重连无退避
   连续被踢时每 10 秒硬撞服务器。现按指数退避拉长(server.reconnectMaxDelayMs,
   默认上限 120 秒),成功进入世界后清零;抽出 computeReconnectDelay 便于测试。

顺带补充 README 的「部署到服务器」章节(Node ≥ 22 要求、私有运行时、pm2、日志分文件、排障表)。

测试从 242 增至 252,全部通过。
2026-09-27 22:02:24 +08:00

9.8 KiB
原始文件 Blame 文件历史

更新日志

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

[1.1.0] - 2026-09-27

新增多机器人挂机、开拓日志、游戏公屏完整日志与大地图。

新增

  • 多机器人同时挂机(src/bot/botPool.js、src/config/botsConfig.js)
    • .env 里用 MC_BOTS 一次配置多个账号(支持 JSON 数组与 用户名:密码 逗号分隔两种写法), 未配置时回退到 MC_USERNAME / MC_PASSWORD 单机器人模式
    • 每个机器人独立连接、独立登录、独立跑扩地状态机;共享同一份领土数据服务与运行日志
    • 密码只从 .env 读取:data/bots.json 只存启用状态、备注名、是否自动开始与各自的配置覆盖
    • 每个机器人可有自己的扩地配置覆盖(策略、目标邦国、目标数量等),未覆盖字段回退全局默认
    • 控制台新增机器人列表(连接状态 / 坐标 / 任务 / 已开拓数)、机器人切换、全部开始 / 全部停止
  • 开拓日志(src/core/expansionLog.js)
    • 逐条记录开拓玩家、邦国、区块、方块坐标、时间、判定来源,追加写入 data/expansion-log.jsonl
    • 支持按机器人 / 邦国 / 时间筛选、按机器人统计与今日计数、导出带 BOM 的 CSV
    • 文件超过 16MB 自动轮转为 .1;进程被杀留下的半行在重启时被安全跳过
    • 控制台新增「开拓日志」表格页签,支持筛选、清屏、导出
  • 游戏公屏完整日志 + 聊天框(src/core/chatLog.js)
    • 每个机器人收到的全部公屏 / 系统 / 动作栏消息按机器人分文件落盘(data/chat/<机器人>.jsonl)
    • 本机器人发出的聊天与指令同样留档,可对照「指令发出后服务器回了什么」
    • 控制台新增「公屏聊天」页签(可按机器人或全部机器人查看、关键字筛选、导出)与公屏消息发送框
  • 登录验证门禁
    • 游戏侧:未完成服务器登录验证时拒绝发送指令 / 聊天,且 isReady() 不放行扩地任务; 新增登录结果确认兜底(server.loginConfirmTimeoutMs),避免服务器不回提示导致机器人永远卡在未登录
    • 控制台侧:新增 WEB_PASSWORD 与 /api/login、/api/session,页面弹出登录框, 验证通过后才允许操作各机器人的控制台、聊天框与扩地任务
  • 大地图(src/core/bigMapService.js)
    • 爬取服务器地图站点(squaremap)的瓦片图片与领土标记,拼在一张图上查看所有机器人的坐标
    • 坐标系已对源站实测标定:瓦片 512×512,层级 0 每张覆盖 4096 方块,层级 3 为 1 方块 1 像素 (用 27 个王城坐标交叉验证:正确公式下王城所在瓦片平均海洋占比 28.7%, 错误假设为 41.6% / 47.3% / 76.0%)
    • 瓦片磁盘缓存 data/mapcache/,默认启动时预爬取层级 0(全世界 10×10=100 张), 更高层级按需穿透拉取并永久缓存;/api/bigmap/tile/:z/:x/:y 代理避免跨域
    • 领土以 markers.json 的原始多边形绘制(预编译为 Path2D),叠加本次会话新占领区块、 王城与全部机器人坐标;支持滚轮缩放、拖拽平移、全世界 / 回到机器人一键定位
  • 测试从 154 个增加到 242 个:新增开拓日志、公屏日志、大地图坐标系与缓存、 机器人池与配置隔离、凭据解析、机器人登录门禁、多机器人 Web 接口与登录鉴权等用例

变更

  • TerritoryModel 新增 flyingChunksOf() / ownChunksOf(),邦国归属改为按名称显式传入, 不再依赖全局 selfStateName(多机器人会互相覆盖);同时保留 markers.json 的原始多边形
  • ExpansionPlanner 的己方邦国解析顺序改为「配置里的 stateName → 模型全局 selfStateName」
  • 运行日志统一加机器人名前缀([游戏名] …),多机器人共用一份日志也能分清来源
  • Web 接口改为以 /api/bots/:id/... 为主,原有单机器人接口(/api/task/*、/api/command、 /api/bot/reconnect)保留为默认机器人的等价别名
  • /api/map 支持 ?bot=<id> 按机器人视角返回其邦国、目标与玩家区块

修复

  • 修正控制台地图瓦片 URL 与后端路由不一致的问题(前端请求 /api/bigmap/tile/:z/:x_y.png, 后端路由为 /api/bigmap/tile/:z/:x/:y.png)
  • 「被服务器传送」日志洪水:账号未完成服务器验证时,服务端会每 tick 强推一次位置, 实测 3 分钟刷出 748 行日志,几十分钟就会把 2000 条的日志环形缓冲冲光、并把 WebSocket 打满。 现改为首次立即记录、其余按 30 秒窗口聚合成一条(被服务器传送另有 N 次), 并在连接断开时把未汇总的计数刷出去
  • 外站账号绑定流程无法识别:本项目原先只认 /login 与 /register, 遇到「简幻通」这类要求 /auth <UID> <验证码> 或扫码绑定的服务器时, 表现只是「连上 → 被传送 → 120 秒后被踢 → 重连」的静默死循环,失败原因对用户完全不可见。 现新增 NEED_AUTH_PATTERN 识别,命中后输出可操作的中文告警(每个连接只提示一次), 并新增 server.authCommand 模板供配置固定验证码的服务器自动过验证
  • 重连无退避:连续被踢时每 10 秒硬撞一次服务器。现按指数退避拉长间隔 (server.reconnectMaxDelayMs,默认上限 120 秒),成功进入世界后计数清零

已知限制

  • 多个机器人共享一份领土模型:markers.json 是全服数据,没必要每个机器人各拉一遍; 因此「会话新占领」区块是全局共享的,控制台地图的己方邦国显示的是最近启动的那个机器人的邦国
  • 大地图层级 3 不预爬取:全图 80×80=6400 张瓦片约 200MB,改为按需拉取 + 永久缓存
  • 扫码类账号绑定无法自动化:/auth <UID> <验证码> 的验证码是动态的、扫码更是需要人工, 程序只能明确报错提示;绑定是一次性的,绑定成功后同一账号即可自动登录

[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 放开
  • 监守者 / 末影龙 / 凋灵默认跳过:原版会攻击它们,但那基本等于自杀