From 9318084629de184266de41d5780453972ddeb0b0 Mon Sep 17 00:00:00 2001 From: Leeon-666 <3424780951@qq.com> Date: Sun, 6 Sep 2026 23:40:52 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E8=B4=AD=E4=B9=B0?= =?UTF-8?q?=E5=95=86=E5=93=81=203.6.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../README.md" | 30 ++- .../images/\351\261\274\350\202\211.png" | Bin 10308 -> 7707 bytes .../images/\351\261\274\350\202\2112.png" | Bin 10308 -> 0 bytes .../assets/npcs.json" | 2 +- ...346\270\257-\350\200\201\351\253\230.json" | 63 +++---- ...\350\211\257\350\257\272\345\244\253.json" | 23 ++- .../main.js" | 173 ++++++++++++++---- .../manifest.json" | 2 +- ...01\346\224\257\346\214\201\350\241\250.md" | 2 +- 9 files changed, 207 insertions(+), 88 deletions(-) delete mode 100644 "repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/assets/images/\351\261\274\350\202\2112.png" diff --git "a/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/README.md" "b/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/README.md" index 231b214c2a..2a6785075d 100644 --- "a/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/README.md" +++ "b/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/README.md" @@ -96,7 +96,7 @@ | 璃月-璃月港 | 东升 | 盐、胡椒、洋葱、牛奶、番茄、卷心菜、土豆、小麦、稻米、虾仁、豆腐、杏仁 | - | - | 杂货店 | | 璃月-璃月港 | 卯师傅 | 鱼肉、螃蟹 | 竹笋、莲蓬、松茸、蘑菇、胡萝卜、白萝卜、绝云椒椒 | 面粉、糖、香肠、火腿 | | | 璃月-璃月港 | 老孙 | 鱼肉、螃蟹、虾仁 | - | - | | -| 璃月-璃月港 | 老高 | 鱼肉、鱼肉2 | - | - | | +| 璃月-璃月港 | 老高 | 鱼肉 | - | - | | | 璃月-璃月港 | 长顺 | 土豆 | 石珀、电气水晶 | 糖、奶酪 | | | 璃月-璃月港 | 琳琅 | - | - | 游医的药壶、游医的枭羽、游医的方巾、游医的银莲、游医的怀钟 | 狗粮商人 | | 璃月-璃月港 | 张顺 | - | - | 幸运儿之杯、幸运儿鹰羽、幸运儿银冠、幸运儿绿花、幸运儿沙漏 | 狗粮商人 | @@ -265,31 +265,45 @@ A: 游戏内的刷新时间是**每天凌晨4点**。脚本会考虑这个时间 ## 📅 更新日志
+### v3.6.1 + - **新增** + - 商人交互选项识别,为了解决到达目标追踪点后除目标NPC外还存在其他对话对象导致交互错误的问题 + - **优化** + - 商店对话选项智能化:`布纳马`、`杜拉夫`、`齐良诺夫` 等有特殊选项的NPC不再以固定 F 次数交互,而是循环识别对话内容,持续 F 交互直到出现目标选项 + - 未能进入对话时自动跳过该商人并继续下一个,不进行无效的购买尝试。 + - 调整商人`璃月-璃月港-老高`、`至冬-至冬堡-齐良诺夫`路径。 + - 合并`鱼肉` 商品识别图片,`璃月-璃月港-老高`商品列表同步更新。 + - **修复** + - 修复了一处 fakeLog 问题 + ### v3.6.0 - **优化“带括号商品”无法识别的问题** - 针对 `「四方八方之网」`、`「皮拉米达的夜莺」` 等名称带有书名号(「」)的商品,此前若用户在配置中未加括号,脚本会因匹配失败而报错或跳过购买。 + - 针对 `「四方八方之网」`、`「皮拉米达的夜莺」` 等名称带有书名号(「」)的商品,此前若用户在配置中未加括号,脚本会因匹配失败而报错或跳过购买。 本次更新后,**脚本会自动忽略商品名称中的「」括号**。无论您填写的是 `四方八方之网` 还是 `「四方八方之网」`,脚本均能准确识别并正常购买,不再受括号格式困扰。 - **调整** - 调整商品图片识别阈值,从0.85改至0.8 + - 调整商品图片识别阈值,从0.85改至0.8 ### v3.5.10 -- **优化** + - **优化** - 调整商人`璃月-璃月港-阿山婆`路径 ### v3.5.9 -- **优化** + - **优化** - 调整商人`蒙德-蒙德城-天使的馈赠-查尔斯`路径 - 调整商品`冰钩钩果汁`图片 ### v3.5.8 -- **新增**:适配ABGI进度显示日志,脚本运行过程中输出更详细的进度信息,方便追踪执行状态。 -- **优化**:修改「至冬-至冬堡-齐良诺夫」路线,避开角色彩蛋刷新位置,减少因NPC乱入导致的购买失败。 + - **新增** + - 适配ABGI进度显示日志,脚本运行过程中输出更详细的进度信息,方便追踪执行状态。 + - **优化** + - 修改「至冬-至冬堡-齐良诺夫」路线,避开角色彩蛋刷新位置,减少因NPC乱入导致的购买失败。 ### v3.5.7 - **新增** - 新增了4项至冬新物品素材 - 新增了5条至冬新路线:`至冬-至冬堡-格里戈里`、`至冬-至冬堡-齐良诺夫`、`至冬-至冬堡-雅罗斯拉夫`、`至冬-至冬堡-老庭院餐厅-布图琳娜`、`至冬-曙光车站-哲列兹诺夫` - - 修改了一项拼写问题:卯师父->卯师傅;并解决了可能因更名引发的bug问题 + - **调整** + - 修改了一项拼写问题:卯师父->卯师傅;并解决了可能因更名引发的bug问题 ### v3.5.64 - 调整商品图片识别阈值 diff --git "a/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/assets/images/\351\261\274\350\202\211.png" "b/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/assets/images/\351\261\274\350\202\211.png" index 3cf01fbecf1c576a593bb01e3a5f19e4ab31c2af..4e155c5024bbb5a82909ba461c3271ad96acbedb 100644 GIT binary patch literal 7707 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 V3F!Xdc|rgH002ovPDHLkV1jYs%)kHu literal 10308 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 diff --git "a/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/assets/images/\351\261\274\350\202\2112.png" "b/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/assets/images/\351\261\274\350\202\2112.png" deleted file mode 100644 index 3cf01fbecf1c576a593bb01e3a5f19e4ab31c2af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10308 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 diff --git "a/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/assets/npcs.json" "b/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/assets/npcs.json" index ba929503e5..045a4f2ace 100644 --- "a/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/assets/npcs.json" +++ "b/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/assets/npcs.json" @@ -142,7 +142,7 @@ "page": 1, "time": "day", "path": "assets/path/璃月-璃月港-老高.json", - "_1d_foods": ["鱼肉","鱼肉2"], + "_1d_foods": ["鱼肉"], "tags": ["璃月", "璃月港", "老高"] }, "长顺": { diff --git "a/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/assets/path/\347\222\203\346\234\210-\347\222\203\346\234\210\346\270\257-\350\200\201\351\253\230.json" "b/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/assets/path/\347\222\203\346\234\210-\347\222\203\346\234\210\346\270\257-\350\200\201\351\253\230.json" index 03fca0e144..da8fed3141 100644 --- "a/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/assets/path/\347\222\203\346\234\210-\347\222\203\346\234\210\346\270\257-\350\200\201\351\253\230.json" +++ "b/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/assets/path/\347\222\203\346\234\210-\347\222\203\346\234\210\346\270\257-\350\200\201\351\253\230.json" @@ -1,19 +1,19 @@ -{ +{ "info": { "authors": [ { "links": "", - "name": "听雨♪" + "name": "蜜柑魚" } ], "bgiVersion": "0.35.1", "bgi_version": "0.45.0", "description": "", "enable_monster_loot_split": false, - "last_modified_time": 1763060301398, + "last_modified_time": 1788696686847, "map_match_method": "", "map_name": "Teyvat", - "name": "老高", + "name": "璃月-璃月港-老高", "tags": [], "type": "collect", "version": "1.0" @@ -32,46 +32,46 @@ "action": "", "action_params": "", "id": 2, - "move_mode": "run", + "move_mode": "dash", "type": "path", - "x": 247.5, - "y": -664.5 + "x": 254.2285, + "y": -655.7949 }, { "action": "", "action_params": "", "id": 3, - "move_mode": "run", + "move_mode": "dash", "type": "path", - "x": 214.5, - "y": -661.5 + "x": 254.2813, + "y": -629.1934 }, { "action": "", "action_params": "", "id": 4, - "move_mode": "run", + "move_mode": "dash", "type": "path", - "x": 192.5, - "y": -682 + "x": 222.6611, + "y": -615.9551 }, { - "action": "", + "action": "stop_flying", "action_params": "", "id": 5, - "move_mode": "run", + "move_mode": "fly", "type": "path", - "x": 162.5, - "y": -681 + "x": 182.0068, + "y": -600.6699 }, { "action": "", "action_params": "", "id": 6, - "move_mode": "run", + "move_mode": "walk", "type": "path", - "x": 157.5000949141504, - "y": -630.375 + "x": 169.2012, + "y": -603.125 }, { "action": "", @@ -79,35 +79,26 @@ "id": 7, "move_mode": "walk", "type": "path", - "x": 139.99022999999943, - "y": -608.2969000000003 + "x": 161.6416, + "y": -594.8813 }, { "action": "", "action_params": "", "id": 8, "move_mode": "walk", - "type": "path", - "x": 161.6416015625, - "y": -594.88134765625 - }, - { - "action": "", - "action_params": "", - "id": 9, - "move_mode": "walk", "type": "target", - "x": 158.751953125, - "y": -586.27294921875 + "x": 158.752, + "y": -586.2729 }, { "action": "combat_script", "action_params": "w(0.3),wait(0.2)", - "id": 10, + "id": 9, "move_mode": "walk", "type": "orientation", - "x": 161.0419921875, - "y": -584.2685546875 + "x": 161.042, + "y": -584.2686 } ] } \ No newline at end of file diff --git "a/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/assets/path/\350\207\263\345\206\254-\350\207\263\345\206\254\345\240\241-\351\275\220\350\211\257\350\257\272\345\244\253.json" "b/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/assets/path/\350\207\263\345\206\254-\350\207\263\345\206\254\345\240\241-\351\275\220\350\211\257\350\257\272\345\244\253.json" index 85eab20b64..3e30ee2b96 100644 --- "a/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/assets/path/\350\207\263\345\206\254-\350\207\263\345\206\254\345\240\241-\351\275\220\350\211\257\350\257\272\345\244\253.json" +++ "b/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/assets/path/\350\207\263\345\206\254-\350\207\263\345\206\254\345\240\241-\351\275\220\350\211\257\350\257\272\345\244\253.json" @@ -13,7 +13,7 @@ "bgi_version": "0.45.0", "description": "", "enable_monster_loot_split": false, - "last_modified_time": 1788042558021, + "last_modified_time": 1788702202632, "map_match_method": "SIFT", "map_name": "Teyvat", "name": "至冬-至冬堡-齐良诺夫", @@ -46,17 +46,26 @@ "id": 3, "move_mode": "walk", "type": "target", - "x": 6854.1953, - "y": 9636.1826 + "x": 6854.3213, + "y": 9636.8184 }, { - "action": "combat_script", - "action_params": "w(0.3),wait(0.8)", + "action": "", + "action_params": "", "id": 4, "move_mode": "walk", + "type": "target", + "x": 6854.4785, + "y": 9634.959 + }, + { + "action": "combat_script", + "action_params": "w(0.3),wait(1.5)", + "id": 5, + "move_mode": "walk", "type": "orientation", - "x": 6853.1973, - "y": 9634.8359 + "x": 6848.126, + "y": 9634.5098 } ] } \ No newline at end of file diff --git "a/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/main.js" "b/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/main.js" index 157afcabfc..e54ff439fe 100644 --- "a/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/main.js" +++ "b/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/main.js" @@ -1,4 +1,4 @@ -//3.6.0 +//3.6.1 // fakeLog 函数,使用方法:将本函数放在主函数前,调用时请务必使用await,否则可能出现v8白框报错 // 在js开头处伪造该js结束运行的日志信息,如 await fakeLog("js脚本", true, true, 0); @@ -56,6 +56,11 @@ async function fakeLog(name, isJs, isStart, duration) { const durationMinutes = Math.floor(durationInSeconds / 60); const durationSeconds = (durationInSeconds % 60).toFixed(3); // 保留三位小数 + // 交互或拾取:"XXXX" + if (duration == 23333) { + log.info(`交互或拾取:"${name}"`); + return; + } // 使用四个独立的 if 语句处理四种情况 if (isJs && isStart) { // 处理 isJs = true 且 isStart = true 的情况 @@ -93,10 +98,6 @@ async function fakeLog(name, isJs, isStart, duration) { `------------------------------`; log.debug(logMessage); } - // 交互或拾取:"XXXX" - if (duration == 23333) { - log.info(`交互或拾取:"${name}"`); - } } // ==================== 日志辅助函数 ==================== @@ -850,60 +851,155 @@ async function quickBuy(itemName) { } } -// 跳过对话 -async function spikChat(npcName) { - let count = 6; // 添加let声明 +// ==================== 检测交互选项并选择包含NPC名字的选项 ==================== +// 到达追踪点位后,OCR查找包含NPC名字的交互选项, +// 按住Alt键呼出鼠标指针后点击该选项; +// 未找到时重新执行路径并重试,连续失败则中止该商人的交互 +async function selectNpcDialogOption(npcName, npcPath) { + // 设置脚本环境的游戏分辨率和DPI缩放,与OCR坐标一致 + setGameMetrics(1920, 1080, 1); + + let selected = false; + let retryCount = 0; + const maxRetries = 2; // 最大重试次数 + + // OCR区域限制在交互选项列表所在区域,防止点击NPC头顶名字 + const rightHalfOcr = RecognitionObject.Ocr(1150, 430, 250, 210); + await sleep(1000); - if (npcName == "布纳马" || npcName == "杜拉夫" || npcName == "齐良诺夫") { - // 设置脚本环境的游戏分辨率和DPI缩放 - setGameMetrics(1920, 1080, 1); + while (!selected && retryCount <= maxRetries) { + // 对交互选项区域进行 OCR + let captureRegion = captureGameRegion(); + let resList = captureRegion.findMulti(rightHalfOcr); + captureRegion.dispose(); - // 交互 - let loop_count = 3; - if (npcName == "布纳马") { - loop_count = 3; - } else if (npcName == "杜拉夫" || npcName == "齐良诺夫") { - loop_count = 2; + for (let i = 0; i < resList.count; i++) { + if (resList[i].text.includes(npcName)) { + // 找到包含NPC名字的交互选项 + log.info(`找到交互选项: ${resList[i].text.trim()}, 开始交互`); + keyDown("VK_MENU"); // Alt + await sleep(1000); + click(resList[i].x + 30, resList[i].y + 30); // 点击NPC选项 + await sleep(1000); + keyUp("VK_MENU"); // Alt + await sleep(1000); + selected = true; + break; // 找到后跳出循环 + } } - for (let i = 0; i < loop_count; i++) { - keyPress("VK_F"); - await sleep(1500); + if (!selected) { + retryCount++; + if (retryCount <= maxRetries) { + log.warn(`未找到包含 "${npcName}" 的交互选项,进行第 (${retryCount}/${maxRetries}) 次重试`); + await sleep(1500); + if (npcPath) { + // 重新执行路径 + await autoPath(npcPath); + } + await sleep(1000); + } } + } - // 点击有什么卖的 - let captureRegion = captureGameRegion() + if (!selected) { + log.error(`连续${maxRetries}次未能找到包含 "${npcName}" 的交互选项`); + } + return selected; +} + +// 在对话中点击特殊购买选项 +// 循环OCR检测对话:找到特殊选项立即鼠标点击;选项未出现时按F推进下一句。 +async function clickShopDialogOption(maxAttempts = 6) { + // 设置脚本环境的游戏分辨率和DPI缩放 + setGameMetrics(1920, 1080, 1); + + const keywords = ["有什么卖的", "可以卖一些", "有什么喝的"]; + + for (let attempt = 0; attempt < maxAttempts; attempt++) { + let captureRegion = captureGameRegion(); + let target = null; try { let resList = captureRegion.findMulti(RecognitionObject.ocrThis); for (let i = 0; i < resList.count; i++) { - if (resList[i].text.includes("有什么卖的") || resList[i].text.includes("可以卖一些") || resList[i].text.includes("有什么喝的")) { - await sleep(500); - click(resList[i].x + 30, resList[i].y + 30); - await sleep(500); - break; // 找到后跳出循环 + const text = resList[i].text || ""; + if (keywords.some(k => text.includes(k))) { + target = resList[i]; + break; } } } finally { captureRegion.dispose(); } + if (target) { + // 商店选项已出现:直接点击 + await sleep(300); + click(target.x + 30, target.y + 30); + logConditional(`已点击商店对话选项: ${target.text.trim()}`); + await sleep(800); + return true; + } + + // 商店选项尚未出现:按F推进下一句对话 + keyPress("VK_F"); + await sleep(1250); + } + + log.warn("多次尝试后仍未找到商店对话选项"); + return false; +} + +// 跳过对话 +async function spikChat(npcName, npcPath) { + let count = 6; // 添加let声明 + + if (npcName == "齐良诺夫") { + // 目前仅"齐良诺夫"点位启用新逻辑 + const selected = await selectNpcDialogOption(npcName, npcPath); + if (!selected) { + log.error(`未能与 ${npcName} 进入对话,跳过该商人`); + return false; + } + + } else { + // 其余点位依旧按F对话 + await sleep(1000); + keyPress("VK_F"); + await sleep(1000); + if (npcName == "布纳马" || npcName == "杜拉夫") { + // 首次按F已在上方完成,这里推进剩余对话 + const loop_count = (npcName == "布纳马") ? 2 : 1; + for (let i = 0; i < loop_count; i++) { + keyPress("VK_F"); + await sleep(1500); + } + } + } + + if (npcName == "布纳马" || npcName == "杜拉夫" || npcName == "齐良诺夫") { + // 设置脚本环境的游戏分辨率和DPI缩放 + setGameMetrics(1920, 1080, 1); + + // 循环检测并点击"有什么卖的/有什么喝的"商店选项: + // 选项已出现时直接鼠标点击;只有仍是问候语(选项未出现)时才按F推进 + await clickShopDialogOption(6); + // 等待购买页面出现 if (await waitForPurchasePage(6)) { logConditional(`已进入 ${npcName} 的购买页面`); } else { log.warn(`未能进入 ${npcName} 的购买页面,尝试继续...`); } - return; + return true; } else { - // 通用NPC:按F与NPC交互,然后循环检测 - keyPress("VK_F"); - await sleep(1000); - + // 通用NPC:已按F进入对话,这里循环检测购买页面 if (await waitForPurchasePage(8)) { logConditional(`已进入 ${npcName} 的购买页面`); } else { log.warn(`未能进入 ${npcName} 的购买页面,脚本可能无法正常购买`); } + return true; } } @@ -1220,7 +1316,7 @@ async function initNpcData(records) { // 重置容量限制集合 capacityLimitedFoods.clear(); try { - await fakeLog(`当前版本 3.6.0`, false, false, 23333); + await fakeLog(`当前版本 3.6.1`, false, false, 23333); // ==================== 确定账号名 ==================== let rawUserName = settings.userName ? settings.userName.trim() : ""; if (!rawUserName) { @@ -1334,7 +1430,16 @@ async function initNpcData(records) { } await autoPath(npc.path); - await spikChat(npc.name); + const chatOk = await spikChat(npc.name, npc.path); + + if (!chatOk) { + // 未能进入对话,跳过该商人 + log.error(`已跳过: ${displayName}`); + await genshin.returnMainUi(); + // 伪造日志任务结束 + await fakeLog(displayName, false, false, 0); + continue; + } // 购买商品,传入当前记录和周期 const purchaseResult = await buyFoods(key, npcRecords, currentPeriod); diff --git "a/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/manifest.json" "b/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/manifest.json" index e0a50929b0..2c464a4f3d 100644 --- "a/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/manifest.json" +++ "b/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/manifest.json" @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "自动购买商品", - "version": "3.6.0", + "version": "3.6.1", "bgi_version": "0.63.1", "description": "自动购买商品\n每天刷新商品:自动购买商品\n3天刷新商品:未到刷新日不购买该商品\n每周刷新商品:可指定每周购买商品", "authors": [ diff --git "a/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/\345\225\206\344\272\272\344\270\216\345\225\206\345\223\201\346\224\257\346\214\201\350\241\250.md" "b/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/\345\225\206\344\272\272\344\270\216\345\225\206\345\223\201\346\224\257\346\214\201\350\241\250.md" index bc741fe05a..6beafcc527 100644 --- "a/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/\345\225\206\344\272\272\344\270\216\345\225\206\345\223\201\346\224\257\346\214\201\350\241\250.md" +++ "b/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/\345\225\206\344\272\272\344\270\216\345\225\206\345\223\201\346\224\257\346\214\201\350\241\250.md" @@ -20,7 +20,7 @@ | 璃月-璃月港 | 东升 | 盐、胡椒、洋葱、牛奶、番茄、卷心菜、土豆、小麦、稻米、虾仁、豆腐、杏仁 | - | - | 杂货店 | | 璃月-璃月港 | 卯师傅 | 鱼肉、螃蟹 | 竹笋、莲蓬、松茸、蘑菇、胡萝卜、白萝卜、绝云椒椒 | 面粉、糖、香肠、火腿 | | | 璃月-璃月港 | 老孙 | 鱼肉、螃蟹、虾仁 | - | - | | -| 璃月-璃月港 | 老高 | 鱼肉、鱼肉2 | - | - | | +| 璃月-璃月港 | 老高 | 鱼肉 | - | - | | | 璃月-璃月港 | 长顺 | 土豆 | 石珀、电气水晶 | 糖、奶酪 | | | 璃月-璃月港 | 琳琅 | - | - | 游医的药壶、游医的枭羽、游医的方巾、游医的银莲、游医的怀钟 | 狗粮商人 | | 璃月-璃月港 | 张顺 | - | - | 幸运儿之杯、幸运儿鹰羽、幸运儿银冠、幸运儿绿花、幸运儿沙漏 | 狗粮商人 | From be55175a07ba54e74cd842a0b3cbc893cb684081 Mon Sep 17 00:00:00 2001 From: Leeon-666 <3424780951@qq.com> Date: Mon, 7 Sep 2026 00:15:40 +0800 Subject: [PATCH 2/4] fix --- .../README.md" | 6 +-- .../main.js" | 53 ++++++++++++++----- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git "a/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/README.md" "b/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/README.md" index 2a6785075d..f65923111b 100644 --- "a/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/README.md" +++ "b/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/README.md" @@ -270,9 +270,9 @@ A: 游戏内的刷新时间是**每天凌晨4点**。脚本会考虑这个时间 - 商人交互选项识别,为了解决到达目标追踪点后除目标NPC外还存在其他对话对象导致交互错误的问题 - **优化** - 商店对话选项智能化:`布纳马`、`杜拉夫`、`齐良诺夫` 等有特殊选项的NPC不再以固定 F 次数交互,而是循环识别对话内容,持续 F 交互直到出现目标选项 - - 未能进入对话时自动跳过该商人并继续下一个,不进行无效的购买尝试。 - - 调整商人`璃月-璃月港-老高`、`至冬-至冬堡-齐良诺夫`路径。 - - 合并`鱼肉` 商品识别图片,`璃月-璃月港-老高`商品列表同步更新。 + - 未能进入对话时自动跳过该商人并继续下一个,不进行无效的购买尝试 + - 调整商人`璃月-璃月港-老高`、`至冬-至冬堡-齐良诺夫`路径 + - 合并`鱼肉` 商品识别图片,`璃月-璃月港-老高`商品列表同步更新,并对旧名做了兼容处理 - **修复** - 修复了一处 fakeLog 问题 diff --git "a/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/main.js" "b/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/main.js" index e54ff439fe..fbcaa89484 100644 --- "a/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/main.js" +++ "b/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/main.js" @@ -148,8 +148,11 @@ async function loadExternalData() { userTagsToBuy.add(item); enabledTagsList.push(item); } else { - // 视为商品名 (归一化,忽略「」括号差异) - const food = normalizeFoodName(item); + // 视为商品名 (归一化,忽略「」括号差异,并兼容旧商品名) + const food = canonicalFoodName(item); + if (food !== normalizeFoodName(item)) { + log.info(`商品名 "${item}" 已在新版本中更名为 "${food}",已自动兼容`); + } userFoodsToBuy.add(food); enabledFoodsList.push(food); } @@ -208,8 +211,8 @@ function filterUserFoods(foodList) { } return foodList.filter(food => { - // 检查归一化后的商品名是否在用户要购买的商品集合中 - const shouldBuy = userFoodsToBuy.has(normalizeFoodName(food)); + // 检查归一化(含旧名兼容)后的商品名是否在用户要购买的商品集合中 + const shouldBuy = userFoodsToBuy.has(canonicalFoodName(food)); if (recordDebug && shouldBuy) { log.info(`[调试] 用户选择购买: ${food}`); } @@ -414,8 +417,16 @@ function normalizeFoodName(name) { return String(name || "").replace(/[「」]/g, "").trim(); } -// 解析禁用的标签列表(同时归一到新规范名,使旧名禁用设置继续生效;商品名忽略「」括号差异) -const disabledTags = (settings.disabledTags || "").split(/[,\s、]+/).filter(tag => tag.trim() !== "").map(tag => canonicalNpcName(normalizeFoodName(tag))); +// 商品名称兼容映射 +// 用户若仍在商品栏填写旧名,自动映射到新名,避免找不到图片而报错 +const FOOD_NAME_ALIASES = { "鱼肉2": "鱼肉" }; +function canonicalFoodName(name) { + const normalized = normalizeFoodName(name); + return FOOD_NAME_ALIASES[normalized] || normalized; +} + +// 解析禁用的标签列表(同时归一到新规范名,使旧名禁用设置继续生效;商品名忽略「」括号差异并兼容旧商品名) +const disabledTags = (settings.disabledTags || "").split(/[,\s、]+/).filter(tag => tag.trim() !== "").map(tag => canonicalNpcName(canonicalFoodName(tag))); if (disabledTags.length > 0) { log.info(`已禁用标签或商品: ${disabledTags.join(", ")}`); } @@ -457,6 +468,24 @@ async function loadNpcRecords() { changed = true; } } + // 清除记录中已废弃的旧商品名,避免脏数据残留 + const removedFoodAliases = []; + for (const record of records) { + for (const type of ["1d", "3d", "7d", "thu", "month"]) { + if (Array.isArray(record[type])) { + const removed = record[type].filter(food => FOOD_NAME_ALIASES[normalizeFoodName(food)]); + if (removed.length > 0) { + record[type] = record[type].filter(food => !FOOD_NAME_ALIASES[normalizeFoodName(food)]); + removedFoodAliases.push(...removed); + changed = true; + } + } + } + } + if (removedFoodAliases.length > 0) { + const uniqueNames = [...new Set(removedFoodAliases.map(food => normalizeFoodName(food)))]; + log.info(`已从购买记录中清除 ${removedFoodAliases.length} 条已废弃的旧商品名记录: ${uniqueNames.join(", ")}`); + } if (changed) { // 单独捕获落盘失败:写失败不应让本轮记录被当作空,否则会触发重复购买 try { @@ -632,9 +661,9 @@ function shouldBuyFoods(npc, npcRecord, currentPeriod, forceRefresh = false) { useAll = npc.tags.some(tag => userTagsToBuy.has(tag)); } let candidateList = useAll ? fullList : filterUserFoods(fullList); - // 过滤容量上限和禁用商品(禁用匹配忽略「」括号差异) + // 过滤容量上限和禁用商品(禁用匹配忽略「」括号差异,并兼容旧商品名) candidateList = candidateList.filter(food => - !capacityLimitedFoods.has(food) && !disabledTagsSet.has(normalizeFoodName(food)) + !capacityLimitedFoods.has(food) && !disabledTagsSet.has(canonicalFoodName(food)) ); return candidateList; } @@ -1036,8 +1065,8 @@ let foodROMap = {}; // 键为商品名(中文),值为 RecognitionObject async function initRo() { try { for (let foodName of requiredFoods) { - // 统一用归一化名称作键,保证与购买时的查找键一致 - const roKey = normalizeFoodName(foodName); + // 统一用归一化(含旧名兼容)名称作键,保证与购买时的查找键一致 + const roKey = canonicalFoodName(foodName); if (foodROMap[roKey]) { continue; // 同一商品的另一种写法(带/不带「」)已加载过 } @@ -1175,8 +1204,8 @@ async function buyFoods(npcName, npcRecords, currentPeriod) { log.info(`[调试] 尝试购买: ${item}`); } - // 查找识别对象(键为归一化名称,兼容带/不带「」的商品名) - const ro = foodROMap[normalizeFoodName(item)]; + // 查找识别对象(键为归一化名称,兼容带/不带「」及旧商品名) + const ro = foodROMap[canonicalFoodName(item)]; if (!ro) { log.warn(`商品 "${item}" 未启用或没有识别对象,跳过`); continue; From 8262274ee8613961ebb50ba164e7d1e811c34cbf Mon Sep 17 00:00:00 2001 From: Leeon-666 <3424780951@qq.com> Date: Mon, 7 Sep 2026 09:25:07 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=96=B0=E7=89=88=E8=B7=AF=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\350\211\257\350\257\272\345\244\253.json" | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git "a/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/assets/path/\350\207\263\345\206\254-\350\207\263\345\206\254\345\240\241-\351\275\220\350\211\257\350\257\272\345\244\253.json" "b/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/assets/path/\350\207\263\345\206\254-\350\207\263\345\206\254\345\240\241-\351\275\220\350\211\257\350\257\272\345\244\253.json" index 3e30ee2b96..bd23ed1505 100644 --- "a/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/assets/path/\350\207\263\345\206\254-\350\207\263\345\206\254\345\240\241-\351\275\220\350\211\257\350\257\272\345\244\253.json" +++ "b/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/assets/path/\350\207\263\345\206\254-\350\207\263\345\206\254\345\240\241-\351\275\220\350\211\257\350\257\272\345\244\253.json" @@ -13,7 +13,7 @@ "bgi_version": "0.45.0", "description": "", "enable_monster_loot_split": false, - "last_modified_time": 1788702202632, + "last_modified_time": 1788720510037, "map_match_method": "SIFT", "map_name": "Teyvat", "name": "至冬-至冬堡-齐良诺夫", @@ -45,9 +45,9 @@ "action_params": "", "id": 3, "move_mode": "walk", - "type": "target", - "x": 6854.3213, - "y": 9636.8184 + "type": "path", + "x": 6856.4893, + "y": 9634.7383 }, { "action": "", @@ -55,17 +55,17 @@ "id": 4, "move_mode": "walk", "type": "target", - "x": 6854.4785, - "y": 9634.959 + "x": 6854.7539, + "y": 9634.5029 }, { "action": "combat_script", - "action_params": "w(0.3),wait(1.5)", + "action_params": "w(0.3),wait(0.3),j,w(0.3),wait(1.5)", "id": 5, "move_mode": "walk", "type": "orientation", - "x": 6848.126, - "y": 9634.5098 + "x": 6847.7227, + "y": 9633.6924 } ] } \ No newline at end of file From da2b419288800c56da4bf2e26eb27d880eb6d384 Mon Sep 17 00:00:00 2001 From: Leeon-666 <3424780951@qq.com> Date: Wed, 9 Sep 2026 11:55:29 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BC=98=E5=8C=96uid=E8=AF=86=E5=88=AB?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../README.md" | 1 + .../assets/images/Exit.png" | Bin 1229 -> 0 bytes .../main.js" | 65 ++++-------------- 3 files changed, 14 insertions(+), 52 deletions(-) delete mode 100644 "repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/assets/images/Exit.png" diff --git "a/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/README.md" "b/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/README.md" index f65923111b..2c87d27578 100644 --- "a/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/README.md" +++ "b/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/README.md" @@ -273,6 +273,7 @@ A: 游戏内的刷新时间是**每天凌晨4点**。脚本会考虑这个时间 - 未能进入对话时自动跳过该商人并继续下一个,不进行无效的购买尝试 - 调整商人`璃月-璃月港-老高`、`至冬-至冬堡-齐良诺夫`路径 - 合并`鱼肉` 商品识别图片,`璃月-璃月港-老高`商品列表同步更新,并对旧名做了兼容处理 + - 优化了uid识别逻辑,降低了复杂性 - **修复** - 修复了一处 fakeLog 问题 diff --git "a/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/assets/images/Exit.png" "b/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/assets/images/Exit.png" deleted file mode 100644 index e29de3a6161c8f6c9d4aa0dc18c5af6b8d8f43c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1229 zcmV;;1Ty=HP)0(S0D%if6Oq9ouvs)!;Qg7^bL$d({&^gTI!S9o4)d#b`%%6 zQCeI8k2{Y^BvHhngOw;P_GA%cLY5>p%3-%bOX$dR*ilwmh(b?3@5w|-OA~PofnW&H zSR9HZ!Rb(WGA(`?RF;>(mFI-2DllMR%fF3qIGQq2wka|cMdm-@U<{FH9HJ;-I~+y- z%_;WuU{(2lQhjrE5KAlTh{Y42i0Zn|N8xa&OeT^A6iYf6)u!+S`X7tMG56O3`iG{l zvbM1&$-u4K7@4?-P&mqKHEri?-1$yKcMTWGo8${g64N#y>n3LAFgQE|-)6v)Wc>Cl z`Ub`j2!^xX*;R#)f;^HPb``p&!-~kpnn^+)y!m<+zW%ZUbw>_yNQJq3QwAxFK9NWa({~@B_vbMzEUsFF!iKii zdXy9uuu!Z>2<>gh(RJZH6y!Uh>jsBi@Gj1$X40Z~Lc{c(dGuT#!PDn!S(}j8bhvcL zxkxT|o`kB}cwQ2+IT`6$wTWmtTEj_uwRaecOWw4NVixC^M8~-%eD-lGt2Yy()dES9 z(9}@FmhG!3O*6#mnb3K@IVTBn5n;FP9jmXwr=2HJ@oEW=nL}lMCX!1XCvuYPN%Vh1 z&fG6)DXC>*W|q&1O3Pm8?H}WHm%CchyfTN^(j!gNG5z~IdVU(o5<@Ofi@0`ul&gsq zWU|D}O!A(&`v5=mjacRq%Uck*ie$>0Qi8@Vw!hCgXO5EW+X!%lrFK9SVRB{;KlYE| znMDrK;xjFjux85@NN3x4}`K7 zI-Pc$Iq@!MeOghSxX+s`ulg+OUDduaZu4v24aih5sfSRNPH1{Ii9^MQAJpOe=|&WK zTxsu`8*BOZ+n$@26`b~@(9y7%>=!hN2F*}pnUl7yr5?p5Pcq3UoYZDAK@L!r(G3G4 zRcyNXklJ>-;m%En&g_lD`*H461Io*aEN?-{v9qlWXg*rY-qTvzoIoO=4o(ipqEj|gZnJ<|r%e_jS(bf3b*$Ir3u^RxU(!PLJ(p$JDyq%VrBtVk?Jx~x#g4M$>l z;qxOJ$z83@Af=M1xVj5Kf!oE`I3go(2_jay8d3kC`y9D08xkHpS;pHn)o?m@ZZf$* r%DO-Mh>arzgJEoH+q*(A00932-QYti1R*n>00000NkvXXu0mjfJho8- diff --git "a/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/main.js" "b/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/main.js" index fbcaa89484..218029432c 100644 --- "a/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/main.js" +++ "b/repo/js/\350\207\252\345\212\250\350\264\255\344\271\260\345\225\206\345\223\201/main.js" @@ -340,64 +340,25 @@ function validateUserName(name) { return name.trim().replace(/[\\/:*?"<>|]/g, '_'); } +// 使用genshin.uid()获取当前角色UID async function getUidFromGame() { - // 设置脚本环境的游戏分辨率和DPI缩放 - setGameMetrics(3840, 2160, 1.5); - - // 确保回到主界面 - await genshin.returnMainUi(); - await sleep(1000); - - // 打开派蒙菜单 - keyPress("G"); - await sleep(500); - - // 加载退出按钮识别图(需要 assets/images/Exit.png 存在) - let imageExitRo; try { - imageExitRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/images/Exit.png")); - imageExitRo.Threshold = 0.8; - } catch (e) { - log.warn("无法加载 assets/Exit.png,将使用固定延时等待菜单打开"); - } + // 确保回到主界面 + await genshin.returnMainUi(); + await sleep(1000); - if (imageExitRo) { - // 等待退出按钮出现,最多5秒 - const startTime = Date.now(); - while (Date.now() - startTime < 5000) { - let capture = captureGameRegion(); - if (capture.Find(imageExitRo).isExist()) { - capture.dispose(); - break; - } - capture.dispose(); - await sleep(500); + // 通过OCR识别当前角色UID,识别失败返回0 + const uidInt = await genshin.uid(); + const uid = uidInt ? String(uidInt) : ""; + if (uid.length >= 5) { // UID通常9位,至少5位 + log.info(`从游戏获取到UID: ${uid}`); + return uid; } - } else { - await sleep(2000); // 无图片则直接等待2秒 - } - - // OCR识别UID - let gameRegion = captureGameRegion(); - let ocrResult = gameRegion.Find(RecognitionObject.Ocr(1679, 1048, 200, 28)); - gameRegion.dispose(); - - let uid = ""; - if (ocrResult.isExist() && ocrResult.text) { - uid = ocrResult.text.replace(/\D/g, ''); // 只保留数字 - } - - // 关闭派蒙菜单 - keyPress("ESCAPE"); - await sleep(500); - await genshin.returnMainUi(); - - if (uid && uid.length >= 5) { // UID通常9位,至少5位 - log.info(`从游戏获取到UID: ${uid}`); - return uid; - } else { log.warn("无法从游戏获取UID"); return null; + } catch (error) { + log.warn(`获取UID失败: ${error.message}`); + return null; } }