From 204825f37d5b5669a10ea2b86000ee8eb4a9db92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BA=81=E5=8A=A8=E7=9A=84=E6=B0=A8=E6=B0=94?= <131591012+zaodonganqi@users.noreply.github.com> Date: Sun, 2 Nov 2025 13:27:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=BA=E5=88=B6=E6=89=80=E6=9C=89=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=E8=BF=9B=E8=A1=8Cdispose=EF=BC=88=E5=A6=82=E5=8F=91?= =?UTF-8?q?=E7=94=9F=E6=8F=90=E5=89=8D=E9=87=8A=E6=94=BE=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E8=AF=B7=E8=87=AA=E8=A1=8C=E4=BF=AE=E5=A4=8D=EF=BC=89=20(#2292?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 强制dispose * 强制dispose(版本号更新) --- repo/js/AEscoffier_chef/main.js | 65 +++- repo/js/AEscoffier_chef/manifest.json | 2 +- repo/js/AIPC珍贵宝箱无限刷/main.js | 70 +++- repo/js/AIPC珍贵宝箱无限刷/manifest.json | 2 +- repo/js/AbundantOre/main.js | 1 + repo/js/AbundantOre/manifest.json | 2 +- repo/js/ActivitySwitch/main.js | 1 + repo/js/ActivitySwitch/manifest.json | 2 +- repo/js/ArtifactsGroupPurchasing/main.js | 3 +- .../js/ArtifactsGroupPurchasing/manifest.json | 2 +- repo/js/AutoCode/main.js | 44 ++- repo/js/AutoCode/manifest.json | 2 +- .../js/AutoCommission/lib/commission-basic.js | 6 + repo/js/AutoCommission/lib/execute.js | 3 + .../js/AutoCommission/lib/steps/auto-fight.js | 2 + repo/js/AutoCommission/lib/steps/auto-skip.js | 6 +- .../AutoCommission/lib/steps/switch-role.js | 14 +- repo/js/AutoCommission/lib/ui.js | 2 + repo/js/AutoCommission/lib/utils.js | 3 + repo/js/AutoCommission/manifest.json | 2 +- repo/js/AutoFishingTeyvat/main.js | 8 +- repo/js/AutoFishingTeyvat/manifest.json | 2 +- .../main.js | 1 + .../manifest.json | 2 +- repo/js/AutoFriendship鸡腿/main.js | 1 + repo/js/AutoFriendship鸡腿/manifest.json | 2 +- repo/js/AutoLeyLineOutcrop/manifest.json | 2 +- .../utils/recognizeTextInRegion.js | 2 + repo/js/AutoPathingLoader-MultiUser/main.js | 57 +++- .../AutoPathingLoader-MultiUser/manifest.json | 2 +- repo/js/AutoPermission/main.js | 6 +- repo/js/AutoPermission/manifest.json | 2 +- repo/js/AutoRefinedCondensationResin/main.js | 9 +- .../manifest.json | 2 +- repo/js/AutoStoryLoader/main.js | 4 + repo/js/AutoStoryLoader/manifest.json | 2 +- repo/js/AutoSwitchRoles/main.js | 37 +- repo/js/AutoSwitchRoles/manifest.json | 2 +- repo/js/AutoTranscribePathing/main.js | 1 + repo/js/AutoTranscribePathing/manifest.json | 2 +- repo/js/AutoWoodcutting-Pathing/main.js | 4 +- repo/js/AutoWoodcutting-Pathing/manifest.json | 2 +- repo/js/CD-Aware-AutoGather/lib/lib.js | 5 +- repo/js/CD-Aware-AutoGather/manifest.json | 2 +- repo/js/CrystalflyTrap/main.js | 15 +- repo/js/CrystalflyTrap/manifest.json | 2 +- repo/js/DSTCG/main.js | 31 +- repo/js/DSTCG/manifest.json | 2 +- repo/js/DestroyArtifactsForMora/main.js | 24 +- repo/js/DestroyArtifactsForMora/manifest.json | 2 +- repo/js/EscofierKitchenContraption/main.js | 1 + .../EscofierKitchenContraption/manifest.json | 2 +- repo/js/FeatherFalling/main.js | 24 +- repo/js/FeatherFalling/manifest.json | 2 +- repo/js/FollowsPet/index.js | 3 + repo/js/FollowsPet/manifest.json | 2 +- repo/js/JoinFriendsWorld/index.js | 5 + repo/js/MiliastraExperienceAutomation/main.js | 12 +- .../manifest.json | 2 +- repo/js/OCRArtifacts/main.js | 4 +- repo/js/OCRArtifacts/manifest.json | 2 +- repo/js/OCR读取主界面队伍/main.js | 9 +- repo/js/OCR读取主界面队伍/manifest.json | 2 +- repo/js/OCR读取当前抽卡资源并发送通知/main.js | 322 +++++++++--------- .../manifest.json | 2 +- repo/js/OCR读取当前摩拉记录并发送通知/main.js | 12 +- .../manifest.json | 2 +- repo/js/ParametricTrans/main.js | 6 +- repo/js/ParametricTrans/manifest.json | 2 +- repo/js/PurchaseArtifacts/main.js | 13 +- repo/js/TCGQuickProficiency/lib/ocr.js | 26 +- repo/js/TCGQuickProficiency/main.js | 9 +- repo/js/TCGQuickProficiency/manifest.json | 2 +- repo/js/TeyvatScanner/main.js | 12 +- repo/js/TeyvatScanner/manifest.json | 2 +- repo/js/Tool_mint/main.js | 20 +- repo/js/Tool_mint/manifest.json | 2 +- repo/js/TravelersTales/main.js | 20 +- repo/js/TravelersTales/manifest.json | 2 +- repo/js/WeeklyBoss/manifest.json | 2 +- repo/js/WeeklyBoss/utils.js | 11 +- repo/js/YNF-AutoEat/main.js | 1 + repo/js/YNF-AutoEat/manifest.json | 2 +- .../main.js | 1 + .../manifest.json | 2 +- repo/js/七圣召唤七日历练全自动/main.js | 36 +- repo/js/七圣召唤七日历练全自动/manifest.json | 2 +- repo/js/七圣召唤角色邀约全自动/main.js | 9 +- repo/js/七圣召唤角色邀约全自动/manifest.json | 2 +- repo/js/全队自动回满大招能量/main.js | 9 +- repo/js/全队自动回满大招能量/manifest.json | 2 +- repo/js/切换画质/main.js | 8 +- repo/js/切换画质/manifest.json | 2 +- repo/js/切换账号(OCR)版本/main.js | 12 +- repo/js/切换账号(OCR)版本/manifest.json | 2 +- repo/js/切换账号Dropdown/main.js | 10 + repo/js/切换账号Dropdown/manifest.json | 2 +- repo/js/尘歌壶一条龙/main.js | 19 +- repo/js/尘歌壶一条龙/manifest.json | 2 +- repo/js/恢复默认键位设置/main.js | 18 +- repo/js/恢复默认键位设置/manifest.json | 2 +- .../js/批量讨伐角色养成材料BOSS/manifest.json | 2 +- repo/js/批量讨伐角色养成材料BOSS/reward.js | 16 +- repo/js/提瓦特百货商店/main.js | 5 +- repo/js/提瓦特百货商店/manifest.json | 2 +- repo/js/料理制作及食材加工/main.js | 3 + repo/js/料理制作及食材加工/manifest.json | 2 +- repo/js/模板匹配区域坐标输出/main.js | 16 +- repo/js/模板匹配区域坐标输出/manifest.json | 2 +- repo/js/每月自动兑换抽卡资源/main.js | 83 ++--- repo/js/每月自动兑换抽卡资源/manifest.json | 2 +- repo/js/烹饪熟练度一键拉满/main.js | 29 +- repo/js/烹饪熟练度一键拉满/manifest.json | 2 +- repo/js/纪行周常-15次秘境一条龙/main.js | 7 +- repo/js/纪行周常-15次秘境一条龙/manifest.json | 2 +- repo/js/自动购买每天&3天&每周刷新食材/main.js | 2 + .../manifest.json | 2 +- repo/js/自动领取成就奖励/main.js | 4 +- repo/js/自动领取成就奖励/manifest.json | 2 +- repo/js/角色养成一条龙/main.js | 97 +++--- repo/js/角色养成一条龙/manifest.json | 2 +- repo/js/食材加工(模拟点击)/main.js | 3 + repo/js/食材加工(模拟点击)/manifest.json | 2 +- repo/js/首领讨伐一条龙/main.js | 90 +++-- repo/js/首领讨伐一条龙/manifest.json | 2 +- 125 files changed, 996 insertions(+), 532 deletions(-) diff --git a/repo/js/AEscoffier_chef/main.js b/repo/js/AEscoffier_chef/main.js index 15b71123b..b696f87c2 100644 --- a/repo/js/AEscoffier_chef/main.js +++ b/repo/js/AEscoffier_chef/main.js @@ -148,7 +148,9 @@ moveMouseTo(1555, 860); // 移走鼠标,防止干扰OCR await sleep(200); - let ocrleftupper = captureGameRegion().Find(ocrleftupperRo); // 当前页面OCR + const ro1 = captureGameRegion(); + let ocrleftupper = ro1.Find(ocrleftupperRo); // 当前页面OCR + ro1.dispose(); return ocrleftupper.isExist() && ocrleftupper.text === "烹饪" ? true: false; } @@ -163,7 +165,9 @@ moveMouseTo(1555, 860); // 移走鼠标,防止干扰OCR await sleep(200); - let ocrleftupper = captureGameRegion().Find(ocrleftupperRo); // 当前页面OCR + const ro2 = captureGameRegion(); + let ocrleftupper = ro2.Find(ocrleftupperRo); // 当前页面OCR + ro2.dispose(); return ocrleftupper.isExist() && ocrleftupper.text === "料理制作" ? true: false; } @@ -178,7 +182,9 @@ moveMouseTo(1555, 860); // 移走鼠标,防止干扰OCR await sleep(200); - let ocrleftupper = captureGameRegion().Find(ocrleftupperRo); // 当前页面OCR + const ro3 = captureGameRegion(); + let ocrleftupper = ro3.Find(ocrleftupperRo); // 当前页面OCR + ro3.dispose(); return ocrleftupper.isExist() && ocrleftupper.text === "食材加工" ? true: false; } @@ -211,7 +217,9 @@ moveMouseTo(1555, 860); // 移走鼠标,防止干扰OCR await sleep(200); - let ocr = captureGameRegion().Find(ocrRo); // 当前页面OCR + const ro4 = captureGameRegion(); + let ocr = ro4.Find(ocrRo); // 当前页面OCR + ro4.dispose(); return ocr.isExist() && ocr.text === "自动烹饪" ? true: false; } @@ -281,7 +289,9 @@ moveMouseTo(1555, 860); // 移走鼠标,防止干扰OCR await sleep(200); - let ocr = captureGameRegion().Find(ocrRo); // 当前页面OCR + const ro6 = captureGameRegion(); + let ocr = ro6.Find(ocrRo); // 当前页面OCR + ro6.dispose(); if (ocr.isExist()) { log.info(`烹饪品质: ${ocr.text}`); if (ocr.text === "") { @@ -312,7 +322,9 @@ moveMouseTo(1555, 860); // 移走鼠标,防止干扰OCR await sleep(200); - let ocr = captureGameRegion().Find(ocrRo); // 当前页面OCR + const ro7 = captureGameRegion(); + let ocr = ro7.Find(ocrRo); // 当前页面OCR + ro7.dispose(); if (ocr.isExist()) { log.info(`当前熟练度: ${ocr.text}`); let ocr_nums = ocr.text.split("/").map(Number); @@ -339,7 +351,9 @@ moveMouseTo(1555, 860); // 移走鼠标,防止干扰OCR await sleep(200); - let ocr = captureGameRegion().Find(ocrRo); // 当前页面OCR + const ro8 = captureGameRegion(); + let ocr = ro8.Find(ocrRo); // 当前页面OCR + ro8.dispose(); if (ocr.isExist()) { return ocr.text; } else { @@ -361,7 +375,9 @@ moveMouseTo(1555, 860); // 移走鼠标,防止干扰OCR await sleep(200); - let ocr = captureGameRegion().FindMulti(ocrRo); // 当前页面OCR + const ro9 = captureGameRegion(); + let ocr = ro9.FindMulti(ocrRo); // 当前页面OCR + ro9.dispose(); if (ocr.count !== 0) { for (let i = 0; i < ocr.count; i++) { let food_name_deal = await Promise.all( @@ -394,7 +410,9 @@ moveMouseTo(1555, 860); // 移走鼠标,防止干扰OCR await sleep(200); - let ocr = captureGameRegion().FindMulti(ocrRo); // 当前页面OCR + const ro10 = captureGameRegion(); + let ocr = ro10.FindMulti(ocrRo); // 当前页面OCR + ro10.dispose(); if (ocr.count !== 0) { for (let i = 0; i < ocr.count; i++) { if (ocr[i].text === name) { @@ -427,8 +445,10 @@ for (let i = 0; i < pages; i++) { moveMouseTo(1555, 860); // 移走鼠标,防止干扰识别 await sleep(200); - let slide_bar_up = captureGameRegion().Find(slide_bar_upRo); // 当前页面模板匹配 - let slide_bar_down = captureGameRegion().Find(slide_bar_downRo); // 当前页面模板匹配 + const ro11 = captureGameRegion(); + let slide_bar_up = ro11.Find(slide_bar_upRo); // 当前页面模板匹配 + let slide_bar_down = ro11.Find(slide_bar_downRo); // 当前页面模板匹配 + ro11.dispose(); if (slide_bar_up.isExist() && slide_bar_down.isExist()) { log.info(`定位到滑块...(${slide_bar_up.x}, ${slide_bar_up.y})-滑动方向: ${direction}`); if (slide_bar_down.y > 920 && direction === "down") { @@ -470,7 +490,9 @@ for (let i = 0; i < pages; i++) { moveMouseTo(1555, 860); // 移走鼠标,防止干扰识别 await sleep(200); - let slide_bar = captureGameRegion().Find(slide_barRo); // 当前页面模板匹配 + const ro12 = captureGameRegion(); + let slide_bar = ro12.Find(slide_barRo); // 当前页面模板匹配 + ro12.dispose(); if (slide_bar.isExist()) { log.info(`定位到滑块...(${slide_bar.x}, ${slide_bar.y})-滑动方向: ${direction}`); if (slide_bar.y > 880 && direction === "down") { @@ -1179,6 +1201,7 @@ } else { result = region.find(templateRo1); } + region.dispose(); if (!result.isEmpty()) { const segmentTime = 66; @@ -1186,9 +1209,11 @@ log.info(`找到点位${i}号区域`); await sleep(waitTime); keyPress("VK_SPACE"); + gameRegion.dispose(); return 0; } } + gameRegion.dispose(); // log.info(`未找到点位区域,烹饪结束`); // keyPress("ESCAPE"); // await sleep(1000); @@ -1572,7 +1597,9 @@ moveMouseTo(1555, 860); // 移走鼠标,防止干扰OCR await sleep(200); - let ocr = captureGameRegion().FindMulti(ocrRo); // 当前页面OCR + const ro13 = captureGameRegion(); + let ocr = ro13.FindMulti(ocrRo); // 当前页面OCR + ro13.dispose(); await sleep(200); try { msg_dic["quality"] = await check_quality(); @@ -1631,7 +1658,9 @@ moveMouseTo(1555, 860); // 移走鼠标,防止干扰OCR await sleep(200); - let ocr = captureGameRegion().Find(ocrRo); // 当前页面OCR + const ro14 = captureGameRegion(); + let ocr = ro14.Find(ocrRo); // 当前页面OCR + ro14.dispose(); if (ocr.isExist()) { return ocr.text; } else { @@ -1650,7 +1679,9 @@ moveMouseTo(1555, 860); // 移走鼠标,防止干扰OCR await sleep(200); - let ocr = captureGameRegion().FindMulti(ocrRo); // 当前页面OCR + const ro15 = captureGameRegion(); + let ocr = ro15.FindMulti(ocrRo); // 当前页面OCR + ro15.dispose(); if (ocr.isExist()) { if (ocr.text.includes("2倍产出")) { return "2倍产出"; @@ -1677,7 +1708,9 @@ moveMouseTo(1555, 860); // 移走鼠标,防止干扰OCR await sleep(200); - let ocr = captureGameRegion().Find(ocrRo); // 当前页面OCR + const ro16 = captureGameRegion(); + let ocr = ro16.Find(ocrRo); // 当前页面OCR + ro16.dispose(); // 等待以防止时长提醒影响操作 const regex = new RegExp(/(?<=旅行者)[\s\S]*?(?=休息)/); if (regex.test(ocr)) { diff --git a/repo/js/AEscoffier_chef/manifest.json b/repo/js/AEscoffier_chef/manifest.json index bfec258b3..9b19d6d00 100644 --- a/repo/js/AEscoffier_chef/manifest.json +++ b/repo/js/AEscoffier_chef/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "一只爱可菲(厨娘版)", - "version": "1.3.2", + "version": "1.3.3", "bgi_version": "0.45.0", "description": "专精料理制作的爱可菲(自动烹饪及解锁、特殊料理)", "authors": [ diff --git a/repo/js/AIPC珍贵宝箱无限刷/main.js b/repo/js/AIPC珍贵宝箱无限刷/main.js index 447890f10..c2dd22a8d 100644 --- a/repo/js/AIPC珍贵宝箱无限刷/main.js +++ b/repo/js/AIPC珍贵宝箱无限刷/main.js @@ -121,7 +121,9 @@ const LocationButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync(" let keyStatus = false; for (let i = 0; i < 2; i++) { await TryOpenQuestMenu(0); - let StoryQuestsButton = captureGameRegion().find(StoryQuestsButtonRo); + const ro1 = captureGameRegion(); + let StoryQuestsButton = ro1.find(StoryQuestsButtonRo); + ro1.dispose(); if (StoryQuestsButton.isExist()) { log.info("检测到任务菜单已开启,按键正常"); await sleep(1000); @@ -130,7 +132,9 @@ const LocationButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync(" log.info("检测到任务菜单没有开启,推测快捷键不是默认值,尝试恢复"); await KeyBindlings(); // 恢复默认键位 await TryOpenQuestMenu(0); - let StoryQuestsButton = captureGameRegion().find(StoryQuestsButtonRo); + const ro2 = captureGameRegion(); + let StoryQuestsButton = ro2.find(StoryQuestsButtonRo); + ro2.dispose(); if (StoryQuestsButton.isExist()) { log.info("识别到传说任务按钮,按键正常"); await sleep(1000); @@ -158,7 +162,9 @@ const LocationButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync(" keyPress("ESCAPE"); await sleep(2000); - let SettingsButton = captureGameRegion().find(SettingsButtonRo); + const ro3 = captureGameRegion(); + let SettingsButton = ro3.find(SettingsButtonRo); + ro3.dispose(); if (SettingsButton.isExist()) { log.info("识别到设置按钮"); SettingsButton.click(); @@ -166,6 +172,7 @@ const LocationButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync(" let captureRegion = captureGameRegion(); let resList = captureRegion.findMulti(RecognitionObject.ocr(100, 100, 300, 300)); + captureRegion.dispose(); for (let i = 0; i < resList.count; i++) { let res = resList[i]; if (res.text.includes("Key") || res.text.includes("Bindings") || res.text.includes("按键") || res.text.includes("按鍵")) { @@ -173,13 +180,17 @@ const LocationButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync(" res.click(); await sleep(2000); - let RestoreButton = captureGameRegion().find(RestoreButtonRo); + const ro4 = captureGameRegion(); + let RestoreButton = ro4.find(RestoreButtonRo); + ro4.dispose(); if (RestoreButton.isExist()) { log.info("识别到恢复默认按钮"); RestoreButton.click(); await sleep(1500); - let ConfirmButton = captureGameRegion().find(ConfirmButtonRo); + const ro5 = captureGameRegion(); + let ConfirmButton = ro5.find(ConfirmButtonRo); + ro5.dispose(); if (ConfirmButton.isExist()) { log.info("识别到确认按钮"); ConfirmButton.click(); @@ -201,8 +212,10 @@ const LocationButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync(" let RadishNum = 0 let CabbageNum = 0 - let Materials = captureGameRegion().find(MaterialsRo); - let MaterialsSelected = captureGameRegion().find(MaterialsSelectedRo); + const ro6 = captureGameRegion(); + let Materials = ro6.find(MaterialsRo); + let MaterialsSelected = ro6.find(MaterialsSelectedRo); + ro6.dispose(); if (Materials.isExist()) { log.info("识别到材料按钮"); Materials.click(); @@ -214,10 +227,14 @@ const LocationButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync(" } for (let i = 0; i < 10; i++) { - let Radish = captureGameRegion().find(RadishRo); + const ro7 = captureGameRegion(); + let Radish = ro7.find(RadishRo); + ro7.dispose(); if (Radish.isExist()) { // log.info("识别到白萝卜,进行OCR获取数量"); - let resList = captureGameRegion().findMulti(RecognitionObject.ocr(Radish.x, Radish.y + Radish.width, Radish.Width, Radish.Height)); + const ro8 = captureGameRegion(); + let resList = ro8.findMulti(RecognitionObject.ocr(Radish.x, Radish.y + Radish.width, Radish.Width, Radish.Height)); + ro8.dispose(); for (let i = 0; i < resList.count; i++) { let Radish = resList[i]; log.info("白萝卜识别结果:({x},{y},{h},{w}), 数量:{text}", Radish.x, Radish.y, Radish.Width, Radish.Height, Radish.text); @@ -225,10 +242,14 @@ const LocationButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync(" break; } } - let Cabbage = captureGameRegion().find(CabbageRo); + const ro9 = captureGameRegion(); + let Cabbage = ro9.find(CabbageRo); + ro9.dispose(); if (Cabbage.isExist()) { // log.info("识别到卷心菜,进行OCR获取数量"); - let resList = captureGameRegion().findMulti(RecognitionObject.ocr(Cabbage.x, Cabbage.y + Cabbage.width, Cabbage.Width, Cabbage.Height)); + const ro10 = captureGameRegion(); + let resList = ro10.findMulti(RecognitionObject.ocr(Cabbage.x, Cabbage.y + Cabbage.width, Cabbage.Width, Cabbage.Height)); + ro10.dispose(); for (let i = 0; i < resList.count; i++) { let Cabbage = resList[i]; log.info("卷心菜识别结果:({x},{y},{h},{w}), 数量:{text}", Cabbage.x, Cabbage.y, Cabbage.Width, Cabbage.Height, Cabbage.text); @@ -237,7 +258,9 @@ const LocationButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync(" } break; } - let SliderBottom = captureGameRegion().find(SliderBottomRo); + const ro11 = captureGameRegion(); + let SliderBottom = ro11.find(SliderBottomRo); + ro11.dispose(); if (SliderBottom.isExist()) { log.info("识别到滑块,当前页面没有目标物品,向下滑动"); // log.info("滑块当前位置:({x},{y},{h},{w})", SliderBottom.x, SliderBottom.y, SliderBottom.Width, SliderBottom.Height); @@ -272,6 +295,7 @@ const LocationButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync(" for (let p = 0; p < 40; p++) { let captureRegion = captureGameRegion(); let MaxStatus = captureRegion.Find(MaxRo); + captureRegion.dispose(); if (MaxStatus.isEmpty()) { click(105, 787); // 调整缩放到最大 } else if (MaxStatus.isExist()) { @@ -283,7 +307,9 @@ const LocationButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync(" } if (times == 0) { - let LocationButton = captureGameRegion().find(LocationButtonRo); + const ro12 = captureGameRegion(); + let LocationButton = ro12.find(LocationButtonRo); + ro12.dispose(); if (LocationButton.isExist()) { log.info("识别到定位当前节点按钮"); LocationButton.click(); @@ -303,7 +329,9 @@ const LocationButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync(" await sleep(1500); if (times == 0) { - let InProgressButton = captureGameRegion().find(InProgressButtonRo); + const ro13 = captureGameRegion(); + let InProgressButton = ro13.find(InProgressButtonRo); + ro13.dispose(); if (InProgressButton.isExist()) { log.info("识别到进行中任务按钮"); InProgressButton.click(); @@ -311,21 +339,27 @@ const LocationButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync(" } } - let AbandonCurrentHangoutEventButton = captureGameRegion().find(AbandonCurrentHangoutEventButtonRo); + const ro14 = captureGameRegion(); + let AbandonCurrentHangoutEventButton = ro14.find(AbandonCurrentHangoutEventButtonRo); + ro14.dispose(); if (AbandonCurrentHangoutEventButton.isExist()) { log.info("识别到放弃按钮"); AbandonCurrentHangoutEventButton.click(); await sleep(1500); } - let ConfirmButton = captureGameRegion().find(ConfirmButtonRo); + const ro15 = captureGameRegion(); + let ConfirmButton = ro15.find(ConfirmButtonRo); + ro15.dispose(); if (ConfirmButton.isExist()) { log.info("识别到确认按钮"); ConfirmButton.click(); await sleep(1500); } - let StoryQuestsButton = captureGameRegion().find(StoryQuestsButtonRo); + const ro16 = captureGameRegion(); + let StoryQuestsButton = ro16.find(StoryQuestsButtonRo); + ro16.dispose(); if (StoryQuestsButton.isExist()) { log.info("识别到传说任务按钮"); StoryQuestsButton.click(); @@ -337,6 +371,7 @@ const LocationButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync(" let HangoutEventButtonSelected1 = captureRegion.find(HangoutEventButtonSelected1Ro); let HangoutEventButtonSelected2 = captureRegion.find(HangoutEventButtonSelected2Ro); let HangoutEventButtonSelected3 = captureRegion.find(HangoutEventButtonSelected3Ro); + captureRegion.dispose(); if (HangoutEventButtonSelected1.isExist()) { log.info("识别到邀约事件选项卡按钮"); HangoutEventButtonSelected1.click(); @@ -359,6 +394,7 @@ const LocationButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync(" for (let p = 0; p < 5; p++) { let captureRegion = captureGameRegion(); let resList = captureRegion.findMulti(RecognitionObject.ocr(960, 0, 650, 1080)); + captureRegion.dispose(); for (let i = 0; i < resList.count; i++) { let res = resList[i]; if (res.text.includes("Precious") || res.text.includes("Chest") || res.text.includes("箱") || res.text.includes("珍貴") || res.text.includes("珍贵")) { diff --git a/repo/js/AIPC珍贵宝箱无限刷/manifest.json b/repo/js/AIPC珍贵宝箱无限刷/manifest.json index f0cfa443f..13bc0138f 100644 --- a/repo/js/AIPC珍贵宝箱无限刷/manifest.json +++ b/repo/js/AIPC珍贵宝箱无限刷/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "AutoInfinitePreciousChest", - "version": "4.1", + "version": "4.2", "bgi_version": "0.44.0", "description": "AutoInfinitePreciousChest&&&默认按键检测&背包物品检测&拾取状态检测", "authors": [ diff --git a/repo/js/AbundantOre/main.js b/repo/js/AbundantOre/main.js index 7b68ef772..18d323ecb 100644 --- a/repo/js/AbundantOre/main.js +++ b/repo/js/AbundantOre/main.js @@ -298,6 +298,7 @@ async function get_inventory() { } } } + game_region.dispose(); if (inventory_result.crystal_chunks + inventory_result.condessence_crystals + inventory_result.amethyst_lumps + inventory_result.rainbowdrop_crystals === 0) { log.error("获取背包矿石数量失败"); } diff --git a/repo/js/AbundantOre/manifest.json b/repo/js/AbundantOre/manifest.json index 98a547f30..e720a8934 100644 --- a/repo/js/AbundantOre/manifest.json +++ b/repo/js/AbundantOre/manifest.json @@ -2,7 +2,7 @@ "bgi_version": "0.50.0", "manifest_version": 1, "name": "矿产资源批发", - "version": "0.18", + "version": "0.19", "description": "自动记录矿石刷新时间,优先选择效率最高的路线,支持按区域、种类、数量自动规划挖矿路线", "authors": [ { diff --git a/repo/js/ActivitySwitch/main.js b/repo/js/ActivitySwitch/main.js index d7d4cd405..f21d313fa 100644 --- a/repo/js/ActivitySwitch/main.js +++ b/repo/js/ActivitySwitch/main.js @@ -204,6 +204,7 @@ async function lookForClickActivity(ocrRegion, activityName) { const ocrObject = RecognitionObject.Ocr(ocrRegion.x, ocrRegion.y, ocrRegion.width, ocrRegion.height); // ocrObject.threshold = 1.0; let resList = captureRegion.findMulti(ocrObject); + captureRegion.dispose(); let firstRes = null let lastRes = null for (let res of resList) { diff --git a/repo/js/ActivitySwitch/manifest.json b/repo/js/ActivitySwitch/manifest.json index 8c5e00492..dfcfb26d1 100644 --- a/repo/js/ActivitySwitch/manifest.json +++ b/repo/js/ActivitySwitch/manifest.json @@ -1,6 +1,6 @@ { "name": "切换活动页面", - "version": "1.1.0", + "version": "1.1.1", "description": "(需要处于主界面)一个通过 F5 打开活动页面、(鼠标上滑/滚轮滑动)并根据活动名称选择活动的脚本", "settings_ui": "settings.json", "main": "main.js", diff --git a/repo/js/ArtifactsGroupPurchasing/main.js b/repo/js/ArtifactsGroupPurchasing/main.js index 3efbe6c3f..f68fade64 100644 --- a/repo/js/ArtifactsGroupPurchasing/main.js +++ b/repo/js/ArtifactsGroupPurchasing/main.js @@ -802,14 +802,13 @@ async function findAndClick(target, maxAttempts = 20) { const gameRegion = captureGameRegion(); try { const result = gameRegion.find(target); + gameRegion.dispose(); if (result.isExist()) { await sleep(250); result.click(); return true; // 成功立刻返回 } } catch (err) { - } finally { - gameRegion.dispose(); } if (attempts < maxAttempts - 1) { // 最后一次不再 sleep await sleep(250); diff --git a/repo/js/ArtifactsGroupPurchasing/manifest.json b/repo/js/ArtifactsGroupPurchasing/manifest.json index 5e81fc6be..7af94a4c9 100644 --- a/repo/js/ArtifactsGroupPurchasing/manifest.json +++ b/repo/js/ArtifactsGroupPurchasing/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "AAA狗粮联机团购", - "version": "1.5.15", + "version": "1.5.16", "tags": [ "狗粮" ], diff --git a/repo/js/AutoCode/main.js b/repo/js/AutoCode/main.js index bcf411f76..649f0dee7 100644 --- a/repo/js/AutoCode/main.js +++ b/repo/js/AutoCode/main.js @@ -76,17 +76,23 @@ async function openCodeUI() { await sleep(2000); const settingsRo = RecognitionObject.TemplateMatch(file.readImageMatSync("assets/settings.png")); - const settingsRes = captureGameRegion().find(settingsRo); + const ro1 = captureGameRegion(); + const settingsRes = ro1.find(settingsRo); + ro1.dispose(); if (settingsRes.isExist()) settingsRes.click(); await sleep(2000); const accountRo = RecognitionObject.TemplateMatch(file.readImageMatSync("assets/account.png")); - const accountRes = captureGameRegion().find(accountRo); + const ro2 = captureGameRegion(); + const accountRes = ro2.find(accountRo); + ro2.dispose(); if (accountRes.isExist()) accountRes.click(); await sleep(500); const goToRedeemRo = RecognitionObject.TemplateMatch(file.readImageMatSync("assets/go_to_redeem.png")); - const goToRedeemRes = captureGameRegion().find(goToRedeemRo); + const ro3 = captureGameRegion(); + const goToRedeemRes = ro3.find(goToRedeemRo); + ro3.dispose(); if (goToRedeemRes.isExist()) goToRedeemRes.click(); await sleep(500); } @@ -151,7 +157,9 @@ async function openCodeUI() { // 输入兑换码 const inputCodeRo = RecognitionObject.TemplateMatch(file.readImageMatSync("assets/input_code.png")); - const inputCodeRes = captureGameRegion().find(inputCodeRo); + const ro4 = captureGameRegion(); + const inputCodeRes = ro4.find(inputCodeRo); + ro4.dispose(); if (inputCodeRes.isExist()) inputCodeRes.click(); await sleep(300); @@ -160,15 +168,21 @@ async function openCodeUI() { // 点击兑换按钮 const redeemRo = RecognitionObject.TemplateMatch(file.readImageMatSync("assets/redeem.png")); - const redeemRes = captureGameRegion().find(redeemRo); + const ro5 = captureGameRegion(); + const redeemRes = ro5.find(redeemRo); + ro5.dispose(); if (redeemRes.isExist()) redeemRes.click(); await sleep(1500); // 检测各种状态 - const invalidRes = captureGameRegion().find(RecognitionObject.TemplateMatch(file.readImageMatSync("assets/invalid.png"))); + const ro6 = captureGameRegion(); + const invalidRes = ro6.find(RecognitionObject.TemplateMatch(file.readImageMatSync("assets/invalid.png"))); + ro6.dispose(); if (invalidRes.isExist()) log.info(`兑换码【${code}】无效`); - const usedRes = captureGameRegion().find(RecognitionObject.TemplateMatch(file.readImageMatSync("assets/used.png"))); + const ro7 = captureGameRegion(); + const usedRes = ro7.find(RecognitionObject.TemplateMatch(file.readImageMatSync("assets/used.png"))); + ro7.dispose(); if (usedRes.isExist()) { // 写入记录 const writeOk = file.writeTextSync(recordPath, code + "\n", true); @@ -178,7 +192,9 @@ async function openCodeUI() { } } - const expiredRes = captureGameRegion().find(RecognitionObject.TemplateMatch(file.readImageMatSync("assets/expired.png"))); + const ro8 = captureGameRegion(); + const expiredRes = ro8.find(RecognitionObject.TemplateMatch(file.readImageMatSync("assets/expired.png"))); + ro8.dispose(); if (expiredRes.isExist()) { // 写入记录 const writeOk = file.writeTextSync(recordPath, code + "\n", true); @@ -188,10 +204,14 @@ async function openCodeUI() { } } - const notopenRes = captureGameRegion().find(RecognitionObject.TemplateMatch(file.readImageMatSync("assets/not_open.png"))); + const ro9 = captureGameRegion(); + const notopenRes = ro9.find(RecognitionObject.TemplateMatch(file.readImageMatSync("assets/not_open.png"))); + ro9.dispose(); if (notopenRes.isExist()) log.info(`兑换码【${code}】未开启`); - const confirmRes = captureGameRegion().find(RecognitionObject.TemplateMatch(file.readImageMatSync("assets/confirm.png"))); + const ro10 = captureGameRegion(); + const confirmRes = ro10.find(RecognitionObject.TemplateMatch(file.readImageMatSync("assets/confirm.png"))); + ro10.dispose(); if (confirmRes.isExist()) { log.info(`兑换码【${code}】成功兑换`); confirmRes.click(); @@ -205,7 +225,9 @@ async function openCodeUI() { } // 清除输入 - const clearRes = captureGameRegion().find(RecognitionObject.TemplateMatch(file.readImageMatSync("assets/clear.png"))); + const ro11 = captureGameRegion(); + const clearRes = ro11.find(RecognitionObject.TemplateMatch(file.readImageMatSync("assets/clear.png"))); + ro11.dispose(); if (clearRes.isExist()) clearRes.click(); await sleep(4000); diff --git a/repo/js/AutoCode/manifest.json b/repo/js/AutoCode/manifest.json index 76bf30977..9711f4c58 100644 --- a/repo/js/AutoCode/manifest.json +++ b/repo/js/AutoCode/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "自动使用兑换码", - "version": "6.0.5", + "version": "6.0.6", "bgi_version": "0.45.0", "description": "仅支持国服", "authors": [ diff --git a/repo/js/AutoCommission/lib/commission-basic.js b/repo/js/AutoCommission/lib/commission-basic.js index ceaf67582..cde6caacb 100644 --- a/repo/js/AutoCommission/lib/commission-basic.js +++ b/repo/js/AutoCommission/lib/commission-basic.js @@ -149,14 +149,20 @@ var CommissionBasic = { // 检测完成状态 var completedResult = checkRegion.find(completedRo); if (!completedResult.isEmpty()) { + captureRegion.dispose(); + checkRegion.dispose(); return "completed"; } // 检测未完成状态 var uncompletedResult = checkRegion.find(uncompletedRo); if (!uncompletedResult.isEmpty()) { + captureRegion.dispose(); + checkRegion.dispose(); return "uncompleted"; } + captureRegion.dispose(); + checkRegion.dispose(); log.warn("委托{id}状态识别失败", button.id); return "unknown"; diff --git a/repo/js/AutoCommission/lib/execute.js b/repo/js/AutoCommission/lib/execute.js index d9ebf627c..89f0e008f 100644 --- a/repo/js/AutoCommission/lib/execute.js +++ b/repo/js/AutoCommission/lib/execute.js @@ -267,6 +267,8 @@ var Execute = { var captureRegion = captureGameRegion(); var rewardTextArea = captureRegion.DeriveCrop(1210, 515, 200, 50); var rewardResult = rewardTextArea.find(RecognitionObject.ocrThis); + captureRegion.dispose(); + rewardTextArea.dispose(); log.debug("检测到文字: " + rewardResult.text); // 检测到特点文字则结束!!! if (rewardResult.text == textArray) { @@ -282,6 +284,7 @@ var Execute = { for (var i = 0; i < 100; i++) { captureRegion = captureGameRegion(); var iconRes = captureRegion.Find(boxIconRo); + captureRegion.dispose(); log.info("检测到委托图标位置 ({x}, {y})", iconRes.x, iconRes.y); if (iconRes.x >= 920 && iconRes.x <= 980 && iconRes.y <= 540) { advanceNum++; diff --git a/repo/js/AutoCommission/lib/steps/auto-fight.js b/repo/js/AutoCommission/lib/steps/auto-fight.js index 1faec317c..21bbf2ac7 100644 --- a/repo/js/AutoCommission/lib/steps/auto-fight.js +++ b/repo/js/AutoCommission/lib/steps/auto-fight.js @@ -30,11 +30,13 @@ // 查找模板 if (cap.find(teamRO)) { log.info("识别到战斗结束"); + cap.dispose(); // 取消 打开队伍 keyPress("l"); return true; } + cap.dispose(); log.info("未识别到战斗结束"); await sleep(intervals); } diff --git a/repo/js/AutoCommission/lib/steps/auto-skip.js b/repo/js/AutoCommission/lib/steps/auto-skip.js index b8406c2fb..bdaf55524 100644 --- a/repo/js/AutoCommission/lib/steps/auto-skip.js +++ b/repo/js/AutoCommission/lib/steps/auto-skip.js @@ -22,7 +22,9 @@ var executeAutoSkipLogic = async function (stepData, stepName) { var recognizeImage = async function (recognitionObject) { try { // 尝试识别图像 - var imageResult = captureGameRegion().find(recognitionObject); + let captureRegion = captureGameRegion(); + var imageResult = captureRegion.find(recognitionObject); + captureRegion.dispose(); if ( imageResult && imageResult.x !== 0 && @@ -183,6 +185,8 @@ var executeAutoSkipLogic = async function (stepData, stepName) { dialogArea.height ); var ocrResults = dialogArea.FindMulti(ocrRo); + captureRegion.dispose(); + dialogArea.dispose(); if (ocrResults && ocrResults.count > 0) { var foundValidOption = false; diff --git a/repo/js/AutoCommission/lib/steps/switch-role.js b/repo/js/AutoCommission/lib/steps/switch-role.js index 0f6375717..4211a06f7 100644 --- a/repo/js/AutoCommission/lib/steps/switch-role.js +++ b/repo/js/AutoCommission/lib/steps/switch-role.js @@ -64,7 +64,9 @@ while (openPairingTries < 3) { keyPress("l"); await sleep(3500); - var teamConfigResult = captureGameRegion().find(roTeamConfig); + const ro1 = captureGameRegion(); + var teamConfigResult = ro1.find(roTeamConfig); + ro1.dispose(); if (teamConfigResult.isExist()) { openPairingTries = 0; return true; @@ -106,7 +108,9 @@ file.ReadImageMatSync("Data/characterimage/" + characterFileName + ".png"), 0, 0, 1920, 1080 ); - var characterResult = captureGameRegion().find(characterRo); + const ro2 = captureGameRegion(); + var characterResult = ro2.find(characterRo); + ro2.dispose(); if (characterResult.isExist()) { log.info("已找到角色{character}", actualName); // 计算向右偏移35像素、向下偏移35像素的位置 @@ -146,8 +150,10 @@ } // 识别"更换"或"加入"按钮 - var replaceResult = captureGameRegion().find(roReplace); - var joinResult = captureGameRegion().find(roJoin); + const ro3 = captureGameRegion(); + var replaceResult = ro3.find(roReplace); + var joinResult = ro3.find(roJoin); + ro3.dispose(); if (replaceResult.isExist() || joinResult.isExist()) { await sleep(300); diff --git a/repo/js/AutoCommission/lib/ui.js b/repo/js/AutoCommission/lib/ui.js index 6cfacd8f0..74660aff0 100644 --- a/repo/js/AutoCommission/lib/ui.js +++ b/repo/js/AutoCommission/lib/ui.js @@ -103,6 +103,7 @@ var UI = { var captureRegion = captureGameRegion(); var res = captureRegion.Find(paimonMenuRo); + captureRegion.dispose(); return !res.isEmpty(); }, @@ -117,6 +118,7 @@ var UI = { var captureRegion = captureGameRegion(); var res = captureRegion.Find(paimonMenuRo); + captureRegion.dispose(); return !res.isEmpty(); }, diff --git a/repo/js/AutoCommission/lib/utils.js b/repo/js/AutoCommission/lib/utils.js index c0fe39e1d..640f901c1 100644 --- a/repo/js/AutoCommission/lib/utils.js +++ b/repo/js/AutoCommission/lib/utils.js @@ -44,6 +44,7 @@ var Utils = { // 捕获并识别 var region = captureGameRegion(); region.Find(ro); + region.dispose(); // 2000毫秒后移除绘制的边框 setTimeout(function () { @@ -122,6 +123,7 @@ var Utils = { // 截图识别 var captureRegion = captureGameRegion(); var results = await captureRegion.findMulti(TemplateMatchRo); + captureRegion.dispose(); return results; } catch (error) { @@ -185,6 +187,7 @@ var Utils = { // 截图识别 var captureRegion = captureGameRegion(); var OCRresults = await captureRegion.findMulti(locationOcrRo); + captureRegion.dispose(); return OCRresults; } catch (error) { diff --git a/repo/js/AutoCommission/manifest.json b/repo/js/AutoCommission/manifest.json index 1fc9d9e9f..64da083eb 100644 --- a/repo/js/AutoCommission/manifest.json +++ b/repo/js/AutoCommission/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "(对话+成就)全自动蒙德地区每日委托", - "version": "0.98.10", + "version": "0.98.11", "tags": ["委托","对话","战斗","成就","历练点"], "description": "自动完成每日委托、自动识别委托内容、自动追踪战斗委托、自动完成对话委托、自动获得到隐藏成就。使用前请阅读README.md获取详细说明和常见问题解答。目前项目急需人手,有意者可加群。感谢云闲vsv & 换苏伟u & 小鹰划船不用桨 & 塔台 & 未知_ 的共同开发", "authors": [ diff --git a/repo/js/AutoFishingTeyvat/main.js b/repo/js/AutoFishingTeyvat/main.js index c1e054a4f..cac8c1d54 100644 --- a/repo/js/AutoFishingTeyvat/main.js +++ b/repo/js/AutoFishingTeyvat/main.js @@ -667,20 +667,24 @@ keyPress("Escape"); await sleep(1000); - let ocrUid = captureGameRegion().Find(ocrRoUid); // 当前页面OCR + let ro1 = captureGameRegion(); + let ocrUid = ro1.Find(ocrRoUid); // 当前页面OCR if (ocrUid.isExist()) { uid = ocrUid.text; } + ro1.dispose(); await genshin.returnMainUi(); keyPress("F2"); // 按下F2打开多人模式界面 await sleep(1000); - let ocrText = captureGameRegion().Find(ocrRoText); // 当前页面OCR + let ro2 = captureGameRegion(); + let ocrText = ro2.Find(ocrRoText); // 当前页面OCR if (ocrText.isExist() && ocrText.text === "回到单人模式") { log.info("当前为多人模式,垂钓点CD统计已失效..."); fishing_cd = false; // 多人模式下关闭CD记录功能 } + ro2.dispose(); await sleep(500); keyPress("Escape"); diff --git a/repo/js/AutoFishingTeyvat/manifest.json b/repo/js/AutoFishingTeyvat/manifest.json index 90d3aa759..a3ee85f3e 100644 --- a/repo/js/AutoFishingTeyvat/manifest.json +++ b/repo/js/AutoFishingTeyvat/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "提瓦特自动钓鱼(全流程+自选)", - "version": "2.3.1", + "version": "2.3.2", "bgi_version": "0.47.0", "description": "支持自动追踪并垂钓bgi支持的全提瓦特垂钓点", "authors": [ diff --git a/repo/js/AutoFriendshipEvilBaresItsFangsGetRawMeat/main.js b/repo/js/AutoFriendshipEvilBaresItsFangsGetRawMeat/main.js index 548006987..64cd90c16 100644 --- a/repo/js/AutoFriendshipEvilBaresItsFangsGetRawMeat/main.js +++ b/repo/js/AutoFriendshipEvilBaresItsFangsGetRawMeat/main.js @@ -171,6 +171,7 @@ while (Date.now() - ocrStartTime < ocrTimeout && !ocrStatus) { let captureRegion = captureGameRegion(); let resList = captureRegion.findMulti(RecognitionObject.ocr(0, 200, 300, 300)); + captureRegion.dispose(); for (let o = 0; o < resList.count; o++) { let res = resList[o]; if (res.text.includes("张牙") || res.text.includes("舞爪") || res.text.includes("恶党") || res.text.includes("打倒") || res.text.includes("所有") || res.text.includes("鳄鱼")) { diff --git a/repo/js/AutoFriendshipEvilBaresItsFangsGetRawMeat/manifest.json b/repo/js/AutoFriendshipEvilBaresItsFangsGetRawMeat/manifest.json index c67199ea8..68b4cad7f 100644 --- a/repo/js/AutoFriendshipEvilBaresItsFangsGetRawMeat/manifest.json +++ b/repo/js/AutoFriendshipEvilBaresItsFangsGetRawMeat/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "兽肉好感:自动好感度&刷两只鳄鱼兽肉&卡时间", - "version": "1.4.1", + "version": "1.4.2", "bgi_version": "0.44.6", "tags": ["好感", "兽肉", "突发事件"], "description": "通过突发事件:张牙舞爪的恶党刷兽肉,并顺带获取好感度(好感度超过10次后不再获取),请使用满员好感度队伍,并为全体队伍角色配置相应的战斗策略", diff --git a/repo/js/AutoFriendship鸡腿/main.js b/repo/js/AutoFriendship鸡腿/main.js index 0fefa5da5..e9441ce6a 100644 --- a/repo/js/AutoFriendship鸡腿/main.js +++ b/repo/js/AutoFriendship鸡腿/main.js @@ -40,6 +40,7 @@ async function OcrF() { let capture = await captureGameRegion(); let ocr = await capture.find(RecognitionObject.ocrThis); + capture.dispose(); if(ocr.text.includes('投喂')){ return true; } diff --git a/repo/js/AutoFriendship鸡腿/manifest.json b/repo/js/AutoFriendship鸡腿/manifest.json index e357a0f6d..3996b1850 100644 --- a/repo/js/AutoFriendship鸡腿/manifest.json +++ b/repo/js/AutoFriendship鸡腿/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "鸡腿好感", - "version": "1.2", + "version": "1.3", "tags": [ "好感", "突发事件" diff --git a/repo/js/AutoLeyLineOutcrop/manifest.json b/repo/js/AutoLeyLineOutcrop/manifest.json index 357d808b4..51af1093f 100644 --- a/repo/js/AutoLeyLineOutcrop/manifest.json +++ b/repo/js/AutoLeyLineOutcrop/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "全自动地脉花", - "version": "4.4.1", + "version": "4.4.2", "tags": ["地脉花"], "bgi_version": "0.44.7", "description": "基于OCR图像识别的全自动刷取地脉花。\n💡更多信息请查看在线手册:https://hcnsvf0s8d0s.feishu.cn/wiki/Tb1twpThLi7UlykqcYOcuccTnjJ \n\n----------注意事项----------\n●仅支持BetterGI 0.44.7 及以上版本!\n●部分地脉花因特殊原因不支持全自动,具体的点位请在手册中查看。\n●树脂使用的优先级:2倍原粹树脂 > 浓缩树脂 > 原粹树脂。\n●运行时会传送到七天神像设置中设置的七天神像,需要关闭七天神像设置中的“是否就近七天神像恢复血量”,并指定七天神像。\n●战斗策略注意调度器设置中地图追踪行走配置里的“允许在JsSpript中使用”和“覆盖JS中的自动战斗配置”,只有在都打开的情况下脚本才会使用下面的战斗配置,否则会使用独立任务中的战斗策略。战斗超时时间不能大于脚本自定义配置中的时间。\n\n如果遇到问题,请先参照手册中的方法进行解决。", diff --git a/repo/js/AutoLeyLineOutcrop/utils/recognizeTextInRegion.js b/repo/js/AutoLeyLineOutcrop/utils/recognizeTextInRegion.js index 32bb57c04..12a26e217 100644 --- a/repo/js/AutoLeyLineOutcrop/utils/recognizeTextInRegion.js +++ b/repo/js/AutoLeyLineOutcrop/utils/recognizeTextInRegion.js @@ -25,6 +25,7 @@ async function (timeout) { for (let keyword of successKeywords) { if (text.includes(keyword)) { log.debug("检测到战斗成功关键词: {0}", keyword); + captureRegion.dispose(); resolve(true); return; } @@ -34,6 +35,7 @@ async function (timeout) { for (let keyword of failureKeywords) { if (text.includes(keyword)) { log.debug("检测到战斗失败关键词: {0}", keyword); + captureRegion.dispose(); resolve(false); return; } diff --git a/repo/js/AutoPathingLoader-MultiUser/main.js b/repo/js/AutoPathingLoader-MultiUser/main.js index a47de500c..2b120442d 100644 --- a/repo/js/AutoPathingLoader-MultiUser/main.js +++ b/repo/js/AutoPathingLoader-MultiUser/main.js @@ -108,7 +108,9 @@ const ocrRo = RecognitionObject.Ocr(0, 0, 257, 173); moveMouseTo(1555, 860); // 移走鼠标,防止干扰OCR await sleep(300); - let ocr = captureGameRegion().Find(ocrRo); // 当前页面OCR + let ro = captureGameRegion(); + let ocr = ro.Find(ocrRo); // 当前页面OCR + ro.dispose(); for (let i = 0; i < 3; i++) { if (ocr.isExist() && ocr.text === "当前队伍") { ocr.Click(); // 点击 当前队伍 @@ -393,7 +395,9 @@ while (true) { // 注意死循环 moveMouseTo(1555, 860); // 移走鼠标,防止干扰OCR await sleep(200); - let ocrList = captureGameRegion().FindMulti(ocrMsgRo); // 当前页面OCR + const ro = captureGameRegion(); + let ocrList = ro.FindMulti(ocrMsgRo); // 当前页面OCR + ro.dispose(); if (mode === "领队") { if (Object.keys(verifyDic).length != playerNum) { for (let j = 1; j < playerNum + 1; j++) { @@ -500,6 +504,7 @@ let p2 = gameRegion.Find(p2Ro); let p3 = gameRegion.Find(p3Ro); let p4 = gameRegion.Find(p4Ro); + gameRegion.dispose(); if (p1.isExist()) return "1P"; if (p2.isExist()) return "2P"; if (p3.isExist()) return "3P"; @@ -545,10 +550,17 @@ async function dealPlayerRequest(playerList, timeOut=30000, mode="exact") { const ocrTitleRo = RecognitionObject.Ocr(874, 236, 171, 33); const ocrTextRo = RecognitionObject.Ocr(507, 285, 907, 484); - let ocrTitle = captureGameRegion().Find(ocrTitleRo); - let ocrText = captureGameRegion().FindMulti(ocrTextRo); + let ro1 = captureGameRegion(); + let ocrTitle = ro1.Find(ocrTitleRo); + let ro2 = captureGameRegion(); + let ocrText = ro2.FindMulti(ocrTextRo); + ro1.dispose(); + ro2.dispose(); let count = 0; await sleep(1000); + let ro3 = captureGameRegion(); + ocrTitle = ro3.Find(ocrTitleRo); + ro3.dispose(); if (!(ocrTitle.isExist() && ocrTitle.text === "多人游戏申请")) { log.error(`未处于 多人游戏申请 界面...`); return false; @@ -589,7 +601,9 @@ }; } await sleep(100); - ocrText = captureGameRegion().FindMulti(ocrTextRo); + const ro4 = captureGameRegion(); + ocrText = ro4.FindMulti(ocrTextRo); + ro4.dispose(); } return false; } @@ -611,8 +625,12 @@ moveMouseTo(1555, 860); // 移走鼠标,防止干扰识别 for (let i = 0; i < 3; i++) { await sleep(200); - let ocrMulti = captureGameRegion().Find(ocrMultiRo); - if (ocrMulti.isExist() && ocrMulti.text === "多人游戏") break; + const ro5 = captureGameRegion(); + let ocrMulti = ro5.Find(ocrMultiRo); + ro5.dispose(); + if (ocrMulti.isExist() && ocrMulti.text === "多人游戏") { + break; + } } click(260, 115); // 点击搜索框 await sleep(100); @@ -622,11 +640,15 @@ log.info(`尝试加入房主(${playerUid})世界[${i + 1}/10]`); click(1681, 115); // 搜索 await sleep(200); - let ocrJoin = captureGameRegion().Find(ocrJoinRo); + const ro6 = captureGameRegion(); + let ocrJoin = ro6.Find(ocrJoinRo); + ro6.dispose(); if (ocrJoin.isExist() && ocrJoin.text === "申请加入") { ocrJoin.Click(); await sleep(10000); - ocrJoin = captureGameRegion().Find(ocrJoinRo); + const ro7 = captureGameRegion(); + ocrJoin = ro7.Find(ocrJoinRo); + ro7.dispose(); if (!(ocrJoin.isExist() && ocrJoin.text === "申请加入")) return true; } await sleep(8000); @@ -676,7 +698,9 @@ const ocrRo = RecognitionObject.Ocr(0, 0, 257, 173); moveMouseTo(1555, 860); // 移走鼠标,防止干扰OCR await sleep(200); - let ocr = captureGameRegion().Find(ocrRo); // 当前页面OCR + const ro8 = captureGameRegion(); + let ocr = ro8.Find(ocrRo); // 当前页面OCR + ro8.dispose(); if (ocr.isExist() && ocr.text === "当前队伍") { // 多此一举 ocr.Click(); // 点击 当前队伍 } @@ -689,7 +713,9 @@ const player_num = parseInt(settingDic["player_all"], 10); let judge_dic = {}; while (wait_flag) { // 循环等待 - let ocr = captureGameRegion().FindMulti(ocrMsgRo); // 当前页面OCR + const ro9 = captureGameRegion(); + let ocr = ro9.FindMulti(ocrMsgRo); // 当前页面OCR + ro9.dispose(); for (let k = 1; k < player_num + 1; k++) { // 遍历总玩家数 const player_key = `${player_num.toString()}P`; if (Object.keys(judge_dic).length < k) { // 将玩家加入判断字典 @@ -706,7 +732,6 @@ } else { log.info(`${player_key} 已就位...`); } - } if (Object.values(judge_dic).every(value => value === true)) wait_flag = false; // 全部就位 } @@ -917,7 +942,9 @@ const ocrRo = RecognitionObject.Ocr(0, 0, 257, 173); moveMouseTo(1555, 860); // 移走鼠标,防止干扰OCR await sleep(200); - let ocr = captureGameRegion().Find(ocrRo); // 当前页面OCR + const ro12 = captureGameRegion(); + let ocr = ro12.Find(ocrRo); // 当前页面OCR + ro12.dispose(); if (ocr.isExist() && ocr.text === "当前队伍") { // 多此一举 ocr.Click(); // 点击 当前队伍 } @@ -927,7 +954,9 @@ moveMouseTo(1555, 860); // 移走鼠标,防止干扰OCR await sleep(200); while (true) { // 循环等待 - let ocr = captureGameRegion().FindMulti(ocrMsgRo); // 当前页面OCR + const ro13 = captureGameRegion(); + let ocr = ro13.FindMulti(ocrMsgRo); // 当前页面OCR + ro13.dispose(); for (let l = 0; l < ocr.count; l++) { // 遍历OCR数组 if (ocr[l].text.includes("全部路线结束")) { // 检测队长的消息 log.info(`检测到队长发送的脚本结束信息`); diff --git a/repo/js/AutoPathingLoader-MultiUser/manifest.json b/repo/js/AutoPathingLoader-MultiUser/manifest.json index 26ea6a923..def4126c6 100644 --- a/repo/js/AutoPathingLoader-MultiUser/manifest.json +++ b/repo/js/AutoPathingLoader-MultiUser/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "BGI-地图追踪加载器(联机版)", - "version": "1.0.1", + "version": "1.0.2", "bgi_version": "0.45.0", "description": "基于聊天框实现的同步联机锄地", "authors": [ diff --git a/repo/js/AutoPermission/main.js b/repo/js/AutoPermission/main.js index 6d07c9d01..9297f947b 100644 --- a/repo/js/AutoPermission/main.js +++ b/repo/js/AutoPermission/main.js @@ -38,6 +38,7 @@ let OCRcaptureRegion = captureGameRegion(); let resList = OCRcaptureRegion.findMulti(RecognitionObject.ocrThis); + OCRcaptureRegion.dispose(); for (let i = 0; i < resList.count; i++) { let res = resList[i]; @@ -54,9 +55,10 @@ } tag = 0; for (let i = 0; i < 5 && tag === 0; i++) { - OCRcaptureRegion = captureGameRegion(); + let OCRcaptureRegion = captureGameRegion(); - resList = OCRcaptureRegion.findMulti(RecognitionObject.ocrThis); + let resList = OCRcaptureRegion.findMulti(RecognitionObject.ocrThis); + OCRcaptureRegion.dispose(); for (let i = 0; i < resList.count; i++) { let res = resList[i]; diff --git a/repo/js/AutoPermission/manifest.json b/repo/js/AutoPermission/manifest.json index a0422b838..c6156ea63 100644 --- a/repo/js/AutoPermission/manifest.json +++ b/repo/js/AutoPermission/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "自动设置权限", - "version": "2.0", + "version": "2.1", "description": "设置进入世界的权限,默认锁门", "authors": [ { diff --git a/repo/js/AutoRefinedCondensationResin/main.js b/repo/js/AutoRefinedCondensationResin/main.js index 562c7f65a..0f0f4c900 100644 --- a/repo/js/AutoRefinedCondensationResin/main.js +++ b/repo/js/AutoRefinedCondensationResin/main.js @@ -31,6 +31,7 @@ async function condensedResin() { while (!Alchemy && retryCount <= maxRetries) { // 对整个区域进行 OCR let resList = captureRegion.findMulti(RecognitionObject.ocrThis); + captureRegion.dispose(); for (let i = 0; i < resList.count; i++) { if (resList[i].text.includes("合成")) { // 找到合成台,点击合成台 @@ -45,12 +46,16 @@ async function condensedResin() { await sleep(1000); // 图像识别浓缩树脂 - let Resin = captureGameRegion().find(CondensedResin); + const ro1 = captureGameRegion(); + let Resin = ro1.find(CondensedResin); + ro1.dispose(); if (Resin.isExist()) { Resin.click(); log.info("找到浓缩树脂,开始合成体力"); await sleep(750); - let confirm = captureGameRegion().find(confirmRo); + const ro2 = captureGameRegion(); + let confirm = ro2.find(confirmRo); + ro2.dispose(); if (confirm.isExist()) { confirm.click(); // 点击合成 await sleep(5000); diff --git a/repo/js/AutoRefinedCondensationResin/manifest.json b/repo/js/AutoRefinedCondensationResin/manifest.json index aa99046b7..a2b145149 100644 --- a/repo/js/AutoRefinedCondensationResin/manifest.json +++ b/repo/js/AutoRefinedCondensationResin/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "自动合成浓缩树脂", - "version": "1.0", + "version": "1.1", "bgi_version": "0.47.0", "description": "\n可前往多国合成台自动合成浓缩树脂(仅支持中文语言)。\n通过OCR技术确保准确进入合成台并完成合成操作。\n可设置特定星期执行任务(例:输入\"1,3,5,7\"在周一/三/五/日执行)。\n特殊时间处理:00:00~04:00视为前一天。", "tags": [ diff --git a/repo/js/AutoStoryLoader/main.js b/repo/js/AutoStoryLoader/main.js index 6b3c50f73..e20e70ba7 100644 --- a/repo/js/AutoStoryLoader/main.js +++ b/repo/js/AutoStoryLoader/main.js @@ -21,6 +21,7 @@ const paimonMenuRo = RecognitionObject.TemplateMatch( const isInMainUI = () => { let captureRegion = captureGameRegion(); let res = captureRegion.Find(paimonMenuRo); + captureRegion.dispose(); return !res.isEmpty(); }; @@ -85,6 +86,7 @@ const isInMainUI = () => { // 捕获并识别 const region = captureGameRegion(); region.Find(ro); + region.dispose(); // 2000毫秒后移除绘制的边框 setTimeout(() => { @@ -109,6 +111,7 @@ const isInMainUI = () => { // 截图识别 let captureRegion = captureGameRegion(); let OCRresults = await captureRegion.findMulti(locationOcrRo); + captureRegion.dispose(); return OCRresults; } catch (error) { @@ -543,6 +546,7 @@ const isInMainUI = () => { return () => { let captureRegion = captureGameRegion(); let res = captureRegion.Find(paimonMenuRo); + captureRegion.dispose(); return !res.isEmpty(); }; }, diff --git a/repo/js/AutoStoryLoader/manifest.json b/repo/js/AutoStoryLoader/manifest.json index 3b27e25cb..c9bfefdf6 100644 --- a/repo/js/AutoStoryLoader/manifest.json +++ b/repo/js/AutoStoryLoader/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "自动剧情加载器", - "version": "1.4", + "version": "1.5", "tags": ["剧情","任务"], "description": "剧情自动加载器一键挂机过剧情:自动寻路、对话、战斗(需任务脚本支持),脚本拖进调度器就能跑,仅提供技术框架,完全体须搭配需任务脚本使用,详情见说明文档", "authors": [ diff --git a/repo/js/AutoSwitchRoles/main.js b/repo/js/AutoSwitchRoles/main.js index 373a9f89b..4bf2bcdff 100644 --- a/repo/js/AutoSwitchRoles/main.js +++ b/repo/js/AutoSwitchRoles/main.js @@ -97,7 +97,9 @@ function readAliases() { while (openPairingTries < 3) { keyPress("l"); await sleep(3200); - const teamConfigResult = captureGameRegion().find(roTeamConfig); + const ro = captureGameRegion(); + const teamConfigResult = ro.find(roTeamConfig); + ro.dispose(); if (teamConfigResult.isExist()) { openPairingTries = 0; return true; @@ -167,18 +169,22 @@ function readAliases() { log.info(`对角色【${selectedCharacter}】执行筛选: 元素=${filterInfo.element || '空'}, 武器=${filterInfo.weapon || '空'}`); // 点击筛选按钮 - const filterBtn = captureGameRegion().find(RecognitionObject.TemplateMatch( + const ro1 = captureGameRegion(); + const filterBtn = ro1.find(RecognitionObject.TemplateMatch( file.readImageMatSync('Assets/RecognitionObject/筛选.png'), 0, 0, 1920, 1080 )); + ro1.dispose(); if (filterBtn.isExist()) { filterBtn.click(); await sleep(200); // 元素不为空才执行元素筛选 if (filterInfo.element) { - const elementBtn = captureGameRegion().find(RecognitionObject.TemplateMatch( + const ro2 = captureGameRegion(); + const elementBtn = ro2.find(RecognitionObject.TemplateMatch( file.readImageMatSync(`Assets/RecognitionObject/${filterInfo.element}.png`), 0, 0, 1920, 1080 )); + ro2.dispose(); if (elementBtn.isExist()) { elementBtn.click(); await sleep(200); @@ -191,9 +197,11 @@ function readAliases() { // 武器不为空才执行武器筛选 if (filterInfo.weapon) { - const weaponBtn = captureGameRegion().find(RecognitionObject.TemplateMatch( + const ro3 = captureGameRegion(); + const weaponBtn = ro3.find(RecognitionObject.TemplateMatch( file.readImageMatSync(`Assets/RecognitionObject/${filterInfo.weapon}.png`), 0, 0, 1920, 1080 )); + ro3.dispose(); if (weaponBtn.isExist()) { weaponBtn.click(); await sleep(200); @@ -205,16 +213,20 @@ function readAliases() { } // 点击确认筛选(无论元素/武器是否为空都需要确认) - const confirmFilterBtn = captureGameRegion().find(RecognitionObject.TemplateMatch( + const ro4 = captureGameRegion(); + const confirmFilterBtn = ro4.find(RecognitionObject.TemplateMatch( file.readImageMatSync('Assets/RecognitionObject/确认筛选.png'), 0, 0, 1920, 1080 )); + ro4.dispose(); if (confirmFilterBtn.isExist()) { confirmFilterBtn.click(); await sleep(50); // 等待筛选结果显示 // 识别是否有"暂无筛选结果"提示 const noResultRo = RecognitionObject.TemplateMatch(noResultTemplate, 0, 0, 1920, 1080); - const noResult = captureGameRegion().find(noResultRo); + const ro5 = captureGameRegion(); + const noResult = ro5.find(noResultRo); + ro5.dispose(); if (noResult.isExist()) { log.warn(`筛选后无结果,跳过${rolenum}号位角色`); hasNoFilterResult = true; @@ -253,7 +265,9 @@ function readAliases() { file.ReadImageMatSync(`Assets/characterimage/${characterFileName}.png`), 0, 0, 1920, 1080 ); - const characterResult = captureGameRegion().find(characterRo); + const ro = captureGameRegion(); + const characterResult = ro.find(characterRo); + ro.dispose(); if (characterResult.isExist()) { log.info(`已找到角色【${selectedCharacter}】`); characterResult.click(); @@ -414,7 +428,9 @@ function readAliases() { while (openPairingTries < 3) { keyPress("l"); await sleep(3500); - const teamConfigResult = captureGameRegion().find(roTeamConfig); + const ro6 = captureGameRegion(); + const teamConfigResult = ro6.find(roTeamConfig); + ro6.dispose(); if (teamConfigResult.isExist()) { openPairingTries = 0; return true; @@ -454,6 +470,7 @@ function readAliases() { } } log.info(`有文字的区域数量为: ${regionsWithTextCount}`); + captureRegion.dispose(); // 角色切换逻辑 click(1212, 1020); // 点击快速编队 @@ -498,7 +515,9 @@ function readAliases() { file.ReadImageMatSync(`Assets/characterimage/${characterFileName}.png`), 0, 0, 1920, 1080 ); - const characterResult = captureGameRegion().find(characterRo); + const ro2 = captureGameRegion(); + const characterResult = ro2.find(characterRo); + ro2.dispose(); if (characterResult.isExist()) { log.info(`已找到角色【${selectedCharacter}】`); characterResult.click(); diff --git a/repo/js/AutoSwitchRoles/manifest.json b/repo/js/AutoSwitchRoles/manifest.json index 6700d0403..04ef5f948 100644 --- a/repo/js/AutoSwitchRoles/manifest.json +++ b/repo/js/AutoSwitchRoles/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "配对界面切换角色", - "version": "6.0.1", + "version": "6.0.2", "bgi_version": "0.50.0", "description": "在配对界面切换指定位置的指定角色", "authors": [ diff --git a/repo/js/AutoTranscribePathing/main.js b/repo/js/AutoTranscribePathing/main.js index 0e7c96014..12d946098 100644 --- a/repo/js/AutoTranscribePathing/main.js +++ b/repo/js/AutoTranscribePathing/main.js @@ -11,6 +11,7 @@ const paimonMenuRo = RecognitionObject.TemplateMatch( const isInMainUI = () => { let captureRegion = captureGameRegion(); let res = captureRegion.Find(paimonMenuRo); + captureRegion.dispose(); return !res.isEmpty(); }; diff --git a/repo/js/AutoTranscribePathing/manifest.json b/repo/js/AutoTranscribePathing/manifest.json index 64a81ad47..f734be40e 100644 --- a/repo/js/AutoTranscribePathing/manifest.json +++ b/repo/js/AutoTranscribePathing/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "地图追踪录制", - "version": "1.0", + "version": "1.1", "bgi_version": "0.45.0", "description": "自动地图追踪录制,每3秒从小地图获取一次当前坐标,打开大地图结束录制", "tags": [ diff --git a/repo/js/AutoWoodcutting-Pathing/main.js b/repo/js/AutoWoodcutting-Pathing/main.js index 8cf0a7500..ee414397e 100644 --- a/repo/js/AutoWoodcutting-Pathing/main.js +++ b/repo/js/AutoWoodcutting-Pathing/main.js @@ -229,7 +229,9 @@ keyDown("VK_Z"); await sleep(1500) keyUp("VK_Z"); - let theBoonOfTheElderTree = captureGameRegion().find(RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/The Boon of the Elder Tree.png"), 550, 450, 900, 300)); + const ro = captureGameRegion(); + let theBoonOfTheElderTree = ro.find(RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/The Boon of the Elder Tree.png"), 550, 450, 900, 300)); + ro.dispose(); if (theBoonOfTheElderTree.isExist()) { log.info("识别到王树瑞佑"); theBoonOfTheElderTree.click(); diff --git a/repo/js/AutoWoodcutting-Pathing/manifest.json b/repo/js/AutoWoodcutting-Pathing/manifest.json index 1019f3c73..373fdae26 100644 --- a/repo/js/AutoWoodcutting-Pathing/manifest.json +++ b/repo/js/AutoWoodcutting-Pathing/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "自动伐木-地图追踪版", - "version": "3.0.2", + "version": "3.0.3", "description": "基于地图追踪的自动伐木,已支持6.0版本及之前的全部木材\n默认砍伐全部支持木材至2000上限\n自定义设置:\n-可更改砍伐木材种类和数量\n-可以单独设置每个木材数量\n-可设置队伍中是否包含一斗,按保底20%,计算砍伐数量时会除以1.2", "bgi_version": "0.52.0", "tags": [ diff --git a/repo/js/CD-Aware-AutoGather/lib/lib.js b/repo/js/CD-Aware-AutoGather/lib/lib.js index 873a0ae24..606fda364 100644 --- a/repo/js/CD-Aware-AutoGather/lib/lib.js +++ b/repo/js/CD-Aware-AutoGather/lib/lib.js @@ -344,6 +344,7 @@ async function getGameAccount(multiAccount = false, mask = true) { const region = captureGameRegion(); const ocrResults = RecognitionObject.ocr(region.width * 0.75, region.height * 0.75, region.width * 0.25, region.height * 0.25); const resList = region.findMulti(ocrResults); + region.dispose(); for (let i = 0; i < resList.count; i++) { const text = resList[i].text; @@ -614,7 +615,9 @@ async function waitTpFinish(timeout = 30000) { await sleep(500); //点击传送后等待一段时间避免误判 while (Date.now() - startTime < timeout) { - let res = captureGameRegion().find(region); + const ro = captureGameRegion(); + let res = ro.find(region); + ro.dispose(); if (!res.isEmpty()) { await sleep(600); //传送结束后有僵直 return; diff --git a/repo/js/CD-Aware-AutoGather/manifest.json b/repo/js/CD-Aware-AutoGather/manifest.json index e7bba7ae5..e019bf510 100644 --- a/repo/js/CD-Aware-AutoGather/manifest.json +++ b/repo/js/CD-Aware-AutoGather/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "带CD管理的自动采集", - "version": "1.7.6", + "version": "1.7.7", "bgi_version": "0.45.0", "description": "自动同步你通过BetterGI订阅的地图追踪任务,执行采集任务,并管理材料刷新时间(支持多账号)。\n首次使用前请先简单阅读说明(可在`全自动`——`JS脚本`页面,点击本脚本名称查看)", "authors": [ diff --git a/repo/js/CrystalflyTrap/main.js b/repo/js/CrystalflyTrap/main.js index 812364106..d9736a7d7 100644 --- a/repo/js/CrystalflyTrap/main.js +++ b/repo/js/CrystalflyTrap/main.js @@ -42,6 +42,7 @@ await sleep(1000); let backpackTitle = captureGameRegion(); let resList = backpackTitle.findMulti(RecognitionObject.ocr(130, 0, 200, 50)); + backpackTitle.dispose(); for (let i = 0; i < resList.count; i++) { let res = resList[i]; if (!res.text.includes("小道")) { @@ -50,7 +51,9 @@ await sleep(1000); } } - let crystalflyTrap = captureGameRegion().find(RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/icon/晶蝶诱捕装置.png"))) + const ro1 = captureGameRegion(); + let crystalflyTrap = ro1.find(RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/icon/晶蝶诱捕装置.png"))) + ro1.dispose(); if (crystalflyTrap) { log.info("选择晶蝶诱捕装置"); crystalflyTrap.click(); @@ -65,6 +68,7 @@ await sleep(1000); let captureRegion = captureGameRegion(); let resList2 = captureRegion.findMulti(RecognitionObject.ocr(1210, 510, 210, 50)); + captureRegion.dispose(); for (let i = 0; i < resList2.count; i++) { let res = resList2[i]; if (!res.text.includes("晶蝶") || !res.text.includes("诱捕") || !res.text.includes("装置")) { @@ -75,9 +79,13 @@ log.info("添加矿石"); keyPress("F"); await sleep(1000); - let oreIcon = captureGameRegion().find(RecognitionObject.TemplateMatch(file.ReadImageMatSync(`assets/icon/${ore}.png`))) + const ro2 = captureGameRegion(); + let oreIcon = ro2.find(RecognitionObject.TemplateMatch(file.ReadImageMatSync(`assets/icon/${ore}.png`))) + ro2.dispose(); if (oreIcon) { - let oreCount = captureGameRegion().find(RecognitionObject.ocr(oreIcon.x - 20, 240, 90, 30)); + const ro3 = captureGameRegion(); + let oreCount = ro3.find(RecognitionObject.ocr(oreIcon.x - 20, 240, 90, 30)); + ro3.dispose(); if (oreCount.text < 30) { log.error(`${ore}数量不足30个!`); throw new Error(`${ore}数量不足30个!`); @@ -123,6 +131,7 @@ let captureRegion = captureGameRegion(); let resList = captureRegion.findMulti(RecognitionObject.ocr(1210, 510, 210, 50)); + captureRegion.dispose(); for (let i = 0; i < resList.count; i++) { let res = resList[i]; if (!res.text.includes("晶蝶") || !res.text.includes("诱捕") || !res.text.includes("装置")) { diff --git a/repo/js/CrystalflyTrap/manifest.json b/repo/js/CrystalflyTrap/manifest.json index 9c5c8b4bd..db6c16437 100644 --- a/repo/js/CrystalflyTrap/manifest.json +++ b/repo/js/CrystalflyTrap/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "晶蝶诱捕装置", - "version": "2.0", + "version": "2.1", "bgi_version": "0.44.3", "description": "自动放置和收集晶蝶诱捕装置。\n\n----------使用说明----------\n●BetterGI 版本必须大于0.44.3,低于此版本无法使用!\n●请确保背包内有「晶蝶诱捕装置」。\n●晶蝶诱捕装置放在枫丹冒险家协会锚点。\n●请确保背包内所选择的矿石数量大于30个。\n●请勿修改\"status.json\"文件,里面保存的是收集奖励的时间,否则将无法通过脚本领取晶核!\n\n----------更新说明----------\n●2.0版本改用json储存时间,如果你的晶核还没领取,请打开脚本所在的文件夹,复制\"time.txt\"中的所有内容,粘贴到\"status.json\"中\"collectionTime\": 后面(要把原来的0删掉!),并将false改为true。", "authors": [ diff --git a/repo/js/DSTCG/main.js b/repo/js/DSTCG/main.js index c18fad32b..6704d0614 100644 --- a/repo/js/DSTCG/main.js +++ b/repo/js/DSTCG/main.js @@ -734,6 +734,7 @@ await this.getEnemyCard(1070, 2, waitTime); await this.getEnemyCard(1275, 3, waitTime); } + gameRegion.dispose(); } // 获取我方角色牌名称和充能 @@ -747,6 +748,7 @@ this.userState[i] = await getState("user", i + 1, 3, gameRegion); this.userHp[i] = await getCardHp("user", i + 1, 3, gameRegion); } + gameRegion.dispose(); await this.getUserCard(750, 0, waitTime); await this.getUserCard(960, 1, waitTime); await this.getUserCard(1175, 2, waitTime); @@ -1802,7 +1804,9 @@ moveMouseTo(1555, 860); // 移走鼠标,防止干扰OCR } await sleep(200); - let ocr = captureGameRegion().Find(ocrRo); // 当前页面OCR + const ro1 = captureGameRegion(); + let ocr = ro1.Find(ocrRo); // 当前页面OCR + ro1.dispose(); if (ocr.isExist() && ocr.text === "初始手牌") { return true; } else { @@ -1823,7 +1827,9 @@ moveMouseTo(1555, 860); // 移走鼠标,防止干扰OCR } await sleep(200); - let ocr = captureGameRegion().Find(ocrRo); // 当前页面OCR + const ro2 = captureGameRegion(); + let ocr = ro2.Find(ocrRo); // 当前页面OCR + ro2.dispose(); if (ocr.isExist() && ocr.text === "重投骰子") { return true; } else { @@ -1844,7 +1850,9 @@ moveMouseTo(1555, 860); // 移走鼠标,防止干扰OCR } await sleep(200); - let ocr = captureGameRegion().Find(ocrRo); // 当前页面OCR + const ro3 = captureGameRegion(); + let ocr = ro3.Find(ocrRo); // 当前页面OCR + ro3.dispose(); if (ocr.isExist() && ocr.text === "出战角色") { return true; } else { @@ -1865,7 +1873,9 @@ moveMouseTo(1555, 860); // 移走鼠标,防止干扰OCR } await sleep(200); - let ocr = captureGameRegion().Find(ocrRo); // 当前页面OCR + const ro4 = captureGameRegion(); + let ocr = ro4.Find(ocrRo); // 当前页面OCR + ro4.dispose(); if (ocr.isExist() && ocr.text.includes("对局胜利")) { return "win"; } else if (ocr.isExist() && ocr.text.includes("对局失败")){ @@ -1888,7 +1898,9 @@ moveMouseTo(1555, 860); // 移走鼠标,防止干扰OCR } await sleep(100); - let slide_bar = captureGameRegion().Find(slide_barRo); // 当前页面模板匹配 + const ro5 = captureGameRegion(); + let slide_bar = ro5.Find(slide_barRo); // 当前页面模板匹配 + ro5.dispose(); if (slide_bar.isExist()) { return true; } else { @@ -1909,12 +1921,14 @@ moveMouseTo(1555, 860); // 移走鼠标,防止干扰OCR await sleep(10); + const ro6 = captureGameRegion(); let ocr; if (mode === "StartingHand") { - ocr = captureGameRegion().Find(ocrRo_StartingHand); // 当前页面OCR + ocr = ro6.Find(ocrRo_StartingHand); // 当前页面OCR } else if (mode === "main") { - ocr = captureGameRegion().Find(ocrRo_Main); // 当前页面OCR + ocr = ro6.Find(ocrRo_Main); // 当前页面OCR } + ro6.dispose(); if (ocr.isExist()) { return ocr.text; } else { @@ -1966,6 +1980,7 @@ } } } + gameRegion.dispose(); log.info(`[DEBUG] 剩余元素骰: ${Object.keys(dice_dic)} | ${Object.values(dice_dic)}`); return dice_dic; } @@ -1987,6 +2002,7 @@ for (let i = 0; i < HandNumNames.length; i++) { let numRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync(pic_path_dic[HandNumNames[i]]), 1463, 700, 439, 124); let num = gameRegion.Find(numRo); + gameRegion.dispose(); if (num.isExist()) return parseInt(HandNumNames[i].slice(4), 10); } @@ -2095,6 +2111,7 @@ let gameRegion = captureGameRegion(); // 捕获一次游戏区域 let userTurn = gameRegion.Find(userRo); let enemyTurn = gameRegion.Find(enemyRo); + gameRegion.dispose(); if (userTurn.isExist()) { return "user"; } else if (enemyTurn.isExist()) { diff --git a/repo/js/DSTCG/manifest.json b/repo/js/DSTCG/manifest.json index 293fe97a0..e4a277356 100644 --- a/repo/js/DSTCG/manifest.json +++ b/repo/js/DSTCG/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "「牌圣」", - "version": "1.0", + "version": "1.1", "bgi_version": "0.45.0", "description": "智能版自动七圣召唤", "authors": [ diff --git a/repo/js/DestroyArtifactsForMora/main.js b/repo/js/DestroyArtifactsForMora/main.js index 9887a5009..71df21a04 100644 --- a/repo/js/DestroyArtifactsForMora/main.js +++ b/repo/js/DestroyArtifactsForMora/main.js @@ -14,7 +14,9 @@ const MidDestoryButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync keyPress("B"); await sleep(1500); - let ArtifactsButton = captureGameRegion().find(ArtifactsButtonRo); + const ro1 = captureGameRegion(); + let ArtifactsButton = ro1.find(ArtifactsButtonRo); + ro1.dispose(); if (ArtifactsButton.isExist()) { log.info("识别到圣遗物按钮"); ArtifactsButton.click(); @@ -31,9 +33,13 @@ const MidDestoryButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync } try { for (let i = 0; i < times; i++) { - captureGameRegion().find(DeleteButtonRo).click();// 点击摧毁 + const ro2 = captureGameRegion(); + ro2.find(DeleteButtonRo).click();// 点击摧毁 + ro2.dispose(); await sleep(600); - captureGameRegion().find(AutoAddButtonRo).click();// 点击自动添加 + const ro3 = captureGameRegion(); + ro3.find(AutoAddButtonRo).click();// 点击自动添加 + ro3.dispose(); await sleep(600); if (settings.oneStar) { @@ -53,11 +59,17 @@ const MidDestoryButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync click(150, 370); } - captureGameRegion().find(ConfirmButtonRo).click();// 点击快捷放入 + const ro4 = captureGameRegion(); + ro4.find(ConfirmButtonRo).click();// 点击快捷放入 + ro4.dispose(); await sleep(600); - captureGameRegion().find(DestoryButtonRo).click();// 点击摧毁 + const ro5 = captureGameRegion(); + ro5.find(DestoryButtonRo).click();// 点击摧毁 + ro5.dispose(); await sleep(600); - captureGameRegion().find(MidDestoryButtonRo).click();// 弹出页面点击摧毁 + const ro6 = captureGameRegion(); + ro6.find(MidDestoryButtonRo).click();// 弹出页面点击摧毁 + ro6.dispose(); await sleep(600); click(960, 1000);// 点击空白处 await sleep(1000); diff --git a/repo/js/DestroyArtifactsForMora/manifest.json b/repo/js/DestroyArtifactsForMora/manifest.json index 33707619b..28c06be08 100644 --- a/repo/js/DestroyArtifactsForMora/manifest.json +++ b/repo/js/DestroyArtifactsForMora/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "摧毁圣遗物换摩拉", - "version": "1.1", + "version": "1.2", "bgi_version": "0.44.6", "description": "图像识别改造版", "authors": [ diff --git a/repo/js/EscofierKitchenContraption/main.js b/repo/js/EscofierKitchenContraption/main.js index 3cdba9567..8ae35f5f8 100644 --- a/repo/js/EscofierKitchenContraption/main.js +++ b/repo/js/EscofierKitchenContraption/main.js @@ -34,6 +34,7 @@ var conuntcottimecomp=1; // 对整个区域进行 OCR var resList = captureRegion.findMulti(RecognitionObject.ocr(x,y,w,h)); + captureRegion.dispose(); //log.info("OCR 全区域识别结果数量 {len}", resList.count); if (resList.count !== 0) { for (let i = 0; i < resList.count; i++) diff --git a/repo/js/EscofierKitchenContraption/manifest.json b/repo/js/EscofierKitchenContraption/manifest.json index 1c43cded1..dca6ddd1d 100644 --- a/repo/js/EscofierKitchenContraption/manifest.json +++ b/repo/js/EscofierKitchenContraption/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "爱可菲自动化", - "version": "1.3", + "version": "1.4", "bgi_version": "0.44.0", "description": "爱可菲厨艺机关自动化,请注意说明文件,如有BUG请联系作者QQ:119996800", "tags": [ diff --git a/repo/js/FeatherFalling/main.js b/repo/js/FeatherFalling/main.js index be9c374b2..8ded09b61 100644 --- a/repo/js/FeatherFalling/main.js +++ b/repo/js/FeatherFalling/main.js @@ -52,7 +52,9 @@ async function PlacePortableWaypoint() { await sleep(50); click(1050, 50); await sleep(1000); - let result = captureGameRegion().find(tpBagRo); + const ro1 = captureGameRegion(); + let result = ro1.find(tpBagRo); + ro1.dispose(); if (result.isExist()) { result.click(); await sleep(1000); @@ -73,14 +75,18 @@ async function FeatherFailing() { await genshin.setBigMapZoomLevel(3.0); await genshin.moveMapTo(3419, 2739, `枫丹`); await genshin.setBigMapZoomLevel(1.0); - let result = captureGameRegion().find(tpIconRo); + const ro2 = captureGameRegion(); + let result = ro2.find(tpIconRo); + ro2.dispose(); if (result.isExist()) { log.info("传送点图标已识别,点击传送"); result.click(); await sleep(1000); let totalHours = 999; if (settings.autoPortableWaypoint) { - let result = captureGameRegion().find(ocrRo); + const ro3 = captureGameRegion(); + let result = ro3.find(ocrRo); + ro3.dispose(); log.info("识别到锚点文字: " + result.text); // 使用正则表达式匹配不同的时间格式 @@ -103,7 +109,9 @@ async function FeatherFailing() { log.warn("无法解析锚点剩余时间格式,本次不放置锚点"); } } - result = captureGameRegion().find(goTeleportRo); + const ro4 = captureGameRegion(); + result = ro4.find(goTeleportRo); + ro4.dispose(); result.click(); await sleep(1000); await genshin.returnMainUi(); @@ -142,7 +150,9 @@ async function FeatherFailing() { await sleep(50); keyUp("W"); await sleep(300); - result = captureGameRegion().find(swimStateRo); + const ro5 = captureGameRegion(); + result = ro5.find(swimStateRo); + ro5.dispose(); if (result.isExist()) { log.info("已进入游泳状态"); break; @@ -169,7 +179,9 @@ async function FeatherFailing() { await sleep(200); middleButtonClick(); for (let i = 0; i < 100; i++) { - result = captureGameRegion().find(swimStateRo); + const ro6 = captureGameRegion(); + result = ro6.find(swimStateRo); + ro6.dispose(); if (!result.isExist()) { log.info("已退出游泳状态"); break; diff --git a/repo/js/FeatherFalling/manifest.json b/repo/js/FeatherFalling/manifest.json index 6d657b830..a20165e7e 100644 --- a/repo/js/FeatherFalling/manifest.json +++ b/repo/js/FeatherFalling/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "摔落保护:提瓦特反牛顿机制", - "version": "1.1.2", + "version": "1.1.3", "description": "利用游戏机制获取免疫摔落伤害的buff,鸣谢柒叶子制作的键鼠脚本", "authors": [ { diff --git a/repo/js/FollowsPet/index.js b/repo/js/FollowsPet/index.js index cc876dbc1..cad4a3fd1 100644 --- a/repo/js/FollowsPet/index.js +++ b/repo/js/FollowsPet/index.js @@ -61,6 +61,7 @@ async function equipPet(pet) { const gameRegion = captureGameRegion(); const petRegion = gameRegion.find(petRo); if (!petRegion.isExist()) { + gameRegion.dispose(); // 未找到宠物,尝试拖动屏幕 await mouseSmoothDrag(1200, 890, 1200, 186, 2000); continue; @@ -70,6 +71,7 @@ async function equipPet(pet) { // 提升精度 petRo.threshold = 0.97; const equipRegion = gameRegion.find(petRo); + gameRegion.dispose(); if (!equipRegion.isExist()) { // 装备宠物 click(1690, 1015); @@ -105,6 +107,7 @@ async function removePet() { await sleep(1000); return log.info(`已卸下宠物:${pet.name}`); } + gameRegion.dispose(); await mouseSmoothDrag(1200, 890, 1200, 186, 2000); } log.warn('未找到装备中的宠物'); diff --git a/repo/js/FollowsPet/manifest.json b/repo/js/FollowsPet/manifest.json index d7aa5a2ef..ac2733c44 100644 --- a/repo/js/FollowsPet/manifest.json +++ b/repo/js/FollowsPet/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 1, "name": "装备或卸下跟随宠物", "description": "带上你的宠物,一起冒险吧!\nPS:请在原神分辨率为 1920x1080 下使用该脚本。", - "version": "0.0.4", + "version": "0.0.5", "main": "index.js", "settings_ui": "settings.json", "authors": [ diff --git a/repo/js/JoinFriendsWorld/index.js b/repo/js/JoinFriendsWorld/index.js index e459f2536..5940d60d3 100644 --- a/repo/js/JoinFriendsWorld/index.js +++ b/repo/js/JoinFriendsWorld/index.js @@ -18,6 +18,7 @@ async function isCoOpMode() { await genshin.returnMainUi(); const gameRegion = captureGameRegion(); const ocrRegion = gameRegion.find(autoZoomOcr(343, 22, 45, 45)); + gameRegion.dispose(); const ocrText = ocrRegion.text.trim().toLocaleLowerCase(); return ocrText.includes("p") || ocrText !== ""; } @@ -53,12 +54,15 @@ const WAIT_FRIEND_CONFIRM_TIMEOUT = 25 * 1000; // 判断是否搜索的用户是否是自己 const yourselfRegin = gameRegion.find(autoZoomOcr(660, 495, 601, 88)); if (yourselfRegin.text.includes('其他玩家')) { + gameRegion.dispose(); throw new Error('不能使用自己的UID'); } + gameRegion.dispose(); throw new Error('UID不存在'); } const joinOrAddRegin = gameRegion.find(autoZoomOcr(1160, 800, 200, 54)); const joinOrAddText = joinOrAddRegin.text.trim(); + gameRegion.dispose(); if (joinOrAddText === '') { throw new Error('你的好友不在线'); } @@ -75,6 +79,7 @@ const WAIT_FRIEND_CONFIRM_TIMEOUT = 25 * 1000; const gameRegion = captureGameRegion(); const requestRegin = gameRegion.find(autoZoomOcr(725, 195, 465, 45)); const requestText = requestRegin.text.trim(); + gameRegion.dispose(); if (requestText.endsWith('拒绝了多人游戏申请')) { throw new Error('好友拒绝了多人游戏'); } diff --git a/repo/js/MiliastraExperienceAutomation/main.js b/repo/js/MiliastraExperienceAutomation/main.js index ec44cc92f..ef50e23e2 100644 --- a/repo/js/MiliastraExperienceAutomation/main.js +++ b/repo/js/MiliastraExperienceAutomation/main.js @@ -53,7 +53,9 @@ const findImageWithinBounds = (path, x, y, w, h) => { try { const ir = captureGameRegion(); const ro = RecognitionObject.templateMatch(file.readImageMatSync(path), x, y, w, h); - return findFirst(ir, ro, (region) => region.isExist()); + const result = findFirst(ir, ro, (region) => region.isExist()); + ir.dispose(); + return result; } catch (err) { err?.message && log.warn(`${err.message}`); } @@ -63,22 +65,26 @@ const findText = (text, options) => { const searchText = ignoreCase ? text.toLowerCase() : text; const ir = captureGameRegion(); const ro = RecognitionObject.ocrThis; - return findFirst(ir, ro, (region) => { + const result = findFirst(ir, ro, (region) => { const itemText = ignoreCase ? region.text.toLowerCase() : region.text; const isMatch = contains ? itemText.includes(searchText) : itemText === searchText; return isMatch && region.isExist(); }); + ir.dispose(); + return result; }; const findTextWithinBounds = (text, x, y, w, h, options) => { const { ignoreCase = true, contains = false } = options || {}; const searchText = ignoreCase ? text.toLowerCase() : text; const ir = captureGameRegion(); const ro = RecognitionObject.ocr(x, y, w, h); - return findFirst(ir, ro, (region) => { + const result = findFirst(ir, ro, (region) => { const itemText = ignoreCase ? region.text.toLowerCase() : region.text; const isMatch = contains ? itemText.includes(searchText) : itemText === searchText; return isMatch && region.isExist(); }); + ir.dispose(); + return result; }; // node_modules/.pnpm/@bettergi+utils@0.1.1/node_modules/@bettergi/utils/dist/store.js diff --git a/repo/js/MiliastraExperienceAutomation/manifest.json b/repo/js/MiliastraExperienceAutomation/manifest.json index bc5214c63..e4c16e5c0 100644 --- a/repo/js/MiliastraExperienceAutomation/manifest.json +++ b/repo/js/MiliastraExperienceAutomation/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "千星奇域每周刷取经验值", - "version": "0.6", + "version": "0.7", "bgi_version": "0.52.0", "description": "千星奇域每周刷取经验值", "authors": [ diff --git a/repo/js/OCRArtifacts/main.js b/repo/js/OCRArtifacts/main.js index 72b963824..5d0697636 100644 --- a/repo/js/OCRArtifacts/main.js +++ b/repo/js/OCRArtifacts/main.js @@ -35,7 +35,8 @@ async function recognizeTextInRegion(ocrRegion, timeout = 5000) { while (Date.now() - startTime < timeout) { try { // 在指定区域进行 OCR 识别 - let ocrResult = captureGameRegion().find( + const ro = captureGameRegion(); + let ocrResult = ro.find( RecognitionObject.ocr( ocrRegion.x, ocrRegion.y, @@ -43,6 +44,7 @@ async function recognizeTextInRegion(ocrRegion, timeout = 5000) { ocrRegion.height ) ) + ro.dispose(); if (ocrResult) { return ocrResult.text // 返回识别到的内容 } else { diff --git a/repo/js/OCRArtifacts/manifest.json b/repo/js/OCRArtifacts/manifest.json index 6819872a3..9192a3918 100644 --- a/repo/js/OCRArtifacts/manifest.json +++ b/repo/js/OCRArtifacts/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "OCRArtifacts", - "version": "1.0.0", + "version": "1.0.1", "description": "读取背包圣遗物并解析为json格式", "authors": [ { diff --git a/repo/js/OCR读取主界面队伍/main.js b/repo/js/OCR读取主界面队伍/main.js index 7ae7ff552..e8525664d 100644 --- a/repo/js/OCR读取主界面队伍/main.js +++ b/repo/js/OCR读取主界面队伍/main.js @@ -53,7 +53,9 @@ function filterChineseChars(text) { async function recognizeImage(recognitionObject) { await sleep(500); // 延迟500ms,避免识别请求过于频繁 try { - const imageResult = captureGameRegion().find(recognitionObject); + const ro = captureGameRegion(); + const imageResult = ro.find(recognitionObject); + ro.dispose(); // 当识别结果存在且坐标不为(0,0)时(排除无效识别) return !!imageResult && imageResult.x !== 0 && imageResult.y !== 0; } catch (error) { @@ -77,7 +79,9 @@ async function recognizeTextInRegion(ocrRegion, timeout = 5000) { // 绘制识别区域红框(调试用) //captureGameRegion().find(region).DrawSelf("debug"); - const ocrResult = captureGameRegion().find(region); + const ro = captureGameRegion(); + const ocrResult = ro.find(region); + ro.dispose(); if (ocrResult) { // 应用字符替换映射表修正识别结果 let correctedText = ocrResult.text; @@ -113,6 +117,7 @@ const paimonMenuRo = RecognitionObject.TemplateMatch( const isInMainUI = () => { let captureRegion = captureGameRegion(); let res = captureRegion.Find(paimonMenuRo); + captureRegion.dispose(); return !res.isEmpty(); }; diff --git a/repo/js/OCR读取主界面队伍/manifest.json b/repo/js/OCR读取主界面队伍/manifest.json index d61b2e0ed..c2ba02c69 100644 --- a/repo/js/OCR读取主界面队伍/manifest.json +++ b/repo/js/OCR读取主界面队伍/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "OCR主界面读取队伍 ", - "version": "1.0", + "version": "1.1", "description": "至少0.44.3版本。OCR识别队伍角色", "authors": [ { diff --git a/repo/js/OCR读取当前抽卡资源并发送通知/main.js b/repo/js/OCR读取当前抽卡资源并发送通知/main.js index 4321ca9bf..b3f756a21 100644 --- a/repo/js/OCR读取当前抽卡资源并发送通知/main.js +++ b/repo/js/OCR读取当前抽卡资源并发送通知/main.js @@ -1,162 +1,166 @@ -// 定义替换映射表 -const replacementMap = { - "监": "盐", - "卵": "卯" -}; - -// 定义所有图标的图像识别对象,每个图片都有自己的识别区域 -//let CharacterMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Wish.png"), 0, 0, 1920, 1080); - -// 定义一个函数用于识别图像 -async function recognizeImage(recognitionObject, timeout = 5000) { - let startTime = Date.now(); - await sleep(500); // 短暂延迟,避免过快 - try { - // 尝试识别图像 - let imageResult = captureGameRegion().find(recognitionObject); - if (imageResult && imageResult.x != 0 && imageResult.y != 0) { - log.info(`成功识别图像,坐标: x=${imageResult.x}, y=${imageResult.y}`); - log.info(`图像尺寸: width=${imageResult.width}, height=${imageResult.height}`); - return { success: true, x: imageResult.x, y: imageResult.y }; - } - } catch (error) { - log.error(`识别图像时发生异常: ${error.message}`); - } - log.warn(`无法识别图像`); - return { success: false }; -} - - -// 定义一个独立的函数用于在指定区域进行 OCR 识别并输出识别内容 -async function recognizeTextInRegion(ocrRegion, timeout = 5000) { - let startTime = Date.now(); - let retryCount = 0; // 重试计数 - while (Date.now() - startTime < timeout) { - try { - // 在指定区域进行 OCR 识别 - let ocrResult = captureGameRegion().find(RecognitionObject.ocr(ocrRegion.x, ocrRegion.y, ocrRegion.width, ocrRegion.height)); - if (ocrResult) { - // 后处理:根据替换映射表检查和替换错误识别的字符 - let correctedText = ocrResult.text; - for (let [wrongChar, correctChar] of Object.entries(replacementMap)) { - correctedText = correctedText.replace(new RegExp(wrongChar, 'g'), correctChar); - } - return correctedText; // 返回识别到的内容 - } else { - log.warn(`OCR 识别区域未找到内容`); - return null; // 如果 OCR 未识别到内容,返回 null - } - } catch (error) { - retryCount++; // 增加重试计数 - log.warn(`OCR 数识别失败,正在进行第 ${retryCount} 次重试...`); - } - await sleep(500); // 短暂延迟,避免过快循环 - } - log.warn(`经过多次尝试,仍然无法在指定区域识别到文字`); - return null; // 如果未识别到文字,返回 null -} - -(async function () { - setGameMetrics(1920, 1080, 1); - await genshin.returnMainUi(); - const notify = settings.notify || false; - - // 按下 F3 键 - keyPress("F3"); - await sleep(1500); - - let recognized = true; - - // 识别“常驻祈愿”图标 - let startTime = Date.now(); - let targetText = "奔行世间"; - let ocrRegion = { x: 349, y: 300, width: 326, height: 88 }; // 设置对应的识别区域 - let retryCount = 0; // 重试计数 - //先判断是否为常驻卡池 - try { - - let recognizedText = await recognizeTextInRegion(ocrRegion); - log.info(`识别到的卡池为符为:${recognizedText}`); - recognizedText = recognizedText.replace(/[^\u4e00-\u9fa5]/g, '')// 使用正则表达式匹配并保留中文字符 - if (targetText === recognizedText) { - await sleep(100); // 短暂延迟,避免过快 - recognized = false; ; - await click(1845, 540);//尝试切换卡池 - await sleep(500); // 短暂延迟,避免过快 - } - } catch (error) { - log.warn(`页面标志识别失败`); - } - //检验是否切换成功 - while (Date.now() - startTime < 6000 && !recognized) { - try { - - let recognizedText = await recognizeTextInRegion(ocrRegion); - log.info(`识别到的卡池为符为:${recognizedText}`); - recognizedText = recognizedText.replace(/[^\u4e00-\u9fa5]/g, '')// 使用正则表达式匹配并保留中文字符 - if (targetText === recognizedText) { - await click(1845, 540);//继续尝试切换卡池 - } else { - log.info(`切换卡池成功`); +// 定义替换映射表 +const replacementMap = { + "监": "盐", + "卵": "卯" +}; + +// 定义所有图标的图像识别对象,每个图片都有自己的识别区域 +//let CharacterMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Wish.png"), 0, 0, 1920, 1080); + +// 定义一个函数用于识别图像 +async function recognizeImage(recognitionObject, timeout = 5000) { + let startTime = Date.now(); + await sleep(500); // 短暂延迟,避免过快 + try { + // 尝试识别图像 + const ro = captureGameRegion(); + let imageResult = ro.find(recognitionObject); + ro.dispose(); + if (imageResult && imageResult.x != 0 && imageResult.y != 0) { + log.info(`成功识别图像,坐标: x=${imageResult.x}, y=${imageResult.y}`); + log.info(`图像尺寸: width=${imageResult.width}, height=${imageResult.height}`); + return { success: true, x: imageResult.x, y: imageResult.y }; + } + } catch (error) { + log.error(`识别图像时发生异常: ${error.message}`); + } + log.warn(`无法识别图像`); + return { success: false }; +} + + +// 定义一个独立的函数用于在指定区域进行 OCR 识别并输出识别内容 +async function recognizeTextInRegion(ocrRegion, timeout = 5000) { + let startTime = Date.now(); + let retryCount = 0; // 重试计数 + while (Date.now() - startTime < timeout) { + try { + // 在指定区域进行 OCR 识别 + const ro = captureGameRegion(); + let ocrResult = ro.find(RecognitionObject.ocr(ocrRegion.x, ocrRegion.y, ocrRegion.width, ocrRegion.height)); + ro.dispose(); + if (ocrResult) { + // 后处理:根据替换映射表检查和替换错误识别的字符 + let correctedText = ocrResult.text; + for (let [wrongChar, correctChar] of Object.entries(replacementMap)) { + correctedText = correctedText.replace(new RegExp(wrongChar, 'g'), correctChar); + } + return correctedText; // 返回识别到的内容 + } else { + log.warn(`OCR 识别区域未找到内容`); + return null; // 如果 OCR 未识别到内容,返回 null + } + } catch (error) { + retryCount++; // 增加重试计数 + log.warn(`OCR 数识别失败,正在进行第 ${retryCount} 次重试...`); + } + await sleep(500); // 短暂延迟,避免过快循环 + } + log.warn(`经过多次尝试,仍然无法在指定区域识别到文字`); + return null; // 如果未识别到文字,返回 null +} + +(async function () { + setGameMetrics(1920, 1080, 1); + await genshin.returnMainUi(); + const notify = settings.notify || false; + + // 按下 F3 键 + keyPress("F3"); + await sleep(1500); + + let recognized = true; + + // 识别“常驻祈愿”图标 + let startTime = Date.now(); + let targetText = "奔行世间"; + let ocrRegion = { x: 349, y: 300, width: 326, height: 88 }; // 设置对应的识别区域 + let retryCount = 0; // 重试计数 + //先判断是否为常驻卡池 + try { + + let recognizedText = await recognizeTextInRegion(ocrRegion); + log.info(`识别到的卡池为符为:${recognizedText}`); + recognizedText = recognizedText.replace(/[^\u4e00-\u9fa5]/g, '')// 使用正则表达式匹配并保留中文字符 + if (targetText === recognizedText) { + await sleep(100); // 短暂延迟,避免过快 + recognized = false; ; + await click(1845, 540);//尝试切换卡池 + await sleep(500); // 短暂延迟,避免过快 + } + } catch (error) { + log.warn(`页面标志识别失败`); + } + //检验是否切换成功 + while (Date.now() - startTime < 6000 && !recognized) { + try { + + let recognizedText = await recognizeTextInRegion(ocrRegion); + log.info(`识别到的卡池为符为:${recognizedText}`); + recognizedText = recognizedText.replace(/[^\u4e00-\u9fa5]/g, '')// 使用正则表达式匹配并保留中文字符 + if (targetText === recognizedText) { + await click(1845, 540);//继续尝试切换卡池 + } else { + log.info(`切换卡池成功`); recognized = true; break; - } - } catch (error) { - retryCount++; // 增加重试计数 - log.warn(`切换失败,正在进行第 ${retryCount} 次重试...`); - } - await sleep(1000); // 短暂延迟,避免过快循环 - } - - - - // 如果识别到了“常驻祈愿”图标,则识别“原石以及纠缠之缘到数值” - if (recognized) { - //原石 - let ocrRegionYuanShi = { x: 1470, y: 25, width: 180, height: 46 }; // 设置对应的识别区域 - let recognizedText1 = await recognizeTextInRegion(ocrRegionYuanShi); - //纠缠之缘 - let ocrRegionInterwinedFate = { x: 1650, y: 25, width: 140, height: 46 }; // 设置对应的识别区域 - let recognizedText2 = await recognizeTextInRegion(ocrRegionInterwinedFate); - - - if (recognizedText1 && recognizedText2) { - recognizedText1 = recognizedText1.replace(/\D/g, ''); - recognizedText2 = recognizedText2.replace(/\D/g, ''); - log.info(`成功识别到原石数值: ${recognizedText1} `); - log.info(`成功识别到纠缠之缘数值: ${recognizedText2} `); - log.info(`总价值: ${parseInt(recognizedText2, 10) * 160 + parseInt(recognizedText1, 10)}原石 ———— ${parseInt(recognizedText2, 10) + (parseInt(recognizedText1, 10) / 160) | 0}抽`); - if (notify) { - notification.Send(`原石数值: ${recognizedText1}`); - notification.Send(`纠缠之缘数值: ${recognizedText2}`); - if (!isNaN(recognizedText1) && recognizedText1.trim() !== "" && !isNaN(recognizedText2) && recognizedText2.trim() !== "") { - notification.Send(`总价值: ${parseInt(recognizedText2, 10) * 160 + parseInt(recognizedText1, 10)}原石 ———— ${parseInt(recognizedText2, 10) + (parseInt(recognizedText1, 10) / 160) | 0}抽`); - } else { + } + } catch (error) { + retryCount++; // 增加重试计数 + log.warn(`切换失败,正在进行第 ${retryCount} 次重试...`); + } + await sleep(1000); // 短暂延迟,避免过快循环 + } + + + + // 如果识别到了“常驻祈愿”图标,则识别“原石以及纠缠之缘到数值” + if (recognized) { + //原石 + let ocrRegionYuanShi = { x: 1470, y: 25, width: 180, height: 46 }; // 设置对应的识别区域 + let recognizedText1 = await recognizeTextInRegion(ocrRegionYuanShi); + //纠缠之缘 + let ocrRegionInterwinedFate = { x: 1650, y: 25, width: 140, height: 46 }; // 设置对应的识别区域 + let recognizedText2 = await recognizeTextInRegion(ocrRegionInterwinedFate); + + + if (recognizedText1 && recognizedText2) { + recognizedText1 = recognizedText1.replace(/\D/g, ''); + recognizedText2 = recognizedText2.replace(/\D/g, ''); + log.info(`成功识别到原石数值: ${recognizedText1} `); + log.info(`成功识别到纠缠之缘数值: ${recognizedText2} `); + log.info(`总价值: ${parseInt(recognizedText2, 10) * 160 + parseInt(recognizedText1, 10)}原石 ———— ${parseInt(recognizedText2, 10) + (parseInt(recognizedText1, 10) / 160) | 0}抽`); + if (notify) { + notification.Send(`原石数值: ${recognizedText1}`); + notification.Send(`纠缠之缘数值: ${recognizedText2}`); + if (!isNaN(recognizedText1) && recognizedText1.trim() !== "" && !isNaN(recognizedText2) && recognizedText2.trim() !== "") { + notification.Send(`总价值: ${parseInt(recognizedText2, 10) * 160 + parseInt(recognizedText1, 10)}原石 ———— ${parseInt(recognizedText2, 10) + (parseInt(recognizedText1, 10) / 160) | 0}抽`); + } else { notification.Send(`总价值转换失败`); - } - } - - // 获取当前时间 - const now = new Date(); - const formattedTime = now.toLocaleString(); // 使用本地时间格式化 - - - // 写入本地文件 - const filePath = "Resources_log.txt"; - const logContent = `${formattedTime} —— 原石数值: ${recognizedText1} —— 纠缠之缘数值: ${recognizedText2} —— 总价值: ${parseInt(recognizedText2, 10) * 160 + parseInt(recognizedText1, 10)}原石 ———— ${parseInt(recognizedText2, 10) + (parseInt(recognizedText1, 10) / 160) | 0}抽\n`; - const result = file.WriteTextSync(filePath, logContent, true); // 追加模式 - if (result) { - log.info("成功将原石以及纠缠之缘数值写入日志文件"); - } else { - log.error("写入日志文件失败"); - } - } else { - log.warn("未能识别原石以及纠缠之缘到数值。"); - } - } else { - log.warn("未能识别到了“常驻祈愿”图标,跳过识别“原石以及纠缠之缘到数值”。"); - } - await sleep(500); - await genshin.returnMainUi(); -})(); - + } + } + + // 获取当前时间 + const now = new Date(); + const formattedTime = now.toLocaleString(); // 使用本地时间格式化 + + + // 写入本地文件 + const filePath = "Resources_log.txt"; + const logContent = `${formattedTime} —— 原石数值: ${recognizedText1} —— 纠缠之缘数值: ${recognizedText2} —— 总价值: ${parseInt(recognizedText2, 10) * 160 + parseInt(recognizedText1, 10)}原石 ———— ${parseInt(recognizedText2, 10) + (parseInt(recognizedText1, 10) / 160) | 0}抽\n`; + const result = file.WriteTextSync(filePath, logContent, true); // 追加模式 + if (result) { + log.info("成功将原石以及纠缠之缘数值写入日志文件"); + } else { + log.error("写入日志文件失败"); + } + } else { + log.warn("未能识别原石以及纠缠之缘到数值。"); + } + } else { + log.warn("未能识别到了“常驻祈愿”图标,跳过识别“原石以及纠缠之缘到数值”。"); + } + await sleep(500); + await genshin.returnMainUi(); +})(); + diff --git a/repo/js/OCR读取当前抽卡资源并发送通知/manifest.json b/repo/js/OCR读取当前抽卡资源并发送通知/manifest.json index 342e97114..cf8f394df 100644 --- a/repo/js/OCR读取当前抽卡资源并发送通知/manifest.json +++ b/repo/js/OCR读取当前抽卡资源并发送通知/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "读取当前原石以及纠缠之缘记录并发送通知", - "version": "1.4", + "version": "1.5", "description": "至少0.44.3版本。OCR识别原石以及纠缠之缘数值输出到本地", "authors": [ { diff --git a/repo/js/OCR读取当前摩拉记录并发送通知/main.js b/repo/js/OCR读取当前摩拉记录并发送通知/main.js index 23c0458bd..e7d8d9e13 100644 --- a/repo/js/OCR读取当前摩拉记录并发送通知/main.js +++ b/repo/js/OCR读取当前摩拉记录并发送通知/main.js @@ -13,7 +13,9 @@ async function recognizeImage(recognitionObject, timeout = 5000) { while (Date.now() - startTime < timeout) { try { // 尝试识别图像 - let imageResult = captureGameRegion().find(recognitionObject); + const ro = captureGameRegion(); + let imageResult = ro.find(recognitionObject); + ro.dispose(); if (imageResult) { // log.info(`成功识别图像,坐标: x=${imageResult.x}, y=${imageResult.y}`); // log.info(`图像尺寸: width=${imageResult.width}, height=${imageResult.height}`); @@ -35,7 +37,9 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 5000) { while (Date.now() - startTime < timeout) { try { // 尝试 OCR 识别 - let resList = captureGameRegion().findMulti(RecognitionObject.ocr(ocrRegion.x, ocrRegion.y, ocrRegion.width, ocrRegion.height)); // 指定识别区域 + const ro = captureGameRegion(); + let resList = ro.findMulti(RecognitionObject.ocr(ocrRegion.x, ocrRegion.y, ocrRegion.width, ocrRegion.height)); // 指定识别区域 + ro.dispose(); // 遍历识别结果,检查是否找到目标文本 for (let res of resList) { // 后处理:根据替换映射表检查和替换错误识别的字符 @@ -70,7 +74,9 @@ async function recognizeTextInRegion(ocrRegion, timeout = 5000) { while (Date.now() - startTime < timeout) { try { // 在指定区域进行 OCR 识别 - let ocrResult = captureGameRegion().find(RecognitionObject.ocr(ocrRegion.x, ocrRegion.y, ocrRegion.width, ocrRegion.height)); + const ro = captureGameRegion(); + let ocrResult = ro.find(RecognitionObject.ocr(ocrRegion.x, ocrRegion.y, ocrRegion.width, ocrRegion.height)); + ro.dispose(); if (ocrResult) { // 后处理:根据替换映射表检查和替换错误识别的字符 let correctedText = ocrResult.text; diff --git a/repo/js/OCR读取当前摩拉记录并发送通知/manifest.json b/repo/js/OCR读取当前摩拉记录并发送通知/manifest.json index 90f368339..97c5205df 100644 --- a/repo/js/OCR读取当前摩拉记录并发送通知/manifest.json +++ b/repo/js/OCR读取当前摩拉记录并发送通知/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "读取当前摩拉记录并发送通知", - "version": "1.1.2", + "version": "1.1.3", "description": "至少0.44.3版本。OCR识别摩拉数值输出到本地", "authors": [ { diff --git a/repo/js/ParametricTrans/main.js b/repo/js/ParametricTrans/main.js index 5d84eeb25..b33571b9c 100644 --- a/repo/js/ParametricTrans/main.js +++ b/repo/js/ParametricTrans/main.js @@ -38,6 +38,7 @@ var conuntcottimecomp=1; // 对整个区域进行 OCR var resList = captureRegion.findMulti(RecognitionObject.ocr(x,y,w,h)); + captureRegion.dispose(); //log.info("OCR 全区域识别结果数量 {len}", resList.count); if (resList.count !== 0) { for (let i = 0; i < resList.count; i++) @@ -83,7 +84,10 @@ const Imagidentify = RecognitionObject.TemplateMatch(file.ReadImageMatSync(filePath)); for (let ii = 0; ii < 10; ii++) { captureRegion = captureGameRegion(); // 获取一张截图 - res = captureRegion.DeriveCrop(xa, ya, wa, ha).Find(Imagidentify); + let dc = captureRegion.DeriveCrop(xa, ya, wa, ha); + let res = dc.Find(Imagidentify); + captureRegion.dispose(); + dc.dispose(); if (res.isEmpty()) { if (debugmodel===1 & xa===0 & ya===0){log.info("识别图片中")}; } else { diff --git a/repo/js/ParametricTrans/manifest.json b/repo/js/ParametricTrans/manifest.json index 36464ec56..c8aad61b7 100644 --- a/repo/js/ParametricTrans/manifest.json +++ b/repo/js/ParametricTrans/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "参量质变仪", - "version": "1.5", + "version": "1.6", "bgi_version": "0.44.0", "description": "参量质变仪自动化,请注意说明文件,如有BUG请联系作者QQ:119996800", "tags": [ diff --git a/repo/js/PurchaseArtifacts/main.js b/repo/js/PurchaseArtifacts/main.js index dc0f09ae2..ad568b8be 100644 --- a/repo/js/PurchaseArtifacts/main.js +++ b/repo/js/PurchaseArtifacts/main.js @@ -232,6 +232,7 @@ let userName = settings.userName || "默认账户"; async function checkFAlignment(fDialogueRo) { let ra = captureGameRegion(); let fRes = ra.find(fDialogueRo); + ra.dispose(); if (!fRes.isExist()) { let f_attempts = null; // 初始化尝试次数 while (f_attempts < 6) { // 最多尝试 5 次 @@ -257,6 +258,7 @@ let userName = settings.userName || "默认账户"; // 检查是否找到 F 图标 ra = captureGameRegion(); fRes = ra.find(fDialogueRo); // 重新查找 F 图标 + ra.dispose(); if (fRes.isExist()) { log.info("找到 F 图标"); break; // 找到后退出循环 @@ -279,6 +281,7 @@ let userName = settings.userName || "默认账户"; // 最多 F 5次 let captureRegion = captureGameRegion(); // 获取一张截图 let res = captureRegion.Find(shopDialogueRo); + captureRegion.dispose(); if (res.isEmpty()) { keyPress("F"); await sleep(1000); @@ -292,8 +295,9 @@ let userName = settings.userName || "默认账户"; // 进入商店界面 for (let i = 0; i < 5; i++) { // 最多 F 5次 - captureRegion = captureGameRegion(); // 获取一张截图 - res = captureRegion.Find(shopDialogueRo2); + let captureRegion = captureGameRegion(); // 获取一张截图 + let res = captureRegion.Find(shopDialogueRo2); + captureRegion.dispose(); if (res.isEmpty()) { keyPress("F"); await sleep(1000); @@ -309,8 +313,9 @@ let userName = settings.userName || "默认账户"; // 购买狗粮 for (let i = 0; i < 5; i++) { // 最多购买5次 - captureRegion = captureGameRegion(); // 获取一张截图 - res = captureRegion.Find(conFirmRo); + let captureRegion = captureGameRegion(); // 获取一张截图 + let res = captureRegion.Find(conFirmRo); + captureRegion.dispose(); if (res.isEmpty()) { log.info('圣遗物已售罄'); break; diff --git a/repo/js/TCGQuickProficiency/lib/ocr.js b/repo/js/TCGQuickProficiency/lib/ocr.js index 2d0964c21..874c9a7ee 100644 --- a/repo/js/TCGQuickProficiency/lib/ocr.js +++ b/repo/js/TCGQuickProficiency/lib/ocr.js @@ -36,11 +36,14 @@ async function waitForTextAppear(targetText, ocrRegion, timeout = 5000, retryInt } } catch (error) { log.warn(`页面标志识别失败,正在进行第 ${retryCount} 次重试...`); - } - retryCount++; // 增加重试计数 - if (retryCount > debugThreshold) { - let region = captureRegion.DeriveCrop(x, y, width, height); - region.DrawSelf("debug"); + } finally { + retryCount++; // 增加重试计数 + if (retryCount > debugThreshold) { + let region = captureRegion.DeriveCrop(x, y, width, height); + region.DrawSelf("debug"); + region.dispose(); + } + captureRegion.dispose(); } await sleep(retryInterval); } @@ -85,11 +88,14 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 5000, retr } } catch (error) { log.warn(`页面标志识别失败,正在进行第 ${retryCount} 次重试...`); - } - retryCount++; // 增加重试计数 - if (retryCount > debugThreshold) { - let region = captureRegion.DeriveCrop(x, y, width, height); - region.DrawSelf("debug"); + } finally { + retryCount++; // 增加重试计数 + if (retryCount > debugThreshold) { + let region = captureRegion.DeriveCrop(x, y, width, height); + region.DrawSelf("debug"); + region.dispose(); + } + captureRegion.dispose(); } await sleep(retryInterval); } diff --git a/repo/js/TCGQuickProficiency/main.js b/repo/js/TCGQuickProficiency/main.js index b2b2fb563..4c2c0a023 100644 --- a/repo/js/TCGQuickProficiency/main.js +++ b/repo/js/TCGQuickProficiency/main.js @@ -219,7 +219,9 @@ async function waitTpFinish(timeout = 30000) { await sleep(1000); //点击传送后等待一段时间避免误判 while (new Date() - startTime < timeout) { - let res = captureGameRegion().find(region); + let ro = captureGameRegion(); + let res = ro.find(region); + ro.dispose(); if (!res.isEmpty()) { await sleep(600); //传送结束后有僵直 return; @@ -237,6 +239,7 @@ async function teleportToTheCatsTail() { for (let i = 0; i < 5; i++) { const region = captureGameRegion(); const tarvern = region.find(tavernRo); + region.dispose(); clickIcon = tarvern.isExist() ? tarvern : region.find(adventurersRo); if (clickIcon.isExist()) { clickIcon.click(); @@ -257,12 +260,15 @@ async function getCurrentState() { let window = captureGameRegion(); const invite = window.find(RecognitionObject.ocr(1248, 688, 156, 36)); if (invite.text && invite.text.includes("我方出战牌组")) { + window.dispose(); return "邀请界面"; } const deck = window.find(RecognitionObject.ocr(1592, 186, 139, 35)); if (deck.text && deck.text.includes("更改牌组外观")) { + window.dispose(); return "牌组编辑器界面"; } + window.dispose(); return "任意界面"; } @@ -312,6 +318,7 @@ async function scanCardsProficiency(scanAll = false, getReward = false) { retry++; if (retry >= 3) { const skill = captureRegion.find(RecognitionObject.ocr(897, 441, 300, 58)); + captureRegion.dispose(); if (skill.text) { log.warn("OCR无法识别当前角色名称,使用技能名作为替代"); character = `?${skill.text.trim()}`; diff --git a/repo/js/TCGQuickProficiency/manifest.json b/repo/js/TCGQuickProficiency/manifest.json index e3aa75c17..c9fa3341a 100644 --- a/repo/js/TCGQuickProficiency/manifest.json +++ b/repo/js/TCGQuickProficiency/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "七圣召唤卡牌熟练度速刷", - "version": "1.1", + "version": "1.2", "bgi_version": "0.45.0", "description": "七圣召唤卡牌熟练度速刷", "authors": [ diff --git a/repo/js/TeyvatScanner/main.js b/repo/js/TeyvatScanner/main.js index 92361aab6..a60d43653 100644 --- a/repo/js/TeyvatScanner/main.js +++ b/repo/js/TeyvatScanner/main.js @@ -378,9 +378,11 @@ async function isCompassFree(totalAttempts = 3) { // 遍历所有图标路径 for (const icon of iconPaths) { // 使用图像识别方法查找图标 - const iconList = captureGameRegion().findMulti( + const ro = captureGameRegion(); + const iconList = ro.findMulti( RecognitionObject.TemplateMatch(file.ReadImageMatSync(icon.path)) ); + ro.dispose(); // 判断是否找到图标 if (iconList && iconList.count > 0) { @@ -418,9 +420,11 @@ async function isCompassFree(totalAttempts = 3) { // 遍历所有图标路径 for (const icon of iconPaths) { // 使用图像识别方法查找图标 - const iconList = captureGameRegion().findMulti( + const ro = captureGameRegion(); + const iconList = ro.findMulti( RecognitionObject.TemplateMatch(file.ReadImageMatSync(icon.path)) ); + ro.dispose(); // 判断是否找到图标 if (iconList && iconList.count > 0) { @@ -494,9 +498,11 @@ async function doTreasureExist(totalAttempts = 3) { // 遍历所有图标路径 for (const icon of iconPaths) { // 使用图像识别方法查找图标 - const iconList = captureGameRegion().findMulti( + const ro = captureGameRegion(); + const iconList = ro.findMulti( RecognitionObject.TemplateMatch(file.ReadImageMatSync(icon.path)) ); + ro.dispose(); // 判断是否找到图标 if (iconList && iconList.count > 0) { diff --git a/repo/js/TeyvatScanner/manifest.json b/repo/js/TeyvatScanner/manifest.json index d674962ab..e0854c7cb 100644 --- a/repo/js/TeyvatScanner/manifest.json +++ b/repo/js/TeyvatScanner/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "提瓦特扫描仪", - "version": "0.1", + "version": "0.2", "tags": [ "宝箱" ], diff --git a/repo/js/Tool_mint/main.js b/repo/js/Tool_mint/main.js index c7e39ce32..a2febc5dc 100644 --- a/repo/js/Tool_mint/main.js +++ b/repo/js/Tool_mint/main.js @@ -385,8 +385,12 @@ async function getMintCount() { keyPress("B"); await sleep(1500); let mintCount = 0; - let materials = captureGameRegion().find(MaterialsRo); - let materialsSelected = captureGameRegion().find(MaterialsSelectedRo); + let ro1 = captureGameRegion(); + let materials = ro1.find(MaterialsRo); + ro1.dispose(); + let ro2 = captureGameRegion(); + let materialsSelected = ro2.find(MaterialsSelectedRo); + ro2.dispose(); if (materials.isExist()) { materials.click(); await sleep(1500); @@ -395,9 +399,13 @@ async function getMintCount() { await sleep(1500); } for (let i = 0; i < 10; i++) { - let mint = captureGameRegion().find(MintRo); + let ro3 = captureGameRegion(); + let mint = ro3.find(MintRo); + ro3.dispose(); if (mint.isExist()) { - let resList = captureGameRegion().findMulti(RecognitionObject.ocr(mint.x, mint.y + mint.width, mint.Width, mint.Height)); + let ro4 = captureGameRegion(); + let resList = ro4.findMulti(RecognitionObject.ocr(mint.x, mint.y + mint.width, mint.Width, mint.Height)); + ro4.dispose(); for (let j = 0; j < resList.count; j++) { let mintResult = resList[j]; mintCount = parseInt(mintResult.text); @@ -409,7 +417,9 @@ async function getMintCount() { break; } } - let sliderBottom = captureGameRegion().find(SliderBottomRo); + let ro5 = captureGameRegion(); + let sliderBottom = ro5.find(SliderBottomRo); + ro5.dispose(); if (sliderBottom.isExist()) { click(Math.ceil(sliderBottom.x + sliderBottom.Width / 2), Math.ceil(sliderBottom.y + sliderBottom.Height + sliderBottom.Height / 2)); await moveMouseTo(0, 0); diff --git a/repo/js/Tool_mint/manifest.json b/repo/js/Tool_mint/manifest.json index 07f325ff3..375b02190 100644 --- a/repo/js/Tool_mint/manifest.json +++ b/repo/js/Tool_mint/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "薄荷采集", - "version": "2.3", + "version": "2.4", "bgi_version": "0.45.0", "description": "根据设置采集数量和执行时间自动采集薄荷", "authors": [ diff --git a/repo/js/TravelersTales/main.js b/repo/js/TravelersTales/main.js index 310e2cb81..51979feaf 100644 --- a/repo/js/TravelersTales/main.js +++ b/repo/js/TravelersTales/main.js @@ -167,7 +167,9 @@ let failed = false; continue; } const avatarName = name.split("-")[0]; - const isChar = captureGameRegion().findMulti(RecognitionObject.TemplateMatch(file.ReadImageMatSync(`assets/avatars/${avatarName}.png`))); + const ro = captureGameRegion(); + const isChar = ro.findMulti(RecognitionObject.TemplateMatch(file.ReadImageMatSync(`assets/avatars/${avatarName}.png`))); + ro.dispose(); if (isChar && isChar.count > 0) { pathingName = name; const pos = characterPositions.find(p => p.name === pathingName); @@ -302,7 +304,9 @@ async function find() { * @returns {Promise} 检测到的角色名字数组 */ async function locate() { - let character = await captureGameRegion().findMulti(RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/icon/三个点.png"))); + let ro1 = captureGameRegion(); + let character = await ro1.findMulti(RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/icon/三个点.png"))); + ro1.dispose(); await sleep(500); if (character && character.count > 0) { avatar = character[0]; @@ -318,7 +322,9 @@ async function locate() { await sleep(200); click(avatar.x + 20, avatar.y + 20); await sleep(2000); - let resList = captureGameRegion().findMulti(RecognitionObject.ocrThis); + let ro2 = captureGameRegion(); + let resList = ro2.findMulti(RecognitionObject.ocrThis); + ro2.dispose(); // 识别text中的角色名字 const characterNames = [ @@ -358,7 +364,13 @@ async function waitToMain(pathingName, hasKeyMouse = false) { const maxRetries = 60; // 设置最大重试次数以防止无限循环 let retries = 0; let enteredLoop = false; - while (captureGameRegion().Find(paimonMenuRo).isEmpty()) { + while (true) { + const ro = captureGameRegion(); + const isEmpty = ro.Find(paimonMenuRo).isEmpty(); + ro.dispose(); + if (!isEmpty) { + break; + } enteredLoop = true; if (retries >= maxRetries) { log.error("返回主界面超时"); diff --git a/repo/js/TravelersTales/manifest.json b/repo/js/TravelersTales/manifest.json index cc2de969d..864aec19b 100644 --- a/repo/js/TravelersTales/manifest.json +++ b/repo/js/TravelersTales/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "游逸旅闻", - "version": "0.1.4", + "version": "0.1.5", "bgi_version": "0.45.1", "description": "自动游逸旅闻", "authors": [ diff --git a/repo/js/WeeklyBoss/manifest.json b/repo/js/WeeklyBoss/manifest.json index ed2546db6..c9257dcfc 100644 --- a/repo/js/WeeklyBoss/manifest.json +++ b/repo/js/WeeklyBoss/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "周本一条龙", - "version": "3.1.1", + "version": "3.1.2", "description": "https://www.bilibili.com/video/BV1F2uvz3E4K/?vd_source=9dfaf88af48ecc0ff95a41f1145af7a2", "authors": [ { diff --git a/repo/js/WeeklyBoss/utils.js b/repo/js/WeeklyBoss/utils.js index cc8081640..4417a816f 100644 --- a/repo/js/WeeklyBoss/utils.js +++ b/repo/js/WeeklyBoss/utils.js @@ -52,6 +52,8 @@ const repeatOperationUntilTextFound = async ({ // 2. 执行OCR识别 const ocrResult = textArea.find(RecognitionObject.ocrThis); + captureRegion.dispose(); + textArea.dispose(); const hasAnyText = ocrResult.text.trim().length > 0; const matchesTarget = targetText === null @@ -64,7 +66,7 @@ const repeatOperationUntilTextFound = async ({ if (ifClick) click(Math.round(x + width / 2), Math.round(y + height / 2)); return true; } - + // 4. 检查步数限制 if (stepsTaken >= maxSteps) { throw new Error(`检查次数超过最大限制: ${maxSteps},未查询到文字"${targetText}"`); @@ -121,7 +123,9 @@ let challengeTime = 0; await sleep(500); leftButtonClick(); await sleep(100); - let res = captureGameRegion().find(RecognitionObject.ocr(840, 935, 230, 40)); + const ro = captureGameRegion(); + let res = ro.find(RecognitionObject.ocr(840, 935, 230, 40)); + ro.dispose(); if (res.text.includes("自动退出")) { log.info("检测到挑战成功"); return; @@ -154,13 +158,14 @@ async function tpEndDetection() { let capture = captureGameRegion(); let res1 = capture.find(region1); let res2 = capture.find(region2); + capture.dispose(); if (!res1.isEmpty()|| !res2.isEmpty()){ log.info("传送完成"); await sleep(1000);//传送结束后有僵直 click(960, 810);//点击任意处 await sleep(500); return; - } + } tpTime++; await sleep(100); } diff --git a/repo/js/YNF-AutoEat/main.js b/repo/js/YNF-AutoEat/main.js index 022fbac89..9a43d2793 100644 --- a/repo/js/YNF-AutoEat/main.js +++ b/repo/js/YNF-AutoEat/main.js @@ -152,6 +152,7 @@ var conuntcottimecomp = 1; // 对整个区域进行 OCR var resList = captureRegion.findMulti(RecognitionObject.ocr(x, y, w, h)); + captureRegion.dispose(); //log.info("OCR 全区域识别结果数量 {len}", resList.count); if (resList.count !== 0) { for (let i = 0; i < resList.count; i++) { // 遍历的是 C# 的 List 对象,所以要用 count,而不是 length diff --git a/repo/js/YNF-AutoEat/manifest.json b/repo/js/YNF-AutoEat/manifest.json index 31bf5b20a..e2146be24 100644 --- a/repo/js/YNF-AutoEat/manifest.json +++ b/repo/js/YNF-AutoEat/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "伊涅芙の自助餐", - "version": "1.5", + "version": "1.6", "tags": [ "伊涅芙", "调味品" diff --git a/repo/js/一条龙领奖无树脂(用于周本、首领刷取)+尘歌壶/main.js b/repo/js/一条龙领奖无树脂(用于周本、首领刷取)+尘歌壶/main.js index 8d888b41e..d77f5afb0 100644 --- a/repo/js/一条龙领奖无树脂(用于周本、首领刷取)+尘歌壶/main.js +++ b/repo/js/一条龙领奖无树脂(用于周本、首领刷取)+尘歌壶/main.js @@ -9,6 +9,7 @@ while (tpTime < 300) { let capture = captureGameRegion(); let res = capture.find(region); + capture.dispose(); if (!res.isEmpty()) { log.info("传送完成"); await sleep(1200); // 传送结束后有僵直 diff --git a/repo/js/一条龙领奖无树脂(用于周本、首领刷取)+尘歌壶/manifest.json b/repo/js/一条龙领奖无树脂(用于周本、首领刷取)+尘歌壶/manifest.json index b5ac24ad0..14273b1d5 100644 --- a/repo/js/一条龙领奖无树脂(用于周本、首领刷取)+尘歌壶/manifest.json +++ b/repo/js/一条龙领奖无树脂(用于周本、首领刷取)+尘歌壶/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "无树脂每日领奖", - "version": "1.3", + "version": "1.4", "description": "完成周本或首领讨伐等不使用浓缩树脂的副本挑战后,切换好感队前往凯瑟琳领奖、派遣、纪行、尘歌壶。如果是周一会在尘歌壶自动购买树脂", "authors": [ { diff --git a/repo/js/七圣召唤七日历练全自动/main.js b/repo/js/七圣召唤七日历练全自动/main.js index 36ba53cce..475ed5945 100644 --- a/repo/js/七圣召唤七日历练全自动/main.js +++ b/repo/js/七圣召唤七日历练全自动/main.js @@ -26,6 +26,7 @@ async function dragTemplateToPosition(templatePath, targetX, targetY, maxAttempt // 捕获游戏区域并查找模板 const captureRegion = captureGameRegion(); let foundRegion = captureRegion.find(templateRo); + captureRegion.dispose(); if (foundRegion.isEmpty()) { log.warn(`第 ${attempt + 1} 次尝试: 未找到模板图片 ${templatePath}`); @@ -51,12 +52,14 @@ async function dragTemplateToPosition(templatePath, targetX, targetY, maxAttempt await sleep(500); moveMouseTo(50, 50);//移动鼠标位置,避免检测失败 await sleep(400); - foundRegion = captureGameRegion().Find(templateRo); + const ro2 = captureGameRegion(); + foundRegion = ro2.Find(templateRo); + ro2.dispose(); log.info(`模板图片拖动后位置: (${foundRegion.x}, ${foundRegion.y})`); - if(Math.abs(foundRegion.x - targetX) < 3 && Math.abs(foundRegion.y - targetY) < 3){ - log.info("拖动操作完成"); - return true; - } + if( Math.abs(foundRegion.x - targetX) < 3 && Math.abs(foundRegion.y - targetY ) < 3) { + log.info("拖动操作完成"); + return true; + } } catch (error) { log.error(`第 ${attempt + 1} 次尝试时发生错误: ${error}`); @@ -98,6 +101,7 @@ async function switchCardTeam(Name, shareCode) { break; } } + captureRegion.dispose(); } if (teamName.text != Name || settings.overwritePartyName == Name) { @@ -118,6 +122,7 @@ async function switchCardTeam(Name, shareCode) { if (Name !== settings.defaultPartyName && shareCode) { captureRegion = captureGameRegion(); let res = captureRegion.find(RecognitionObject.ocr(1140, 732, 83, 55)); + captureRegion.dispose(); if (res.text === "确认") { res.click(); } else { @@ -139,6 +144,7 @@ async function switchCardTeam(Name, shareCode) { await stopNow(); captureRegion = captureGameRegion(); res = captureRegion.find(RecognitionObject.ocr(770, 516, 381, 43)); + captureRegion.dispose(); if (res.text.includes("无法出战")) { log.error(res.text); userDefault = true; @@ -288,6 +294,7 @@ async function checkChallengeResults() { const region2 = RecognitionObject.ocr(1520, 170, 160, 40); // 退出位置 let capture = captureGameRegion(); let res1 = capture.find(region1); + capture.dispose(); let success = false; log.info(`结果识别:${res1.text}`); if (res1.text.includes("对局失败")) { @@ -312,7 +319,9 @@ async function checkChallengeResults() { await sleep(500); click(1860, 50); //点击齿轮图标 await sleep(1000); - let res2 = captureGameRegion().find(region2); + let ro2 = captureGameRegion(); + let res2 = ro2.find(region2); + ro2.dispose(); if (res2.text.includes("设置")) click(1600, 260); //点击退出-选项4 else click(1600, 200); //点击退出-选项3 await sleep(1000); @@ -335,7 +344,9 @@ async function autoConversation() { log.info("准备开始对话"); //最多10次对话 while (talkTime < 30) { - let talk = captureGameRegion().find(talkRo); + let ro = captureGameRegion(); + let talk = ro.find(talkRo); + ro.dispose(); if (talk.isExist()) { await sleep(300); keyPress("VK_SPACE"); @@ -362,6 +373,7 @@ async function tpEndDetection() { while (tpTime < 300) { let capture = captureGameRegion(); let res = capture.find(region); + capture.dispose(); if (!res.isEmpty()) { log.info("传送完成"); await sleep(1200); //传送结束后有僵直 @@ -409,6 +421,8 @@ const detectCardPlayer = async () => { // 在裁剪区域中查找卡片 const result = cropRegion.Find(cardPlayerRo); + captureRegion.dispose(); + cropRegion.dispose(); // 如果找到卡片 if (!result.IsEmpty()) { @@ -461,6 +475,7 @@ async function captureAndStoreTexts() { // 在指定区域进行OCR识别 const result = captureRegion.find(ocrRo); let res2 = captureRegion.find(ocrRo2); + captureRegion.dispose(); if (!result.isEmpty() && result.text) { // 存储识别结果和对应位置 if (res2.isExist()) { @@ -678,6 +693,7 @@ async function clickTextInRegion(targetText, x, y, width, height, options = {}) // 在限定区域内进行OCR识别 const results = captureRegion.findMulti(ocrRo); + captureRegion.dispose(); // 遍历OCR结果 for (let i = 0; i < results.count; i++) { @@ -708,7 +724,7 @@ async function clickTextInRegion(targetText, x, y, width, height, options = {}) res.clickTo(0, 0); log.info(`已点击文字偏移位置: "${targetText}"`); } - + return true; } @@ -748,7 +764,9 @@ async function gotoTavern() { click(1000, 645); //猫尾酒馆 await sleep(600); - let tavern = captureGameRegion().find(tavernRo); + let ro = captureGameRegion(); + let tavern = ro.find(tavernRo); + ro.dispose(); if (tavern.isExist()) { tavern.click(); await sleep(500); diff --git a/repo/js/七圣召唤七日历练全自动/manifest.json b/repo/js/七圣召唤七日历练全自动/manifest.json index e50c7129d..641015e67 100644 --- a/repo/js/七圣召唤七日历练全自动/manifest.json +++ b/repo/js/七圣召唤七日历练全自动/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "打牌一条龙", - "version": "2.10", + "version": "2.11", "description": "完成每周的七圣召唤七日历练(来客挑战)。详见README.md", "tags": [ "七圣召唤" diff --git a/repo/js/七圣召唤角色邀约全自动/main.js b/repo/js/七圣召唤角色邀约全自动/main.js index 1d47613f4..222ead1ce 100644 --- a/repo/js/七圣召唤角色邀约全自动/main.js +++ b/repo/js/七圣召唤角色邀约全自动/main.js @@ -13,6 +13,7 @@ async function tpEndDetection() { while (tpTime < 300) { let capture = captureGameRegion(); let res = capture.find(region); + capture.dispose(); if (!res.isEmpty()) { log.info("传送完成"); await sleep(1200); //传送结束后有僵直 @@ -92,7 +93,9 @@ async function autoConversation() { log.info("开始对话"); //最多10次对话 while (talkTime < 30) { - let talk = captureGameRegion().find(talkRo); + let ro = captureGameRegion(); + let talk = ro.find(talkRo); + ro.dispose(); if (talk.isExist()) { await sleep(300); keyPress("VK_SPACE"); @@ -128,7 +131,9 @@ async function gotoTavern() { click(1000, 645); //猫尾酒馆 await sleep(600); - let tavern = captureGameRegion().find(tavernRo); + let ro = captureGameRegion(); + let tavern = ro.find(tavernRo); + ro.dispose(); if (tavern.isExist()) { tavern.click(); await sleep(500); diff --git a/repo/js/七圣召唤角色邀约全自动/manifest.json b/repo/js/七圣召唤角色邀约全自动/manifest.json index 8750b897e..e95c3594e 100644 --- a/repo/js/七圣召唤角色邀约全自动/manifest.json +++ b/repo/js/七圣召唤角色邀约全自动/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "七圣召唤角色邀请全自动", - "version": "1.1", + "version": "1.2", "description": "挑战前请选好卡组并设好js脚本参数,最少持有一张邀请函或1000牌币!!!建议先手动买,避免一些Bug", "tags": [ "七圣召唤" diff --git a/repo/js/全队自动回满大招能量/main.js b/repo/js/全队自动回满大招能量/main.js index 7722aeffd..6edd1abde 100644 --- a/repo/js/全队自动回满大招能量/main.js +++ b/repo/js/全队自动回满大招能量/main.js @@ -12,6 +12,7 @@ async function tpEndDetection() { let capture = captureGameRegion(); let res1 = capture.find(region1); let res2 = capture.find(region2); + capture.dispose(); if (!res1.isEmpty() || !res2.isEmpty()){ log.info("传送完成"); await sleep(1000);//传送结束后有僵直 @@ -79,6 +80,8 @@ const repeatOperationUntilTextFound = async ({ // 2. 执行OCR识别 const ocrResult = textArea.find(RecognitionObject.ocrThis); + captureRegion.dispose(); + textArea.dispose(); const hasAnyText = ocrResult.text.trim().length > 0; const matchesTarget = targetText === null @@ -91,7 +94,7 @@ const repeatOperationUntilTextFound = async ({ if (ifClick) click(Math.round(x + width / 2), Math.round(y + height / 2)); return true; } - + // 4. 检查步数限制 if (stepsTaken >= maxSteps) { throw new Error(`检查次数超过最大限制: ${maxSteps},未查询到文字"${targetText}"`); @@ -148,7 +151,9 @@ let challengeTime = 0; await sleep(500); leftButtonClick(); await sleep(100); - let res = captureGameRegion().find(RecognitionObject.ocr(840, 935, 230, 40)); + const ro = captureGameRegion(); + let res = ro.find(RecognitionObject.ocr(840, 935, 230, 40)); + ro.dispose(); if (res.text.includes("自动退出")) { log.info("检测到挑战成功"); return; diff --git a/repo/js/全队自动回满大招能量/manifest.json b/repo/js/全队自动回满大招能量/manifest.json index b10da0c25..1e7c3b054 100644 --- a/repo/js/全队自动回满大招能量/manifest.json +++ b/repo/js/全队自动回满大招能量/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "大招能量一键拉满", - "version": "1.5", + "version": "1.6", "description": "需要开启璃月远古副本,可选择指定队伍", "authors": [ { diff --git a/repo/js/切换画质/main.js b/repo/js/切换画质/main.js index daa14d043..af2bb9bcf 100644 --- a/repo/js/切换画质/main.js +++ b/repo/js/切换画质/main.js @@ -32,7 +32,9 @@ async function recognizeAndClick(recognitionObject, iconName, timeout = 5000) { recognitionObject.threshold = 0.85; // 设置识别阈值为 0.85 // recognitionObject.Use3Channels = true; // 使用三通道匹配,可能会受原神Bloom自带饱和度影响 - let imageResult = captureGameRegion().find(recognitionObject); + const ro = captureGameRegion(); + let imageResult = ro.find(recognitionObject); + ro.dispose(); if (imageResult) { // 计算中心坐标 let centerX = imageResult.x + imageResult.width / 2; @@ -68,7 +70,9 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 5000) { while (Date.now() - startTime < timeout) { try { // 尝试 OCR 识别 - let resList = captureGameRegion().findMulti(RecognitionObject.ocr(ocrRegion.x, ocrRegion.y, ocrRegion.width, ocrRegion.height)); // 指定识别区域 + const ro = captureGameRegion(); + let resList = ro.findMulti(RecognitionObject.ocr(ocrRegion.x, ocrRegion.y, ocrRegion.width, ocrRegion.height)); // 指定识别区域 + ro.dispose(); // 遍历识别结果,检查是否找到目标文本 for (let res of resList) { // 后处理:根据替换映射表检查和替换错误识别的字符 diff --git a/repo/js/切换画质/manifest.json b/repo/js/切换画质/manifest.json index 8e89a6d0f..c55b23187 100644 --- a/repo/js/切换画质/manifest.json +++ b/repo/js/切换画质/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "选择画质", - "version": "2.1.1", + "version": "2.1.2", "description": "0.6或1.0精度切换,增加识图定位,增加画质、动态模糊、Bloom选项,", "tags": [ "画质", diff --git a/repo/js/切换账号(OCR)版本/main.js b/repo/js/切换账号(OCR)版本/main.js index 515e30b8b..2cc2faa9f 100644 --- a/repo/js/切换账号(OCR)版本/main.js +++ b/repo/js/切换账号(OCR)版本/main.js @@ -54,7 +54,9 @@ async function matchImgAndClick(obj, desc, timeout = 8000) { try { while (Date.now() - start < timeout && !status) { await sleep(300); - let result = captureGameRegion().Find(obj.template); + const ro = captureGameRegion(); + let result = ro.Find(obj.template); + ro.dispose(); await sleep(500); // 短暂延迟,避免过快循环 if (result.isExist()) { let clickResult = await clickCenter(result.x, result.y, result.width, result.height); @@ -79,7 +81,9 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) { let status = false; // 用于记录是否匹配成功 try { while (Date.now() - start < timeout && !status) { - let resultList = captureGameRegion().findMulti(ocrRegion); + const ro = captureGameRegion(); + let resultList = ro.findMulti(ocrRegion); + ro.dispose(); await sleep(500); // 短暂延迟,避免过快循环 for (let result of resultList) { if (result.text.includes(targetText)) { @@ -148,7 +152,9 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 8000) { await matchImgAndClick(agree,"同意用户协议"); //如果当天上下线次数过于频繁 for(let i = 1;i<=2;i++){ - let verify = captureGameRegion().Find(login_verification.template); + const ro = captureGameRegion(); + let verify = ro.Find(login_verification.template); + ro.dispose(); //等待1s避免循环速度过快 await sleep(1000); if (verify.isExist()) { diff --git a/repo/js/切换账号(OCR)版本/manifest.json b/repo/js/切换账号(OCR)版本/manifest.json index 4d4423e00..53f961f90 100644 --- a/repo/js/切换账号(OCR)版本/manifest.json +++ b/repo/js/切换账号(OCR)版本/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "切换账号(OCR)版本", - "version": "1.2", + "version": "1.3", "description": "使用OCR实现:从主页面退出登录实现切换选定账号。脚本维护/脚本问题请联系作者。\n免责申明:所有的账号密码均保存在本地,请使用者妥善保管账号密码,请勿外泄账号密码。若因使用此脚本导致的账号泄露、封禁问题与脚本作者无关。", "tags": [ "切换账号", diff --git a/repo/js/切换账号Dropdown/main.js b/repo/js/切换账号Dropdown/main.js index 463c7629c..8cbdf4dc9 100644 --- a/repo/js/切换账号Dropdown/main.js +++ b/repo/js/切换账号Dropdown/main.js @@ -59,6 +59,7 @@ while (Date.now() < endTime) { let captureRegion = captureGameRegion(); let res = captureRegion.Find(asset); + captureRegion.dispose(); if (!res.isEmpty()) { return res; } @@ -77,6 +78,7 @@ while (true) { let captureRegion = captureGameRegion(); let resList = captureRegion.findMulti(RecognitionObject.ocr(x, y, w, h)); + captureRegion.dispose(); if (typeof text === "string") { let textFound = u.findText(resList, text); if (textFound) { @@ -124,6 +126,7 @@ let captureRegion = captureGameRegion(); let resList = captureRegion.findMulti(RecognitionObject.ocrThis); + captureRegion.dispose(); for (let i = 0; i < resList.count; i++) { let res = resList[i]; @@ -138,6 +141,7 @@ let captureRegionGetReward = captureGameRegion(); let resGetReward = captureRegionGetReward.findMulti(RecognitionObject.ocrThis); + captureRegionGetReward.dispose(); for (let i = 0; i < resGetReward.count; i++) { let res = resGetReward[i]; if (res.text.includes("点击") || res.text.includes("空白") || res.text.includes("获得")) { @@ -158,6 +162,7 @@ if (logoutIconFound) { let resList = captureRegion.findMulti(RecognitionObject.ocr(u.x(850), u.y(970), u.x(220), u.y(100))); + captureRegion.dispose(); if (u.findText(resList, "点击进入")) { u.logi("检测到目前处于登录界面"); return false; @@ -169,6 +174,7 @@ // Not in the login screen, check if is in the game main menu. let paimonIcon = captureRegion.Find(assetPaimonMenuIcon); + captureRegion.dispose(); if (!paimonIcon.isEmpty()) { u.logi("检测到目前处于游戏主界面"); return true; @@ -236,6 +242,7 @@ const assetSelectUserDropDownIcon = u.loadTemplate("assets/caret.png", 680, 380, 1220, 720); let captureRegion = captureGameRegion(); let res = captureRegion.Find(assetSelectUserDropDownIcon); + captureRegion.dispose(); if (res.isEmpty()) { u.logi("未找到下拉菜单图标,点击硬编码的坐标(960, 500)展开菜单"); click(u.x(960), u.y(500)); @@ -255,6 +262,7 @@ let captureRegion = captureGameRegion(); let resList = captureRegion.findMulti(RecognitionObject.ocr(u.x(680), u.y(540), u.x(540), u.y(500))); + captureRegion.dispose(); for (let i = 0; i < resList.count; i++) { let res = resList[i]; let user = lastLog > start ? u.matchUserRelaxed(res.text, targetUser) : u.matchUser(res.text, targetUser); @@ -285,6 +293,8 @@ let captureRegion = captureGameRegion(); let btnEnterGame = captureRegion.DeriveCrop(u.x(684), u.y(598), u.x(552), u.y(66)); btnEnterGame.Click(); + captureRegion.dispose(); + btnEnterGame.dispose(); // btnEnterGame.DrawSelf("EnterGameBtn"); // u.logi("已点击\"进入游戏\"按钮,完成账号选择。"); } diff --git a/repo/js/切换账号Dropdown/manifest.json b/repo/js/切换账号Dropdown/manifest.json index 35fb9910c..f6d9edecd 100644 --- a/repo/js/切换账号Dropdown/manifest.json +++ b/repo/js/切换账号Dropdown/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "切换账号(从下拉列表中选择)", - "version": "1.1", + "version": "1.2", "bgi_version": "0.49.0", "description": "退出当前登录用户并从列表中选定指定用户,纯鼠标操作。", "tags": [ diff --git a/repo/js/尘歌壶一条龙/main.js b/repo/js/尘歌壶一条龙/main.js index 19647a4e9..d61bd6459 100644 --- a/repo/js/尘歌壶一条龙/main.js +++ b/repo/js/尘歌壶一条龙/main.js @@ -171,6 +171,7 @@ async function exchangeItems() { // 使用OCR识别物品名称 let ocrRo = RecognitionObject.Ocr(0, 0, targetRegion.Width, targetRegion.Height); let ocrResult = targetRegion.find(ocrRo); + targetRegion.dispose(); if (ocrResult.isEmpty()) { throw new Error("无法识别物品名称,请检查具体原因"); @@ -188,6 +189,8 @@ async function exchangeItems() { let soldOutRegion = screen.DeriveCrop(1308, 403, 491, 100); let soldOutOcrRo = RecognitionObject.Ocr(0, 0, soldOutRegion.Width, soldOutRegion.Height); let soldOutResult = soldOutRegion.find(soldOutOcrRo); + screen.dispose(); + soldOutRegion.dispose(); // 如果发现任何已售罄的物品,就认为所有可购买的物品都已检查过,结束搜索 log.debug(`识别到的文字: ${soldOutResult.Text}`) @@ -303,6 +306,8 @@ async function waitForEnteringSereniteaPot() { let targetRegion = screen.DeriveCrop(85, 1025, 69, 28); let ocrRo = RecognitionObject.Ocr(0, 0, targetRegion.Width, targetRegion.Height); let ocrResult = targetRegion.find(ocrRo); + screen.dispose(); + targetRegion.dispose(); if (ocrResult.Text.toLowerCase().includes("enter")) { isEntering = false; } @@ -371,18 +376,22 @@ async function findSereniteaPot() { // 使用OCR识别 let ocrRo = RecognitionObject.Ocr(0, 0, targetRegion.Width, targetRegion.Height); let ocrResult = targetRegion.find(ocrRo); + screen.dispose(); + targetRegion.dispose(); if (!ocrResult.isEmpty() && ocrResult.Text.includes("尘歌壶")) { // 点击指定坐标 click(1690, 1020); await sleep(1000); // 检查一下背包页面是否退出了,有可能当前角色状态没法放置尘歌壶,直接再判断一次截图区域文本是不是尘歌壶就行 - let screen = captureGameRegion(); + let screen2 = captureGameRegion(); // 根据指定区域进行剪裁 - let targetRegion = screen.DeriveCrop(1307, 119, 493, 55); - let ocrRo = RecognitionObject.Ocr(0, 0, targetRegion.Width, targetRegion.Height); - let ocrResult = targetRegion.find(ocrRo); - if (!ocrResult.isEmpty() && ocrResult.Text.includes("尘歌壶")) { + let targetRegion2 = screen2.DeriveCrop(1307, 119, 493, 55); + let ocrRo2 = RecognitionObject.Ocr(0, 0, targetRegion2.Width, targetRegion2.Height); + let ocrResult2 = targetRegion2.find(ocrRo2); + screen2.dispose(); + targetRegion2.dispose(); + if (!ocrResult2.isEmpty() && ocrResult2.Text.includes("尘歌壶")) { throw new Error("当前无法放置尘歌壶,请检查具体原因"); } return; diff --git a/repo/js/尘歌壶一条龙/manifest.json b/repo/js/尘歌壶一条龙/manifest.json index d2ba427bb..77ba4e3d1 100644 --- a/repo/js/尘歌壶一条龙/manifest.json +++ b/repo/js/尘歌壶一条龙/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "尘歌壶一条龙", - "version": "1.0", + "version": "1.1", "description": "自动放置并进入尘歌壶,寻找阿圆,领取洞天宝钱和好感,做饭,锻造(需要配置进入尘歌壶以后的路线),支持自动购买指定物品。推荐洞天摹数81708444664", "authors": [ { diff --git a/repo/js/恢复默认键位设置/main.js b/repo/js/恢复默认键位设置/main.js index 7368b935f..a0ddaa3f9 100644 --- a/repo/js/恢复默认键位设置/main.js +++ b/repo/js/恢复默认键位设置/main.js @@ -9,7 +9,9 @@ const RestoreButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("R keyPress("ESCAPE"); await sleep(2000); - let SettingsButton = captureGameRegion().find(SettingsButtonRo); + const ro1 = captureGameRegion(); + let SettingsButton = ro1.find(SettingsButtonRo); + ro1.dispose(); if (SettingsButton.isExist()) { log.info("识别到设置按钮"); SettingsButton.click(); @@ -17,23 +19,27 @@ const RestoreButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("R let captureRegion = captureGameRegion(); let resList = captureRegion.findMulti(RecognitionObject.ocr(100, 100, 300, 300)); + captureRegion.dispose(); for (let i = 0; i < resList.count; i++) { let res = resList[i]; if (res.text.includes("Key") || res.text.includes("Bindings") || res.text.includes("按键") || res.text.includes("按鍵")) { res.click(); await sleep(2000); - let RestoreButton = captureGameRegion().find(RestoreButtonRo); + const ro2 = captureGameRegion(); + let RestoreButton = ro2.find(RestoreButtonRo); + ro2.dispose(); if (RestoreButton.isExist()) { log.info("识别到恢复默认按钮"); RestoreButton.click(); await sleep(1500); - let captureRegion = captureGameRegion(); - let resList = captureRegion.findMulti(RecognitionObject.ocr(1000, 720, 340, 60)); - for (let i = 0; i < resList.count; i++) { - let res = resList[i]; + let captureRegion2 = captureGameRegion(); + let resList2 = captureRegion2.findMulti(RecognitionObject.ocr(1000, 720, 340, 60)); + captureRegion2.dispose(); + for (let i = 0; i < resList2.count; i++) { + let res = resList2[i]; if (res.text.includes("确认")) { log.info("识别到确认按钮"); res.click(); diff --git a/repo/js/恢复默认键位设置/manifest.json b/repo/js/恢复默认键位设置/manifest.json index 684e2d92c..1355193e0 100644 --- a/repo/js/恢复默认键位设置/manifest.json +++ b/repo/js/恢复默认键位设置/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "恢复默认键位", - "version": "1.0", + "version": "1.1", "bgi_version": "0.45.0", "description": "用于恢复默认键位", "authors": [ diff --git a/repo/js/批量讨伐角色养成材料BOSS/manifest.json b/repo/js/批量讨伐角色养成材料BOSS/manifest.json index cc949f5ce..93ecaa4be 100644 --- a/repo/js/批量讨伐角色养成材料BOSS/manifest.json +++ b/repo/js/批量讨伐角色养成材料BOSS/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "批量讨伐角色养成材料BOSS", - "version": "0.3", + "version": "0.4", "description": "一次性配置多个角色材料的boss,体力不足时保存进度,每次运行时断点续打。\n\n感谢boss地图追踪作者:@柒叶子@Tool_tingsu,\n\n感谢 @柒叶子【首领讨伐一条龙 - 首领连续讨伐】的地脉花寻路的代码实现 \n\n感谢@wjdsg @Tool_tingsu【纪行周常-10个boss一条龙】循环讨伐的代码实现", "authors": [ { diff --git a/repo/js/批量讨伐角色养成材料BOSS/reward.js b/repo/js/批量讨伐角色养成材料BOSS/reward.js index 6cef7e1d2..ec9188c3b 100644 --- a/repo/js/批量讨伐角色养成材料BOSS/reward.js +++ b/repo/js/批量讨伐角色养成材料BOSS/reward.js @@ -18,7 +18,7 @@ async function autoNavigateToReward() { let captureRegion = captureGameRegion(); let rewardTextArea = captureRegion.DeriveCrop(1210, 515, 200, 50); let rewardResult = rewardTextArea.find(RecognitionObject.ocrThis); - captureRegion.Dispose(); + captureRegion.dispose(); rewardTextArea.Dispose(); // 检测到特点文字则结束!!! if (rewardResult.text == "接触征讨之花") { @@ -34,7 +34,7 @@ async function autoNavigateToReward() { let iconRes = captureRegion.Find(boxIconRo); let climbTextArea = captureRegion.DeriveCrop(1686, 1030, 60, 23); let climbResult = climbTextArea.find(RecognitionObject.ocrThis); - captureRegion.Dispose(); + captureRegion.dispose(); climbTextArea.Dispose(); // 检查是否处于攀爬状态 if (climbResult.text.toLowerCase() === "space") { @@ -81,32 +81,37 @@ async function takeReward(isClaimFailed) { const mainUiRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/mainUi.png")); for (let attempt = 1; attempt <= 100; attempt++) { log.debug(`尝试领取奖励,第${attempt}次`); - captureRegion = captureGameRegion(); + let captureRegion = captureGameRegion(); // 点击F领取Boss地脉花 log.debug("尝试接触征讨之花"); let rewardTextArea = captureRegion.DeriveCrop(1210, 515, 200, 50); let rewardResult = rewardTextArea.find(RecognitionObject.ocrThis); + rewardTextArea.dispose(); if (rewardResult.text === "接触征讨之花" && isClaimFailed == false) { keyPress("F"); await sleep(1000); + captureRegion.dispose(); captureRegion = captureGameRegion(); } // 使用脆弱树脂领取奖励 let useTextArea = captureRegion.DeriveCrop(850, 740, 250, 35); let useResult = useTextArea.find(RecognitionObject.ocrThis); + useTextArea.dispose(); log.debug("领取奖励检测到文字: " + useResult.text); if (useResult.text.includes("补充")) { log.info("脆弱树脂不足,跳过领取"); click(1345, 300); await sleep(1000); + captureRegion.dispose(); captureRegion = captureGameRegion(); isClaimFailed = true; } else if (useResult.text.includes("使用")) { log.info("使用脆弱树脂领取奖励"); click(useResult.x, useResult.y); + captureRegion.dispose(); captureRegion = captureGameRegion(); await sleep(3000); } @@ -114,10 +119,12 @@ async function takeReward(isClaimFailed) { // 关闭奖励界面 let closeRewardUi = captureRegion.DeriveCrop(860, 970, 200, 28); let closeResult = closeRewardUi.find(RecognitionObject.ocrThis); + closeRewardUi.dispose(); log.debug("底部检测到文字: " + closeResult.text); if (closeResult.text.includes("点击")){ click(975, 1000);//点击空白区域 await sleep(1000); + captureRegion.dispose(); captureRegion = captureGameRegion(); } @@ -125,9 +132,10 @@ async function takeReward(isClaimFailed) { let inMainUi = captureRegion.Find(mainUiRo); if (inMainUi.x > 0 && !useResult.text.includes("树脂")) { log.debug("回到主界面"); + captureRegion.dispose(); return isClaimFailed; } - captureRegion.Dispose(); + captureRegion.dispose(); rewardTextArea.Dispose(); useTextArea.Dispose(); closeRewardUi.Dispose(); diff --git a/repo/js/提瓦特百货商店/main.js b/repo/js/提瓦特百货商店/main.js index 91b8e9153..6261523a1 100644 --- a/repo/js/提瓦特百货商店/main.js +++ b/repo/js/提瓦特百货商店/main.js @@ -330,7 +330,9 @@ function recognizeImage(templatePath, xMin, yMin, width, height, timeout = 2000) try { let template = file.ReadImageMatSync(templatePath); let recognitionObject = RecognitionObject.TemplateMatch(template, xMin, yMin, width, height); - let result = captureGameRegion().find(recognitionObject); + let ro = captureGameRegion(); + let result = ro.find(recognitionObject); + ro.dispose(); if (result.isExist()) { return { success: true, x: result.x, y: result.y, width: result.width, height: result.height }; } @@ -360,6 +362,7 @@ function performOcr(targetText, xRange, yRange, tolerance, timeout = 2000) { adjustedXMin, adjustedYMin, adjustedXMax - adjustedXMin, adjustedYMax - adjustedYMin )); + ra.dispose(); // 遍历识别结果,检查是否找到目标文本 for (let i = 0; i < resList.count; i++) { diff --git a/repo/js/提瓦特百货商店/manifest.json b/repo/js/提瓦特百货商店/manifest.json index 5565a0352..9f8a61f63 100644 --- a/repo/js/提瓦特百货商店/manifest.json +++ b/repo/js/提瓦特百货商店/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "提瓦特百货商店", - "version": "1.0", + "version": "1.1", "bgi_version": "0.45.1", "description": "提瓦特百货商店,带你买遍提瓦特。目前项目正处于开发阶段缺测试开发人手,有意者可加1037185748。感谢芝麻糊、WQ的测试协力", "authors": [ diff --git a/repo/js/料理制作及食材加工/main.js b/repo/js/料理制作及食材加工/main.js index a942f44ed..7fc6e26a5 100644 --- a/repo/js/料理制作及食材加工/main.js +++ b/repo/js/料理制作及食材加工/main.js @@ -42,6 +42,7 @@ let ra = captureGameRegion(); let fRes = ra.find(fDialogueRo); + ra.dispose(); if (!fRes.isExist()) { let f_attempts = 0; // 初始化尝试次数 @@ -68,6 +69,7 @@ // 重新获取游戏区域截图 ra = captureGameRegion(); fRes = ra.find(fDialogueRo); + ra.dispose(); // 打印识别结果 log.info(`识别结果:${fRes.isExist()}`); @@ -103,6 +105,7 @@ let ra = captureGameRegion(); let cookingRes = ra.find(cookingRo); + ra.dispose(); if (cookingRes.isExist()) { log.info("找到 灶台 图标"); diff --git a/repo/js/料理制作及食材加工/manifest.json b/repo/js/料理制作及食材加工/manifest.json index fad4cf771..bf0203a84 100644 --- a/repo/js/料理制作及食材加工/manifest.json +++ b/repo/js/料理制作及食材加工/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 1, "bgi_version": "0.44.6", "name": "料理制作及食材加工", - "version": "1.3", + "version": "1.4", "tags": [ "料理制作", "搜索", diff --git a/repo/js/模板匹配区域坐标输出/main.js b/repo/js/模板匹配区域坐标输出/main.js index 2dd9303c9..02f4d4977 100644 --- a/repo/js/模板匹配区域坐标输出/main.js +++ b/repo/js/模板匹配区域坐标输出/main.js @@ -51,7 +51,9 @@ async function recognizeImage(recognitionObject, timeout = 5000) { while (Date.now() - startTime < timeout) { try { // 尝试识别图像 - let imageResult = captureGameRegion().find(recognitionObject); + const ro = captureGameRegion(); + let imageResult = ro.find(recognitionObject); + ro.dispose(); if (imageResult && imageResult.x !== 0 && imageResult.y !== 0 && imageResult.width !== 0 && imageResult.height !== 0) { await drawAndClearRedBox(imageResult, 500);// 调用异步函数绘制红框并延时清除 log.info(`成功识别图像,坐标: x=${imageResult.x}, y=${imageResult.y}, width=${imageResult.width}, height=${imageResult.height}`); @@ -69,16 +71,22 @@ async function recognizeImage(recognitionObject, timeout = 5000) { // 定义一个异步函数来绘制红框并延时清除 async function drawAndClearRedBox(result, delay) { // 绘制红框 - let drawRegion = captureGameRegion().DeriveCrop(result.x, result.y, result.width, result.height).DrawSelf("icon"); + const ro1 = captureGameRegion(); + let drawRegion = ro1.DeriveCrop(result.x, result.y, result.width, result.height).DrawSelf("icon"); + ro1.dispose(); // 延时 await sleep(delay); // 清除红框 if (drawRegion) { - drawRegion = captureGameRegion().DeriveCrop(0, 0, 0, 0).DrawSelf("icon"); - drawRegion = null; // 释放对象 + const ro2 = captureGameRegion(); + let drawRegion2 = ro2.DeriveCrop(0, 0, 0, 0); + drawRegion2.DrawSelf("icon"); + ro2.dispose(); + drawRegion2.dispose(); // 释放对象 } + drawRegion.dispose(); } // 主函数 (async function () { diff --git a/repo/js/模板匹配区域坐标输出/manifest.json b/repo/js/模板匹配区域坐标输出/manifest.json index 59e583279..63facddbb 100644 --- a/repo/js/模板匹配区域坐标输出/manifest.json +++ b/repo/js/模板匹配区域坐标输出/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "识图坐标区域", - "version": "1.0", + "version": "1.1", "description": "识别图片输出坐标区域", "authors": [ { diff --git a/repo/js/每月自动兑换抽卡资源/main.js b/repo/js/每月自动兑换抽卡资源/main.js index 8a65e7c72..2896941ca 100644 --- a/repo/js/每月自动兑换抽卡资源/main.js +++ b/repo/js/每月自动兑换抽卡资源/main.js @@ -152,45 +152,50 @@ function positiveIntegerJudgment(testNumber) { async function exchangeGoods() { -await genshin.returnMainUi();await sleep(1000); -keyPress("ESCAPE"); await sleep(2000);//呼叫派蒙 -click(198,416);await sleep(2000);//点击商城 -click(127,434);await sleep(1000);//尘辉兑换 -click(998,125);await sleep(1000);//星辰兑换 -//检查星辰的数量 -const region = RecognitionObject.ocr(1400, 31, 150, 50); // 星辰数量区域 -let capture = captureGameRegion(); -let res = capture.find(region); -let materialQuantity = res.text; -let validatedMaterialQuantity = positiveIntegerJudgment(materialQuantity); -if(validatedMaterialQuantity < 750){ -notification.send(`星尘数量为:${validatedMaterialQuantity},无法全部兑换`); -throw new Error(`星尘数量为:${validatedMaterialQuantity},不能完全兑换`); -} -log.info(`星尘数量为:${validatedMaterialQuantity},数量充足,可以全部兑换`); -const pinkBallRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/pinkBall.png")); -let pinkBall = captureGameRegion().find(pinkBallRo); - if (pinkBall.isExist()) { - pinkBall.click();await sleep(1000); - click(1290,604);await sleep(500);//增加 - click(1290,604);await sleep(500);//增加 - click(1290,604);await sleep(500);//增加 - click(1290,604);await sleep(500);//增加 - click(1164,782);await sleep(500);//确认兑换 - click(960,754);await sleep(1000);//点击空白处继续 -} -const blueBallRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/blueBall.png")); -let blueBall = captureGameRegion().find(blueBallRo); - if (blueBall.isExist()) { - blueBall.click();await sleep(1000); - click(1290,604);await sleep(500);//增加 - click(1290,604);await sleep(500);//增加 - click(1290,604);await sleep(500);//增加 - click(1290,604);await sleep(500);//增加 - click(1164,782);await sleep(500);//确认兑换 - click(960,754);await sleep(1000);//点击空白处继续 -} -notification.send(`商城抽卡资源兑换完成`); + await genshin.returnMainUi();await sleep(1000); + keyPress("ESCAPE"); await sleep(2000);//呼叫派蒙 + click(198,416);await sleep(2000);//点击商城 + click(127,434);await sleep(1000);//尘辉兑换 + click(998,125);await sleep(1000);//星辰兑换 + //检查星辰的数量 + const region = RecognitionObject.ocr(1400, 31, 150, 50); // 星辰数量区域 + let capture = captureGameRegion(); + let res = capture.find(region); + capture.dispose(); + let materialQuantity = res.text; + let validatedMaterialQuantity = positiveIntegerJudgment(materialQuantity); + if(validatedMaterialQuantity < 750){ + notification.send(`星尘数量为:${validatedMaterialQuantity},无法全部兑换`); + throw new Error(`星尘数量为:${validatedMaterialQuantity},不能完全兑换`); + } + log.info(`星尘数量为:${validatedMaterialQuantity},数量充足,可以全部兑换`); + const pinkBallRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/pinkBall.png")); + let ro1 = captureGameRegion(); + let pinkBall = ro1.find(pinkBallRo); + ro1.dispose(); + if (pinkBall.isExist()) { + pinkBall.click();await sleep(1000); + click(1290,604);await sleep(500);//增加 + click(1290,604);await sleep(500);//增加 + click(1290,604);await sleep(500);//增加 + click(1290,604);await sleep(500);//增加 + click(1164,782);await sleep(500);//确认兑换 + click(960,754);await sleep(1000);//点击空白处继续 + } + const blueBallRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/blueBall.png")); + let ro2 = captureGameRegion(); + let blueBall = ro2.find(blueBallRo); + ro2.dispose(); + if (blueBall.isExist()) { + blueBall.click();await sleep(1000); + click(1290,604);await sleep(500);//增加 + click(1290,604);await sleep(500);//增加 + click(1290,604);await sleep(500);//增加 + click(1290,604);await sleep(500);//增加 + click(1164,782);await sleep(500);//确认兑换 + click(960,754);await sleep(1000);//点击空白处继续 + } + notification.send(`商城抽卡资源兑换完成`); } diff --git a/repo/js/每月自动兑换抽卡资源/manifest.json b/repo/js/每月自动兑换抽卡资源/manifest.json index 3ed81eff4..b8e6e1a01 100644 --- a/repo/js/每月自动兑换抽卡资源/manifest.json +++ b/repo/js/每月自动兑换抽卡资源/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "每月自动兑换抽卡资源", - "version": "1.0", + "version": "1.1", "description": "每个月自动兑换蓝球和粉球,兑换资源不够会提醒(需要打开 js 通知),本月兑换过会自动跳过,想要重置 CD可以把monthly.txt中的时间删掉", "authors": [ { diff --git a/repo/js/烹饪熟练度一键拉满/main.js b/repo/js/烹饪熟练度一键拉满/main.js index f0870a294..f0f5aaaf7 100644 --- a/repo/js/烹饪熟练度一键拉满/main.js +++ b/repo/js/烹饪熟练度一键拉满/main.js @@ -76,7 +76,7 @@ extraTime = extraTime+300; regionSize ); -let result; + let result; if (i < 9) { result = region.find(templateRo0); } else if (i >= 18) { @@ -84,26 +84,25 @@ let result; } else { result = region.find(templateRo1); } + gameRegion.dispose(); + region.dispose(); - if (!result.isEmpty()) { - + if (!result.isEmpty()) { const segmentTime = 66; - - const waitTime = Math.round(i * segmentTime+extraTime); - log.info(`找到点位${i}号区域`); - await sleep(waitTime); - keyPress("VK_SPACE"); - return 0; + log.info(`找到点位${i}号区域`); + await sleep(waitTime); + keyPress("VK_SPACE"); + return 0; } } - - log.info(`未找到点位区域,烹饪结束`); -keyPress("ESCAPE"); -await sleep(1000); -keyPress("ESCAPE"); -throw new Error("人家才不是错误呢>_<"); + + log.info(`未找到点位区域,烹饪结束`); + keyPress("ESCAPE"); + await sleep(1000); + keyPress("ESCAPE"); + throw new Error("人家才不是错误呢>_<"); } diff --git a/repo/js/烹饪熟练度一键拉满/manifest.json b/repo/js/烹饪熟练度一键拉满/manifest.json index c3a301d1e..979c3616a 100644 --- a/repo/js/烹饪熟练度一键拉满/manifest.json +++ b/repo/js/烹饪熟练度一键拉满/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "烹饪熟练度一键拉满", - "version": "1.1", + "version": "1.2", "tags": [ "烹饪", "料理" diff --git a/repo/js/纪行周常-15次秘境一条龙/main.js b/repo/js/纪行周常-15次秘境一条龙/main.js index 8abc665d2..ac29a9356 100644 --- a/repo/js/纪行周常-15次秘境一条龙/main.js +++ b/repo/js/纪行周常-15次秘境一条龙/main.js @@ -48,6 +48,7 @@ while (retryCount < maxRetries && (timeout === null || Date.now() - startTime < timeout)) { const capture = captureGameRegion(); const result = capture.find(ro); + capture.dispose(); if (!result.isEmpty()) { result.click(); @@ -83,6 +84,7 @@ while (Date.now() - enterDungeonStartTime < enterDungeonTimeout) { const capture = captureGameRegion(); const result = capture.find(enterDungeonRo); + capture.dispose(); if (!result.isEmpty()) { foundEnterDungeon = true; @@ -176,10 +178,13 @@ let fightResult = false; while (Date.now() - startTime < timeout) { - if (recognizeFightText(captureGameRegion())) { + const ro = captureGameRegion(); + if (recognizeFightText(ro)) { + ro.dispose(); fightResult = true; break; } + ro.dispose(); await sleep(1000); } diff --git a/repo/js/纪行周常-15次秘境一条龙/manifest.json b/repo/js/纪行周常-15次秘境一条龙/manifest.json index 650501450..00ceab1e7 100644 --- a/repo/js/纪行周常-15次秘境一条龙/manifest.json +++ b/repo/js/纪行周常-15次秘境一条龙/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "纪行周常-15次秘境一条龙", - "version": "1.1", + "version": "1.2", "description": "", "authors": [ { diff --git a/repo/js/自动购买每天&3天&每周刷新食材/main.js b/repo/js/自动购买每天&3天&每周刷新食材/main.js index 745d3cece..2e34e2c53 100644 --- a/repo/js/自动购买每天&3天&每周刷新食材/main.js +++ b/repo/js/自动购买每天&3天&每周刷新食材/main.js @@ -445,6 +445,7 @@ async function qucikBuy() { // 查找购买按钮 let captureRegion = captureGameRegion(); let buyBtn = captureRegion.Find(othrtRo.buy.ro); + captureRegion.dispose(); if (buyBtn.isEmpty()) { return false; } @@ -499,6 +500,7 @@ async function buyFoods(npcName) { // 匹配商品 for (let item of tempFoods) { let resList = captureRegion.FindMulti(foodsData[item].ro); + captureRegion.dispose(); for (let res of resList) { log.info("找到物品: {i} 位置({x},{y},{h},{w})", foodsData[item].name, res.x, res.y, res.width, res.height); // 移除已购买的物品 diff --git a/repo/js/自动购买每天&3天&每周刷新食材/manifest.json b/repo/js/自动购买每天&3天&每周刷新食材/manifest.json index ed009baf8..42e4f740f 100644 --- a/repo/js/自动购买每天&3天&每周刷新食材/manifest.json +++ b/repo/js/自动购买每天&3天&每周刷新食材/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "自动购买每天&3天&每周刷新食材", - "version": "1.0", + "version": "1.1", "description": "自动购买每天&3天&每周刷新食材\n每天刷新食材:自动购买食材\n3天刷新食材:未到刷新日不购买该食材\n每周刷新食材:可指定每周购买食材", "authors": [ { diff --git a/repo/js/自动领取成就奖励/main.js b/repo/js/自动领取成就奖励/main.js index 07f2b65f7..b06da15c1 100644 --- a/repo/js/自动领取成就奖励/main.js +++ b/repo/js/自动领取成就奖励/main.js @@ -20,6 +20,7 @@ async function detectTextInRegion(x, y, width, height, targetText) { // 在指定区域内进行OCR识别 let resList = captureRegion.findMulti(ocrRo); + captureRegion.dispose(); // 如果没有识别到任何结果,返回false if (resList.count === 0) { @@ -30,7 +31,7 @@ async function detectTextInRegion(x, y, width, height, targetText) { // 获取第一个识别结果 let firstResult = resList[0]; let detectedText = firstResult.text; - + // 如果没有传入目标文字,则只要检测到非空内容就算成功 if (targetText === undefined) { return detectedText.trim() !== "" ? detectedText : false; @@ -108,6 +109,7 @@ const waitAndClickImage = async ( const captureRegion = captureGameRegion(); // 查找图片 const result = captureRegion.Find(recognitionObj); + captureRegion.dispose(); if (!result.isEmpty()) { log.info(`找到图片 ${imageName},位置(${result.x}, ${result.y}),正在点击...`); diff --git a/repo/js/自动领取成就奖励/manifest.json b/repo/js/自动领取成就奖励/manifest.json index 07ff8e151..695790648 100644 --- a/repo/js/自动领取成就奖励/manifest.json +++ b/repo/js/自动领取成就奖励/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "自动领取成就奖励", - "version": "1.2", + "version": "1.3", "description": "所以米桑什么时候实装一键领取?", "tags": [ "OCR", diff --git a/repo/js/角色养成一条龙/main.js b/repo/js/角色养成一条龙/main.js index 28c3fa5fc..ad192f030 100644 --- a/repo/js/角色养成一条龙/main.js +++ b/repo/js/角色养成一条龙/main.js @@ -139,18 +139,20 @@ async function findAndClickWithScroll(targetRo, stopRo, options = {}) { // 找到目标,点击并返回 log.info(`找到目标图片,位置: (${targetResult.x}, ${targetResult.y})`); targetResult.click(); + captureRegion.dispose(); await sleep(clickDelay); return; } - + // 4. 未找到目标,滚动画面 log.info(`第 ${attempt + 1} 次尝试未找到目标图片,将滚动画面...`); for (let i = 0; i < scrollNum; i++) { - await keyMouseScript.runFile("assets/滚轮下滑.json"); + await keyMouseScript.runFile("assets/滚轮下滑.json"); } // 2. 检查是否遇到终止图片 const stopResult = captureRegion.find(stopRo); + captureRegion.dispose(); if (!stopResult.isEmpty()) { throw new Error(`遇到终止图片,停止寻找目标图片。终止位置: (${stopResult.x}, ${stopResult.y})`); } @@ -200,9 +202,11 @@ let challengeTime = 0; await sleep(500); leftButtonClick(); await sleep(100); - let res = captureGameRegion().find(RecognitionObject.ocr(840, 935, 230, 40)); + let ro = captureGameRegion(); + let res = ro.find(RecognitionObject.ocr(840, 935, 230, 40)); + ro.dispose(); if (res.text.includes("自动退出")) { - log.info("检测到挑战成功"); + log.info("检测到挑战成功"); return; } } @@ -244,44 +248,50 @@ const autoNavigateToReward = async () => { if (rewardResult.text == "接触征讨之花") { log.info(`总计前进第${advanceNum}次`); log.info("已到达领奖点,检测到文字: " + rewardResult.text); + captureRegion.dispose(); return; } else if(advanceNum > 150){ - log.info(`总计前进第${advanceNum}次`); - throw new Error('前进时间超时'); + log.info(`总计前进第${advanceNum}次`); + captureRegion.dispose(); + throw new Error('前进时间超时'); } // 2. 未到达领奖点,则调整视野 for(let i = 0; i < 100; i++){ - captureRegion = captureGameRegion(); - let iconRes = captureRegion.Find(boxIconRo); - let climbTextArea = captureRegion.DeriveCrop(1685, 1030, 65, 25); - let climbResult = climbTextArea.find(RecognitionObject.ocrThis); - // 检查是否处于攀爬状态 - if (climbResult.text == "Space"){ - log.info("检侧进入攀爬状态,尝试脱离"); - keyPress("x"); - await sleep(1000); - keyDown("a"); - await sleep(800); - keyUp("a"); - keyDown("w"); - await sleep(800); - keyUp("w"); - } - if (iconRes.x >= 920 && iconRes.x <= 980 && iconRes.y <= 540) { - advanceNum++; - break; - } else { - // 小幅度调整 - if(iconRes.y >= 520) moveMouseBy(0, 920); - let adjustAmount = iconRes.x < 920 ? -20 : 20; - let distanceToCenter = Math.abs(iconRes.x - 920); // 计算与920的距离 - let scaleFactor = Math.max(1, Math.floor(distanceToCenter / 50)); // 根据距离缩放,最小为1 - let adjustAmount2 = iconRes.y < 540 ? scaleFactor : 10; - moveMouseBy(adjustAmount * adjustAmount2, 0); - await sleep(100); - } - if(i > 20) throw new Error('视野调整超时'); + captureRegion = captureGameRegion(); + let iconRes = captureRegion.Find(boxIconRo); + let climbTextArea = captureRegion.DeriveCrop(1685, 1030, 65, 25); + let climbResult = climbTextArea.find(RecognitionObject.ocrThis); + captureRegion.dispose(); + climbTextArea.dispose(); + // 检查是否处于攀爬状态 + if (climbResult.text == "Space"){ + log.info("检侧进入攀爬状态,尝试脱离"); + keyPress("x"); + await sleep(1000); + keyDown("a"); + await sleep(800); + keyUp("a"); + keyDown("w"); + await sleep(800); + keyUp("w"); + } + if (iconRes.x >= 920 && iconRes.x <= 980 && iconRes.y <= 540) { + advanceNum++; + break; + } else { + // 小幅度调整 + if(iconRes.y >= 520) moveMouseBy(0, 920); + let adjustAmount = iconRes.x < 920 ? -20 : 20; + let distanceToCenter = Math.abs(iconRes.x - 920); // 计算与920的距离 + let scaleFactor = Math.max(1, Math.floor(distanceToCenter / 50)); // 根据距离缩放,最小为1 + let adjustAmount2 = iconRes.y < 540 ? scaleFactor : 10; + moveMouseBy(adjustAmount * adjustAmount2, 0); + await sleep(100); + } + if(i > 20) { + throw new Error('视野调整超时'); + } } // 3. 前进一小步 keyDown("w"); @@ -325,6 +335,7 @@ async function queryStaminaValue() { await sleep(800); let captureRegion = captureGameRegion(); let stamina = captureRegion.find(RecognitionObject.ocr(1580, 20, 210, 55)); + captureRegion.dispose(); log.info(`OCR原始文本:${stamina.text}`); const staminaText = stamina.text.replace(/\s/g, ''); // 移除所有空格 const standardMatch = staminaText.match(/(\d+)/); @@ -334,7 +345,7 @@ async function queryStaminaValue() { if (validatedStamina > 11200) validatedStamina = (validatedStamina-1200)/10000; log.info(`返回体力值:${validatedStamina}`); return validatedStamina; - } + } } catch (error) { log.error(`体力识别失败:${error.message},默认为零`); await genshin.returnMainUi(); @@ -354,13 +365,14 @@ async function tpEndDetection() { let capture = captureGameRegion(); let res1 = capture.find(region1); let res2 = capture.find(region2); + capture.dispose(); if (!res1.isEmpty()|| !res2.isEmpty()){ log.info("传送完成"); await sleep(1000);//传送结束后有僵直 click(960, 810);//点击任意处 await sleep(500); return; - } + } tpTime++; await sleep(100); } @@ -421,6 +433,8 @@ const repeatOperationUntilTextFound = async ({ // 2. 执行OCR识别 const ocrResult = textArea.find(RecognitionObject.ocrThis); + captureRegion.dispose(); + textArea.dispose(); const hasAnyText = ocrResult.text.trim().length > 0; const matchesTarget = targetText === null @@ -433,7 +447,7 @@ const repeatOperationUntilTextFound = async ({ if (ifClick) click(Math.round(x + width / 2), Math.round(y + height / 2)); return true; } - + // 4. 检查步数限制 if (stepsTaken >= maxSteps) { throw new Error(`检查次数超过最大限制: ${maxSteps},未查询到文字"${targetText}"`); @@ -485,6 +499,7 @@ threshold = 0.8 // 新增阈值参数,默认值0.8 const captureRegion = captureGameRegion(); // 查找图片 const result = captureRegion.Find(recognitionObj); + captureRegion.dispose(); if (!result.isEmpty()) { log.info(`找到图片 ${imageName},位置(${result.x}, ${result.y}),正在点击...`); @@ -492,7 +507,7 @@ threshold = 0.8 // 新增阈值参数,默认值0.8 await sleep(300); // 点击后稍作等待 return true; } - + await sleep(checkInterval); } @@ -520,6 +535,7 @@ async function findImageAndOCR(imagePath, ocrWidth, ocrHeight, offsetX, offsetY) if (foundRegion.isEmpty()) { log.info(`未找到模板图片: ${imagePath}`); + captureRegion.dispose(); return false; } @@ -532,6 +548,7 @@ async function findImageAndOCR(imagePath, ocrWidth, ocrHeight, offsetX, offsetY) // 4. 创建OCR识别对象并识别 const ocrRo = RecognitionObject.Ocr(ocrX, ocrY, ocrWidth, ocrHeight); const ocrResult = captureRegion.Find(ocrRo); + captureRegion.dispose(); if (ocrResult.isEmpty() || !ocrResult.text || ocrResult.text.trim() === "") { log.info("OCR未识别到内容"); diff --git a/repo/js/角色养成一条龙/manifest.json b/repo/js/角色养成一条龙/manifest.json index 7434bef92..affd34ab7 100644 --- a/repo/js/角色养成一条龙/manifest.json +++ b/repo/js/角色养成一条龙/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "角色养成一条龙", - "version": "1.5", + "version": "1.6", "description": "详见readme.md", "authors": [ { diff --git a/repo/js/食材加工(模拟点击)/main.js b/repo/js/食材加工(模拟点击)/main.js index 9cb1040b2..814553422 100644 --- a/repo/js/食材加工(模拟点击)/main.js +++ b/repo/js/食材加工(模拟点击)/main.js @@ -143,6 +143,7 @@ let ra = captureGameRegion(); let fRes = ra.find(fDialogueRo); + ra.dispose(); if (!fRes.isExist()) { let f_attempts = 0; // 初始化尝试次数 @@ -169,6 +170,7 @@ // 重新获取游戏区域截图 ra = captureGameRegion(); fRes = ra.find(fDialogueRo); + ra.dispose(); // 打印识别结果 log.info(`识别结果:${fRes.isExist()}`); @@ -204,6 +206,7 @@ let ra = captureGameRegion(); let cookingRes = ra.find(cookingRo); + ra.dispose(); if (cookingRes.isExist()) { log.info("找到 灶台 图标"); diff --git a/repo/js/食材加工(模拟点击)/manifest.json b/repo/js/食材加工(模拟点击)/manifest.json index 414649822..3cf91a9f2 100644 --- a/repo/js/食材加工(模拟点击)/manifest.json +++ b/repo/js/食材加工(模拟点击)/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "食材加工(模拟点击)", - "version": "1.0.1", + "version": "1.0.2", "description": "根据选择加工物,自动加工食材。加工时会直接拉满加工数量。\n \n使用前请阅读“readme”文件以获取更多详细信息。", "tags": ["食材加工", "模拟点击"], diff --git a/repo/js/首领讨伐一条龙/main.js b/repo/js/首领讨伐一条龙/main.js index 4c5968ca1..2dedbd1f1 100644 --- a/repo/js/首领讨伐一条龙/main.js +++ b/repo/js/首领讨伐一条龙/main.js @@ -37,6 +37,8 @@ const autoNavigateToReward = async () => { let captureRegion = captureGameRegion(); let rewardTextArea = captureRegion.DeriveCrop(1210, 515, 200, 50); let rewardResult = rewardTextArea.find(RecognitionObject.ocrThis); + captureRegion.dispose(); + rewardTextArea.dispose(); // 检测到特点文字则结束!!! if (rewardResult.text == "接触征讨之花") { log.info(`总计前进第${advanceNum}次`); @@ -44,42 +46,46 @@ const autoNavigateToReward = async () => { return; } else if(advanceNum > 150){ - log.info(`总计前进第${advanceNum}次`); - throw new Error('前进时间超时'); + log.info(`总计前进第${advanceNum}次`); + throw new Error('前进时间超时'); } // 2. 未到达领奖点,则调整视野 for(let i = 0; i < 100; i++){ - captureRegion = captureGameRegion(); - let iconRes = captureRegion.Find(boxIconRo); - let climbTextArea = captureRegion.DeriveCrop(1685, 1030, 65, 25); - let climbResult = climbTextArea.find(RecognitionObject.ocrThis); - // 检查是否处于攀爬状态 - if (climbResult.text == "Space"){ - log.info("检侧进入攀爬状态,尝试脱离"); - keyPress("x"); - await sleep(1000); - keyDown("a"); - await sleep(800); - keyUp("a"); - keyDown("w"); - await sleep(800); - keyUp("w"); + captureRegion = captureGameRegion(); + let iconRes = captureRegion.Find(boxIconRo); + let climbTextArea = captureRegion.DeriveCrop(1685, 1030, 65, 25); + let climbResult = climbTextArea.find(RecognitionObject.ocrThis); + captureRegion.dispose(); + climbTextArea.dispose(); + // 检查是否处于攀爬状态 + if (climbResult.text == "Space"){ + log.info("检侧进入攀爬状态,尝试脱离"); + keyPress("x"); + await sleep(1000); + keyDown("a"); + await sleep(800); + keyUp("a"); + keyDown("w"); + await sleep(800); + keyUp("w"); + } + if (iconRes.x >= 920 && iconRes.x <= 980 && iconRes.y <= 540) { + advanceNum++; + break; + } else { + // 小幅度调整 + if(iconRes.y >= 520) moveMouseBy(0, 920); + let adjustAmount = iconRes.x < 920 ? -20 : 20; + let distanceToCenter = Math.abs(iconRes.x - 920); // 计算与920的距离 + let scaleFactor = Math.max(1, Math.floor(distanceToCenter / 50)); // 根据距离缩放,最小为1 + let adjustAmount2 = iconRes.y < 540 ? scaleFactor : 10; + moveMouseBy(adjustAmount * adjustAmount2, 0); + await sleep(100); + } + if(i > 20) { + throw new Error('视野调整超时'); + } } - if (iconRes.x >= 920 && iconRes.x <= 980 && iconRes.y <= 540) { - advanceNum++; - break; - } else { - // 小幅度调整 - if(iconRes.y >= 520) moveMouseBy(0, 920); - let adjustAmount = iconRes.x < 920 ? -20 : 20; - let distanceToCenter = Math.abs(iconRes.x - 920); // 计算与920的距离 - let scaleFactor = Math.max(1, Math.floor(distanceToCenter / 50)); // 根据距离缩放,最小为1 - let adjustAmount2 = iconRes.y < 540 ? scaleFactor : 10; - moveMouseBy(adjustAmount * adjustAmount2, 0); - await sleep(100); - } - if(i > 20) throw new Error('视野调整超时'); - } // 3. 前进一小步 keyDown("w"); await sleep(200); @@ -98,20 +104,30 @@ const autoNavigateToReward = async () => { await genshin.returnMainUi(); keyPress("M");//打开地图 await sleep(1200); - captureGameRegion().find(PlusButtonRo).click();// 点击添加体力 + let ro1 = captureGameRegion(); + ro1.find(PlusButtonRo).click();// 点击添加体力 + ro1.dispose(); await sleep(600); - captureGameRegion().find(FragileResinRo).click();// 选择脆弱树脂 + let ro2 = captureGameRegion(); + ro2.find(FragileResinRo).click();// 选择脆弱树脂 + ro2.dispose(); await sleep(600); - captureGameRegion().find(ConfirmButtonRo).click();// 点击使用 + let ro3 = captureGameRegion(); + ro3.find(ConfirmButtonRo).click();// 点击使用 + ro3.dispose(); await sleep(600); - let QuickUsePlusButton = captureGameRegion().find(QuickUsePlusButtonRo); + let ro4 = captureGameRegion(); + let QuickUsePlusButton = ro4.find(QuickUsePlusButtonRo); + ro4.dispose(); for (let i = 0; i < resinNum; ++i) { QuickUsePlusButton.click();// 点击使用数量 await sleep(300); } - captureGameRegion().find(ConfirmButtonRo).click();// 点击使用 + let ro5 = captureGameRegion(); + ro5.find(ConfirmButtonRo).click();// 点击使用 + ro5.dispose(); await sleep(600); click(960, 1000);// 点击空白处 await genshin.returnMainUi(); diff --git a/repo/js/首领讨伐一条龙/manifest.json b/repo/js/首领讨伐一条龙/manifest.json index 289bcb16c..8d966a6d3 100644 --- a/repo/js/首领讨伐一条龙/manifest.json +++ b/repo/js/首领讨伐一条龙/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "首领连续讨伐", - "version": "1.5.3", + "version": "1.5.4", "description": "请看一看readme文件", "authors": [ {