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。
这个提交包含在:
@@ -237,8 +237,6 @@ class ExpansionController {
|
||||
return false;
|
||||
}
|
||||
this.config = requestedConfig;
|
||||
// 显式启动的任务优先于「掉线待恢复」的那一次
|
||||
this.resumeConfig = null;
|
||||
// 现实时间限制:不在允许时段时登记「等待自动开始」,进入时段后由 tick() 自动启动
|
||||
if (!this.isWithinClaimTime()) {
|
||||
this.pendingStart = requestedConfig;
|
||||
@@ -360,12 +358,23 @@ class ExpansionController {
|
||||
}
|
||||
return;
|
||||
}
|
||||
// 重新进入世界:把被掉线打断的任务接上
|
||||
// 重新进入世界:把被掉线打断的任务接上。
|
||||
// 必须等 isReady()(含登录完成)才试,否则 start() 会直接返回 false;
|
||||
// 而且只有在真的启动成功后才清掉 resumeConfig —— 否则一次失败的尝试
|
||||
// 就会把这次恢复永久丢掉(实测本服掉线频繁,很容易踩到)。
|
||||
if (this.resumeConfig && !this.isRunning()) {
|
||||
if (!bm.isReady()) return; // 还没就绪,下一 tick 再试
|
||||
const resume = this.resumeConfig;
|
||||
this.resumeConfig = null;
|
||||
this._log('已重新进入世界,自动恢复扩地任务');
|
||||
this.start(resume).catch((err) => this._log('自动恢复任务失败:' + err.message, 'error'));
|
||||
Promise.resolve(this.start(resume))
|
||||
.then((ok) => {
|
||||
if (ok) {
|
||||
this.resumeConfig = null;
|
||||
} else {
|
||||
this._log('自动恢复未成功(' + this.status + '),稍后重试', 'warn');
|
||||
}
|
||||
})
|
||||
.catch((err) => this._log('自动恢复任务失败:' + err.message, 'error'));
|
||||
return;
|
||||
}
|
||||
this.playerChunk = this._playerChunk();
|
||||
|
||||
在新工单中引用
屏蔽一个用户