lyizai
|
abecdd2648
|
fix: 修复实机运行才暴露的 8 个缺陷,新增控制台添加玩家与移动测试
首次真正连上线上服务器(Debian 12 + pm2 + 端口 78)后暴露的问题,单元测试全绿但机器人干不了活:
致命
- 寻路插件从未加载:项目从没调用 bot.loadPlugin(pathfinder),bot.pathfinder 恒为
undefined、isReady() 恒为 false,扩地任务连启动都启动不了,界面只显示含糊的
「机器人尚未就绪」。现在 createBot 后立刻加载,失败时明确报错。
登录门禁相关(三处死锁)
- preLoginCommands 白名单:/login、/register、简幻通的 /auth 本身就是登录流程的一部分,
原先被门禁一并拦下,形成「要先登录才能发登录指令」
- 验证码常被要求直接当聊天内容发出(不是指令),原先被 sendChat 的门禁挡住;
现在服务器明确要求验证时自动放行,另有 server.allowChatBeforeLogin 兜底
- 配置了登录指令却没有密码时 loggedIn 永久为 false,控制台连手动指令都发不出;
现在走与其他「服务器不回提示」一致的超时兜底并给出说明
可用性
- 离线时指令被静默丢弃却回报「已发送」;现在要求已连接并进入世界,失败信息区分
「未连接」「登录被拒」「未通过验证」
- 「被服务器传送」日志洪水:实测 3 分钟 748 行,会冲光日志缓冲并打满 WebSocket;
现在按 30 秒窗口聚合,断开时刷出未汇总计数
- 识别外站账号绑定流程并给出可操作告警,新增 server.authCommand 模板
- 重连指数退避(server.reconnectMaxDelayMs)
- 控制台瓦片 URL 与后端路由不一致
新增
- 控制台添加 / 移除玩家:不必改 .env 重启。密码只写入 data/bots.credentials.json
(强制 0600),不进仓库、不出现在任何响应里;.env 与凭据文件同名时以 .env 为准,
.env 里的账号不允许从控制台移除
- 手动移动测试接口与按钮:绕开寻路器直接按方向键,返回真实位移,
用于区分「算不出路径」与「根本走不动」
- 位置同步诊断:位置包收发计数、onGround、游戏模式、维度、脚下方块与六向实心
- grim.reportOnGroundFromWorld:按世界数据修正出站 onGround(默认开启)
- scripts/check-protocol.js:核对包名与字段名同目标版本协议是否一致
文档
- README 新增「部署到服务器」与「机器人走不动的排查方法」两章
已知限制:实测本服上 mineflayer 客户端无法移动(按方向键 2 秒位移 0.00~0.02 格,
服务端每 tick 回弹一次),已排除区块数据、onGround、Grim 层、游戏模式、物理引擎、
寻路插件、teleport_confirm 协议字段等因素,彻底定位需与原生客户端逐字节对比移动包。
连接 / 登录 / 指令 / 聊天 / 公屏日志 / 大地图均正常。
测试从 263 增至 290,全部通过。
|
2026-09-27 23:06:39 +08:00 |
|
lyizai
|
2671da95d5
|
fix: 打通登录门禁死锁,失败信息区分未连接/登录被拒/未通过验证
继续修复部署时暴露的门禁设计问题:
- 登录门禁死锁:/login、/register、简幻通的 /auth 本身就是登录流程的一部分,
原先门禁把它们一并拦下,形成「要先登录才能发登录指令」,账号永远卡在未验证状态。
新增 server.preLoginCommands 白名单(默认 login,l,register,reg,auth),
这些前缀在未验证时也放行,其余指令仍要求已完成验证。
- 离线时指令被静默丢弃却回报「已发送」:bot.chat() 在未连接时无处可发。
canSendCommand() 现在要求已连接并进入世界,失败信息区分
「未连接」「登录被服务器拒绝」「未通过登录验证」三种情况并给出对应建议。
- 前端配置表单支持 list 类型字段(逗号分隔的字符串数组)。
测试从 252 增至 263,全部通过。
|
2026-09-27 22:11:52 +08:00 |
|
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 |
|
lyizai
|
39624da2d5
|
feat: 支持多机器人挂机、开拓日志、公屏完整日志与大地图
多机器人(src/bot/botPool.js、src/config/botsConfig.js)
- .env 用 MC_BOTS 一次配置多个账号(JSON 数组或 用户名:密码 逗号分隔),未配置时回退单机器人
- 每个机器人独立连接 / 登录 / 扩地状态机,共享一份领土数据服务与运行日志
- 密码只从 .env 读取;data/bots.json 只存启用状态、备注名、自动开始与各自的配置覆盖
- 每个机器人可覆盖全局配置(策略 / 目标邦国 / 目标数量等),未覆盖字段回退全局默认
开拓日志(src/core/expansionLog.js)
- 逐条记录开拓玩家、邦国、区块、方块坐标、时间与判定来源,追加写入 data/expansion-log.jsonl
- 支持按机器人 / 邦国 / 时间筛选、统计、导出带 BOM 的 CSV,超过 16MB 自动轮转
游戏公屏完整日志与聊天框(src/core/chatLog.js)
- 每个机器人的全部公屏 / 系统 / 动作栏消息按机器人分文件留档,自身发出的聊天与指令同样留档
- 控制台新增公屏聊天页签与消息发送框
登录验证门禁
- 游戏侧:未完成登录验证时拒绝发送指令 / 聊天,isReady() 也不放行扩地任务;
新增 server.loginConfirmTimeoutMs 兜底,避免服务器不回提示导致永远卡在未登录
- 控制台侧:新增 WEB_PASSWORD 与 /api/login、/api/session,页面登录框验证通过才允许操作
大地图(src/core/bigMapService.js)
- 爬取服务器地图站点(squaremap)的瓦片图片与领土标记,一张图上看全部机器人坐标
- 坐标系对源站实测标定并用 27 个王城交叉验证;瓦片磁盘缓存,层级 0 启动预爬取、更高层级按需穿透
- 领土按 markers.json 原始多边形绘制(预编译 Path2D,even-odd 保留孔洞),叠加王城与机器人标签
配套改造
- TerritoryModel 新增 flyingChunksOf / ownChunksOf,邦国归属改为按名称显式传入,
不再依赖全局 selfStateName(多机器人会互相覆盖)
- Web 接口以 /api/bots/:id/... 为主,原单机器人接口保留为默认机器人的等价别名
- 新增 scripts/check-web-ids.js 校验前端元素引用一致性
测试从 154 增至 242,全部通过。
|
2026-09-27 21:22:57 +08:00 |
|
lyizai
|
223cf719b6
|
fix: 修正令牌鉴权拦下静态资源、全量地图数据每 20 秒重传两个问题
- 静态资源改到鉴权中间件之前:浏览器加载 index.html 时带的 ?token= 不会附加到
style.css / app.js 的子请求上,原先一并拦截会导致页面缺样式缺脚本
- 全量地图数据(实测 11.5 万区块约 1MB JSON)改为按需拉取:
勾选「显示全部邦国」、手动刷新地图或超过 5 分钟时才拉全量,
定时刷新只拉己方领土(约 4KB)并复用上一次的全量数据
- 配置热更新时直接替换控制器配置对象,去掉多余的一层浅合并
测试:新增静态资源可加载的回归用例,154 个用例全绿。
|
2026-09-27 17:19:20 +08:00 |
|
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 |
|