From b181b020fca798d8dbc0c74b80bc41b4b1f11049 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=B1=E5=91=B1z?= <131586533+jidingcai@users.noreply.github.com> Date: Thu, 28 Aug 2025 21:40:15 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E9=93=81=E5=8C=A0=E9=93=BAjs=E3=80=91?= =?UTF-8?q?2.3.0=E6=9B=B4=E6=96=B0=20=20(#1745)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 【铁匠铺js】路径优化与新增 修复:枫丹铁匠铺走过头的问题 新增:纳塔铁匠铺 * 【铁匠铺js】整理模板匹配图像 * 【铁匠铺js】2.3.0更新 - **修复**:枫丹铁匠铺跑过头导致失败的问题 - **优化**:仅领取锻造时,先检测大地图左上角是否有【锻造奖励】图标 - **新增**: 1. 模式选择(默认模式一) - 模式一:自动识别背包中数量最多的矿石锻造,失败自动切换到手动优先级(可能存在数量识别错误) - 模式二:手动优先级,依次尝试主选及备选矿石 2. 支持纳塔铁匠铺 --------- Co-authored-by: 起个名字好难的喵 <25520958+MisakaAldrich@users.noreply.github.com> --- repo/js/铁匠铺/README.md | 212 ++++++---- repo/js/铁匠铺/assets/Pathing/枫丹铁匠铺.json | 66 +-- repo/js/铁匠铺/assets/Pathing/纳塔铁匠铺.json | 40 ++ .../{ => DialogueInterface}/Forge.png | Bin .../GameInterface/DisabledMaterialsFace.png | Bin 0 -> 3539 bytes .../{ => GameInterface}/ForgingInterface.png | Bin .../GameInterface/InventoryInterface.png | Bin 0 -> 3440 bytes .../GameInterface/MaterialsFace.png | Bin 0 -> 3899 bytes .../ConfirmDeployButton.png} | Bin .../assets/RecognitionObject/Icon/MapForge.png | Bin 0 -> 1035 bytes .../RecognitionObject/{ => Icon}/全部领取.png | Bin .../assets/RecognitionObject/Icon/右上角巨诗.png | Bin 0 -> 1032 bytes .../RecognitionObject/ItemImage/AmethystLump.png | Bin 0 -> 8055 bytes .../ItemImage/CondessenceCrystal.png | Bin 0 -> 10125 bytes .../RecognitionObject/ItemImage/CrystalChunk.png | Bin 0 -> 8796 bytes repo/js/铁匠铺/main.js | 398 ++++++++++++++++-- repo/js/铁匠铺/manifest.json | 49 +-- repo/js/铁匠铺/settings.json | 19 +- 18 files changed, 617 insertions(+), 167 deletions(-) create mode 100644 repo/js/铁匠铺/assets/Pathing/纳塔铁匠铺.json rename repo/js/铁匠铺/assets/RecognitionObject/{ => DialogueInterface}/Forge.png (100%) create mode 100644 repo/js/铁匠铺/assets/RecognitionObject/GameInterface/DisabledMaterialsFace.png rename repo/js/铁匠铺/assets/RecognitionObject/{ => GameInterface}/ForgingInterface.png (100%) create mode 100644 repo/js/铁匠铺/assets/RecognitionObject/GameInterface/InventoryInterface.png create mode 100644 repo/js/铁匠铺/assets/RecognitionObject/GameInterface/MaterialsFace.png rename repo/js/铁匠铺/assets/RecognitionObject/{Confirm Deploy Button.png => Icon/ConfirmDeployButton.png} (100%) create mode 100644 repo/js/铁匠铺/assets/RecognitionObject/Icon/MapForge.png rename repo/js/铁匠铺/assets/RecognitionObject/{ => Icon}/全部领取.png (100%) create mode 100644 repo/js/铁匠铺/assets/RecognitionObject/Icon/右上角巨诗.png create mode 100644 repo/js/铁匠铺/assets/RecognitionObject/ItemImage/AmethystLump.png create mode 100644 repo/js/铁匠铺/assets/RecognitionObject/ItemImage/CondessenceCrystal.png create mode 100644 repo/js/铁匠铺/assets/RecognitionObject/ItemImage/CrystalChunk.png diff --git a/repo/js/铁匠铺/README.md b/repo/js/铁匠铺/README.md index 2f171078c..1026bc400 100644 --- a/repo/js/铁匠铺/README.md +++ b/repo/js/铁匠铺/README.md @@ -1,97 +1,163 @@ -// ==UserScript== -// @name 自动锻造魔矿脚本 -// @version 2.2.1 -// @description 自动前往铁匠铺并锻造魔矿,通过识图模式自动选择矿石 -// @author 呱呱z -// @match 原神版本:5.6;BGI 版本:0.45.1 -// ==/UserScript== - -/\*\* - -- === 重要免责声明 === -- 1. 使用风险 -- - 本脚本为开源学习项目,禁止用于商业用途或违反游戏条款的行为。 -- - 滥用可能导致游戏账号封禁,开发者不承担任何直接或间接责任。 -- -- 2. 责任限制 -- - 本脚本按“现状”提供,不承诺兼容性、安全性或功能完整性。 -- - 因使用本脚本导致的账号、数据、设备损失,开发者概不负责。 -- -- 3. 禁止条款 -- - 严禁逆向工程、恶意篡改或用于外挂等非法用途。 -- - 如游戏运营商提出要求,开发者保留随时停止维护的权利。 -- -- 使用即表示您已阅读并同意上述条款。 -- -- Last Updated: 2025-05-12 - \*/ - # 自动锻造魔矿脚本 -## 简介 +## ⚠️ 免责声明 -本脚本可自动前往铁匠铺并利用识图模式选择需要的矿石锻造魔矿。 +> **重要提示:请在使用前仔细阅读以下内容** -## 文件结构 +### 使用风险 +本脚本为开源学习项目,仅限个人学习使用,**禁止用于商业用途或任何违反游戏条款的行为**。滥用可能导致游戏账号封禁,开发者不承担任何直接或间接责任。 -- **main.js**:负责核心业务逻辑,包括前往铁匠铺和执行锻造任务。 -- **manifest.json**:脚本配置文件,记录基本信息和设置。 -- **settings.json**:用户配置文件,用于选择目标铁匠铺和指定矿石。 +### 责任限制 +本脚本按"现状"提供,不承诺兼容性、安全性或功能完整性。因使用本脚本导致的账号、数据、设备等任何损失,开发者概不负责。 -## 使用方法 +### 禁止条款 +严禁对本脚本进行逆向工程、恶意篡改或用于外挂等非法用途。如游戏运营商提出要求,开发者保留随时停止维护的权利。 -1. 将脚本添加至调度器。 -2. 右键点击脚本以修改 JS 自定义配置。 -3. 在配置文件中选择目标城市的铁匠铺(默认选择枫丹铁匠铺),并设定所需矿石(默认:水晶矿)。 - - 注意:由于地图追踪功能尚不支持室内定位,故纳塔铁匠铺不可用。 - - 可选矿石: - - 默认:水晶矿 - - 其他:紫晶矿、萃凝晶 - - 如需使用“星银矿石”、“白铁块”或“铁块”,请打开 `settings.json`,删除对应矿石前的 `//` 注释后保存配置。 +**使用本脚本即表示您已阅读、理解并同意上述所有条款。** -## 后言 +## 📞 联系与反馈 -本脚本目前处于测试阶段,欢迎反馈问题至 QQ:1765137214。 +如有任何建议或问题,欢迎通过以下方式联系: +📧 QQ:1765137214 -## 更新日志 +--- -### 2.2.1(2025.08.03) +## ✨ 功能介绍 +适用于原神 5.6 +BGI 0.48.2 版本 +本脚本能够自动前往指定铁匠铺,通过智能图像识别技术自动选择或按预设优先级锻造魔矿: -- 加快锻造速度 -- 优化通知逻辑,减少通知被吞概率 +- 🗺️ **自动寻路** - 智能导航至指定铁匠铺 +- 🔍 **矿石识别** - 支持多种矿石的自动识别与选择 +- 🎯 **双模式锻造** - 提供自动和手动两种智能模式 +- 📊 **状态通知** - 实时桌面通知与详细执行日志 +- 🛡️ **异常处理** - 智能应对各种异常情况 + +## 📁 文件结构 + +``` +自动锻造魔矿脚本/ +├── main.js # 核心业务逻辑 +├── manifest.json # 脚本元信息与基础配置 +└── settings.json # 用户自定义配置文件 +``` + +## 🚀 快速开始 + +### 1. 安装脚本 +将本脚本添加至 BGI 脚本调度器。 + +### 2. 配置参数 +右键点击脚本,选择"编辑 JS 配置"或直接修改 `settings.json` 文件: + +```json +{ + "smithyName": "枫丹铁匠铺", + "ore": "水晶块", + "secondaryOre": "紫晶块", + "tertiaryOre": "萃凝晶", + "notice": true, + "forgedOrNot": "是", + "model": "模式一" +} +``` + +### 3. 矿石配置说明 + +**默认支持矿石**: +- 水晶块 +- 紫晶块 +- 萃凝晶 + +**扩展矿石配置**: +如需使用"星银矿石"、"白铁块"或"铁块",请在 `settings.json` 中取消对应矿石前的注释(`//`),保存后即可生效。 + +## ⚙️ 功能详解 + +### 🔧 锻造模式 + +| 模式 | 描述 | +|------|------| +| **模式一(自动)** | 自动识别背包中数量最多的矿石进行锻造,识别失败时自动切换到手动优先级模式(可能存在数量识别错误) | +| **模式二(手动)** | 按照用户配置的优先级顺序,依次尝试主选及备选矿石 | + +### 🎯 特殊功能 + +- **仅领取锻造**:如选择"否",则仅检测并领取已完成的锻造奖励 +- **智能兜底**:自动模式识别失败时,自动切换到手动优先级模式 +- **通知与日志**:支持桌面通知和详细日志,便于追踪脚本执行状态 +- **异常处理**:多次识别失败、材料不足等情况均有详细提示和自动处理 + +## 📋 使用注意事项 + +1. **环境要求**:确保游戏分辨率、BGI 版本与脚本要求一致 +2. **窗口状态**:运行脚本时请保持游戏窗口处于前台且未被遮挡 +3. **权限设置**:确保已授予脚本必要的系统权限 +3. **权限设置**:部分模块由于使用了快捷键,请确保快捷键为默认值。例如纳塔铁匠铺以及仅领取锻造前检查,使用地图快捷键"M";模式一矿物识别部分,使用背包快捷键"B"。因为模式一调用了OCR,数字识别部分可能出现错误 + +## ❓ 常见问题 + +Q:脚本运行后无反应? +**A**:请按以下步骤排查: +1. 检查游戏分辨率是否符合要求 +2. 确认 BGI 版本是否为 0.48.2 或更高 +3. 验证脚本配置是否正确 +4. 确保游戏窗口处于前台且未被遮挡 +5. 确认游戏快捷键设置为默认值(特别是地图"M"和背包"B"键) + +Q:OCR识别矿石数量不准确怎么办? +**A**:这是OCR技术的固有局限性,可尝试: + +切换到模式二(手动优先级模式) + +--- + +## 📜 更新日志 + +### 2.3.0`(2025-08-28)` +- **修复**:枫丹铁匠铺跑过头导致失败的问题 +- **优化**:仅领取锻造时,先检测大地图左上角是否有【锻造奖励】图标 +- **新增**: + 1. 模式选择(默认模式一) + - 模式一:自动识别背包中数量最多的矿石锻造,失败自动切换到手动优先级(可能存在数量识别错误) + - 模式二:手动优先级,依次尝试主选及备选矿石 + 2. 支持纳塔铁匠铺 + +### 2.2.1`(2025-08-03)` +- 加快锻造速度 +- 优化通知逻辑,减少通知被吞概率 ### 2.1 +- 使用新版版本号 +- 5.7 提高了锻造上限,锻造次数由 3 改为 4 -- 使用新版版本号 -- 5.7 提高了锻造上限,因此使用锻造次数从 3 改成了 4 +### 2.00523(2025-05-23) +- 新增仅领取锻造 +- 优化点击逻辑 +- 修复锻造点击次数超过 3 次的 bug -### 2.00523(2025.05.23) +### 2.0(2025-05-22) +- 新增矿石不足时自动选择备用矿石 -- 新增仅领取锻造 -- 优化点击逻辑 -- 修复点击锻造的次数超过 3 次的 bug +### 1.40521(2025-05-21) +- 新增矿石未能识别时自动选择备用矿石 -### 2.0(2025.05.22) +### 1.4(2025-05-20) +- 新增通知功能 -- 新增矿石不足时自动选择备用选矿 +### 1.3(2025-05-15) +- 修复选择"萃凝晶"时无法识别的问题 +- 仓库内新增标签 -### 1.40521(2025.05.21) +### 1.2(2025-05-12) +- 修复选择"萃凝晶"时无法识别的 bug -- 新增矿石未能识别时自动选择备用选矿 +### 1.1(2025-05-01) +- 优化矿石选取方式,改用识图模式 -### 1.4(2025.05.20) +--- -- 新增通知功能 +**最后更新**:2025 年 8 月 28 日 +**维护者**:@呱呱z -### 1.3(2025.05.15) - -- 修复选择“萃凝晶”时无法识别的问题 -- 仓库内新增标签。 - -### 1.2(2025.05.12) - -- 修复选择“萃凝晶”时无法识别的 bug - -### 1.1(2025.05.01) - -- 优化矿石选取方式,改用识图模式 +> 💡 提示:建议定期检查更新以获取最佳体验和最新功能 \ No newline at end of file diff --git a/repo/js/铁匠铺/assets/Pathing/枫丹铁匠铺.json b/repo/js/铁匠铺/assets/Pathing/枫丹铁匠铺.json index 31bd5e2c1..b7393f2b3 100644 --- a/repo/js/铁匠铺/assets/Pathing/枫丹铁匠铺.json +++ b/repo/js/铁匠铺/assets/Pathing/枫丹铁匠铺.json @@ -1,48 +1,62 @@ -{ +{ "info": { - "name": "枫丹铁匠铺", - "type": "collect", - "author": "寒露", - "version": "1.0", + "authors": [ + { + "links": "", + "name": "寒露" + }, + { + "links": "", + "name": "呱呱z" + } + ], + "bgi_version": "0.45.0", "description": "", - "bgi_version": "0.42.3" + "enable_monster_loot_split": false, + "last_modified_time": 1756367313887, + "map_match_method": "", + "map_name": "Teyvat", + "name": "枫丹铁匠铺", + "tags": [], + "type": "collect", + "version": "1.1" }, "positions": [ { - "id": 1, "action": "", + "action_params": "", + "id": 1, "move_mode": "run", "type": "teleport", "x": 4514.0908203125, - "y": 3630.588623046875, - "action_params": "" + "y": 3630.588623046875 }, { + "action": "", + "action_params": "", "id": 2, + "move_mode": "run", + "type": "path", "x": 4518.59765625, - "y": 3601.3916015625, - "type": "path", - "move_mode": "run", - "action": "", - "action_params": "" + "y": 3601.3916015625 }, { + "action": "", + "action_params": "", "id": 3, - "x": 4563.74755859375, - "y": 3593.390869140625, - "type": "path", "move_mode": "run", - "action": "", - "action_params": "" + "type": "path", + "x": 4563.74755859375, + "y": 3593.390869140625 }, { - "id": 4, - "x": 4580.56640625, - "y": 3603.6337890625, - "type": "path", - "move_mode": "walk", "action": "", - "action_params": "" + "action_params": "", + "id": 4, + "move_mode": "dash", + "type": "target", + "x": 4580.56640625, + "y": 3603.6337890625 } ] -} +} \ No newline at end of file diff --git a/repo/js/铁匠铺/assets/Pathing/纳塔铁匠铺.json b/repo/js/铁匠铺/assets/Pathing/纳塔铁匠铺.json new file mode 100644 index 000000000..e03c069f1 --- /dev/null +++ b/repo/js/铁匠铺/assets/Pathing/纳塔铁匠铺.json @@ -0,0 +1,40 @@ +{ + "info": { + "authors": [ + { + "links": "", + "name": "呱呱z" + } + ], + "bgi_version": "0.48.2", + "description": "", + "enable_monster_loot_split": false, + "last_modified_time": 1756367298175, + "map_match_method": "", + "map_name": "Teyvat", + "name": "纳塔铁匠铺", + "tags": [], + "type": "collect", + "version": "1.0" + }, + "positions": [ + { + "action": "", + "action_params": "", + "id": 1, + "move_mode": "walk", + "type": "path", + "x": 9025.55078125, + "y": -1913.60107421875 + }, + { + "action": "", + "action_params": "", + "id": 2, + "move_mode": "dash", + "type": "target", + "x": 9036.7490234375, + "y": -1939.0771484375 + } + ] +} diff --git a/repo/js/铁匠铺/assets/RecognitionObject/Forge.png b/repo/js/铁匠铺/assets/RecognitionObject/DialogueInterface/Forge.png similarity index 100% rename from repo/js/铁匠铺/assets/RecognitionObject/Forge.png rename to repo/js/铁匠铺/assets/RecognitionObject/DialogueInterface/Forge.png diff --git a/repo/js/铁匠铺/assets/RecognitionObject/GameInterface/DisabledMaterialsFace.png b/repo/js/铁匠铺/assets/RecognitionObject/GameInterface/DisabledMaterialsFace.png new file mode 100644 index 0000000000000000000000000000000000000000..80aec26326210a80d424a25550d72d5337ecd48b GIT binary patch literal 3539 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 JPDHLkV1fcqisb+R literal 0 HcmV?d00001 diff --git a/repo/js/铁匠铺/assets/RecognitionObject/Confirm Deploy Button.png b/repo/js/铁匠铺/assets/RecognitionObject/Icon/ConfirmDeployButton.png similarity index 100% rename from repo/js/铁匠铺/assets/RecognitionObject/Confirm Deploy Button.png rename to repo/js/铁匠铺/assets/RecognitionObject/Icon/ConfirmDeployButton.png diff --git a/repo/js/铁匠铺/assets/RecognitionObject/Icon/MapForge.png b/repo/js/铁匠铺/assets/RecognitionObject/Icon/MapForge.png new file mode 100644 index 0000000000000000000000000000000000000000..99ee9c73b3907bcea4fde3a4e202e66594a3741d GIT binary patch literal 1035 zcmV+m1oZofP)P000>X0ssI2ON$aT00009a7bBm000tn z000tn0p4aGcmMzZ5p+dZbW?9;ba!ELWdKudX>eh4bY)!^&fNe202g#cSael$WpW@x zZ*6U5Zgc=sV{&C>ZgXgFboX@)M*si=eMv+?R5*?0l1*xTB*1VG_eplYOmSRtqaihxQ$q^P1I zEtDiUiR*mZ&Wt^Fm>JK#heb=9HZ2R}9Y<$zb)@^~J@0u*d1VfoRP5u+SDFGMKuA0u zYYGbhSaNToIV41-IUoQaq~gk>v}>6LI`7w0RSNSe#7&95d2=5aQHop691i$#5tX2w__`v+N20BobW*2KKdt!*`cg78diq=W&e#kf$gj zRi~CtCEtAG;)!F!p-{+g_?w$WcIxD-2L=aTJUY~$=>-70QvG)F`?2va%3Bua{E4Ef zj?>lI@&0>n5A5r=EPE-RS5+2^McKRWyrt=y2!h%9T)n=XOeW5Zp7wnI@+V^=2}o?{uxQl~MuQ+gDS*KJek2X|1_+4Zuvx2?>wo!;Mx#}y zN~A?K4W(2n6^ljAShT$@9*dUB<fbr6eHdbNThn zO$7rtpI^E2M-D~6s4_A#f`~J>ey>&?q9_lPJ2eU(bv!QKGQRE`_7fI&n(;Ks!GTc;%XY^{CuvXv!lPSx3{N9g0i}@ z=({y~aDUn~jA*>`%(;s_>Ga*g>ecbjZ_eE28sEL+L)WGJ;rdSyIIcJnT4Fm)@SA`H$(>ENa7He-$r@FI;hv^H4 zQZK*qS~MD4$}fNL;YU-`H*`(oyW;*>A%LcFA?2^PezPol=x`P=P$1a8`O6d_`o8;T zZh;a-;|vHAf&`EN67o+2!j3y2qONHg=TeGr*en#5{sskfm}WDJh9>|3002ovPDHLk FV1ilP)Aj%W literal 0 HcmV?d00001 diff --git a/repo/js/铁匠铺/assets/RecognitionObject/全部领取.png b/repo/js/铁匠铺/assets/RecognitionObject/Icon/全部领取.png similarity index 100% rename from repo/js/铁匠铺/assets/RecognitionObject/全部领取.png rename to repo/js/铁匠铺/assets/RecognitionObject/Icon/全部领取.png diff --git a/repo/js/铁匠铺/assets/RecognitionObject/Icon/右上角巨诗.png b/repo/js/铁匠铺/assets/RecognitionObject/Icon/右上角巨诗.png new file mode 100644 index 0000000000000000000000000000000000000000..d5e2ed9b6024fbb64aa4d8d48bb52c54f478082d GIT binary patch literal 1032 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 FV1lp0g7^Rc literal 0 HcmV?d00001 diff --git a/repo/js/铁匠铺/assets/RecognitionObject/ItemImage/CondessenceCrystal.png b/repo/js/铁匠铺/assets/RecognitionObject/ItemImage/CondessenceCrystal.png new file mode 100644 index 0000000000000000000000000000000000000000..0a7996416ad9e10bb50019be0678d9e91f2f5891 GIT binary patch literal 10125 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 literal 0 HcmV?d00001 diff --git a/repo/js/铁匠铺/assets/RecognitionObject/ItemImage/CrystalChunk.png b/repo/js/铁匠铺/assets/RecognitionObject/ItemImage/CrystalChunk.png new file mode 100644 index 0000000000000000000000000000000000000000..d30bb2d7f76fef29a07f84ecaa68e7a5a6e112bc GIT binary patch literal 8796 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 返回识别结果对象 + */ +async function findAndInteract(target, options = {}) { + // 合并默认选项 + const { + useClick = false, + timeout = 3000, + interval = 300, + clickCenter = true, + postClickDelay = 300, + singleAttempt = false + } = options || {}; + + const startTime = Date.now(); + let attemptCount = 0; + let lastError = null; + + // 结果对象结构 + const resultTemplate = { + success: false, + position: null, // {x, y} 原始位置 + clickPosition: null, // {x, y} 点击位置 + dimensions: null, // {width, height} + attempts: 0, + elapsed: 0, + error: null + }; + + // 主识别循环 + while (true) { + attemptCount++; + let gameRegion = null; + try { + // 1. 捕获游戏区域 + gameRegion = captureGameRegion(); + // 2. 执行图像识别 + const found = gameRegion.find(target); + + if (found?.isExist?.() === true) { + // 构建成功结果 + const result = { + ...resultTemplate, + success: true, + position: { x: found.x, y: found.y }, + dimensions: { width: found.width, height: found.height }, + attempts: attemptCount, + elapsed: Date.now() - startTime + }; + + //log.info(`✅ 识别成功 | 位置: (${found.x}, ${found.y}) | 尺寸: ${found.width}x${found.height} | 尝试: ${attemptCount}次`); + + // 3. 处理点击交互 + if (useClick) { + // 计算点击位置 + const clickPos = clickCenter + ? { + x: Math.round(found.x + found.width / 2), + y: Math.round(found.y + found.height / 2) + } + : { x: Math.round(found.x), y: Math.round(found.y) }; + + result.clickPosition = clickPos; + + // 兼容同步/异步 click + if (typeof click === 'function') { + const clickResult = click(clickPos.x, clickPos.y); + if (clickResult && typeof clickResult.then === 'function') { + await clickResult; + } + } + //log.info(`🖱️ 已点击位置: (${clickPos.x}, ${clickPos.y})`); + + // 点击后延迟 + if (postClickDelay > 0) { + await sleep(postClickDelay); + } + } + + return result; + } + + // 未找到时的日志 + if (attemptCount % 3 === 0) { + log.debug(`⏳ 识别尝试中... 次数: ${attemptCount}, 已用时: ${Date.now() - startTime}ms`); + } + } catch (error) { + lastError = error; + log.error(`识别异常,错误: ${error.message}`); + } finally { + // 4. 资源清理 + if (gameRegion?.dispose) { + try { gameRegion.dispose(); } catch (e) { } + } + } + + // 退出条件 + if (singleAttempt || Date.now() - startTime >= timeout) { + log.warn(`识别失败 | 尝试: ${attemptCount}次,未能识别到目标图像`); + return { + ...resultTemplate, + attempts: attemptCount, + elapsed: Date.now() - startTime, + error: lastError?.message + }, + false; + } + await sleep(interval); + } +} + + + + + // 图像识别函数 function recognizeImage(imagePath, x, y, searchWidth, searchHeight) { try { @@ -88,12 +280,97 @@ function determineOre(oreType) { return message; } + /*********************** 主逻辑函数 ***********************/ +// 模式一:自动识别背包中数量最多的矿石 +async function getMaxOreType() { + try { + //开启背包 + //【背包】界面检测 + if (!await findAndInteract(InventoryInterFaceRo, { + singleAttempt: true + })) { + log.info("未检测到背包界面,尝试返回主界面并打开背包"); + await genshin.returnMainUi(); + keyPress("B"); await sleep(1000); + } else { + log.info("检测到处于背包界面"); + } + + // 【材料】见面检测 + if (!await findAndInteract(MaterialsFaceRo, + { + singleAttempt: true + })) { + log.info("未处于材料界面,准备点击材料界面图标"); + await findAndInteract(DisabledMaterialsFaceRo, + { + useClick: true + }) + await sleep(600); + } else { + log.info("已经处于材料界面,准备点击料理区域"); + } + + const oreResults = [ + { name: "萃凝晶", ro: CondessenceCrystalRo }, + { name: "紫晶块", ro: AmethystLumpRo }, + { name: "水晶块", ro: CrystalChunkRo } + ]; + let maxOre = null; + let maxCount = 0; + for (const ore of oreResults) { + const result = await findAndInteract(ore.ro, { + useClick: true, + timeout: 5000, + interval: 500, + postClickDelay: 500 + }); + if (!result || !result.success || !result.clickPosition) continue; + let ocrX = result.clickPosition.x - 63; + let ocrY = result.clickPosition.y + 60; + let resList = captureGameRegion().findMulti(RecognitionObject.ocr(ocrX, ocrY, 130, 55)); + let oreNum = 0; + if (resList.count > 0) { + let text = resList[0].text.replace(/[^\d]/g, ""); + oreNum = parseInt(text, 10) || 0; + log.info(`识别到 ${OreChineseMap[ore.name]} 数量: ${oreNum}`); + } + if (oreNum > maxCount) { + maxCount = oreNum; + maxOre = ore.name; + if (notice) { + notification.info(`当前最多矿石为: ${OreChineseMap[ore.name]} 数量: ${oreNum}`); + } else { + log.info(`当前最多矿石为: ${OreChineseMap[ore.name]} 数量: ${oreNum}`); + } + } + } + return maxOre; + } catch (error) { + if (notice) { + notification.error(`自动识别背包中数量最多的矿石失败,错误: ${error.message}`); + } else { + log.error(`识自动识别背包中数量最多的矿石失败,错误: ${error.message}`); + } + return null; + } + +} + // 自动前往铁匠铺 async function autoSmithy(smithyName) { log.info(`自动前往 ${smithyName}`); try { + if (smithyName === "纳塔铁匠铺") { + keyPress("M"); await sleep(1000); + click(1845, 1015); await sleep(100); + click(1650, 355); await sleep(100); + await genshin.setBigMapZoomLevel(1.0); + click(845, 615); await sleep(100); + click(1475, 1005); await sleep(100); + } let filePath = `assets/Pathing/${smithyName}.json`; await pathingScript.runFile(filePath); if (notice) { @@ -220,7 +497,7 @@ async function tryForgeOre(oreType, skipCheckOres = []) { } // 对话、领取、锻造操作 -async function forgeOre(smithyName) { +async function forgeOre(smithyName, maxOre = null) { // 对话部分 await sleep(1000); keyPress("F"); @@ -246,12 +523,13 @@ async function forgeOre(smithyName) { await click(960, 1042); } } - if (dialogFound) break; + if (!dialogFound) + log.error("多次尝试未能识别到对话界面锻造图标"); + break; } - // 检测锻造界面是否出现 if (dialogFound) { - let interfaceFound = false; + let interFaceFound = false; for (let attempt = 0; attempt < maxAttempts; attempt++) { const ocrRegion = { x: 185, y: 125, width: 670 - 185, height: 175 - 125 }; let ocrResults = captureGameRegion().find( @@ -259,8 +537,8 @@ async function forgeOre(smithyName) { ); let innerFound = false; for (let i = 0; i < 3; i++) { - let ForgingInterface = captureGameRegion().find(ForgingInterfaceRo); - if (ForgingInterface.isExist()) { + let ForgingInterFace = captureGameRegion().find(ForgingInterFaceRo); + if (ForgingInterFace.isExist()) { log.info("已进入锻造界面"); innerFound = true; break; @@ -270,13 +548,9 @@ async function forgeOre(smithyName) { } } if (innerFound) { - interfaceFound = true; + interFaceFound = true; // 领取操作:点击全部领取及确认领取 - const ClaimAllRo = RecognitionObject.TemplateMatch( - file.ReadImageMatSync("Assets/RecognitionObject/全部领取.png"), - 0, 900, 1920, 180 - ); let ClaimAll = captureGameRegion().find(ClaimAllRo); if (ClaimAll.isExist()) { ClaimAll.click(); @@ -285,26 +559,40 @@ async function forgeOre(smithyName) { if (ConfirmButton.isExist()) { ConfirmButton.click(); await sleep(500); - await click(220, 150); - await sleep(1000); // 点击进入锻造界面 + if (forgedOrNot === "是") { + await click(220, 150); + await sleep(1000); // 点击进入锻造界面 + } } else { log.warn("未能识别到确定按钮"); } } - // 若设置为锻造,则依次尝试主选及备选矿石 if (forgedOrNot === "是") { let forgeSuccess = false; - if (await tryForgeOre(primaryOre, [])) { - forgeSuccess = true; - } else if (await tryForgeOre(secondaryOre, [primaryOre])) { - forgeSuccess = true; - } else if (await tryForgeOre(tertiaryOre, [primaryOre, secondaryOre])) { - forgeSuccess = true; - } else { - if (notice) { - notification.error("所有备选矿石都未能识别,结束锻造"); + + // 模式一:自动模式:自动选择数量最多的矿石锻造 + if (model === "模式一" && maxOre) { + primaryOre = maxOre; + log.info(`自动选择数量最多的矿石为: ${primaryOre}`); + forgeSuccess = await tryForgeOre(primaryOre, []); + if (!forgeSuccess) { + log.warn("自动模式锻造未成功,切换到手动备选矿石模式"); + } + } + // 模式二或模式一失败时,依次尝试主选及备选矿石 + if (model === "模式二" || !forgeSuccess) { + if (await tryForgeOre(primaryOre, [])) { + forgeSuccess = true; + } else if (await tryForgeOre(secondaryOre, [primaryOre])) { + forgeSuccess = true; + } else if (await tryForgeOre(tertiaryOre, [primaryOre, secondaryOre])) { + forgeSuccess = true; } else { - log.error("所有备选矿石都未能识别,结束锻造"); + if (notice) { + notification.error("所有备选矿石都未能识别,结束锻造"); + } else { + log.error("所有备选矿石都未能识别,结束锻造"); + } } } } @@ -324,7 +612,7 @@ async function forgeOre(smithyName) { break; // 退出锻造界面检测循环 } } - if (!interfaceFound) { + if (!interFaceFound) { log.error("经过多次尝试,未能进入锻造界面"); } } else { @@ -352,9 +640,45 @@ async function forgeOre(smithyName) { log.info("自动锻造矿石脚本开始"); } + let maxOre = null; + if (forgedOrNot === "是") { + if (model === "模式一") { + maxOre = await getMaxOreType(); + if (maxOre) { + log.info(`自动选择数量最多的矿石为: ${maxOre}`); + primaryOre = maxOre; + } else { + log.warn("自动识别矿石失败,将使用默认配置"); + } + } + await autoSmithy(smithyName); + await forgeOre(smithyName, maxOre); + } + + if (forgedOrNot === "否") { + keyPress("M"); await sleep(1000); + + if (!await findAndInteract(MapRo, + { + singleAttempt: true + })) { + const smithyInfo = smithyMap[smithyName]; + if (smithyInfo) { + await genshin.moveMapTo(smithyInfo.x, smithyInfo.y, smithyInfo.country); + } + } + if (!await findAndInteract(MapForgeRo, + { + })) { + await genshin.returnMainUi(); + log.info("未能识别到锻造完成图标,无需前往领取。结束脚本"); + return; // 若没有锻造图标则跳出 + } + + await autoSmithy(smithyName);//路径函数,前往铁匠铺 + await forgeOre(smithyName); + } - await autoSmithy(smithyName); - await forgeOre(smithyName); await genshin.returnMainUi(); //后退两步 diff --git a/repo/js/铁匠铺/manifest.json b/repo/js/铁匠铺/manifest.json index b49322efe..9adca455e 100644 --- a/repo/js/铁匠铺/manifest.json +++ b/repo/js/铁匠铺/manifest.json @@ -1,28 +1,23 @@ { - "manifest_version": 1, - "name": "自动锻造魔矿(识图版)", - "version": "2.2.1", - "bgi_version": "0.44.0", - "description": "自动选择铁匠铺和使用矿物去锻造精锻矿。\n \n使用前请阅读“readme”文件以获取更多详细信息。 \n---更新说明--- \n- 请查阅readme", - "tags": [ - "铁匠铺", - "锻造", - "精锻用魔矿", - "模板匹配" - ], - "authors": [ - { - "name": "呱呱z", - "links": "https://github.com/jidingcai" - }, - { - "name": "寒露" - }, - { - "name": "蜜柑魚", - "links": "https://github.com/this-Fish" - } - ], - "settings_ui": "settings.json", - "main": "main.js" -} \ No newline at end of file + "manifest_version": 1, + "name": "自动锻造魔矿(识图版)", + "version": "2.3.0", + "bgi_version": "0.48.2", + "description": "自动选择铁匠铺和使用矿物去锻造精锻矿。\n \n使用前请阅读“readme”文件以获取更多详细信息。 \n---更新说明--- \n- 请查阅readme", + "tags": ["铁匠铺", "锻造", "精锻用矿"], + "authors": [ + { + "name": "呱呱z", + "links": "https://github.com/jidingcai" + }, + { + "name": "寒露" + }, + { + "name": "蜜柑魚", + "links": "https://github.com/this-Fish" + } + ], + "settings_ui": "settings.json", + "main": "main.js" +} diff --git a/repo/js/铁匠铺/settings.json b/repo/js/铁匠铺/settings.json index 515a0e659..ddef80c74 100644 --- a/repo/js/铁匠铺/settings.json +++ b/repo/js/铁匠铺/settings.json @@ -4,16 +4,27 @@ "type": "checkbox", "label": "通过BGI通知系统发送详细通知" }, + { + "name": "model", + "type": "select", + "label": "模式选择(默认:模式一)\n【模式一】自动模式:自动选择数量最多的矿石锻造\n【模式二】手动模式:依次尝试主选及备选矿石\n注:模式一可能会因OCR识别数量不准导致选择错误", + "options": [ + "模式一", + "模式二" + ], + "default": "模式一" + }, { "name": "smithyName", "type": "select", - "label": "选择铁匠铺(默认:蒙德铁匠铺)", + "label": "铁匠铺地区选择(默认:枫丹铁匠铺)", "options": [ "蒙德铁匠铺", "璃月铁匠铺", "稻妻铁匠铺", "须弥铁匠铺", - "枫丹铁匠铺" + "枫丹铁匠铺", + "纳塔铁匠铺" ] }, { @@ -28,11 +39,11 @@ { "name": "ore", "type": "select", - "label": "当矿石未能识别时依次使用\n锻造用矿(默认:水晶块)", + "label": "当矿石未能识别/模式二时依次使用\n锻造用矿(默认:水晶块)", "options": [ "水晶块", "萃凝晶", - "星银矿石", + //"星银矿石", //"白铁块", //"铁块", "紫晶块"