diff --git a/repo/js/AAA-Artifacts-Bulk-Supply/README.md b/repo/js/AAA-Artifacts-Bulk-Supply/README.md index 108cf719d..5c440d944 100644 --- a/repo/js/AAA-Artifacts-Bulk-Supply/README.md +++ b/repo/js/AAA-Artifacts-Bulk-Supply/README.md @@ -19,7 +19,7 @@ - **强制收尾路线交替执行**:默认不开,用于一些用户想收集其他的调查材料,比如茶叶等。替换掉(替补收尾路线)内的文件,可以一天收尾狗粮,一天收尾茶叶。 - **狗粮分解模式**:默认不分解,可选分解成(经验瓶/摩拉) - **账户名称**:**单账号无需更改。** 多账号使用时建多个配置组,一个账号使用一个配置组,填入游戏账号名称(自己取名),就可以按各自名称分别记录运行信息。 -- **芙宁娜** :狗粮队支持自动使用白芙作为生存位(汐佬逼的),当你狗粮队伍中含有芙宁娜时请勾选,将确保狗粮路线时芙宁娜为白芙状态,清怪和脚本结束时切回黑芙。 +- **芙宁娜** :狗粮队支持自动使用白芙作为生存位(汐姐姐逼的,非必要不要用,会慢很多),当你狗粮队伍中一定要含有芙宁娜时勾选,将确保狗粮路线时芙宁娜为白芙状态,清怪和脚本结束时切回黑芙。 ## 二、调查点类型收益 @@ -71,8 +71,8 @@ ## 六、队伍配置建议 - **根据自己CPU配置选择合适的移速**:电脑性能较差以至于收益远不如及格线时,降低队伍移速(使用较矮小的体型,不使用双风,四风原典,迪西雅天赋等)。 -- **行走位:优先迪希雅;或芙宁娜等 E启动奶** -- **钟剑迪希雅**:耐肘王/白天6-18点移速+10%(路径内置调时间到白天,全程100%吃满天赋) +- **行走位:优先迪希雅;或芭芭拉等 E启动奶** +- **钟剑迪希雅**:耐肘王/白天6-18点移速+10%(js自定义配置可选调时间到白天,全程100%吃满天赋) - **万叶:建议携带,路径内配有E吸狗粮策略(不带不影响运行)**,琴可作为备选项,不要同时携带琴和万叶 - **双风BUFF**:移速+10% 体力消耗-15% diff --git a/repo/js/AAA-Artifacts-Bulk-Supply/assets/拾取滚轮.png b/repo/js/AAA-Artifacts-Bulk-Supply/assets/拾取滚轮.png new file mode 100644 index 000000000..18cc09292 Binary files /dev/null and b/repo/js/AAA-Artifacts-Bulk-Supply/assets/拾取滚轮.png differ diff --git a/repo/js/AAA-Artifacts-Bulk-Supply/main.js b/repo/js/AAA-Artifacts-Bulk-Supply/main.js index e913b0d3e..8ea76bbd7 100644 --- a/repo/js/AAA-Artifacts-Bulk-Supply/main.js +++ b/repo/js/AAA-Artifacts-Bulk-Supply/main.js @@ -28,6 +28,7 @@ const doDecomposeRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("ass const doDecompose2Ro = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/doDecompose2.png")); const outDatedRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/ConfirmButton.png"), 760, 700, 100, 100); +const scrollRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/拾取滚轮.png"), 1017, 496, 1093 - 581, 581 - 496); const normalPathA = settings.fastMode ? "" : "assets/ArtifactsPath/普通98点1号线"; const normalPathB = settings.fastMode ? "" : "assets/ArtifactsPath/普通98点2号线"; @@ -1197,10 +1198,10 @@ async function recognizeAndInteract() { gameRegion = captureGameRegion(); let centerYF = await findFIcon(); if (!centerYF) { - if (await isMainUI()) { - if (new Date() - lastRoll >= 200) { + if (new Date() - lastRoll >= 200) { + lastRoll = new Date(); + if (await hasScroll()) { await keyMouseScript.runFile(`assets/滚轮下翻.json`); - lastRoll = new Date(); } } continue; @@ -1295,25 +1296,6 @@ async function recognizeAndInteract() { return null; } - async function isMainUI() { - const recognitionObject = RecognitionObject.TemplateMatch(mainUITemplate, 0, 0, 150, 150); - const maxAttempts = 1; - let attempts = 0; - - while (attempts < maxAttempts && state.running) { - try { - const result = gameRegion.find(recognitionObject); - if (result.isExist()) return true; - } catch (error) { - log.error(`识别图像时发生异常: ${error.message}`); - if (!state.running) break; - return false; - } - attempts++; - await sleep(checkDelay); - } - return false; - } } /** @@ -1482,4 +1464,33 @@ async function findAndClick(target, log.error(`执行通用识图时出现错误:${error.message}`); return retType === 0 ? false : null; } +} + +/** + * 判断当前是否存在拾取滚轮图标 + * @param {number} maxDuration 最大允许耗时(毫秒) + */ +async function hasScroll(maxDuration = 10) { + const start = Date.now(); + let dodispose = false; + while (Date.now() - start < maxDuration) { + if (!gameRegion) { + gameRegion = captureGameRegion(); + dodispose = true; + } + try { + const result = gameRegion.find(scrollRo); + if (result.isExist()) return true; + } catch (error) { + log.error(`识别图像时发生异常: ${error.message}`); + return false; // 一旦出现异常直接退出,不再重试 + } + await sleep(checkDelay); // 识别间隔 + if (dodispose) { + gameRegion.dispose(); + dodispose = false; // 已经释放,标记避免重复 dispose + } + } + /* 超时仍未识别到,返回失败 */ + return false; } \ No newline at end of file diff --git a/repo/js/AAA-Artifacts-Bulk-Supply/manifest.json b/repo/js/AAA-Artifacts-Bulk-Supply/manifest.json index a8262990e..44fd5eec6 100644 --- a/repo/js/AAA-Artifacts-Bulk-Supply/manifest.json +++ b/repo/js/AAA-Artifacts-Bulk-Supply/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "AAA狗粮批发", - "version": "2.1.6", + "version": "2.2.0", "tags": [ "狗粮" ], diff --git a/repo/js/ArtifactsGroupPurchasing/assets/拾取滚轮.png b/repo/js/ArtifactsGroupPurchasing/assets/拾取滚轮.png new file mode 100644 index 000000000..18cc09292 Binary files /dev/null and b/repo/js/ArtifactsGroupPurchasing/assets/拾取滚轮.png differ diff --git a/repo/js/ArtifactsGroupPurchasing/main.js b/repo/js/ArtifactsGroupPurchasing/main.js index a143d4907..526c44573 100644 --- a/repo/js/ArtifactsGroupPurchasing/main.js +++ b/repo/js/ArtifactsGroupPurchasing/main.js @@ -1,5 +1,6 @@ const runExtra = settings.runExtra || false; const leaveTeamRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/leaveTeam.png")); +const scrollRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/拾取滚轮.png"), 1017, 496, 1093 - 581, 581 - 496); let targetItems; let pickupDelay = 100; let timeMove = 1000; @@ -1264,10 +1265,10 @@ async function recognizeAndInteract() { gameRegion = captureGameRegion(); let centerYF = await findFIcon(); if (!centerYF) { - if (await isMainUI()) { - if (new Date() - lastRoll >= 200) { + if (new Date() - lastRoll >= 200) { + lastRoll = new Date(); + if (await hasScroll()) { await keyMouseScript.runFile(`assets/滚轮下翻.json`); - lastRoll = new Date(); } } continue; @@ -1649,4 +1650,33 @@ async function numberTemplateMatch( adopted.sort((a, b) => a.x - b.x); return adopted.reduce((num, item) => num * 10 + item.digit, 0); +} + +/** + * 判断当前是否存在拾取滚轮图标 + * @param {number} maxDuration 最大允许耗时(毫秒) + */ +async function hasScroll(maxDuration = 10) { + const start = Date.now(); + let dodispose = false; + while (Date.now() - start < maxDuration) { + if (!gameRegion) { + gameRegion = captureGameRegion(); + dodispose = true; + } + try { + const result = gameRegion.find(scrollRo); + if (result.isExist()) return true; + } catch (error) { + log.error(`识别图像时发生异常: ${error.message}`); + return false; // 一旦出现异常直接退出,不再重试 + } + await sleep(checkDelay); // 识别间隔 + if (dodispose) { + gameRegion.dispose(); + dodispose = false; // 已经释放,标记避免重复 dispose + } + } + /* 超时仍未识别到,返回失败 */ + return false; } \ No newline at end of file diff --git a/repo/js/ArtifactsGroupPurchasing/manifest.json b/repo/js/ArtifactsGroupPurchasing/manifest.json index 51c91a67d..17bff59a3 100644 --- a/repo/js/ArtifactsGroupPurchasing/manifest.json +++ b/repo/js/ArtifactsGroupPurchasing/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "AAA狗粮联机团购", - "version": "1.13.9", + "version": "1.13.4", "tags": [ "狗粮" ], diff --git a/repo/js/AutoHoeingOneDragon/assets/其余材料图-实用版.zip b/repo/js/AutoHoeingOneDragon/assets/其余材料图-实用版.zip deleted file mode 100644 index 5ad766ded..000000000 Binary files a/repo/js/AutoHoeingOneDragon/assets/其余材料图-实用版.zip and /dev/null differ diff --git a/repo/js/AutoHoeingOneDragon/assets/拾取滚轮.png b/repo/js/AutoHoeingOneDragon/assets/拾取滚轮.png new file mode 100644 index 000000000..18cc09292 Binary files /dev/null and b/repo/js/AutoHoeingOneDragon/assets/拾取滚轮.png differ diff --git a/repo/js/AutoHoeingOneDragon/main.js b/repo/js/AutoHoeingOneDragon/main.js index 9e2d3608f..13dacd8d2 100644 --- a/repo/js/AutoHoeingOneDragon/main.js +++ b/repo/js/AutoHoeingOneDragon/main.js @@ -41,6 +41,7 @@ const fIconRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync('assets/F_ fIconRo.Threshold = 0.95; fIconRo.InitTemplate(); const mainUIRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/MainUI.png"), 0, 0, 150, 150); +const scrollRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/拾取滚轮.png"), 1017, 496, 1093 - 581, 581 - 496); //全局通用变量声明 let gameRegion; @@ -53,6 +54,7 @@ let state; let pathings; let localeWorks; let lastEatBuff = 0; +let currentFood = ""; (async function () { //通用预处理 @@ -961,31 +963,50 @@ async function runPath(fullPath, map_name, pm, pe) { await pathingScript.runFile("assets/强制黑芙.json"); } if (settings.eatBuff) { - const res = settings.eatBuff.split(','); if (new Date() - lastEatBuff > 300 * 1000) { - lastEatBuff = new Date(); + // 1. 数据预处理:分割、去空、去重 + let res = settings.eatBuff + .split(',') + .map(item => item.trim()) + .filter(item => item.length > 0) + .filter((item, index, arr) => arr.indexOf(item) === index); + + // 无有效数据时提前返回 + if (res.length === 0) { + log.error("无有效的食物配置"); + return; + } + // 2. 优化排序:currentFood 置顶以减少筛选操作 + if (currentFood && res.includes(currentFood)) { + res = [currentFood, ...res.filter(item => item !== currentFood)]; + } await genshin.returnMainUi(); keyPress("B"); - await sleep(300); let type = "食物" await findAndClick([`assets/背包界面/${type}1.png`, `assets/背包界面/${type}2.png`]); - await sleep(300); - // 2. 遍历数组,逐项执行 + // 3. 遍历数组,逐项执行 for (const item of res) { - await sleep(300); - await findAndClick(['assets/筛选1.png', 'assets/筛选2.png']); - await findAndClick("assets/重置.png"); - await sleep(500); - await findAndClick("assets/搜索.png"); - await sleep(1000); - // 真正输入当前这一项 - log.info(`搜索${item}`) - inputText(item); - await findAndClick("assets/确认筛选.png"); - await sleep(500); + if (currentFood !== item) { + await sleep(300); + await findAndClick(['assets/筛选1.png', 'assets/筛选2.png']); + await findAndClick("assets/重置.png"); + await sleep(300); + await findAndClick("assets/搜索.png"); + await sleep(300); + await findAndClick("assets/搜索成功点击.png"); + // 真正输入当前这一项 + log.info(`搜索${item}`); + currentFood = item; + inputText(item); + await findAndClick("assets/确认筛选.png"); + while (await findAndClick("assets/确认筛选.png", false, 2, 3)) { + await sleep(16); + } + } await findAndClick("assets/使用.png"); } await genshin.returnMainUi(); + lastEatBuff = new Date(); } } @@ -1250,7 +1271,7 @@ async function recognizeAndInteract() { if (!centerYF) { if (new Date() - lastRoll >= 200) { lastRoll = new Date(); - if (await isMainUI()) { + if (await hasScroll()) { await keyMouseScript.runFile(`assets/滚轮下翻.json`); } } @@ -1905,6 +1926,35 @@ async function isMainUI(maxDuration = 10) { return false; } +/** + * 判断当前是否存在拾取滚轮图标 + * @param {number} maxDuration 最大允许耗时(毫秒) + */ +async function hasScroll(maxDuration = 10) { + const start = Date.now(); + let dodispose = false; + while (Date.now() - start < maxDuration) { + if (!gameRegion) { + gameRegion = captureGameRegion(); + dodispose = true; + } + try { + const result = gameRegion.find(scrollRo); + if (result.isExist()) return true; + } catch (error) { + log.error(`识别图像时发生异常: ${error.message}`); + return false; // 一旦出现异常直接退出,不再重试 + } + await sleep(checkDelay); // 识别间隔 + if (dodispose) { + gameRegion.dispose(); + dodispose = false; // 已经释放,标记避免重复 dispose + } + } + /* 超时仍未识别到,返回失败 */ + return false; +} + // 加载拾取物图片 async function loadTargetItems() { diff --git a/repo/js/AutoHoeingOneDragon/manifest.json b/repo/js/AutoHoeingOneDragon/manifest.json index 05b075345..81801c78b 100644 --- a/repo/js/AutoHoeingOneDragon/manifest.json +++ b/repo/js/AutoHoeingOneDragon/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "锄地一条龙", - "version": "2.3.1", + "version": "2.4.0", "description": "一站式解决自动化锄地,支持只拾取狗粮,请仔细阅读README.md后使用", "authors": [ { diff --git a/repo/js/采集cd管理/README.md b/repo/js/采集cd管理/README.md index 05095e0d1..056915802 100644 --- a/repo/js/采集cd管理/README.md +++ b/repo/js/采集cd管理/README.md @@ -85,6 +85,9 @@
📋 点击查看历史更新 +### 2026/2/26 +1. 无f时滚轮改为仅在识别到滚轮图标时触发 + ### 2026/2/18 1. 对食材加工过程中可能出现的道具数量超过上限进行处理 diff --git a/repo/js/采集cd管理/assets/拾取滚轮.png b/repo/js/采集cd管理/assets/拾取滚轮.png new file mode 100644 index 000000000..18cc09292 Binary files /dev/null and b/repo/js/采集cd管理/assets/拾取滚轮.png differ diff --git a/repo/js/采集cd管理/main.js b/repo/js/采集cd管理/main.js index c017993f3..3b352f23f 100644 --- a/repo/js/采集cd管理/main.js +++ b/repo/js/采集cd管理/main.js @@ -95,6 +95,7 @@ FiconRo.Threshold = 0.95; FiconRo.InitTemplate(); const mainUiRo = RecognitionObject.TemplateMatch(mainUITemplate, 0, 0, 150, 150); +const scrollRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/拾取滚轮.png"), 1017, 496, 1093 - 581, 581 - 496); let checkInterval = +settings.checkInterval || 50; @@ -1325,11 +1326,12 @@ async function recognizeAndInteract() { let time2 = new Date(); const centerYF = await findFIcon(); + if (!centerYF) { - if (await isMainUI()) { - if (new Date() - lastRoll >= 200) { + if (new Date() - lastRoll >= 200) { + lastRoll = new Date(); + if (await hasScroll()) { await keyMouseScript.runFile(`assets/滚轮下翻.json`); - lastRoll = new Date(); } } if (checkTask) { @@ -2264,3 +2266,32 @@ function isArrivedAtEndPoint(fullPath) { return false; } } + +/** + * 判断当前是否存在拾取滚轮图标 + * @param {number} maxDuration 最大允许耗时(毫秒) + */ +async function hasScroll(maxDuration = 10) { + const start = Date.now(); + let dodispose = false; + while (Date.now() - start < maxDuration) { + if (!gameRegion) { + gameRegion = captureGameRegion(); + dodispose = true; + } + try { + const result = gameRegion.find(scrollRo); + if (result.isExist()) return true; + } catch (error) { + log.error(`识别图像时发生异常: ${error.message}`); + return false; // 一旦出现异常直接退出,不再重试 + } + await sleep(checkDelay); // 识别间隔 + if (dodispose) { + gameRegion.dispose(); + dodispose = false; // 已经释放,标记避免重复 dispose + } + } + /* 超时仍未识别到,返回失败 */ + return false; +} \ No newline at end of file diff --git a/repo/js/采集cd管理/manifest.json b/repo/js/采集cd管理/manifest.json index 758015709..20fca3c2e 100644 --- a/repo/js/采集cd管理/manifest.json +++ b/repo/js/采集cd管理/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "采集cd管理", - "version": "2.10.4", + "version": "2.11.0", "bgi_version": "0.44.8", "description": "仅面对会操作文件和读readme的用户,基于文件夹操作自动管理采集路线的cd,会按照路径组的顺序依次运行,直到指定的时间,并会按照给定的cd类型,自动跳过未刷新的路线", "saved_files": [