@@ -1,4 +1,3 @@
|
|||||||
(async function () {
|
|
||||||
|
|
||||||
const folderA = 'assets/狗粮A线@Yang-z/';
|
const folderA = 'assets/狗粮A线@Yang-z/';
|
||||||
const folderB = 'assets/狗粮B线@Yang-z/';
|
const folderB = 'assets/狗粮B线@Yang-z/';
|
||||||
@@ -91,12 +90,13 @@
|
|||||||
let autoSalvage4 = settings.autoSalvage4 != undefined && settings.autoSalvage4 != '否' ? true : false;
|
let autoSalvage4 = settings.autoSalvage4 != undefined && settings.autoSalvage4 != '否' ? true : false;
|
||||||
let autoSalvageSpan = settings.autoSalvageSpan != undefined && ~~settings.autoSalvageSpan > 0 ? ~~settings.autoSalvageSpan : 10;
|
let autoSalvageSpan = settings.autoSalvageSpan != undefined && ~~settings.autoSalvageSpan > 0 ? ~~settings.autoSalvageSpan : 10;
|
||||||
let activeRestore = settings.activeRestore != undefined && settings.activeRestore != '是' ? false : true;
|
let activeRestore = settings.activeRestore != undefined && settings.activeRestore != '是' ? false : true;
|
||||||
|
const activeProgress = settings.activeProgress != undefined && settings.activeProgress != '否' ? true : false;
|
||||||
|
|
||||||
|
|
||||||
log.debug(`path: ${path}; swapPath: ${swapPath}; extra: ${extra}; extraAB: ${extraAB}; autoSalvage: ${autoSalvage}; autoSalvage4: ${autoSalvage4}; autoSalvageSpan: ${autoSalvageSpan}; activeRestore: ${activeRestore};`);
|
log.debug(`path: ${path}; swapPath: ${swapPath}; extra: ${extra}; extraAB: ${extraAB}; autoSalvage: ${autoSalvage}; autoSalvage4: ${autoSalvage4}; autoSalvageSpan: ${autoSalvageSpan}; activeRestore: ${activeRestore};`);
|
||||||
// await sleep(30000);
|
// await sleep(30000);
|
||||||
|
|
||||||
// 路线
|
// 确定路径
|
||||||
function determinePath() {
|
function determinePath() {
|
||||||
if (path != 'A' && path != 'B') {
|
if (path != 'A' && path != 'B') {
|
||||||
const benchmark = new Date("2024-11-20T04:00:00");
|
const benchmark = new Date("2024-11-20T04:00:00");
|
||||||
@@ -107,18 +107,31 @@
|
|||||||
|
|
||||||
if (swapPath) path = path == 'A' ? 'B' : 'A';
|
if (swapPath) path = path == 'A' ? 'B' : 'A';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 如果路径切换,清理与当前路径无关的任务记录
|
||||||
|
if (progress.path !== path) {
|
||||||
|
progress.completedTasks = [];
|
||||||
|
progress.path = path;
|
||||||
|
saveProgress(); // 保存新的路径和清理后的任务记录
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 初始化
|
|
||||||
|
// 初始化函数
|
||||||
async function init(shouldRestore = true, shouldResizeMap = false) {
|
async function init(shouldRestore = true, shouldResizeMap = false) {
|
||||||
// close forced interaction just in case..
|
// 关闭强制交互
|
||||||
dispatcher.addTimer(new RealtimeTimer("AutoPick", { "forceInteraction": false }));
|
dispatcher.addTimer(new RealtimeTimer("AutoPick", { "forceInteraction": false }));
|
||||||
|
|
||||||
// restore and alignment
|
// 恢复和对齐
|
||||||
if (shouldRestore) await genshin.tp("1468.0732421875", "1998.04443359375"); await sleep(3000);
|
if (shouldRestore) {
|
||||||
|
await genshin.tp("1468.0732421875", "1998.04443359375");
|
||||||
|
await sleep(3000);
|
||||||
|
}
|
||||||
|
|
||||||
// resize map here (not necessary after bgi v0.41.0)
|
// 调整地图缩放 (bgi[v0.41.0]后不需要)
|
||||||
if (shouldResizeMap) await resizeMap();
|
if (shouldResizeMap) {
|
||||||
|
await resizeMap();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 调整地图
|
// 调整地图
|
||||||
@@ -169,59 +182,134 @@
|
|||||||
// 分解圣遗物
|
// 分解圣遗物
|
||||||
async function salvage() {
|
async function salvage() {
|
||||||
if (!autoSalvage) return;
|
if (!autoSalvage) return;
|
||||||
|
|
||||||
await genshin.returnMainUi();
|
await genshin.returnMainUi();
|
||||||
|
keyPress("B");
|
||||||
|
await sleep(2000);
|
||||||
|
click(670, 40);
|
||||||
|
await sleep(1000); // 圣遗物
|
||||||
|
click(660, 1010);
|
||||||
|
await sleep(1000); // 分解
|
||||||
|
click(300, 1020);
|
||||||
|
await sleep(1000); // 快速选择
|
||||||
|
|
||||||
keyPress("B"); await sleep(2000);
|
// 点击4星圣遗物
|
||||||
click(670, 40); await sleep(1000); // 圣遗物
|
if (!autoSalvage4) {
|
||||||
click(660, 1010); await sleep(1000); // 分解
|
click(200, 380);
|
||||||
click(300, 1020); await sleep(1000); // 快速选择
|
await sleep(500);
|
||||||
|
|
||||||
// click(200, 140); await sleep(500); // 1
|
|
||||||
// click(200, 220); await sleep(500); // 2
|
|
||||||
// click(200, 300); await sleep(500); // 3
|
|
||||||
if (!autoSalvage4) { click(200, 380); await sleep(500); } // 4
|
|
||||||
|
|
||||||
click(340, 1000); await sleep(1000); // 确认选择
|
|
||||||
click(1720, 1015); await sleep(1500); // 分解
|
|
||||||
click(1180, 750); await sleep(1000); // 进行分解
|
|
||||||
|
|
||||||
click(1840, 45); await sleep(1500); // 取消
|
|
||||||
click(1840, 45); await sleep(1000); // 取消
|
|
||||||
click(1840, 45); await sleep(1000); // 取消
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 单一脚本执行
|
click(340, 1000);
|
||||||
let count = 0;
|
await sleep(1000); // 确认选择
|
||||||
|
click(1720, 1015);
|
||||||
|
await sleep(1500); // 分解
|
||||||
|
click(1320, 750);
|
||||||
|
await sleep(1000); // 进行分解
|
||||||
|
|
||||||
|
await genshin.returnMainUi();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 进度文件路径
|
||||||
|
const progressFile = "progress.json";
|
||||||
|
|
||||||
|
// 初始化进度
|
||||||
|
let progress = {
|
||||||
|
path: null,
|
||||||
|
completedTasks: [],
|
||||||
|
lastRunDate: null // 记录上次运行的日期
|
||||||
|
};
|
||||||
|
|
||||||
|
// 读取进度
|
||||||
|
async function loadProgress() {
|
||||||
|
try {
|
||||||
|
const content = await file.readText(progressFile);
|
||||||
|
const loadedProgress = JSON.parse(content);
|
||||||
|
|
||||||
|
// 检查日期是否一致
|
||||||
|
const now = new Date();
|
||||||
|
const today = now.toISOString().split('T')[0]; // 当前日期(YYYY-MM-DD)
|
||||||
|
const lastRunDate = loadedProgress.lastRunDate;
|
||||||
|
|
||||||
|
if (lastRunDate && lastRunDate === today) {
|
||||||
|
// 如果日期一致,加载进度
|
||||||
|
progress.path = loadedProgress.path;
|
||||||
|
progress.completedTasks = Array.isArray(loadedProgress.completedTasks) ? loadedProgress.completedTasks : [];
|
||||||
|
} else {
|
||||||
|
// 如果日期不一致,重置进度
|
||||||
|
progress.path = null;
|
||||||
|
progress.completedTasks = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
progress.lastRunDate = today; // 更新当前日期
|
||||||
|
log.info("加载进度成功:", progress);
|
||||||
|
} catch (error) {
|
||||||
|
log.error("加载进度失败:", error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 保存进度
|
||||||
|
async function saveProgress() {
|
||||||
|
try {
|
||||||
|
progress.lastRunDate = new Date().toISOString().split('T')[0]; // 更新当前日期
|
||||||
|
await file.writeText(progressFile, JSON.stringify(progress));
|
||||||
|
log.info("进度已保存。");
|
||||||
|
} catch (error) {
|
||||||
|
log.error("保存进度失败:", error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let count = 0; // 用于记录分解圣遗物的次数
|
||||||
|
|
||||||
async function runFile(filePath, times = 2) {
|
async function runFile(filePath, times = 2) {
|
||||||
try {
|
try {
|
||||||
--times;
|
// 检查任务是否已经完成
|
||||||
|
if (progress.completedTasks.includes(filePath)) {
|
||||||
|
log.info(`任务已跳过: ${filePath}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// 如关闭主动去神像恢复,则依赖队伍配置持续恢复角色,及bgi的低血量被动恢复
|
// 记录任务开始时间
|
||||||
|
const startTime = Date.now();
|
||||||
|
log.info(`开始执行任务: ${filePath}`);
|
||||||
|
|
||||||
|
// 检查是否是恢复任务
|
||||||
let isToRestore = filePath.search("(恢复)") != -1;
|
let isToRestore = filePath.search("(恢复)") != -1;
|
||||||
if (isToRestore && !activeRestore) return;
|
if (isToRestore && !activeRestore) {
|
||||||
|
log.info(`跳过恢复任务: ${filePath}`);
|
||||||
// 暂不支持关闭自动拾取
|
return;
|
||||||
// if (isToRestore) dispatcher.removeTimer(...);
|
}
|
||||||
// else...
|
|
||||||
|
|
||||||
// 分解圣遗物
|
// 分解圣遗物
|
||||||
if (!isToRestore && count++ % autoSalvageSpan == 0) await salvage();
|
if (!isToRestore && count++ % autoSalvageSpan == 0) {
|
||||||
|
await salvage();
|
||||||
|
}
|
||||||
|
|
||||||
// 调整地图缩放 (bgi[v0.41.0]后不需要)
|
// 调整地图缩放 (bgi[v0.41.0]后不需要)
|
||||||
// let shouldResizeMap = filePath.search("-m") != -1;
|
// let shouldResizeMap = filePath.search("-m") != -1;
|
||||||
// if (shouldResizeMap) await resizeMap();
|
// if (shouldResizeMap) await resizeMap();
|
||||||
|
|
||||||
// 配置自动拾取,根据文件名指定信息,确定是否强制交互(快速拾取)
|
// 配置自动拾取,根据文件名指定信息,确定是否强制交互(快速拾取)
|
||||||
let forceInteraction = filePath.search("-f") != -1; //
|
let forceInteraction = filePath.search("-f") != -1;
|
||||||
if (!isToRestore) dispatcher.addTimer(new RealtimeTimer("AutoPick", { "forceInteraction": forceInteraction }));
|
if (!isToRestore) dispatcher.addTimer(new RealtimeTimer("AutoPick", { "forceInteraction": forceInteraction }));
|
||||||
|
|
||||||
//执行路径追踪脚本
|
// 执行任务
|
||||||
log.info(filePath);
|
|
||||||
await pathingScript.runFile(filePath);
|
await pathingScript.runFile(filePath);
|
||||||
|
await sleep(1000);
|
||||||
// 配置强制拾取为关闭状态
|
// 配置强制拾取为关闭状态
|
||||||
dispatcher.addTimer(new RealtimeTimer("AutoPick", { "forceInteraction": false }));
|
dispatcher.addTimer(new RealtimeTimer("AutoPick", { "forceInteraction": false }));
|
||||||
|
// 记录任务结束时间
|
||||||
|
const endTime = Date.now();
|
||||||
|
const duration = endTime - startTime; // 任务运行时长(毫秒)
|
||||||
|
|
||||||
|
// 判断任务是否成功完成
|
||||||
|
if (duration < 5000) { // 假设任务运行时长小于5秒则认为任务被取消或异常终止
|
||||||
|
log.info(`任务运行时长过短(${duration}ms),可能被取消或异常终止,不保存进度: ${filePath}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 任务成功完成,更新进度
|
||||||
|
progress.completedTasks.push(filePath);
|
||||||
|
await saveProgress();
|
||||||
|
log.info(`任务成功完成并保存进度: ${filePath}`);
|
||||||
|
|
||||||
// 地图缩放按键同某些地图标识重叠,导致识别失败(bgi[v0.43.0]后引入)
|
// 地图缩放按键同某些地图标识重叠,导致识别失败(bgi[v0.43.0]后引入)
|
||||||
// // 完成路径后,放大地图,脚本中调用就近传送。仍可能被缩小回去。不可行
|
// // 完成路径后,放大地图,脚本中调用就近传送。仍可能被缩小回去。不可行
|
||||||
@@ -237,11 +325,16 @@
|
|||||||
await tpNearby(filePath);
|
await tpNearby(filePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
} catch (error) {
|
||||||
catch (error) { // bgi已捕获可预期异常,此处仅做兜底
|
// 任务失败,记录错误但不保存进度
|
||||||
log.error(error.toString());
|
log.error(`任务执行失败: ${filePath}`, error);
|
||||||
await sleep(3000);
|
await sleep(3000);
|
||||||
if (times > 0) await runFile(filePath, times);
|
if (times > 0) {
|
||||||
|
log.info(`任务失败,尝试重新执行: ${filePath}`);
|
||||||
|
await runFile(filePath, times - 1);
|
||||||
|
} else {
|
||||||
|
log.info(`任务失败,不再重试: ${filePath}`);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -253,23 +346,41 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 主函数
|
||||||
|
(async function () {
|
||||||
|
|
||||||
// main
|
// 如果 activeProgress 为否,则直接写入一个空对象到进度文件
|
||||||
setGameMetrics(1920, 1080, 1);
|
if (!activeProgress) {
|
||||||
|
// 写入空对象到进度文件
|
||||||
|
const result = await file.writeText(progressFile, JSON.stringify({}));
|
||||||
|
if (result) {
|
||||||
|
log.info("进度文件已重置,重新开始任务。");
|
||||||
|
} else {
|
||||||
|
log.error("进度文件重置失败。");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 如果 activeProgress 为是,则正常加载进度
|
||||||
|
await loadProgress();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 确定路径
|
||||||
determinePath();
|
determinePath();
|
||||||
|
|
||||||
// A or B
|
// 初始化
|
||||||
await init();
|
await init();
|
||||||
log.info(`开始执行${path}线路。`);
|
|
||||||
if (path == 'A') await batch(folderA, pathingA);
|
|
||||||
else await batch(folderB, pathingB);
|
|
||||||
|
|
||||||
// Extra
|
// 执行主线任务
|
||||||
|
log.info(`开始执行${progress.path}线路。`);
|
||||||
|
if (progress.path == 'A') {
|
||||||
|
await batch(folderA, pathingA);
|
||||||
|
} else {
|
||||||
|
await batch(folderB, pathingB);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 执行额外任务
|
||||||
if (extra) {
|
if (extra) {
|
||||||
await init();
|
await init();
|
||||||
log.info(`开始执行额外线路。`);
|
log.info("开始执行额外线路。");
|
||||||
|
|
||||||
// 12小时刷新的额外点位每天拾取
|
|
||||||
await batch(folderE, pathingE);
|
await batch(folderE, pathingE);
|
||||||
|
|
||||||
// 24小时刷新的额外点位隔天拾取,避免空跑
|
// 24小时刷新的额外点位隔天拾取,避免空跑
|
||||||
@@ -278,7 +389,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
await init();
|
await init();
|
||||||
log.info(`今日狗粮拾取任务完成。拾取路线:${path}${extra ? '+E' : ''}`);
|
log.info(`今日狗粮拾取任务完成。拾取路线:${progress.path}${extra ? '+E' : ''}`);
|
||||||
await sleep(1000);
|
await sleep(1000);
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,15 @@
|
|||||||
"否"
|
"否"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "activeProgress",
|
||||||
|
"type": "select",
|
||||||
|
"label": "启用断点续跑。多账号选否!(默认:否)",
|
||||||
|
"options": [
|
||||||
|
"是",
|
||||||
|
"否"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"name": "extra",
|
"name": "extra",
|
||||||
|
|||||||
Reference in New Issue
Block a user