fix: 自动恢复不再因一次失败的尝试而永久丢失

1.9.3 的 tick() 里先取走 resumeConfig 再调 start(),而 start() 在
「已进入世界但还没完成登录」时会直接返回 false(isReady() 要求 loggedIn)。
本服掉线频繁、重连后常常短暂处于这个状态,于是第一次失败的尝试就把这次恢复
永久丢掉了,任务再也不会自己接上 —— 实测监控里任务长时间停在
「机器人尚未就绪(未连接 / 未进入世界)」就是这个原因。

现在:① 等 bm.isReady() 才尝试;② 只有 start() 真的返回 true 才清掉登记,
失败时保留并在下一 tick 继续试,日志打「自动恢复未成功(…),稍后重试」。

顺带:服务器上保存的 pathing.maxDropDown 被改成了 64(钳制上限),
而原版摔落伤害超过 3 格后每格 1 点、23 格必死 —— 实测机器人正是
「fell from a high place」摔死并重生回王城,白走了 100 多格。
已在服务器配置上改回 4(代码默认本来就是 3)。

测试 477 → 478。
这个提交包含在:
lyizai
2026-10-01 17:22:11 +08:00
父节点 2ae2833568
当前提交 1b958cb804
共修改 5 个文件,包含 59 行新增和 9 行删除
+25 -1
查看文件
@@ -89,10 +89,12 @@ class FakeBotManager {
this._model = model;
/** 设为 false 模拟「世界已退出」(掉线 / 被踢 / 被切到登录服) */
this.spawned = true;
/** 设为 false 模拟「已进入世界但还没完成登录」 */
this.ready = true;
}
isReady() {
return true;
return this.ready;
}
isSpawned() {
@@ -168,6 +170,28 @@ test('世界退出后任务暂停,重连进入世界时自动恢复', async ()
assert.strictEqual(botManager.pathing.pathCalls, 2, '恢复后应重新下发寻路');
});
test('恢复尝试失败时不会丢掉这次恢复(等就绪后继续试)', async () => {
// 回归:本服掉线频繁,重连后常常「已进入世界但还没完成登录」,
// 此时 start() 会直接返回 false。若在尝试前就清掉 resumeConfig,
// 这次恢复就永久丢了 —— 任务再也不会自己接上。
const { controller, botManager, config } = setup();
await controller.start(config);
botManager.spawned = false;
controller.tick(); // 世界退出 → 登记待恢复
botManager.spawned = true;
botManager.ready = false; // 已进入世界但未就绪
controller.tick();
assert.strictEqual(controller.isRunning(), false, '未就绪时不应启动');
assert.ok(controller.resumeConfig, '未就绪时不能丢掉待恢复的任务');
botManager.ready = true;
controller.tick();
// start() 是异步的,等它落地再断言
await new Promise((resolve) => setTimeout(resolve, 0));
assert.strictEqual(controller.isRunning(), true, '就绪后应恢复');
assert.strictEqual(controller.resumeConfig, null, '恢复成功后清掉登记');
});
test('自动恢复可以关闭', async () => {
const { controller, botManager, config } = setup({ config: { autoResumeAfterReconnect: false } });
await controller.start(config);