From a06d15e54dbd29cc631fec5decfae4c129bf1518 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B1=9F=E7=B4=AB=E7=83=9Fowo?= <1532270678@qq.com> Date: Thu, 18 Sep 2025 23:07:20 +0800 Subject: [PATCH] =?UTF-8?q?repo/js/YNF-AutoEat:=20=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=20(#1941)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 脚本更新 修复了一些bug,添加了一些改动 * YNF-AutoEat又双更新 针对建议进行了进一步的修改 --- repo/js/YNF-AutoEat/README.md | 35 +++++++--- repo/js/YNF-AutoEat/main.js | 108 ++++++++++++++++++------------ repo/js/YNF-AutoEat/manifest.json | 2 +- repo/js/YNF-AutoEat/settings.json | 4 +- 4 files changed, 95 insertions(+), 54 deletions(-) diff --git a/repo/js/YNF-AutoEat/README.md b/repo/js/YNF-AutoEat/README.md index 6c6df6d3b..16a3c0f9a 100644 --- a/repo/js/YNF-AutoEat/README.md +++ b/repo/js/YNF-AutoEat/README.md @@ -1,9 +1,14 @@ # 伊涅芙の自助餐 + ## 食用方法: 1. 将脚本添加至调度器。 2. 右键点击脚本以修改 JS 自定义配置。 -3. 选择队伍名称、食物种类数量和运行次数之后点击运行即可 + 1. 队伍名称:包含伊涅芙的队伍,必填 + 2. 伊涅芙今天吃什么:需要投喂的食材,不选择的情况下默认是苹果 + 3. 食材数量:单次投喂的数量(吃多少个再跳楼),默认99个 + 4. 运行次数:想嘎伊涅芙多少次,默认1次 +3. 完成上述设置后点击运行即可 ## 注意事项: @@ -11,18 +16,28 @@ 2. 使用前确保食材充足 +## 作者留言: +欢迎使用该脚本,毕竟使用的过程也是帮作者发现bug的过程。 +那么当你在使用时发现有bug存在,请反馈到频道并艾特作者! +当然,作者会保证尽力去修但是不一定能修好。(书到用时方恨少了属于是) +希望发现问题积极反馈,来频道尽情蹂虐作者吧! +~~(PS:许愿也行,需求尽管提,没回就是做不到,欸嘿)~~ + + ## 致谢 1. 感谢古又老师的悉心指导,没有古又老师就没有现在的~~伊涅芙灭绝计划~~调味品批量生产计划 2. 感谢氨气老师和秋秋云老师,在审核时提供了宝贵的意见和建议。 - - -##作者留言: -欢迎使用该脚本,毕竟使用的过程也是帮作者发现bug的过程 -那么当你在使用时发现有bug存在,请反馈到频道并艾特作者 -当然,作者会保证尽力去修但是不一定能修好(书到用时方恨少了属于是) -希望发现问题积极反馈,来频道尽情蹂虐作者吧! --------------------------------------------------------------------------------------------------------------------------------- ## 更新日志 -### 0.1(2025.09.15) -酱酱!“伊涅芙の自助餐(YNF-AutoEat) V0.1”闪亮登场!你还在为徒手喂料理而痛苦吗?你的苹果又没处用了吗?你做菜时的调味品又不够用了吗?快来用伊涅芙の自助餐,包你满意! +### 1.1(2025.09.17) +1. 修复了前往神像切换队伍后无法正常进行后续动作的bug +2. 修复了队伍中没有伊涅芙时会在秘境外吃食物的bug +3. 修复了不填写食物时脚本不会及时报错停止的bug +4. 多处位置添加了判断逻辑,防止假值穿透等风险 +5. 将代码结构进行重构,调整了运行顺序,使其更符合逻辑 +6. 蹂虐了古又老师的伊涅芙一顿并让她吃了个饱 +~~7. 我勒个豆版本号怎么写错了,正式版还搁这0开头呢!快改!~~ + +### 1.0(2025.09.15) +酱酱!“伊涅芙の自助餐(YNF-AutoEat) V1.0”闪亮登场!你还在为徒手喂料理而痛苦吗?你的苹果又没处用了吗?你做菜时的调味品又不够用了吗?快来用伊涅芙の自助餐,包你满意! \ No newline at end of file diff --git a/repo/js/YNF-AutoEat/main.js b/repo/js/YNF-AutoEat/main.js index 7cb892921..e4cfb98da 100644 --- a/repo/js/YNF-AutoEat/main.js +++ b/repo/js/YNF-AutoEat/main.js @@ -220,35 +220,47 @@ } } + // 新增:判断队内角色函数(新知识+1) + async function includes(characterName) { + var avatars = getAvatars(); + for (let i = 0; i < avatars.length; i++) { + if (avatars[i] === characterName) { return true; } + } + return false; + } + //切换队伍 async function switchPartyIfNeeded(partyName) { - if (!partyName) { - await genshin.returnMainUi(); - return; - } try { - log.info("正在尝试切换至" + partyName); if (!await genshin.switchParty(partyName)) { log.info("切换队伍失败,前往七天神像重试"); await genshin.tpToStatueOfTheSeven(); - await genshin.switchParty(partyName); + return await genshin.switchParty(partyName); } + return true; } catch { log.error("队伍切换失败,可能处于联机模式或其他不可切换状态"); notification.error(`队伍切换失败,可能处于联机模式或其他不可切换状态`); await genshin.returnMainUi(); + return false; } } // 传送并进入副本 async function fuben() { - await genshin.tp(-887.193359375, 1679.44287109375); + // 先判断一次,队伍里有伊涅芙就直接开始运行,没有的话就切换指定队伍 + let ifynf = await includes("伊涅芙"); + let ifswitch; + if (!ifynf) { + ifswitch = await switchPartyIfNeeded(party); + if (!ifswitch) { log.error("未识别到指定队伍,请检查队伍名是否正确!"); return false; }//找不到指定队伍就直接报错停止 - await switchPartyIfNeeded(party); - - let ifynf = await textOCR("伊涅芙", 3, 0, 0, 1670, 200, 120, 400); - if (!ifynf.found) { log.error("未识别到伊涅芙,请在设置中输入包含伊涅芙的队伍!"); return; } + ifynf = await includes("伊涅芙"); + if (!ifynf) { log.error("未识别到伊涅芙,请在设置中输入包含伊涅芙的队伍!"); return false; }//切换到指定队伍后再进行判定 + } + log.info("已检测到伊涅芙,即将开始后续动作……"); + await genshin.tp(-887.193359375, 1679.44287109375);//沉眠之庭 keyDown("w"); await sleep(2500); keyUp("w"); @@ -261,11 +273,13 @@ leftButtonClick(); await sleep(1500); - log.info("古又老师说让你先die一下"); + log.info("古又老师说让你先die一下");//先降低点生命值避免满血弹窗 keyDown("A"); await sleep(3000); keyUp("A"); await sleep(3000); + + return true; } // 伊涅芙跳楼机 @@ -276,9 +290,9 @@ //连续点击三次防止过期道具卡背包 await click(970, 760); - await sleep(300); + await sleep(100); await click(970, 760); - await sleep(300); + await sleep(100); await click(970, 760); log.info("猜猜为什么要连续点击这个位置呢~"); @@ -289,36 +303,34 @@ const ifshiwu = await textOCR("食物", 3, 0, 0, 126, 17, 99, 53); if (!ifshiwu.found) { await genshin.returnMainUi(); - log.warn("未打开'食物'页面"); - return; + throw new Error("未打开'食物'页面,请确保背包已正确打开并切换到食物标签页"); }//确认在食物界面 await sleep(500); const ifpingguo = await imageRecognitionEnhanced(pingguo, 1, 1, 0, 115, 120, 1150, 155);//识别"苹果"图片 if (!ifpingguo.found) { await genshin.returnMainUi(); - log.warn("没有找到指定的食物"); - return; + throw new Error("没有找到指定的食物:" + food + "请检查背包中该食材数量是否足够!"); } await sleep(500); - await textOCR("使用", 5, 1, 0, 1620, 987, 225, 50); + await click(1700, 1020);//点击使用 await sleep(1000); - const ifzjz = await imageRecognitionEnhanced(zjz, 5, 1, 0, 625, 290, 700, 360, true); - await sleep(300); + const ifzjz = await imageRecognitionEnhanced(zjz, 5, 1, 0, 625, 290, 700, 360, true);//点击伊涅芙证件照 + await sleep(100); + leftButtonClick();//连续点击确保吃食物的是伊涅芙 + await sleep(100); leftButtonClick(); - await sleep(300); - leftButtonClick(); - await sleep(300); + await sleep(100); - if (!ifzjz.found) { log.error("未识别到伊涅芙"); return; } + if (!ifzjz.found) { throw new Error("未识别到伊涅芙"); } for (let i = 0; i < foodCount; i++) { click(1251, 630); - await sleep(300); + await sleep(150); } - await textOCR("确认", 5, 1, 0, 1100, 740, 225, 50); + await click(1180, 770);//点击确认 await sleep(500); await sleep(1000); @@ -326,31 +338,47 @@ await sleep(1000); await keyPress("ESCAPE"); + await sleep(1000); + + if (n == 1) { return; } + log.info("再见了伊涅芙,希望你喜欢这几分钟的戏份"); - await sleep(1000); keyDown("A"); await sleep(3000); keyUp("A"); await sleep(3000); } - log.warn("使用前请仔细阅读readme并进行相关设置!"); - log.warn("请确保食材充足!"); + + // ===== MAIN EXECUTION ===== + + + // 预处理 + const party = settings.n;//设置好要切换的队伍 + const food = settings.food;//设置要吃的食物 + const foodCount = settings.foodNumber - 1;//点击“+”的次数,比食物数量少1 + const n = settings.runNumber;//运行次数 + + const pingguo = `assets/${food}.png`;//食物图片路径 + const zjz = `assets/zhengjianzhao.png`;//伊涅芙证件照 + + // 添加验证 + if (!party) { log.error("队伍名为空,请仔细阅读readme并进行设置后再使用此脚本!"); return; }// 利用队伍是否为空判断用户有没有进行设置 + if (foodCount > 98 || foodCount < 0) { log.error("食材数量请填写1-99之间的数字!"); return; }//确保食材数量1~99 + if (n <= 0) { log.error("不是哥们,运行次数还能小于0???"); return; }//确保运行次数合法 + //设置分辨率和缩放 setGameMetrics(1920, 1080, 1); - await genshin.returnMainUi(); + await genshin.returnMainUi();//回到主界面,在秘境中可能会卡几秒 - const food = settings.food; - const party = settings.n; - const n = settings.runNumber; - const foodCount = settings.foodNumber - 1; - const pingguo = `assets/${food}.png`; - const zjz = `assets/zhengjianzhao.png`; + log.warn("使用前请仔细阅读readme并进行相关设置!"); + log.warn("请确保食材充足!"); - await fuben(); + const iffuben = await fuben(); if (!iffuben) { return; }//前期准备,进入副本并降低一部分血量 + // 循环控制运行次数 try { for (let i = 0; i < n; i++) { await doit(); @@ -358,9 +386,7 @@ } catch (error) { log.error(`识别图像时发生异常: ${error.message}`); } + log.info("运行结束!今天的" + food + "味道不错哦~"); await genshin.tpToStatueOfTheSeven(); - })(); - - diff --git a/repo/js/YNF-AutoEat/manifest.json b/repo/js/YNF-AutoEat/manifest.json index b6d47bba4..a1a5fb565 100644 --- a/repo/js/YNF-AutoEat/manifest.json +++ b/repo/js/YNF-AutoEat/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "伊涅芙の自助餐", - "version": "0.1", + "version": "1.1", "tags": [ "伊涅芙", "调味品" diff --git a/repo/js/YNF-AutoEat/settings.json b/repo/js/YNF-AutoEat/settings.json index dc16198ab..e435d56ba 100644 --- a/repo/js/YNF-AutoEat/settings.json +++ b/repo/js/YNF-AutoEat/settings.json @@ -8,7 +8,7 @@ { "name": "food", "type": "select", - "label": "伊涅芙今天吃什么", + "label": "伊涅芙今天吃什么(默认苹果)", "options": [ "苹果", "日落果", @@ -18,7 +18,7 @@ "活化的星蕈", "枯焦的星蕈" ], - "default": "" + "default": "苹果" }, { "name": "foodNumber",