From ffadcf244213c644f85a9eaa11ae47057d02fbdd Mon Sep 17 00:00:00 2001 From: skyflag2022 <107539971+skyflag2022@users.noreply.github.com> Date: Wed, 7 Jan 2026 13:27:15 +0800 Subject: [PATCH] Delay (#2635) --- repo/js/营养袋吃药统计/README.md | 1 - .../assets/RecognitionObject/interface.png | Bin 1566 -> 0 bytes repo/js/营养袋吃药统计/main.js | 164 +++++++++--------- repo/js/营养袋吃药统计/manifest.json | 2 +- repo/js/营养袋吃药统计/settings.json | 12 ++ 5 files changed, 99 insertions(+), 80 deletions(-) delete mode 100644 repo/js/营养袋吃药统计/assets/RecognitionObject/interface.png diff --git a/repo/js/营养袋吃药统计/README.md b/repo/js/营养袋吃药统计/README.md index 632ab2d34..7d751ea71 100644 --- a/repo/js/营养袋吃药统计/README.md +++ b/repo/js/营养袋吃药统计/README.md @@ -59,7 +59,6 @@ 1. 完成上述配置后运行脚本 2. 脚本自动执行: - 校验账户名合法性 - - 领取月卡(如可领取) - 打开背包识别药品数量 - 创建记录文件(路径:`assets/账户名.txt`) 3. 收到「今日初始化完成」通知 diff --git a/repo/js/营养袋吃药统计/assets/RecognitionObject/interface.png b/repo/js/营养袋吃药统计/assets/RecognitionObject/interface.png deleted file mode 100644 index b70d1784295cff26fe369f742ffa9c329ff58985..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1566 zcmV+(2I2XMP)P000>X1^@s6#OZ}&00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1+z&+K~zXfjaF?> zlV=pZ`aCVArG?T0EmR5!h@!w$bWTJ^=G;qWbo;QMuzgtOPgq=*Eiv22?dy^y+dgcG zON^P*WEwThw<*4W3=rg{mKF--t@NGlTz6Z*M6;c8_o4T5Kj)nLx~_BX$FObB>sgE0 zh?6}{IMm^Vwb+C^kAwK*#yBRYmyph^VYAt-MJThGaqK`n_O-gfXRqIXhD)+O5MDuM zEt_AtVMcx#3_x*_Q8_5Fm|&F$jhal#pGntH<+7rwwj8^*y3n}Af$%~M4!c>6B9ktO z8R4t8qtagEmKZu%=FMJUQ7rlMfo|}?SUXJ-N0@~NT=6u z_VO_17USsN?L|+g50#D$=(L{BTAVo2gce^pOoA`1)?>#T`+R7rb1KXW#>`g}DI}8V zJi$4Vv)L?GVkyPdax{sIh-EYVnpp_9n02)+*|joVNayy6zrupwLc;OGjX3k^VZ7hd z3|Cn(G!i3bGU_-fiJm#tjSt^!QOM9o!L%RF58#_0@8VYfG~&q|#*fG5@cp@d+~l&@H&*{E2UP5 zF>!YY6s=N_`&vC{7NOWn%!(JAK-DBg+PTA{{8Txt!l#ZOji+EqLr5xtJ*ryR-J2*eSTb24Kk`4Dyia? zMM?n}uAcoWTW&92hlF9fOer*!?W2H z=%Kj%^rXnHPWq59k3A(iG!a2$Iia9obBqe!5z&7bfSvq`9zf6`zM6{(J)-HlWu96d!_9U49}|Ko09_OW8CFCT@504i)uf# z2P0uT9GO+U?1d8EY$=i_ig|UXN1dErfu*aX2JOuiN)S$w@38}Q*emkofyWSoqN+t&L$44@{WQRPG8DK#A-nr|ec=RN!Bu#Ms zR}exnHM5N0t~`-O8o;VR%%gXAOBI^sSmt{HcYIYK{Q2S_9txZ>skH+7DhSVavyfH5 z^F_u}j@WZ8gK{OiEeYoTEJz9=x|&i2SqMNgeEHcY*`1hPe~JrP~= z(BjJ2v~BTdq{z{9+vc0wt1&7EkqH Q9{>OV07*qoM6N<$g3t%`)c^nh diff --git a/repo/js/营养袋吃药统计/main.js b/repo/js/营养袋吃药统计/main.js index 9e01c9602..d684fa7a0 100644 --- a/repo/js/营养袋吃药统计/main.js +++ b/repo/js/营养袋吃药统计/main.js @@ -7,11 +7,12 @@ const ocrRegion = { width: 220, height: 270 }; -const filterButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/filterButton.png")); -const resetButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/resetButton.png")); -const researchRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/research.png")); -const searchInterfaceRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/interface.png")); -const confirmButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/confirmButton.png"), 350, 1000, 50, 50); +const filterButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/filterButton.png"),154, 1003, 27, 27); +const resetButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/resetButton.png"),66, 1006, 27, 27); +const researchRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/research.png"),95, 101, 27, 27); +const confirmButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/confirmButton.png"), 355, 999, 44, 44); +const loadDelay = +settings.loadDelay || 1000; +const stepDelay = +settings.stepDelay || 1000; (async function () { // 检验账户名 async function getUserName() { @@ -452,90 +453,97 @@ const confirmButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("a return null; } - async function findAndClick(target, maxAttempts = 50, clicks=true) { + async function findAndClick(target, maxAttempts = 50) { for (let i = 0; i < maxAttempts; i++) { - const rg = captureGameRegion(); - try { - const res = rg.find(target); - if (res.isExist()) { - if(clicks) - {await sleep(50); res.click()} - return true; - } - } finally { rg.dispose(); } - if (i < maxAttempts - 1) await sleep(50); + const result = await recognizeImage(target); + if (result.success) { + click(result.x, result.y); + await sleep(50); + return true; + } else { + log.warn(`未能识别到图标,尝试 ${i + 1}/${maxAttempts}`); + } + await sleep(50); } return false; } - - - async function getFoodNum(){ - keyPress("B");//打开背包 - await handleExpiredItems(); //处理过期物品弹窗 - await sleep(500); - click(863, 51);//选择食物 - await sleep(1000); - await findAndClick(filterButtonRo);//筛选 - await sleep(1000); - await findAndClick(searchInterfaceRo,50,false);//搜索界面 - await sleep(200); - await findAndClick(resetButtonRo);//重置按钮 - await sleep(200); - await findAndClick(researchRo);//搜索输入框 - await sleep(200); - inputText(recoveryFoodName); - await findAndClick(confirmButtonRo);//确认按钮 - await sleep(1000); - let recoveryNumber=await recognizeNumberByOCR(ocrRegion,/\d+/) //识别回血药数量 - // 处理回血药识别结果 - if (recoveryNumber === null) { - recoveryNumber = 0; - notification.send(`未识别到回血药数量,设置数量为0,药品名:${recoveryFoodName}`) - await sleep(5000); - click(863, 51);//选择食物 - await sleep(1000); + + // 定义一个函数用于识别图像 + async function recognizeImage(recognitionObject, timeout = 5000) { + let startTime = Date.now(); + while (Date.now() - startTime < timeout) { + try { + // 尝试识别图像 + const ro = captureGameRegion(); + let imageResult = ro.find(recognitionObject); + ro.dispose(); + if (imageResult && imageResult.x !== 0 && imageResult.y !== 0 && imageResult.width !== 0 && imageResult.height !== 0) { +// log.info(`成功识别图像,坐标: x=${imageResult.x}, y=${imageResult.y}, width=${imageResult.width}, height=${imageResult.height}`); + return { success: true, x: imageResult.x, y: imageResult.y, width: imageResult.width, height: imageResult.height}; + } + } catch (error) { + log.error(`识别图像时发生异常: ${error.message}`); + } + await sleep(10); // 短暂延迟,避免过快循环 } - await findAndClick(filterButtonRo);//筛选 - await sleep(500); - await findAndClick(searchInterfaceRo,50,false);//搜索界面 - await sleep(200); - await findAndClick(resetButtonRo);//重置按钮 - await sleep(200); - await findAndClick(researchRo);//搜索输入框 - await sleep(200); - inputText(resurrectionFoodName); - await findAndClick(confirmButtonRo);//确认按钮 - await sleep(1000); // 增加等待时间 - let resurrectionNumber=await recognizeNumberByOCR(ocrRegion,/\d+/) //识别复活药数量 - // 处理复活药识别结果 - if (resurrectionNumber === null) { - resurrectionNumber = 0; - notification.send(`未识别到复活药数量,设置数量为0,药品名:${resurrectionFoodName}`) - await sleep(5000); - click(863, 51);//选择食物 - await sleep(1000); - } - await findAndClick(filterButtonRo);//筛选 - await sleep(200); - await findAndClick(searchInterfaceRo,50,false);//搜索界面 - await sleep(200); - await findAndClick(resetButtonRo);//重置 - await sleep(200); - await findAndClick(confirmButtonRo);//确认按钮 - await genshin.returnMainUi(); - return { recoveryNumber, resurrectionNumber }; + log.warn(`经过多次尝试,仍然无法识别图像`); + return { success: false }; } async function main() { // 设置分辨率和缩放 setGameMetrics(1920, 1080, 1); - // 点击领月卡 - await genshin.blessingOfTheWelkinMoon(); - await sleep(500); await genshin.returnMainUi(); - await sleep(500); - // 获取食物数量 - return await getFoodNum(); + keyPress("B");//打开背包 + await handleExpiredItems(); //处理过期物品弹窗 + await sleep(loadDelay); + click(863, 51);//选择食物 + await sleep(loadDelay); + await findAndClick(filterButtonRo);//筛选 图标的坐标: x=155, y=1004, width=25, height=25,识图范围推荐: 154, 1003, 27, 27 + await sleep(stepDelay); + await findAndClick(resetButtonRo);//重置按钮 图标的坐标: x=67, y=1007, width=25, height=25,识图范围推荐: 66, 1006, 27, 27 + await sleep(stepDelay); + await findAndClick(researchRo);//搜索输入框 图标的坐标: x=96, y=102, width=25, height=25,识图范围推荐: 95, 101, 27, 27 + await sleep(loadDelay); + inputText(recoveryFoodName); + await sleep(stepDelay); + await findAndClick(confirmButtonRo);//确认按钮 图标的坐标: x=356, y=1000, width=42, height=42,识图范围推荐: 355, 999, 44, 44 + await sleep(loadDelay); + let recoveryNumber=await recognizeNumberByOCR(ocrRegion,/\d+/) //识别回血药数量 + // 处理回血药识别结果 + if (recoveryNumber === null) { + recoveryNumber = 0; + notification.send(`未识别到回血药数量,设置数量为0,药品名:${recoveryFoodName}`) + await sleep(5000); + click(863, 51);//选择食物 + await sleep(1000); + } + await findAndClick(filterButtonRo);//筛选 图标的坐标: x=155, y=1004, width=25, height=25,识图范围推荐: 154, 1003, 27, 27 + await sleep(stepDelay); + await findAndClick(resetButtonRo);//重置按钮 + await sleep(stepDelay); + await findAndClick(researchRo);//搜索输入框 + await sleep(loadDelay); + inputText(resurrectionFoodName); + await sleep(stepDelay); + await findAndClick(confirmButtonRo);//确认按钮 + await sleep(loadDelay); + let resurrectionNumber=await recognizeNumberByOCR(ocrRegion,/\d+/) //识别复活药数量 + // 处理复活药识别结果 + if (resurrectionNumber === null) { + resurrectionNumber = 0; + notification.send(`未识别到复活药数量,设置数量为0,药品名:${resurrectionFoodName}`) + await sleep(5000); + click(863, 51);//选择食物 + await sleep(1000); + } + await findAndClick(filterButtonRo);//筛选 + await sleep(stepDelay); + await findAndClick(resetButtonRo);//重置 + await sleep(stepDelay); + await findAndClick(confirmButtonRo);//确认按钮 + await genshin.returnMainUi(); + return { recoveryNumber, resurrectionNumber }; } // 主执行流程 diff --git a/repo/js/营养袋吃药统计/manifest.json b/repo/js/营养袋吃药统计/manifest.json index 97a2f59dd..2e7dff75b 100644 --- a/repo/js/营养袋吃药统计/manifest.json +++ b/repo/js/营养袋吃药统计/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "吃药统计", - "version": "1.4.3", + "version": "1.5", "bgi_version": "0.51", "description": "用于统计指定两个食物的消耗,推荐锄地前后使用", "authors": [ diff --git a/repo/js/营养袋吃药统计/settings.json b/repo/js/营养袋吃药统计/settings.json index c49451569..abf6041b6 100644 --- a/repo/js/营养袋吃药统计/settings.json +++ b/repo/js/营养袋吃药统计/settings.json @@ -22,5 +22,17 @@ "type": "input-text", "label": "复活药名称", "default": "" + }, + { + "name": "loadDelay", + "type": "input-text", + "label": "加载等待延迟\n用于OCR,界面切换和输入药名前的等待\n默认1000,单位毫秒", + "default": "1000" + }, + { + "name": "stepDelay", + "type": "input-text", + "label": "操作间隔延迟\n用于筛选操作之间的短暂等待\n默认1000,单位毫秒", + "default": "1000" } ]