diff --git a/repo/js/YNF-AutoEat/README.md b/repo/js/YNF-AutoEat/README.md index c8b84a6ae..b03994415 100644 --- a/repo/js/YNF-AutoEat/README.md +++ b/repo/js/YNF-AutoEat/README.md @@ -17,10 +17,10 @@ ## 作者留言 -欢迎使用该脚本,毕竟使用的过程也是帮作者发现bug的过程。 -那么当你在使用时发现有bug存在,请反馈到频道并艾特作者! -当然,作者会保证尽力去修但是不一定能修好。(书到用时方恨少了属于是) -希望发现问题积极反馈,来频道尽情蹂虐作者吧! +这个脚本是作者第一次pr的脚本。大家可以发现更新频率很高,但是对于这种小功能的脚本来说,更新频率高也意味着欠缺的地方还有很多。 +作者也在慢慢学习,慢慢在摸索,偶尔可能会出现新版本不如上一版本的情况…… +那么……欢迎使用此脚本,毕竟使用的过程也是帮作者发现bug的过程。 +有问题请及时到频道反馈,作者会高频刷帖的,看到之后会很快处理,来频道尽情蹂虐作者吧! ~~(PS:许愿也行,需求尽管提,没回就是做不到,欸嘿)~~ @@ -29,6 +29,10 @@ 2. 感谢氨气老师和秋秋云老师,在审核时提供了宝贵的意见和建议。 --------------------------------------------------------------------------------------------------------------------------------- ## 更新日志 +### 1.4.1(2025.09.26) +1. 副本进入流程增加OCR识别,提升流程稳定性 +2. 优化了多处的等待时长,实现脚本运行全流程的平滑过渡与效率跃升 +3. 优化了多处识别流程,提高识别准确率并减少无用日志 ### 1.4(2025.09.24) 1. 修复了运行次数为某些值时运行结束前往神像之后还会回到秘境的bug 2. 添加了更为完善的过期物品拦截机制,不用再傻乎乎的每次点击同一位置了!(感谢糖雕老师以身殉道提供海量素材~) diff --git a/repo/js/YNF-AutoEat/main.js b/repo/js/YNF-AutoEat/main.js index a4906394a..0745313b4 100644 --- a/repo/js/YNF-AutoEat/main.js +++ b/repo/js/YNF-AutoEat/main.js @@ -129,17 +129,17 @@ } /** - * 文字OCR识别封装函数(测试中,未封装完成,后续会优化逻辑) - * @param text 要识别的文字,默认为"空参数" - * @param timeout 超时时间,单位为秒,默认为10秒 - * @param afterBehavior 点击模式,0表示不点击,1表示点击识别到文字的位置,2表示输出模式,默认为0 - * @param debugmodel 调试代码,0表示输入判断模式,1表示输出位置信息,2表示输出判断模式,默认为0 - * @param x OCR识别区域的起始X坐标,默认为0 - * @param y OCR识别区域的起始Y坐标,默认为0 - * @param w OCR识别区域的宽度,默认为1920 - * @param h OCR识别区域的高度,默认为1080 - * @returns 包含识别结果的对象,包括识别的文字、坐标和是否找到的结果 - */ + * 文字OCR识别封装函数(测试中,未封装完成,后续会优化逻辑) + * @param text 要识别的文字,默认为"空参数" + * @param timeout 超时时间,单位为秒,默认为10秒 + * @param afterBehavior 点击模式,0表示不点击,1表示点击识别到文字的位置,2表示输出模式,默认为0 + * @param debugmodel 调试代码,0表示输入判断模式,1表示输出位置信息,2表示输出判断模式,默认为0 + * @param x OCR识别区域的起始X坐标,默认为0 + * @param y OCR识别区域的起始Y坐标,默认为0 + * @param w OCR识别区域的宽度,默认为1920 + * @param h OCR识别区域的高度,默认为1080 + * @returns 包含识别结果的对象,包括识别的文字、坐标和是否找到的结果 + */ async function textOCR(text = "空参数", timeout = 10, afterBehavior = 0, debugmodel = 0, x = 0, y = 0, w = 1920, h = 1080) { const startTime = new Date(); var Outcheak = 0 @@ -161,9 +161,8 @@ if (res.text.includes(text) && debugmodel == 3) { return result = { text: res.text, x: res.x, y: res.y, found: true }; } if (res.text.includes(text) && debugmodel !== 2) { conuntcottimecot++; - log.info(`“${res1}”找到`); - if (debugmodel === 1 & x === 0 & y === 0) { log.info("全图代码位置:({x},{y},{h},{w})", res.x - 10, res.y - 10, res.width + 10, res.Height + 10); } else { log.info("文本OCR完成'{text}'", res.text); } - if (afterBehavior === 1) { log.info("点击模式:开"); await sleep(1000); click(res.x, res.y); } else { if (debugmodel === 1 & x === 0 & y === 0) { log.info("点击模式:关") } } + if (debugmodel === 1 & x === 0 & y === 0) { log.info("全图代码位置:({x},{y},{h},{w})", res.x - 10, res.y - 10, res.width + 10, res.Height + 10); } + if (afterBehavior === 1) { await sleep(1000); click(res.x, res.y); } else { if (debugmodel === 1 & x === 0 & y === 0) { log.info("点击模式:关") } } if (afterBehavior === 2) { log.info("F模式:开"); await sleep(100); keyPress("F"); } else { if (debugmodel === 1 & x === 0 & y === 0) { log.info("F模式:关"); } } if (conuntcottimecot >= conuntcottimecomp / 2) { return result = { text: res.text, x: res.x, y: res.y, found: true }; } else { return result = { found: false }; } } @@ -187,7 +186,7 @@ for (let i = 0; i < avatars.length; i++) { if (avatars[i] === characterName) { await keyPress(String(i + 1)); - await sleep(1000); + await sleep(1500); return true; } } @@ -219,22 +218,21 @@ await genshin.tp(-887.193359375, 1679.44287109375);//识别成功直接传送 keyDown("w"); - await sleep(2500); + await sleep(2000); keyUp("w"); keyPress("F"); - await sleep(4000); - await click(1600, 1015); - await sleep(1500); - await click(1600, 1015); - await sleep(9000); - leftButtonClick(); - await sleep(1500); + + await textOCR("单人挑战", 8, 1, 1, 1615, 990, 220, 50);//等待“单人挑战”出现 + await textOCR("开始挑战", 8, 1, 1, 1615, 990, 220, 50);//等待“开始挑战”出现 + await textOCR("地脉异常", 10, 1, 1, 840, 405, 180, 55);//等待“地脉异常”出现 + await sleep(1000); return true; } // 伊涅芙跳楼机 async function doit() { + // 江紫烟老师绞尽脑汁想也不出来几句骚话 const randomNumber = Math.floor(Math.random() * 3) + 1; if (randomNumber == 1) { log.info("即使分离,我们的心始终相连"); } if (randomNumber == 2) { log.info("再见了伊涅芙,希望你喜欢这几分钟的戏份"); } @@ -247,18 +245,17 @@ await keyPress("B"); await handleExpiredItems();//处理过期物品弹窗 - await sleep(1000); + await sleep(800); await click(860, 50); - await sleep(1000); + await sleep(800); const ifshiwu = await imageRecognitionEnhanced(foodbag, 3, 0, 0, 126, 17, 99, 53); if (!ifshiwu.found) { await genshin.returnMainUi(); throw new Error("未打开'食物'页面,请确保背包已正确打开并切换到食物标签页"); }//确认在食物界面 - await sleep(500); - const ifpingguo = await imageRecognitionEnhanced(pingguo, 1, 1, 0, 115, 120, 1150, 155, true);//识别"苹果"图片 + const ifpingguo = await imageRecognitionEnhanced(pingguo, 3, 1, 0, 115, 120, 1150, 155, true);//识别"苹果"图片 if (!ifpingguo.found) { await genshin.returnMainUi(); throw new Error("没有找到指定的食物:" + food + ",请检查背包中该食材数量是否足够!"); @@ -266,12 +263,9 @@ await sleep(500); await click(1700, 1020);//点击使用 - await sleep(1000); - const ifzjz = await imageRecognitionEnhanced(zjz, 5, 1, 0, 625, 290, 700, 360, true);//点击伊涅芙证件照 - await sleep(300); - leftButtonClick();//连续点击确保吃食物的是伊涅芙 - await sleep(300); + await imageRecognitionEnhanced(zjz, 3, 1, 0, 625, 290, 700, 360, true);//点击伊涅芙证件照,确保吃食物的是伊涅芙 + await sleep(500); for (let i = 0; i < foodCount; i++) { click(1251, 630); @@ -294,14 +288,13 @@ // 背包过期物品识别,需要在背包界面,并且是1920x1080分辨率下使用 async function handleExpiredItems() { - const ifGuoqi = await textOCR("物品过期", 1, 0, 0, 870, 280, 170, 40); + const ifGuoqi = await textOCR("物品过期", 1.5, 0, 0, 870, 280, 170, 40); if (ifGuoqi.found) { log.info("检测到过期物品,正在处理..."); await sleep(500); await click(980, 750); // 点击确认按钮,关闭提示 - } else { - log.info("未检测到过期物品"); } + // else { log.info("未检测到过期物品"); }//频繁开关背包,不需要每次都提示 } @@ -319,6 +312,8 @@ const zjz = `assets/zhengjianzhao.png`;//伊涅芙证件照 const foodbag = `assets/foodbag.png`;//背包的“食物”界面 + const eater = "伊涅芙";//客官一位~ + // 添加验证 if (!party) { log.error("队伍名为空,请仔细阅读readme并进行设置后再使用此脚本!"); return; }// 利用队伍是否为空判断用户有没有进行设置 if (foodCount > 98 || foodCount < 0) { log.error("食材数量请填写1-99之间的数字!"); return; }//确保食材数量1~99 @@ -337,12 +332,12 @@ // 先判断一次,队伍里有伊涅芙就直接开始运行,没有的话就切换指定队伍 - if (!await includes("伊涅芙")) { + if (!await includes(eater)) { if (!await switchPartyIfNeeded(party)) { log.error("未识别到指定队伍,请检查队伍名是否正确!"); return false; }//找不到指定队伍就直接报错停止 - if (!await includes("伊涅芙")) { log.error("未识别到伊涅芙,请检查队伍名是否正确!"); return false; }// 切换成功后判断队伍中是否有伊涅芙 + if (!await includes(eater)) { log.error(`未识别到`+eater+`,请检查队伍名是否正确!`); return false; }// 切换成功后判断队伍中是否有伊涅芙 } - log.info("已识别到伊涅芙,即将开始后续动作……"); + log.info(`已识别到`+eater+`,即将开始后续动作……`); try { await fuben();//进入副本 diff --git a/repo/js/YNF-AutoEat/manifest.json b/repo/js/YNF-AutoEat/manifest.json index 8abe62493..6e2b335cf 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.4", + "version": "1.4.1", "tags": [ "伊涅芙", "调味品"