Compare commits
4 Commits
822a3f9d69
...
bc8ce5c07c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bc8ce5c07c | ||
|
|
dafad69e8a | ||
|
|
bcf538a697 | ||
|
|
1d47acf6b0 |
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"time": "20250512025004",
|
||||
"time": "20250512053034",
|
||||
"url": "https://github.com/babalae/bettergi-scripts-list/archive/refs/heads/main.zip",
|
||||
"file": "repo.json",
|
||||
"indexes": [
|
||||
@@ -49084,12 +49084,12 @@
|
||||
{
|
||||
"name": "AutoLeyLineOutcrop",
|
||||
"type": "directory",
|
||||
"hash": "251b8defadd8b99f9562aef9a1bc4353180a3c99",
|
||||
"version": "3.0.3",
|
||||
"hash": "a3f9648f041c2d29e0ff4ee287c1129e5a943514",
|
||||
"version": "3.1.0",
|
||||
"author": "ddaodan",
|
||||
"description": "全自动地脉花~|~基于OCR图像识别的全自动刷取地脉花。\n💡更多信息请查看在线手册:https://hcnsvf0s8d0s.feishu.cn/wiki/Tb1twpThLi7UlykqcYOcuccTnjJ \n\n----------注意事项----------\n●仅支持BetterGI 0.44.7 及以上版本!\n●脚本仍未完成,没有出现的路线还未制作,请耐心等待。目前只有蒙德是全部路线,其他国家请使用强制运行模式。\n●目前脚本能力有限,暂时不支持识别地脉花是否已经开启,请确保队伍的练度足够,中途出现角色血量过低或倒下会无法继续,届时需要在重新运行时手动关闭领取地脉花奖励的界面。\n●脚本还提供了强行运行的功能,当无法识别地脉花位置时可以指定线路,脚本将不再对地脉花进行识别,即使没有领取到奖励也会继续运行,适用于路线重跑以及开发调试。\n●运行时会传送到七天神像设置中设置的七天神像,可能需要关闭七天神像设置中的“是否就近七天神像恢复血量”,并指定七天神像。\n●战斗策略注意调度器设置中地图追踪行走配置里的“允许在JsSpript中使用”和“覆盖JS中的自动战斗配置”,只有在都打开的情况下脚本才会使用下面的战斗配置,否则会使用独立任务中的战斗策略。",
|
||||
"tags": [],
|
||||
"lastUpdated": "2025-05-12 02:49:27"
|
||||
"lastUpdated": "2025-05-12 05:28:54"
|
||||
},
|
||||
{
|
||||
"name": "AutoNobushi",
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
使用前需要对脚本以及战斗策略进行配置
|
||||
在调度器新建一个配置组,将脚本添加进来
|
||||
右键脚本选择修改js脚本自定义配置,根据你的需要对脚本进行配置。
|
||||
目前刷取次数设置没有实际效果
|
||||
|
||||
### 配置地图追踪策略和战斗策略
|
||||
点击配置组设置,打开地图追踪设置,**关闭自动拾取**,**开启允许在js中使用**和**覆盖js中的自动战斗策略**
|
||||
开启战斗策略配置,**关闭自动检测战斗结束**,其他的根据你的队伍进行配置
|
||||
@@ -34,6 +34,10 @@ wgc的bug,请使用bitblt截图方式,脚本只支持这个
|
||||
打开大地图,点击左下角设置,开启自定义标记。
|
||||
脚本非正常结束运行时会出现该问题。
|
||||
## 更新日志
|
||||
### 3.1
|
||||
- 新增璃月、须弥部分路线
|
||||
- 修改寻找地脉花领奖的逻辑
|
||||
|
||||
### 3.0
|
||||
**本次更新内容很多,详情可以到[GitHub](https://github.com/babalae/bettergi-scripts-list/pull/633)上查看**
|
||||
- 新增路线:地中之盐 瑶光滩 药蝶谷 踏鞴砂 海祇岛 硫晶支脉 翘枝崖 溶水域 八酝岛 彩石顶 花羽会 鸣神岛 清籁岛
|
||||
|
||||
@@ -1144,131 +1144,157 @@ async function openCustomMarks() {
|
||||
}
|
||||
}
|
||||
|
||||
const paimonMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/icon/paimon_menu.png"), 0, 0, genshin.width / 3.0, genshin.width / 5.0);
|
||||
const boxIconRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/icon/box.png"));
|
||||
/**
|
||||
* 自动导航到地脉花奖励点
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
async function autoNavigateToReward() {
|
||||
// 定义识别对象
|
||||
const boxIconRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/icon/box.png"));
|
||||
const rewardTextRo = RecognitionObject.Ocr(1210, 515, 200, 50); // 领奖区域检测
|
||||
let advanceNum = 0; // 前进次数
|
||||
|
||||
const cts = new CancellationTokenSource();
|
||||
|
||||
try {
|
||||
// 调整初始视角为俯视角
|
||||
log.info("调整视角...");
|
||||
middleButtonClick();
|
||||
await sleep(300);
|
||||
|
||||
// 调整初始视角为俯视角
|
||||
log.info("调整为俯视视角...");
|
||||
middleButtonClick();
|
||||
await sleep(1000);
|
||||
moveMouseBy(0, 1030);
|
||||
await sleep(500);
|
||||
moveMouseBy(0, 920);
|
||||
await sleep(500);
|
||||
moveMouseBy(0, 710);
|
||||
await sleep(500);
|
||||
|
||||
log.info("开始自动导航到地脉花...");
|
||||
while (true) {
|
||||
// 1. 优先检查是否已到达领奖点
|
||||
let captureRegion = captureGameRegion();
|
||||
let rewardTextArea = captureRegion.DeriveCrop(1210, 515, 200, 50);
|
||||
let ocrResults = rewardTextArea.findMulti(RecognitionObject.ocrThis);
|
||||
|
||||
|
||||
if (advanceNum % 15 == 0 && advanceNum >= 10) {
|
||||
log.warn("前进又超时15次啦,先往旁边挪挪再继续试试")
|
||||
keyDown("s");
|
||||
await sleep(500);
|
||||
keyUp("s");
|
||||
middleButtonClick();
|
||||
await sleep(1000);
|
||||
keyDown("w");
|
||||
await sleep(1000);
|
||||
keyUp("w");
|
||||
}
|
||||
else if (advanceNum > 45) {
|
||||
throw new Error('前进时间超时');
|
||||
}
|
||||
// 检测到地脉之花文字则结束
|
||||
else if (ocrResults.count > 0 && ocrResults[0].text.trim().length > 0) {
|
||||
for (let i = 0; i < ocrResults.count; i++) {
|
||||
if (ocrResults[i].text.includes("地脉之花")) {
|
||||
log.info("已到达领奖点,检测到文字: " + ocrResults[i].text);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 2. 未到达领奖点,则调整视野
|
||||
await adjustViewForReward(boxIconRo, advanceNum);
|
||||
|
||||
// 3. 前进一小步
|
||||
keyDown("w");
|
||||
await sleep(900);
|
||||
log.info("开始自动导航到地脉花...");
|
||||
|
||||
// 启动文字检测任务
|
||||
let rewardDetectionPromise = startRewardTextDetection(cts);
|
||||
|
||||
// 启动导航任务
|
||||
navigateTowardReward(cts.token);
|
||||
|
||||
// 等待文字检测任务完成
|
||||
await rewardDetectionPromise;
|
||||
|
||||
// 取消导航任务
|
||||
cts.cancel();
|
||||
keyUp("w");
|
||||
log.info("已到达领奖点");
|
||||
} catch (error) {
|
||||
cts.cancel();
|
||||
log.error(`导航过程中出错: ${error}`);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 监测文字区域,检测到地脉之花文字时返回
|
||||
* @param {CancellationTokenSource} cts - 取消令牌源
|
||||
* @returns {Promise<boolean>} - 是否检测到文字
|
||||
*/
|
||||
async function startRewardTextDetection(cts) {
|
||||
return new Promise((resolve, reject) => {
|
||||
(async () => {
|
||||
try {
|
||||
while (!cts.token.isCancellationRequested) {
|
||||
let captureRegion = captureGameRegion();
|
||||
let rewardTextArea = captureRegion.DeriveCrop(1210, 515, 200, 200);
|
||||
let ocrResults = rewardTextArea.findMulti(RecognitionObject.ocrThis);
|
||||
|
||||
if (ocrResults.count > 0) {
|
||||
for (let i = 0; i < ocrResults.count; i++) {
|
||||
if (ocrResults[i].text.includes("接触")
|
||||
|| ocrResults[i].text.includes("地脉")
|
||||
|| ocrResults[i].text.includes("之花")
|
||||
) {
|
||||
log.info("检测到文字: " + ocrResults[i].text);
|
||||
resolve(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
await sleep(200);
|
||||
}
|
||||
} catch (error) {
|
||||
reject(error);
|
||||
}
|
||||
})();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 导航向奖励点
|
||||
* @param {CancellationToken} token - 取消令牌
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
async function navigateTowardReward(token) {
|
||||
let advanceNum = 0; // 前进次数
|
||||
|
||||
try {
|
||||
while (!token.isCancellationRequested) {
|
||||
if (advanceNum % 15 == 0 && advanceNum >= 10) {
|
||||
log.warn("前进又超时15次啦,先往旁边挪挪再继续试试")
|
||||
keyUp("w");
|
||||
keyDown("s");
|
||||
await sleep(1000);
|
||||
keyUp("s");
|
||||
keyDown("w"); // 恢复前进
|
||||
}
|
||||
else if (advanceNum > 45) {
|
||||
keyUp("w");
|
||||
throw new Error('前进时间超时');
|
||||
}
|
||||
|
||||
// 调整视野
|
||||
await adjustViewForReward(boxIconRo, advanceNum);
|
||||
keyDown("w");
|
||||
// 小暂停让角色移动
|
||||
await sleep(300);
|
||||
advanceNum++;
|
||||
}
|
||||
} finally {
|
||||
// 确保任何情况下都会释放按键
|
||||
keyUp("w");
|
||||
await sleep(100); // 等待角色移动稳定
|
||||
advanceNum++;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 调整视野直到图标位于正前方
|
||||
* @param {Object} boxIconRo - 宝箱图标识别对象
|
||||
* @param {number} advanceNum - 当前前进次数
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
async function adjustViewForReward(boxIconRo, advanceNum) {
|
||||
for (let i = 0; i < 100; i++) {
|
||||
|
||||
// 每10次执行一轮异常页面检查
|
||||
if (i % 10 == 0) {
|
||||
// 识别误触发领取导致超时的情况
|
||||
let resList = captureGameRegion().findMulti(RecognitionObject.ocrThis);
|
||||
if (resList && resList.count > 0) {
|
||||
for (let i = 0; i < resList.count; i++) {
|
||||
let res = resList[i];
|
||||
if (res.text.includes("原粹树脂")) {
|
||||
log.info("误触发领取页面,尝试关闭页面")
|
||||
keyPress("ESCAPE");
|
||||
await sleep(500);
|
||||
keyPress("ESCAPE");
|
||||
await sleep(500);
|
||||
await genshin.returnMainUi();
|
||||
}
|
||||
}
|
||||
}
|
||||
// 识别误触发其他页面导致超时的情况
|
||||
const paimonMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/icon/paimon_menu.png"), 0, 0, genshin.width / 3.0, genshin.width / 5.0);
|
||||
let res = captureGameRegion().Find(paimonMenuRo);
|
||||
if (res.isEmpty()) {
|
||||
log.info("误触发其他页面,尝试关闭页面")
|
||||
click(960, 800);
|
||||
keyPress("ESCAPE");
|
||||
await sleep(500);
|
||||
keyPress("ESCAPE");
|
||||
await sleep(500);
|
||||
async function adjustViewForReward(boxIconRo) {
|
||||
const screenCenterX = 960;
|
||||
const screenCenterY = 540;
|
||||
|
||||
let captureRegion = captureGameRegion();
|
||||
let resList = captureRegion.findMulti(RecognitionObject.ocrThis)
|
||||
if(captureRegion.Find(paimonMenuRo).IsEmpty()) {
|
||||
log.info("误触发其他页面,尝试关闭页面")
|
||||
await genshin.returnMainUi();
|
||||
} else if(resList.count > 0) {
|
||||
for (let i = 0; i < resList.count; i++) {
|
||||
let res = resList[i];
|
||||
if (res.text.includes("原粹树脂")) {
|
||||
log.info("误触发领取页面,尝试关闭页面")
|
||||
await genshin.returnMainUi();
|
||||
}
|
||||
}
|
||||
|
||||
let captureRegion = captureGameRegion();
|
||||
let iconRes = captureRegion.Find(boxIconRo);
|
||||
|
||||
if (!iconRes) {
|
||||
// 未找到图标,小幅度转动视角
|
||||
moveMouseBy(20, 0);
|
||||
await sleep(100);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (iconRes.x >= 920 && iconRes.x <= 980 && iconRes.y <= 540) {
|
||||
log.info(`视野已调正,前进第 ${advanceNum} 次`);
|
||||
return;
|
||||
} else {
|
||||
// 小幅度调整
|
||||
let adjustAmount = iconRes.x < 920 ? -20 : 20;
|
||||
let adjustAmount2 = iconRes.y < 540 ? 1 : 10;
|
||||
moveMouseBy(adjustAmount * adjustAmount2, 0);
|
||||
await sleep(100);
|
||||
}
|
||||
}
|
||||
// throw new Error('视野调整超时');
|
||||
let iconRes = captureRegion.Find(boxIconRo);
|
||||
|
||||
if (!iconRes) {
|
||||
throw new Error('未找到图标,没有地脉花');
|
||||
}
|
||||
|
||||
// 检查图标是否位于中心正上方
|
||||
const xOffset = iconRes.x - screenCenterX;
|
||||
const horizontalTolerance = 40;
|
||||
const isHorizontallyAligned = Math.abs(xOffset) <= horizontalTolerance;
|
||||
const isAboveCenter = iconRes.y < screenCenterY;
|
||||
|
||||
if (isHorizontallyAligned && isAboveCenter) {
|
||||
return true;
|
||||
} else {
|
||||
moveMouseBy(xOffset, 0);
|
||||
await sleep(100);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"manifest_version": 1,
|
||||
"name": "全自动地脉花",
|
||||
"version": "3.0.3",
|
||||
"version": "3.1.0",
|
||||
"bgi_version": "0.44.7",
|
||||
"description": "基于OCR图像识别的全自动刷取地脉花。\n💡更多信息请查看在线手册:https://hcnsvf0s8d0s.feishu.cn/wiki/Tb1twpThLi7UlykqcYOcuccTnjJ \n\n----------注意事项----------\n●仅支持BetterGI 0.44.7 及以上版本!\n●脚本仍未完成,没有出现的路线还未制作,请耐心等待。目前只有蒙德是全部路线,其他国家请使用强制运行模式。\n●目前脚本能力有限,暂时不支持识别地脉花是否已经开启,请确保队伍的练度足够,中途出现角色血量过低或倒下会无法继续,届时需要在重新运行时手动关闭领取地脉花奖励的界面。\n●脚本还提供了强行运行的功能,当无法识别地脉花位置时可以指定线路,脚本将不再对地脉花进行识别,即使没有领取到奖励也会继续运行,适用于路线重跑以及开发调试。\n●运行时会传送到七天神像设置中设置的七天神像,可能需要关闭七天神像设置中的“是否就近七天神像恢复血量”,并指定七天神像。\n●战斗策略注意调度器设置中地图追踪行走配置里的“允许在JsSpript中使用”和“覆盖JS中的自动战斗配置”,只有在都打开的情况下脚本才会使用下面的战斗配置,否则会使用独立任务中的战斗策略。",
|
||||
"authors": [
|
||||
|
||||
Reference in New Issue
Block a user