1.地脉花加入异步检测。 (#912)

* 1.地脉花加入异步检测。

1.地脉花加入异步检测。
2.其他一些描述修改

* Update repo/js/Auto全自动“枫丹”地脉花/main.js

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update repo/js/Auto全自动“枫丹”地脉花/main.js

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* 改了跑了一遍,应该可以了

---------

Co-authored-by: 秋云 <physligl@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
kaedelcb
2025-05-24 16:12:08 +08:00
committed by GitHub
parent 2a9866cdef
commit 58c73a0258
6 changed files with 179 additions and 115 deletions

View File

@@ -54,3 +54,6 @@ v.2.0版本20250503
v.2.1版本20250512
1、更改UID识别方法。适配原神UI改变
v.2.2版本20250524
1、参考D捣蛋和秋云佬的代码加入异步检测战斗结束。

View File

@@ -63,33 +63,44 @@
}
}
// //容错检测函数,备用
// function checkOverlap() {
// const overlappingPoints = [];
//初始化
var SMODEL = settings.SMODEL ? settings.SMODEL : false; // false 公版BETTERGItrue 自编译版本LCB
var SHUOVER=0 //0初始状态1队伍配置标志2结束线路3线路出错
var haoganq=0 //0初始状态1好感队伍配置标志
var SHUV = settings.shuv ? settings.shuv : 1; // 1 单线路2 树脂耗尽
var Rewards = settings.Rewards ? settings.Rewards : false; // ture 领取冒险点奖励false 不领取冒险点奖励
var Fligtin = false; //领取冒险点奖励标志。
var FINDagin = 0; //地脉花寻找标志。lv.1.2新增,用于判断是否找线路余下地脉花。
var tolerance = 25;
var position ={};
var Lastexecution = false;//线路执行标志,用于判断上一线路是否执行。
var Fightquick = settings.Fightquick ? settings.Fightquick : false;
var Fighttimeout = settings.timeout = settings.timeout * 1000 || 120000;
const ocrRegion2 = { x: 0, y: 200, width: 300, height: 300 }; // 追踪任务区域
const ocrRo2 = RecognitionObject.ocr(ocrRegion2.x, ocrRegion2.y, ocrRegion2.width, ocrRegion2.height);
const ocrRegion1 = { x: 800, y: 200, width: 300, height: 100 }; // 中心区域
const ocrRo1 = RecognitionObject.ocr(ocrRegion1.x, ocrRegion1.y, ocrRegion1.width, ocrRegion1.height);
// for (let i = 0; i < allFlowerCoords.length; i++) {
// for (let j = i + 1; j < allFlowerCoords.length; j++) {
// const point1 = allFlowerCoords[i];
// const point2 = allFlowerCoords[j];
log.debug(`DEBUG:${SHUV}.${color}.${rawTimes}`);//调试LOG
if (Rewards){log.warn("结束后领励练点和提交每日!");if(settings.nh === undefined || settings.nh === "") {log.warn("好感队未配置,领奖励时不切换队伍")}}
if (settings.nh === undefined || settings.nh === "") { log.warn("好感队禁用!");haoganq=0}else{var haogandui = settings.nh;haoganq=1;if(settings.n === undefined ) {throw new Error("好感队已经设置,请填战斗队伍!")}}
if (settings.n === undefined || settings.n === "") { log.warn("队伍名称未配置,不更换队伍!");SHUOVER=1;}
if (SHUV == 1) {log.warn("线路模式 '单线路!'");}else{log.warn("线路模式 '树脂耗尽模式,强制打完整体线路!'");rawTimes=12}
if (color == 1) {log.warn("地脉类型 '蓝色-经验书花!'");}else{log.warn("地脉类型 '黄色-摩拉花!'")}
let nowuidString = settings.nowuid ? settings.nowuid : "";
// const dx = Math.abs(point1.x - point2.x);
// const dy = Math.abs(point1.y - point2.y);
filePath = ""
// 读取原始次数配置
var rawTimes = settings.times*2 ? settings.times : "12";
var color = settings.color ? settings.color : 1;
var BIAOZZ = "assets/model/BIAOZ.bmp"
if (color == 2){var DIMAIHUA = "assets/model/DIMAIHUA-huank.bmp";}
else if (color == 1){var DIMAIHUA = "assets/model/DIMAIHUA-lank.bmp";}
else{var DIMAIHUA = "assets/model/DIMAIHUA-lank.bmp";}
// if (dx <= tolerance && dy <= tolerance) {
// overlappingPoints.push({
// point1: { line: point1.line, flower: point1.flower, x: point1.x, y: point1.y },
// point2: { line: point2.line, flower: point2.flower, x: point2.x, y: point2.y }
// });
// }
// }
// }
// overlappingPoints.forEach((point, index) => {
// log.info(`重叠点 ${index + 1}${JSON.stringify(point)}`);
// });
// return overlappingPoints;
// // await checkOverlap(allFlowerCoords,tolerance);
// }
setGameMetrics(1920, 1080, 1);
//================= 1.设定路线 =================
@@ -193,50 +204,6 @@
"路线6 芒索斯山东麓": folder6
};
filePath = ""
// 读取原始次数配置
var LOOOKING = 0
var rawTimes = settings.times*2 ? settings.times : "12";
var color = settings.color ? settings.color : 1;
var BIAOZZ = "assets/model/BIAOZ.bmp"
if (LOOOKING == 0) {
if (color == 2){var DIMAIHUA = "assets/model/DIMAIHUA-huank.bmp";}
else if (color == 1){var DIMAIHUA = "assets/model/DIMAIHUA-lank.bmp";}
else{var DIMAIHUA = "assets/model/DIMAIHUA-lank.bmp";}
} else if (LOOOKING == 1) {
if (color == 2){var DIMAIHUA = "assets/model/DIMAIHUA-huan.bmp";}
else if (color == 1){var DIMAIHUA = "assets/model/DIMAIHUA-lan.bmp";}
else{var DIMAIHUA = "assets/model/DIMAIHUA-lan.bmp";}
}
// // 验证是否为数字
// var timesValue;
// if (!/^-?\d+\.?\d*$/.test(rawTimes)) { // 匹配整数和小数
// timesValue = 12
// // log.info("⚠️ 刷本次数设置不为数字改为默认值12");
// } else {
// // 转换为数字
// const num = parseFloat(rawTimes*2); // 乘以2因为每次战斗两次一次战斗两次掉落
// // 范围检查
// if (num < 1) {
// timesValue = 1;
// //log.info(`⚠️ 次数 ${num} 小于1已调整为1`);
// } else if (num > 12) {
// timesValue = 12;
// // log.info(`⚠️ 次数 ${num} 大于12已调整为12`);
// } else {
// // 处理小数
// if (!Number.isInteger(num)) {
// timesValue = Math.floor(num);
// // log.info(`⚠️ 次数 ${num} 不是整数,已向下取整为 ${timesValue}`);
// } else {
// timesValue = num;
// }
// }
// }
// var timesConfig = { value: timesValue };
var timesValue = 12; // 设置默认值
var num = parseFloat(rawTimes) * 2; // 直接计算乘以2后的值并尝试转换为浮点数
@@ -246,12 +213,7 @@
timesValue = Math.max(1, Math.min(12, Math.floor(num))); // 确保值在1到12之间并向下取整
}
// 如果num大于12因为乘以2了所以实际上是原始值大于6则设置为最大值12
// 注意这里不需要额外检查因为Math.min已经处理了上限
var timesConfig = { value: timesValue };
const allFlowerCoords = [
// 线路1
{ line: 1, flower: 1, x: 773, y: 669 },
@@ -288,7 +250,7 @@
{ line: 6, flower: 4, x: 371, y: 281 },//227 379 290
];
// 快速寻路模式寻路
// 输出选择的线路
async function PathCheak1() {
await genshin.returnMainUi();
@@ -436,7 +398,7 @@
}
async function isOnRewardPage() {
const rewardText = await Textocr("地脉之花", 0.5, 0, 0, 861,265, 194, 265);
const rewardText = await Textocr("地脉之花", 0.2, 0, 0, 861,265, 194, 265);
return rewardText.found;
}
@@ -447,7 +409,7 @@
* @param timeout 超时时间单位为毫秒默认值为1000毫秒
* @returns 无返回值
*/
async function checkRewardPage(timeout = 1000) {
async function checkRewardPage(timeout = 2000) {
if (!shouldContinueChecking) {
return; // 如果不应该继续检测,则直接返回
@@ -464,6 +426,99 @@
}
}
//异步检测战斗来自D捣蛋&秋云佬的全自动地脉花的代码
async function autoFight(Fighttimeout) {
const cts = new CancellationTokenSource();
log.info("开始战斗");
dispatcher.RunTask(new SoloTask("AutoFight"), cts);
let fightResult = await recognizeTextInRegion(Fighttimeout);
logFightResult = fightResult ? "成功" : "失败";
log.info(`战斗结束,战斗结果:${logFightResult}`);
cts.cancel();
return fightResult;
}
function recognizeFightText(captureRegion) {
try {
let result = captureRegion.find(ocrRo2);
let text = result.text;
keywords = ["打倒", "所有", "敌人"];
for (let keyword of keywords) {
if (text.includes(keyword)) {
return true;
}
}
return false;
} catch (error) {
log.error("OCR过程中出错: {0}", error);
}
}
async function recognizeTextInRegion(Fighttimeout) {
return new Promise((resolve, reject) => {
(async () => {
try {
let startTime = Date.now();
let noTextCount = 0;
const successKeywords = ["挑战达成", "战斗胜利", "挑战成功"];
const failureKeywords = ["挑战失败"];
// 循环检测直到超时
while (Date.now() - startTime < Fighttimeout) {
try {
let captureRegion = captureGameRegion();
let result = captureRegion.find(ocrRo1);
let text = result.text;
// 检查成功关键词
for (let keyword of successKeywords) {
if (text.includes(keyword)) {
log.info("检测到战斗成功关键词: {0}", keyword);
resolve(true);
return;
}
}
// 检查失败关键词
for (let keyword of failureKeywords) {
if (text.includes(keyword)) {
log.warn("检测到战斗失败关键词: {0}", keyword);
resolve(false);
return;
}
}
//战斗区域
let foundText = recognizeFightText(captureRegion);
if (!foundText) {
noTextCount++;
log.info(`检测到可能离开战斗区域,当前计数: ${noTextCount}`);
if (noTextCount >= 10) {
log.warn("已离开战斗区域");
resolve(false);
return;
}
}
else {
noTextCount = 0; // 重置计数
}
}
catch (error) {
log.error("OCR过程中出错: {0}", error);
}
await sleep(1000); // 检查间隔
}
log.warn("在超时时间内未检测到战斗结果");
resolve(false);
} catch (error) {
reject(error);
}
})();
});
}
async function Veinfligt() {
// 定义路线常量
@@ -508,7 +563,6 @@
else{await pathingScript.runFile(`${selectedFolder}${jsonFile1}`);}
}
// 寻找地脉溢口,文字识别不到转圈寻找,不管有没找到都执行战斗,最后领取奖励判断是否继续执行
shouldContinueChecking = true;
checkRewardPage();// 执行自动战斗并同步检测领奖页面
@@ -516,17 +570,25 @@
await sleep(1000);
dispatcher.addTimer(new RealtimeTimer("AutoPick", { "forceInteraction": false }));
//执行自动战斗,配置器中的设置建议填你的队伍打一次大概得时间
await dispatcher.runTask(new SoloTask("AutoFight"));
await sleep(2000);
await dispatcher.runTask(new SoloTask("AutoFight"));//公版BETTERGI战斗两次可能触发已经出现的地脉花
if (!Fightquick){
await dispatcher.runTask(new SoloTask("AutoFight")); //固定执行两次战斗,执行自动战斗,配置器中的设置建议填你的队伍打一次大概得时间
await sleep(2000);
await dispatcher.runTask(new SoloTask("AutoFight"));
}else
{
shouldContinueChecking = false;
if(!await autoFight(Fighttimeout)){
log.warn("战斗失败,测试寻找地脉花入口");
}
shouldContinueChecking = true;
}
//执行到地脉花地点的寻路脚本
log.info(`开始执行寻找地脉花奖励:${jsonFile2}`);
await pathingScript.runFile(`${selectedFolder}${jsonFile2}`);
await sleep(3000);
// 领取奖励,开始找地脉口
log.info(`开始第 ${executedCount/2} 朵花的奖励领取`);
log.info(`开始第 ${executedCount/2+1} 朵花的奖励领取`);
if (haoganq==1){log.info(`切换好感队伍:'${haogandui}'`);await genshin.returnMainUi(); await sleep(1000);await genshin.SwitchParty(haogandui);}
shouldContinueChecking = false;
await sleep(2000);
@@ -547,29 +609,6 @@
return true;// 线路完成
}
//初始化
var SMODEL = settings.SMODEL ? settings.SMODEL : false; // false 公版BETTERGItrue 自编译版本LCB
var SHUOVER=0 //0初始状态1队伍配置标志2结束线路3线路出错
var haoganq=0 //0初始状态1好感队伍配置标志
var SHUV = settings.shuv ? settings.shuv : 1; // 1 单线路2 树脂耗尽
var Rewards = settings.Rewards ? settings.Rewards : false; // ture 领取冒险点奖励false 不领取冒险点奖励
var Fligtin = false; //领取冒险点奖励标志。
var FINDagin = 0; //地脉花寻找标志。lv.1.2新增,用于判断是否找线路余下地脉花。
var tolerance = 25;
var position ={};
var Lastexecution = false;//线路执行标志,用于判断上一线路是否执行。
log.debug(`DEBUG:${SHUV}.${color}.${rawTimes}`);//调试LOG
if (Rewards){log.warn("结束后领励练点和提交每日!");if(settings.nh === undefined || settings.nh === "") {log.warn("好感队未配置,领奖励时不切换队伍")}}
if (settings.nh === undefined || settings.nh === "") { log.warn("好感队禁用!");haoganq=0}else{var haogandui = settings.nh;haoganq=1;if(settings.n === undefined ) {throw new Error("好感队已经设置,请填战斗队伍!")}}
if (settings.n === undefined || settings.n === "") { log.warn("队伍名称未配置,不更换队伍!");SHUOVER=1;}
if (SHUV == 1) {log.warn("线路模式 '单线路!'");}else{log.warn("线路模式 '树脂耗尽模式,强制打完整体线路!'");rawTimes=12}
if (color == 1) {log.warn("地脉类型 '蓝色-经验书花!'");}else{log.warn("地脉类型 '黄色-摩拉花!'")}
let nowuidString = settings.nowuid ? settings.nowuid : "";
// UID获取存在概率不成功慎用请更换背景纯色的名片提高OCR成功率
let uidNumbers = nowuidString.match(/\d+/g);
if (nowuidString) {

View File

@@ -4,10 +4,22 @@
"version": "2.1",
"bgi_version": "0.44.8",
"description": "枫丹地脉花蓝花金花通用。生存压力大请带盾奶避免纯水输出请注意说明文件。如有BUG请联系作者QQ:119996800",
"tags" : [ "地脉花" ],
"tags":["地脉花"],
"authors": [
{
"name": "LCB-茶包"
},
{
"name": "ddaodan",
"link": "https://github.com/ddaodan"
},
{
"name": "平面镜",
"link": "https://github.com/Flatmirrr"
},
{
"name": "秋云",
"link": "https://github.com/physligl"
}
],
"settings_ui": "settings.json",

View File

@@ -46,5 +46,15 @@
"name": "SMODEL",
"type": "checkbox",
"label": "直跑模式如下个花近直跑过去不传送测试慎用要求44.8版本!"
},
{
"name": "Fightquick",
"type": "checkbox",
"label": "更快检测结束战斗,开启后下方的超时时间才有效"
},
{
"name": "timeout",
"type": "input-text",
"label": "更快检测结束战斗的战斗超时时间单位秒默认120秒"
}
]

View File

@@ -4,7 +4,7 @@
"version": "1.2",
"bgi_version": "0.44.0",
"description": "参量质变仪自动化,请注意说明文件,如有BUG请联系作者QQ:119996800",
"tags" : [ "参量质变仪" ],
"tags":["参量质变仪" ],
"authors": [
{
"name": "LCB-茶包"

View File

@@ -4,7 +4,7 @@
"version": "1.3",
"bgi_version": "0.44.0",
"description": "爱可菲厨艺机关自动化请注意说明文件如有BUG请联系作者QQ:119996800",
"tags" : [ "爱可菲厨艺机关自动化"],
"tags": ["爱可菲厨艺机关"],
"authors": [
{
"name": "LCB-茶包"