js:匹配拾取中滚轮改为仅在必要时触发 (#2930)

* js:AAA狗粮批发2.2.0

1.滚轮改为仅在必要时触发
2.更新readme

* js:采集cd管理

滚轮仅在必要时触发

* js:锄地一条龙

移除材料图片zip
滚轮改为仅必要时触发

* js:联机团购

滚轮改为仅必要时触发

* js:锄地一条龙

优化吃药流程
This commit is contained in:
mno
2026-02-26 14:27:47 +08:00
committed by GitHub
parent d501c65a28
commit 6b5c41945a
15 changed files with 177 additions and 52 deletions

View File

@@ -19,7 +19,7 @@
- **强制收尾路线交替执行**:默认不开,用于一些用户想收集其他的调查材料,比如茶叶等。替换掉(替补收尾路线)内的文件,可以一天收尾狗粮,一天收尾茶叶。
- **狗粮分解模式**:默认不分解,可选分解成(经验瓶/摩拉)
- **账户名称****单账号无需更改。** 多账号使用时建多个配置组,一个账号使用一个配置组,填入游戏账号名称(自己取名),就可以按各自名称分别记录运行信息。
- **芙宁娜** :狗粮队支持自动使用白芙作为生存位(汐佬逼的),当你狗粮队伍中含有芙宁娜时勾选,将确保狗粮路线时芙宁娜为白芙状态,清怪和脚本结束时切回黑芙。
- **芙宁娜** :狗粮队支持自动使用白芙作为生存位(汐姐姐逼的,非必要不要用,会慢很多),当你狗粮队伍中一定要含有芙宁娜时勾选,将确保狗粮路线时芙宁娜为白芙状态,清怪和脚本结束时切回黑芙。
## 二、调查点类型收益
@@ -71,8 +71,8 @@
## 六、队伍配置建议
- **根据自己CPU配置选择合适的移速**:电脑性能较差以至于收益远不如及格线时,降低队伍移速(使用较矮小的体型,不使用双风,四风原典,迪西雅天赋等)。
- **行走位:优先迪希雅;或芙宁娜等 E启动奶**
- **钟剑迪希雅**:耐肘王/白天6-18点移速+10%(路径内置调时间到白天,全程100%吃满天赋)
- **行走位:优先迪希雅;或芭芭拉等 E启动奶**
- **钟剑迪希雅**:耐肘王/白天6-18点移速+10%(js自定义配置可选调时间到白天,全程100%吃满天赋)
- **万叶建议携带路径内配有E吸狗粮策略(不带不影响运行)**,琴可作为备选项,不要同时携带琴和万叶
- **双风BUFF**:移速+10% 体力消耗-15%

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -28,6 +28,7 @@ const doDecomposeRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("ass
const doDecompose2Ro = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/doDecompose2.png"));
const outDatedRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/ConfirmButton.png"), 760, 700, 100, 100);
const scrollRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/拾取滚轮.png"), 1017, 496, 1093 - 581, 581 - 496);
const normalPathA = settings.fastMode ? "" : "assets/ArtifactsPath/普通98点1号线";
const normalPathB = settings.fastMode ? "" : "assets/ArtifactsPath/普通98点2号线";
@@ -1197,10 +1198,10 @@ async function recognizeAndInteract() {
gameRegion = captureGameRegion();
let centerYF = await findFIcon();
if (!centerYF) {
if (await isMainUI()) {
if (new Date() - lastRoll >= 200) {
if (new Date() - lastRoll >= 200) {
lastRoll = new Date();
if (await hasScroll()) {
await keyMouseScript.runFile(`assets/滚轮下翻.json`);
lastRoll = new Date();
}
}
continue;
@@ -1295,25 +1296,6 @@ async function recognizeAndInteract() {
return null;
}
async function isMainUI() {
const recognitionObject = RecognitionObject.TemplateMatch(mainUITemplate, 0, 0, 150, 150);
const maxAttempts = 1;
let attempts = 0;
while (attempts < maxAttempts && state.running) {
try {
const result = gameRegion.find(recognitionObject);
if (result.isExist()) return true;
} catch (error) {
log.error(`识别图像时发生异常: ${error.message}`);
if (!state.running) break;
return false;
}
attempts++;
await sleep(checkDelay);
}
return false;
}
}
/**
@@ -1482,4 +1464,33 @@ async function findAndClick(target,
log.error(`执行通用识图时出现错误:${error.message}`);
return retType === 0 ? false : null;
}
}
/**
* 判断当前是否存在拾取滚轮图标
* @param {number} maxDuration 最大允许耗时(毫秒)
*/
async function hasScroll(maxDuration = 10) {
const start = Date.now();
let dodispose = false;
while (Date.now() - start < maxDuration) {
if (!gameRegion) {
gameRegion = captureGameRegion();
dodispose = true;
}
try {
const result = gameRegion.find(scrollRo);
if (result.isExist()) return true;
} catch (error) {
log.error(`识别图像时发生异常: ${error.message}`);
return false; // 一旦出现异常直接退出,不再重试
}
await sleep(checkDelay); // 识别间隔
if (dodispose) {
gameRegion.dispose();
dodispose = false; // 已经释放,标记避免重复 dispose
}
}
/* 超时仍未识别到,返回失败 */
return false;
}

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 1,
"name": "AAA狗粮批发",
"version": "2.1.6",
"version": "2.2.0",
"tags": [
"狗粮"
],

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -1,5 +1,6 @@
const runExtra = settings.runExtra || false;
const leaveTeamRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/leaveTeam.png"));
const scrollRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/拾取滚轮.png"), 1017, 496, 1093 - 581, 581 - 496);
let targetItems;
let pickupDelay = 100;
let timeMove = 1000;
@@ -1264,10 +1265,10 @@ async function recognizeAndInteract() {
gameRegion = captureGameRegion();
let centerYF = await findFIcon();
if (!centerYF) {
if (await isMainUI()) {
if (new Date() - lastRoll >= 200) {
if (new Date() - lastRoll >= 200) {
lastRoll = new Date();
if (await hasScroll()) {
await keyMouseScript.runFile(`assets/滚轮下翻.json`);
lastRoll = new Date();
}
}
continue;
@@ -1649,4 +1650,33 @@ async function numberTemplateMatch(
adopted.sort((a, b) => a.x - b.x);
return adopted.reduce((num, item) => num * 10 + item.digit, 0);
}
/**
* 判断当前是否存在拾取滚轮图标
* @param {number} maxDuration 最大允许耗时(毫秒)
*/
async function hasScroll(maxDuration = 10) {
const start = Date.now();
let dodispose = false;
while (Date.now() - start < maxDuration) {
if (!gameRegion) {
gameRegion = captureGameRegion();
dodispose = true;
}
try {
const result = gameRegion.find(scrollRo);
if (result.isExist()) return true;
} catch (error) {
log.error(`识别图像时发生异常: ${error.message}`);
return false; // 一旦出现异常直接退出,不再重试
}
await sleep(checkDelay); // 识别间隔
if (dodispose) {
gameRegion.dispose();
dodispose = false; // 已经释放,标记避免重复 dispose
}
}
/* 超时仍未识别到,返回失败 */
return false;
}

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 1,
"name": "AAA狗粮联机团购",
"version": "1.13.9",
"version": "1.13.4",
"tags": [
"狗粮"
],

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -41,6 +41,7 @@ const fIconRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync('assets/F_
fIconRo.Threshold = 0.95;
fIconRo.InitTemplate();
const mainUIRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/MainUI.png"), 0, 0, 150, 150);
const scrollRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/拾取滚轮.png"), 1017, 496, 1093 - 581, 581 - 496);
//全局通用变量声明
let gameRegion;
@@ -53,6 +54,7 @@ let state;
let pathings;
let localeWorks;
let lastEatBuff = 0;
let currentFood = "";
(async function () {
//通用预处理
@@ -961,31 +963,50 @@ async function runPath(fullPath, map_name, pm, pe) {
await pathingScript.runFile("assets/强制黑芙.json");
}
if (settings.eatBuff) {
const res = settings.eatBuff.split('');
if (new Date() - lastEatBuff > 300 * 1000) {
lastEatBuff = new Date();
// 1. 数据预处理:分割、去空、去重
let res = settings.eatBuff
.split('')
.map(item => item.trim())
.filter(item => item.length > 0)
.filter((item, index, arr) => arr.indexOf(item) === index);
// 无有效数据时提前返回
if (res.length === 0) {
log.error("无有效的食物配置");
return;
}
// 2. 优化排序currentFood 置顶以减少筛选操作
if (currentFood && res.includes(currentFood)) {
res = [currentFood, ...res.filter(item => item !== currentFood)];
}
await genshin.returnMainUi();
keyPress("B");
await sleep(300);
let type = "食物"
await findAndClick([`assets/背包界面/${type}1.png`, `assets/背包界面/${type}2.png`]);
await sleep(300);
// 2. 遍历数组,逐项执行
// 3. 遍历数组,逐项执行
for (const item of res) {
await sleep(300);
await findAndClick(['assets/筛选1.png', 'assets/筛选2.png']);
await findAndClick("assets/重置.png");
await sleep(500);
await findAndClick("assets/搜索.png");
await sleep(1000);
// 真正输入当前这一项
log.info(`搜索${item}`)
inputText(item);
await findAndClick("assets/确认筛选.png");
await sleep(500);
if (currentFood !== item) {
await sleep(300);
await findAndClick(['assets/筛选1.png', 'assets/筛选2.png']);
await findAndClick("assets/重置.png");
await sleep(300);
await findAndClick("assets/搜索.png");
await sleep(300);
await findAndClick("assets/搜索成功点击.png");
// 真正输入当前这一项
log.info(`搜索${item}`);
currentFood = item;
inputText(item);
await findAndClick("assets/确认筛选.png");
while (await findAndClick("assets/确认筛选.png", false, 2, 3)) {
await sleep(16);
}
}
await findAndClick("assets/使用.png");
}
await genshin.returnMainUi();
lastEatBuff = new Date();
}
}
@@ -1250,7 +1271,7 @@ async function recognizeAndInteract() {
if (!centerYF) {
if (new Date() - lastRoll >= 200) {
lastRoll = new Date();
if (await isMainUI()) {
if (await hasScroll()) {
await keyMouseScript.runFile(`assets/滚轮下翻.json`);
}
}
@@ -1905,6 +1926,35 @@ async function isMainUI(maxDuration = 10) {
return false;
}
/**
* 判断当前是否存在拾取滚轮图标
* @param {number} maxDuration 最大允许耗时(毫秒)
*/
async function hasScroll(maxDuration = 10) {
const start = Date.now();
let dodispose = false;
while (Date.now() - start < maxDuration) {
if (!gameRegion) {
gameRegion = captureGameRegion();
dodispose = true;
}
try {
const result = gameRegion.find(scrollRo);
if (result.isExist()) return true;
} catch (error) {
log.error(`识别图像时发生异常: ${error.message}`);
return false; // 一旦出现异常直接退出,不再重试
}
await sleep(checkDelay); // 识别间隔
if (dodispose) {
gameRegion.dispose();
dodispose = false; // 已经释放,标记避免重复 dispose
}
}
/* 超时仍未识别到,返回失败 */
return false;
}
// 加载拾取物图片
async function loadTargetItems() {

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 1,
"name": "锄地一条龙",
"version": "2.3.1",
"version": "2.4.0",
"description": "一站式解决自动化锄地支持只拾取狗粮请仔细阅读README.md后使用",
"authors": [
{

View File

@@ -85,6 +85,9 @@
<details>
<summary>📋 点击查看历史更新</summary>
### 2026/2/26
1. 无f时滚轮改为仅在识别到滚轮图标时触发
### 2026/2/18
1. 对食材加工过程中可能出现的道具数量超过上限进行处理

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -95,6 +95,7 @@ FiconRo.Threshold = 0.95;
FiconRo.InitTemplate();
const mainUiRo = RecognitionObject.TemplateMatch(mainUITemplate, 0, 0, 150, 150);
const scrollRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/拾取滚轮.png"), 1017, 496, 1093 - 581, 581 - 496);
let checkInterval = +settings.checkInterval || 50;
@@ -1325,11 +1326,12 @@ async function recognizeAndInteract() {
let time2 = new Date();
const centerYF = await findFIcon();
if (!centerYF) {
if (await isMainUI()) {
if (new Date() - lastRoll >= 200) {
if (new Date() - lastRoll >= 200) {
lastRoll = new Date();
if (await hasScroll()) {
await keyMouseScript.runFile(`assets/滚轮下翻.json`);
lastRoll = new Date();
}
}
if (checkTask) {
@@ -2264,3 +2266,32 @@ function isArrivedAtEndPoint(fullPath) {
return false;
}
}
/**
* 判断当前是否存在拾取滚轮图标
* @param {number} maxDuration 最大允许耗时(毫秒)
*/
async function hasScroll(maxDuration = 10) {
const start = Date.now();
let dodispose = false;
while (Date.now() - start < maxDuration) {
if (!gameRegion) {
gameRegion = captureGameRegion();
dodispose = true;
}
try {
const result = gameRegion.find(scrollRo);
if (result.isExist()) return true;
} catch (error) {
log.error(`识别图像时发生异常: ${error.message}`);
return false; // 一旦出现异常直接退出,不再重试
}
await sleep(checkDelay); // 识别间隔
if (dodispose) {
gameRegion.dispose();
dodispose = false; // 已经释放,标记避免重复 dispose
}
}
/* 超时仍未识别到,返回失败 */
return false;
}

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 1,
"name": "采集cd管理",
"version": "2.10.4",
"version": "2.11.0",
"bgi_version": "0.44.8",
"description": "仅面对会操作文件和读readme的用户基于文件夹操作自动管理采集路线的cd会按照路径组的顺序依次运行直到指定的时间并会按照给定的cd类型自动跳过未刷新的路线",
"saved_files": [