Compare commits

...

11 Commits

Author SHA1 Message Date
MisakaAldrich
3c1df8dbc8 update repo.json
Some checks failed
Build repo.json / build (18.x) (push) Has been cancelled
Build repo.json / upload (push) Has been cancelled
2025-07-16 15:51:11 +00:00
mno
514efa5041 js:狗粮重制版1.6.0 (#1359) 2025-07-16 23:50:56 +08:00
MisakaAldrich
b7e82972a7 update repo.json 2025-07-16 15:48:18 +00:00
JJMdzh
a522fc7c0a js,背包统计内存优化 (#1358) 2025-07-16 23:47:39 +08:00
MisakaAldrich
6453625ebb update repo.json 2025-07-16 15:47:26 +00:00
ddaodan
928b66d622 甜甜花全收集:A37-A42 (#1357) 2025-07-16 23:46:44 +08:00
MisakaAldrich
1f76f4419f update repo.json 2025-07-16 15:14:39 +00:00
this-Fish
31535c8bbe 飞萤路线-路线信息補充 (#1356) 2025-07-16 23:13:51 +08:00
MisakaAldrich
ca9819299f update repo.json 2025-07-16 15:13:46 +00:00
kaedelcb
a60bc2717e 热更:版本号更改和切换队伍错误处理 (#1355) 2025-07-16 23:13:30 +08:00
提瓦特钓鱼玳师
24f70e0fe2 JS脚本:提瓦特自动钓鱼【更新】 (#1354) 2025-07-16 23:13:14 +08:00
38 changed files with 1654 additions and 204 deletions

244
repo.json
View File

@@ -1,5 +1,5 @@
{
"time": "20250716095734",
"time": "20250716235110",
"url": "https://github.com/babalae/bettergi-scripts-list/archive/refs/heads/main.zip",
"file": "repo.json",
"indexes": [
@@ -54268,6 +54268,214 @@
"有攀爬"
],
"lastUpdated": "2025-07-07 22:32:48"
},
{
"name": "A33-甜甜花-蒙德-风龙废墟-4个.json",
"type": "file",
"hash": "066f926e06e17101cf436c32f523ac6b276360e8",
"version": "1.0",
"author": "ddaodan",
"authors": [
{
"name": "ddaodan",
"link": "https://github.com/ddaodan"
}
],
"description": "",
"tags": [
"bgi≥0.45.0",
"食材与炼金",
"甜甜花",
"低效"
],
"lastUpdated": "2025-07-16 09:39:33"
},
{
"name": "A34-甜甜花-蒙德-风龙废墟-4个.json",
"type": "file",
"hash": "db3aed05afcfaf19154ba86af01ce15d6347006b",
"version": "1.0",
"author": "ddaodan",
"authors": [
{
"name": "ddaodan",
"link": "https://github.com/ddaodan"
}
],
"description": "",
"tags": [
"bgi≥0.45.0",
"食材与炼金",
"甜甜花",
"低效"
],
"lastUpdated": "2025-07-16 09:39:33"
},
{
"name": "A35-甜甜花-蒙德-风龙废墟-2个.json",
"type": "file",
"hash": "2aae41c9936b320d94c320e67cef8d9a87885bf2",
"version": "1.0",
"author": "ddaodan",
"authors": [
{
"name": "ddaodan",
"link": "https://github.com/ddaodan"
}
],
"description": "",
"tags": [
"bgi≥0.45.0",
"食材与炼金",
"甜甜花"
],
"lastUpdated": "2025-07-16 09:39:33"
},
{
"name": "A36-甜甜花-蒙德-风龙废墟-6个.json",
"type": "file",
"hash": "0e6e4684f28a1129a044f70e9eb4814e88bf5443",
"version": "1.0",
"author": "ddaodan",
"authors": [
{
"name": "ddaodan",
"link": "https://github.com/ddaodan"
}
],
"description": "",
"tags": [
"bgi≥0.45.0",
"食材与炼金",
"甜甜花",
"低效",
"有攀爬"
],
"lastUpdated": "2025-07-16 09:39:33"
},
{
"name": "A37-甜甜花-蒙德-风龙废墟-3个.json",
"type": "file",
"hash": "4add96bbd9f174925bd90f7706a2cf790e299391",
"version": "1.0",
"author": "ddaodan",
"authors": [
{
"name": "ddaodan",
"link": "https://github.com/ddaodan"
}
],
"description": "",
"tags": [
"bgi≥0.45.0",
"食材与炼金",
"甜甜花",
"低效",
"有攀爬"
],
"lastUpdated": "2025-07-16 15:47:26"
},
{
"name": "A38-甜甜花-蒙德-风龙废墟-6个.json",
"type": "file",
"hash": "7d33df40b07a34c5b690ce69638cae418740a5a6",
"version": "1.0",
"author": "ddaodan",
"authors": [
{
"name": "ddaodan",
"link": "https://github.com/ddaodan"
}
],
"description": "",
"tags": [
"bgi≥0.45.0",
"食材与炼金",
"甜甜花"
],
"lastUpdated": "2025-07-16 15:47:26"
},
{
"name": "A39-甜甜花-蒙德-风龙废墟-4个.json",
"type": "file",
"hash": "e0462b390c79d35ba806920e461f5189084e490a",
"version": "1.0",
"author": "ddaodan",
"authors": [
{
"name": "ddaodan",
"link": "https://github.com/ddaodan"
}
],
"description": "",
"tags": [
"bgi≥0.45.0",
"食材与炼金",
"甜甜花"
],
"lastUpdated": "2025-07-16 15:47:26"
},
{
"name": "A40-甜甜花-蒙德-风龙废墟-8个.json",
"type": "file",
"hash": "0aabd690c39470e1a103d4db11cbea0755bf9510",
"version": "1.0",
"author": "ddaodan",
"authors": [
{
"name": "ddaodan",
"link": "https://github.com/ddaodan"
}
],
"description": "",
"tags": [
"bgi≥0.45.0",
"食材与炼金",
"甜甜花"
],
"lastUpdated": "2025-07-16 15:47:26"
},
{
"name": "A41-甜甜花-蒙德-苍风高地-2个.json",
"type": "file",
"hash": "5c8c84c09c1814f4533dd349b9e2c2c8daf2a86e",
"version": "1.0",
"author": "ddaodan",
"authors": [
{
"name": "ddaodan",
"link": "https://github.com/ddaodan"
}
],
"description": "",
"tags": [
"bgi≥0.45.0",
"食材与炼金",
"甜甜花"
],
"lastUpdated": "2025-07-16 15:47:26"
},
{
"name": "A42-甜甜花-蒙德-达达乌帕谷-15个.json",
"type": "file",
"hash": "cc2d415d6bda21d0485cc8af7f323a357ab9dca4",
"version": "1.0",
"author": "ddaodan",
"authors": [
{
"name": "ddaodan",
"link": "https://github.com/ddaodan"
}
],
"description": "",
"tags": [
"bgi≥0.45.0",
"食材与炼金",
"甜甜花",
"高危",
"有攀爬"
],
"lastUpdated": "2025-07-16 15:47:26"
}
]
}
@@ -69851,8 +70059,8 @@
{
"name": "AutoArtifactsPro",
"type": "directory",
"hash": "91e64bdd4ad99409db27bef0bddd374d7f689963",
"version": "1.5.9",
"hash": "33118569eaed8e7a60807f024c159625ef1cb1a1",
"version": "1.6.0",
"author": "mno",
"authors": [
{
@@ -69873,7 +70081,7 @@
"好感",
"狗粮"
],
"lastUpdated": "2025-07-16 09:57:16"
"lastUpdated": "2025-07-16 23:50:56"
},
{
"name": "AutoArtifactsSalvageOrDestroy1-4star",
@@ -70008,26 +70216,25 @@
{
"name": "AutoFishingTeyvat",
"type": "directory",
"hash": "8874e17c60404321d06767a805e126f410d73850",
"version": "2.1.0",
"hash": "4761d1f2b75fa0a4662707e12165bee8c1b9c0bc",
"version": "2.2.0",
"author": "提瓦特钓鱼玳师",
"authors": [
{
"name": "提瓦特钓鱼玳师",
"link": "https://github.com/Hijiwos"
"name": "提瓦特钓鱼玳师"
}
],
"description": "提瓦特自动钓鱼(全流程+自选)~|~脚本名称:提瓦特自动钓鱼(全流程+自选)\n功能描述支持自动追踪并垂钓bgi支持的全提瓦特垂钓点\n核心功能------------------------------>\n1.可自选地区、鱼类、鱼饵\n2.可直接钓取特定物品的兑换材料(例如渔获)\n3.脚本会根据需要的鱼类自动调节时间,不需要的时段会跳过\n4.支持部分地图追踪无法到达的钓鱼点(例如炽岩斗士急流鱼钓鱼点,枫丹廷东北钓鱼点、雷鸣仙垂钓点)\n5.支持从特定的垂钓点继续任务(仅启用所有垂钓点时可用)\n6.默认禁用需要战斗的路线如有需要请在JS脚本配置内启用\n7.支持自定义钓鱼超时时间\n8.支持设置定时关闭最多24小时\n9.4点自动领取月卡(可选)\n10.启用自动拾取(可选)\n注意事项------------------------------>\n1.部分点位涉及战斗,且队伍内不能有双风和跑步(不是冲刺)时加移速的角色\n2.跑图位必须是少男体型(防止键鼠路线[GCM]出错)\n3.同时选择鱼类和鱼饵的情况下按照以下逻辑选择路线: 所有被选的鱼类会被加入任务列表,如果选择的鱼饵中某个鱼饵不是已选的任何一个鱼类的对应的鱼饵,那么这个鱼饵对应的所有鱼类将被添加到任务列表\n4.JS脚本的设置内各设置项含有优先级如果存在高优先级且选项不为默认则只有最高优先级的设置项生效\n5.部分钓鱼点为路径追踪+键鼠脚本(GCM)的混合模式可能会出现因键鼠脚本误差卡死的情况如果出现这种情况请在JS脚本设置禁用键鼠路线来禁用所有包含键鼠脚本的钓鱼点\n---------------------------------------->\n作者提瓦特钓鱼玳师\n脚本反馈邮箱hijiwos@hotmail.com",
"description": "提瓦特自动钓鱼(全流程+自选)~|~脚本名称:提瓦特自动钓鱼(全流程+自选)\n功能描述支持自动追踪并垂钓bgi支持的全提瓦特垂钓点\n核心功能------------------------------>\n1.可自选地区、鱼类、鱼饵\n2.可直接钓取特定物品的兑换材料(例如渔获)\n3.脚本会根据需要的鱼类自动调节时间,不需要的时段会跳过\n4.支持部分地图追踪无法到达的钓鱼点(例如炽岩斗士急流鱼钓鱼点,枫丹廷东北钓鱼点、雷鸣仙垂钓点)\n5.支持从特定的垂钓点继续任务(仅启用所有垂钓点时可用)\n6.默认禁用需要战斗的路线如有需要请在JS脚本配置内启用\n7.支持自定义钓鱼超时时间\n8.支持设置定时关闭最多24小时\n9.4点自动领取月卡(可选)\n10.自动记录垂钓点冷却时间(进入其他世界钓鱼时请关闭此功能)\n11.启用自动拾取(可选)\n注意事项------------------------------>\n1.部分点位涉及战斗,且队伍内不能有双风和跑步(不是冲刺)时加移速的角色\n2.跑图位必须是少男体型(防止键鼠路线[GCM]出错)\n3.同时选择鱼类和鱼饵的情况下按照以下逻辑选择路线: 所有被选的鱼类会被加入任务列表,如果选择的鱼饵中某个鱼饵不是已选的任何一个鱼类的对应的鱼饵,那么这个鱼饵对应的所有鱼类将被添加到任务列表\n4.JS脚本的设置内各设置项含有优先级如果存在高优先级且选项不为默认则只有最高优先级的设置项生效\n5.部分钓鱼点为路径追踪+键鼠脚本(GCM)的混合模式可能会出现因键鼠脚本误差卡死的情况如果出现这种情况请在JS脚本设置禁用键鼠路线来禁用所有包含键鼠脚本的钓鱼点\n---------------------------------------->\n作者提瓦特钓鱼玳师\n脚本反馈邮箱hijiwos@hotmail.com",
"tags": [
"bgi≥0.45.0"
"bgi≥0.47.0"
],
"lastUpdated": "2025-07-04 23:14:44"
"lastUpdated": "2025-07-16 23:13:14"
},
{
"name": "AutoFontaineLeyLine",
"type": "directory",
"hash": "1e78dc4177521447d9857823e0ae92d040484df8",
"version": "3.2",
"hash": "343c42b201fe5653a1f7e16b7220039ac70fab0b",
"version": "3.3",
"author": "LCB-茶包",
"authors": [
{
@@ -70052,7 +70259,7 @@
"bgi≥0.44.8",
"地脉花"
],
"lastUpdated": "2025-07-05 00:27:26"
"lastUpdated": "2025-07-16 23:13:30"
},
{
"name": "AutoFriendshipEvilBaresItsFangsGetRawMeat",
@@ -71537,20 +71744,19 @@
{
"name": "背包材料统计",
"type": "directory",
"hash": "753304af508f67bab5ff4cf3e72c0f105a680471",
"version": "2.30",
"hash": "b7b88b787e58d2d43a6efa87320db50ee896e4a0",
"version": "2.40",
"author": "吉吉喵",
"authors": [
{
"name": "吉吉喵",
"link": "https://github.com/JJMdzh"
"name": "吉吉喵"
}
],
"description": "背包统计采集系统~|~默认四行为一页模板匹配材料OCR识别数量。\n数字太小可能无法识别用?代替。\n目前支持采集材料的数量统计+路径CD管理。",
"tags": [
"bgi≥0.44.8"
],
"lastUpdated": "2025-07-04 23:14:44"
"lastUpdated": "2025-07-16 23:47:39"
},
{
"name": "自动领取成就奖励",

View File

@@ -171,7 +171,8 @@ https://www.kdocs.cn/wo/sl/v13uXscL
## 更新日志
### 1.6.02025.07.16
1.新增摧毁换取摩拉的选项和沿途分解选项
### 1.5.92025.07.15
1.微调(激活大炮第二炮掉出影响/204卡木条/216避开穷点/224避开书本/302微调/405微调/407微调/428微调/605微调)
### 1.5.72025.07.13

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -9,6 +9,9 @@ let finished = false;
const accountName = settings.accountName || "默认账户";
let version = "default";
let runnedToday = false;
let artifactExperienceDiff = 0;
let moraDiff = 0;
let pathIndex = 0;
//预处理
const minIntervalTime = settings.minIntervalTime || "5";
@@ -20,6 +23,7 @@ const runActivatePath = settings.runActivatePath || false;
let enemyType = "无";
(async function () {
setGameMetrics(1920, 1080, 1);
//伪造js结束记录
await fakeLog("自动狗粮重制版", true, true, 0);
@@ -370,8 +374,12 @@ let enemyType = "无";
}
//运行前按自定义配置清理狗粮
const result1 = await decomposeArtifacts(settings.keep4Star, settings.doDecompose);
if (settings.decomposeMode === "分解(经验瓶)") {
await processArtifacts(21);
} else {
artifactExperienceDiff -= await processArtifacts(21);
}
moraDiff -= await mora();
artifacts: {
if (runnedToday && finished) {
break artifacts;
@@ -379,19 +387,9 @@ let enemyType = "无";
// 开始运行狗粮路线
let runArtifactsResult = true;
runArtifactsResult = await runArtifactsPaths(runRouteA, grindPartyName, settings.useABE);
const result2 = await decomposeArtifacts(settings.keep4Star, settings.doDecompose);
// 计算 mora 和 artifactExperience 的差值
const moraDiff = Number(result2.mora) - Number(result1.mora); // 将字符串转换为数字后计算差值
let artifactExperienceDiff;
if (!settings.doDecompose) {
artifactExperienceDiff = result2.artifactExperience - result1.artifactExperience;
} else {
artifactExperienceDiff = result2.artifactExperience;
}
artifactExperienceDiff += await processArtifacts(21);
moraDiff += await mora();
log.info(`狗粮路线获取摩拉: ${moraDiff}`);
log.info(`狗粮路线获取狗粮经验: ${artifactExperienceDiff}`);
@@ -503,6 +501,10 @@ async function runArtifactsPaths(runRouteA, grindPartyName, useABE) {
// 执行地图追踪文件
for (const fileName of jsonFilePaths) {
pathIndex++;
if ((pathIndex % 5 === 0) && settings.autoSalvage && settings.decomposeMode != "保留") {
artifactExperienceDiff += await processArtifacts(1);
}
const fullPath = fileName;
await fakeLog(fileName, false, true, 0);
currentTask += 1; // 更新当前任务计数器
@@ -934,12 +936,6 @@ function validateTimeoutSetting(value, defaultValue, timeoutType) {
return timeout;
}
// 定义替换映射表
const replacementMap = {
"监": "盐",
"卵": "卯"
};
// 定义所有图标的图像识别对象,每个图片都有自己的识别区域
let CharacterMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/CharacterMenu.png"), 60, 991, 38, 38);
@@ -974,12 +970,7 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 3000) {
let resList = captureGameRegion().findMulti(RecognitionObject.ocr(ocrRegion.x, ocrRegion.y, ocrRegion.width, ocrRegion.height)); // 指定识别区域
// 遍历识别结果,检查是否找到目标文本
for (let res of resList) {
// 后处理:根据替换映射表检查和替换错误识别的字符
let correctedText = res.text;
for (let [wrongChar, correctChar] of Object.entries(replacementMap)) {
correctedText = correctedText.replace(new RegExp(wrongChar, 'g'), correctChar);
}
if (correctedText.includes(targetText)) {
// 如果找到目标文本,计算并点击文字的中心坐标
let centerX = Math.round(res.x + res.width / 2);
@@ -1024,7 +1015,7 @@ async function recognizeTextInRegion(ocrRegion, timeout = 5000) {
}
} catch (error) {
retryCount++; // 增加重试计数
log.warn(`OCR 摩拉数识别失败,正在进行第 ${retryCount} 次重试...`);
log.warn(`OCR 识别失败,正在进行第 ${retryCount} 次重试...`);
}
await sleep(500); // 短暂延迟,避免过快循环
}
@@ -1032,59 +1023,7 @@ async function recognizeTextInRegion(ocrRegion, timeout = 5000) {
return null; // 如果未识别到文字,返回 null
}
async function decomposeArtifacts(keep4Star, doDecompose) {
setGameMetrics(1920, 1080, 1);
await genshin.returnMainUi();
// 按下 C 键
keyPress("C");
await sleep(1500);
let recognized = false;
// 识别“角色菜单”图标或“天赋”文字
let startTime = Date.now();
while (Date.now() - startTime < 5000) {
// 尝试识别“角色菜单”图标
let characterMenuResult = await recognizeImage(CharacterMenuRo, 5000);
if (characterMenuResult.success) {
await click(177, 433);
await sleep(500);
recognized = true;
break;
}
// 尝试识别“天赋”文字
let targetText = "天赋";
let ocrRegion = { x: 133, y: 395, width: 115, height: 70 }; // 设置对应的识别区域
let talentResult = await recognizeTextAndClick(targetText, ocrRegion);
if (talentResult.success) {
log.info(`点击天赋文字,坐标: x=${talentResult.x}, y=${talentResult.y}`);
recognized = true;
break;
}
await sleep(1000); // 短暂延迟,避免过快循环
}
let recognizedText = "";
// 如果识别到了“角色菜单”或“天赋”,则识别“摩拉数值”
if (recognized) {
let ocrRegionMora = { x: 1620, y: 25, width: 152, height: 46 }; // 设置对应的识别区域
recognizedText = await recognizeTextInRegion(ocrRegionMora);
if (recognizedText) {
log.info(`成功识别到摩拉数值: ${recognizedText}`);
} else {
log.warn("未能识别到摩拉数值。");
}
} else {
log.warn("未能识别到角色菜单或天赋,跳过摩拉数值识别。");
}
await sleep(500);
await genshin.returnMainUi();
async function decomposeArtifacts() {
keyPress("B");
await sleep(1000);
await click(670, 45);
@@ -1109,7 +1048,7 @@ async function decomposeArtifacts(keep4Star, doDecompose) {
let firstNumber = 0;
let firstNumber2 = 0;
if (keep4Star) {
if (settings.keep4Star) {
await recognizeTextAndClick("快速选择", { x: 248, y: 996, width: 121, height: 49 });
moveMouseTo(960, 540);
await sleep(1000);
@@ -1140,7 +1079,7 @@ async function decomposeArtifacts(keep4Star, doDecompose) {
moveMouseTo(960, 540);
await sleep(1000);
if (keep4Star) {
if (settings.keep4Star) {
await click(370, 370);//取消选择四星
await sleep(1000);
}
@@ -1172,7 +1111,7 @@ async function decomposeArtifacts(keep4Star, doDecompose) {
log.warn(`在指定区域未识别到有效数字: ${newValue}`);
}
if (doDecompose) {
if (settings.decomposeMode === "分解(经验瓶)") {
log.info(`用户选择了分解,执行分解`);
// 根据用户配置,分解狗粮
await sleep(1000);
@@ -1203,12 +1142,136 @@ async function decomposeArtifacts(keep4Star, doDecompose) {
if (resultExperience === 0) {
resultExperience = initialValue;
}
const result = {
mora: recognizedText, // 将 recognizedText 赋值给 mora
artifactExperience: resultExperience,
fourStarNum: fourStarNum
};
const result = resultExperience;
await genshin.returnMainUi();
return result;
}
/**
* 摧毁圣遗物换摩拉
*/
async function destroyArtifacts(times = 1) {
const ArtifactsButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/ArtifactsButton.png"));
const DeleteButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/DeleteButton.png"));
const AutoAddButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/AutoAddButton.png"));
const ConfirmButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/ConfirmButton.png"));
const DestoryButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/DestoryButton.png"));
const MidDestoryButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/DestoryButton.png"), 900, 600, 500, 300);
await genshin.returnMainUi();
keyPress("B");
await sleep(1500);
let ArtifactsButton = captureGameRegion().find(ArtifactsButtonRo);
if (ArtifactsButton.isExist()) {
log.info("识别到圣遗物按钮");
ArtifactsButton.click();
await sleep(1500);
}
try {
for (let i = 0; i < times; i++) {
captureGameRegion().find(DeleteButtonRo).click();// 点击摧毁
await sleep(600);
captureGameRegion().find(AutoAddButtonRo).click();// 点击自动添加
await sleep(600);
await sleep(300);
click(150, 150);
await sleep(300);
click(150, 220);
await sleep(300);
click(150, 300);
if (!settings.keep4Star) {
await sleep(300);
click(150, 370);
}
captureGameRegion().find(ConfirmButtonRo).click();// 点击快捷放入
await sleep(600);
captureGameRegion().find(DestoryButtonRo).click();// 点击摧毁
await sleep(600);
captureGameRegion().find(MidDestoryButtonRo).click();// 弹出页面点击摧毁
await sleep(600);
click(960, 1000);// 点击空白处
await sleep(1000);
}
} catch (ex) {
log.info("背包里的圣遗物已摧毁完毕,提前结束")
} finally {
await genshin.returnMainUi();
}
}
async function processArtifacts(times = 1) {
await genshin.returnMainUi();
let result = 0;
try {
if (settings.decomposeMode === "销毁(摩拉)") {
result = await destroyArtifacts(times);
} else {
result = await decomposeArtifacts();
}
} catch (error) {
log.error(`处理狗粮分解时发生异常: ${error.message}`);
}
await genshin.returnMainUi();
return result;
}
async function mora() {
let result = 0;
let tryTimes = 0;
while (result = 0 && tryTimes < 3) {
await genshin.returnMainUi();
// 按下 C 键
keyPress("C");
await sleep(1500);
let recognized = false;
// 识别“角色菜单”图标或“天赋”文字
let startTime = Date.now();
while (Date.now() - startTime < 5000) {
// 尝试识别“角色菜单”图标
let characterMenuResult = await recognizeImage(CharacterMenuRo, 5000);
if (characterMenuResult.success) {
await click(177, 433);
await sleep(500);
recognized = true;
break;
}
// 尝试识别“天赋”文字
let targetText = "天赋";
let ocrRegion = { x: 133, y: 395, width: 115, height: 70 }; // 设置对应的识别区域
let talentResult = await recognizeTextAndClick(targetText, ocrRegion);
if (talentResult.success) {
log.info(`点击天赋文字,坐标: x=${talentResult.x}, y=${talentResult.y}`);
recognized = true;
break;
}
await sleep(1000); // 短暂延迟,避免过快循环
}
let recognizedText = "";
// 如果识别到了“角色菜单”或“天赋”,则识别“摩拉数值”
if (recognized) {
let ocrRegionMora = { x: 1620, y: 25, width: 152, height: 46 }; // 设置对应的识别区域
recognizedText = await recognizeTextInRegion(ocrRegionMora);
if (recognizedText) {
log.info(`成功识别到摩拉数值: ${recognizedText}`);
result = recognizedText;
} else {
log.warn("未能识别到摩拉数值。");
}
} else {
log.warn("未能识别到角色菜单或天赋");
}
await sleep(500);
tryTimes++;
await genshin.returnMainUi();
}
return Number(result);
}

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 1,
"name": "自动狗粮重制版",
"version": "1.5.9",
"version": "1.6.0",
"tags": [
"好感",
"狗粮"

View File

@@ -15,7 +15,7 @@
{
"name": "runActivatePath",
"type": "checkbox",
"label": "是否启用激活路线,启用后将先花费约3分钟激活狗粮点\n启用该选项后可提高稳定性并允许中断后重新运行和极大降低最短间隔时间"
"label": "是否启用激活路线,启用后将先花费约5分钟激活狗粮点\n启用该选项后可提高稳定性并允许极大降低最短间隔时间"
},
{
"name": "useABE",
@@ -47,15 +47,26 @@
"default": "狗粮"
},
{
"name": "doDecompose",
"type": "checkbox",
"label": "是否分解狗粮(默认不分解)"
"name": "decomposeMode",
"type": "select",
"label": "狗粮分解模式",
"options": [
"保留",
"分解(经验瓶)",
"销毁(摩拉)"
],
"default": "保留"
},
{
"name": "keep4Star",
"type": "checkbox",
"label": "是否保留四星(默认不保留)"
},
{
"name": "autoSalvage",
"type": "checkbox",
"label": "是否沿路自动分解(默认:否)"
},
{
"name": "minIntervalTime",
"type": "input-text",

View File

@@ -0,0 +1,31 @@
脚本名称:提瓦特自动钓鱼(全流程+自选)
功能描述支持自动追踪并垂钓bgi支持的全提瓦特垂钓点
## 核心功能
1. 可自选地区、鱼类、鱼饵
2. 可直接钓取特定物品的兑换材料(例如渔获)
3. 脚本会根据需要的鱼类自动调节时间,不需要的时段会跳过
4. 支持部分地图追踪无法到达的钓鱼点(例如炽岩斗士急流鱼钓鱼点,枫丹廷东北钓鱼点、雷鸣仙垂钓点)
5. 支持从特定的垂钓点继续任务(仅启用所有垂钓点时可用)
6. 默认禁用需要战斗的路线如有需要请在JS脚本配置内启用
7. 支持自定义钓鱼超时时间
8. 支持设置定时关闭最多24小时
9. 4点自动领取月卡可选
10. 自动记录垂钓点冷却时间(进入其他世界钓鱼时请关闭此功能)
11. 启用自动拾取(可选)
## 注意事项
1. 部分点位涉及战斗,且队伍内不能有双风和跑步(不是冲刺)时加移速的角色
2. 跑图位必须是少男体型(防止键鼠路线[GCM]出错)
3. 同时选择鱼类和鱼饵的情况下按照以下逻辑选择路线: 所有被选的鱼类会被加入任务列表,如果选择的鱼饵中某个鱼饵不是已选的任何一个鱼类的对应的鱼饵,那么这个鱼饵对应的所有鱼类将被添加到任务列表
4. JS脚本的设置内各设置项含有优先级如果存在高优先级且选项不为默认则只有最高优先级的设置项生效
5. 部分钓鱼点为路径追踪+键鼠脚本(GCM)的混合模式可能会出现因键鼠脚本误差卡死的情况如果出现这种情况请在JS脚本设置禁用键鼠路线来禁用所有包含键鼠脚本的钓鱼点
## 其它
作者:提瓦特钓鱼玳师
脚本反馈邮箱hijiwos@hotmail.com

View File

@@ -1,4 +1,4 @@
(async function () {
(async function () { // 多人模式不计CDCD读写仍有优化空间
const area_list = ['蒙德', '璃月', '稻妻', '须弥', '枫丹', '纳塔', '至冬', '层岩巨渊·地下矿区', '渊下宫']
const fish_list = ['花鳉', '波波心羽鲈', '烘烘心羽鲈', '维护机关·水域清理者', '维护机关·态势控制者', '维护机关·澄金领队型', '海涛斧枪鱼', '维护机关·初始能力型', '维护机关·白金典藏型', '吹沙角鲀', '甜甜花鳉', '擒霞客', '水晶宴', '斗棘鱼', '炮鲀', '流纹褐蝶鱼', '锖假龙', '金赤假龙', '玉玉心羽鲈', '赤魔王', '长生仙', '苦炮鲀', '肺棘鱼', '流纹京紫蝶鱼', '琉璃花鳉', '伪装鲨鲨独角鱼', '繁花斗士急流鱼', '深潜斗士急流鱼', '晚霞翻车鲀', '青浪翻车鲀', '拟似燃素独角鱼', '炽岩斗士急流鱼', '蓝染花鳉', '鸩棘鱼', '流纹茶蝶鱼', '雪中君', '真果角鲀', '青金斧枪鱼', '暮云角鲀', '翡玉斧枪鱼', '沉波蜜桃', '雷鸣仙', '佛玛洛鳐', '迪芙妲鳐', '秘源机关·巡戒使']
@@ -158,6 +158,95 @@
// 存储本次任务中的所有鱼类,作为调节时间的关键参考
let list_fish = [];
/**
*
* 将毫秒形式的字符串转换为更清晰的时间格式
*
* @param ms
* @returns {string}
*/
function formatTimeDifference(ms) {
ms = Number(ms);
// 计算天、小时、分钟、秒
const seconds = Math.floor(ms / 1000);
const minutes = Math.floor(seconds / 60);
const hours = Math.floor(minutes / 60);
const days = Math.floor(hours / 24);
// 计算剩余的小时、分钟、秒
const remainingHours = hours % 24;
const remainingMinutes = minutes % 60;
const remainingSeconds = seconds % 60;
// 返回格式化字符串
return `${days}${remainingHours}小时 ${remainingMinutes}分钟 ${remainingSeconds}`;
}
/**
*
* 垂钓点CD存档写入
*
* @param {string} pathing_name 路径名称
* @param {string} time_status 垂钓点时间状态(白天,夜晚)
* @param {string} timestamp 时间戳
* @param {string} user_id 原神UID
*/
function write_archive(pathing_name, time_status, timestamp, user_id) {
let assets_dir = Array.from(file.readPathSync("assets"));
let content = {};
if (assets_dir.includes("assets\\archive.json")) {
content = JSON.parse(file.readTextSync("assets/archive.json"));
if (time_status === "全天") {
content[user_id][pathing_name]["Daytime"] = timestamp;
content[user_id][pathing_name]["Nighttime"] = timestamp;
} else if (time_status === "白天") {
content[user_id][pathing_name]["Daytime"] = timestamp;
content[user_id][pathing_name]["Nighttime"] = Object.keys(content[user_id][pathing_name]).includes("Nighttime") ? content[user_id][pathing_name]["Nighttime"]: null;
} else if (time_status === "夜晚") {
content[user_id][pathing_name]["Daytime"] = Object.keys(content[user_id][pathing_name]).includes("Daytime") ? content[user_id][pathing_name]["Daytime"]: null;
content[user_id][pathing_name]["Nighttime"] = timestamp;
}
} else {
content[user_id] = {};
content[user_id][pathing_name] = {
"Daytime": time_status === "白天" || time_status === "全天" ? timestamp : null,
"Nighttime": time_status === "夜晚" || time_status === "全天" ? timestamp : null
};
}
file.WriteTextSync("assets/archive.json", JSON.stringify(content, null, 2), false);
}
/**
*
* 垂钓点CD存档读取
*
* @param {string} pathing_name 路径名称
* @param {string} user_id 原神UID
*
* @return Daytime/Nighttime 字典
*/
function read_archive(pathing_name, user_id) {
let assets_dir = Array.from(file.readPathSync("assets"));
if (assets_dir.includes("assets\\archive.json")) {
let content = JSON.parse(file.readTextSync("assets/archive.json"));
if (Object.keys(content).includes(user_id)) {
if (Object.keys(content[user_id]).includes(pathing_name)) {
return content[user_id][pathing_name];
} else {
return null;
}
} else {
return null;
}
} else {
return null;
}
}
/**
* 获取路径包含的信息
*
@@ -298,7 +387,7 @@
}
}
async function run_file(path_msg, time_out_throw, time_out_whole, is_con, block_gcm, block_fight, block_tsurumi, auto_skip) {
async function run_file(path_msg, time_out_throw, time_out_whole, is_con, block_gcm, block_fight, block_tsurumi, auto_skip, fishing_cd, uid = "default_user") {
const base_path_pathing = "assets/pathing/";
const base_path_gcm = "assets/KeyMouseScript/";
const base_path_statues = "assets/pathing_statues/";
@@ -408,7 +497,65 @@
log.info(`该钓鱼点的时间: ${fishing_time}`);
await pathingScript.runFile(base_path_pathing + file_name + ".json");
// 检查垂钓点CD
if (fishing_cd) {
let current_cd = read_archive(file_name, uid);
if (current_cd !== null) {
const now = Date.now();
if (fishing_time === "全天") {
let daytime = true;
if (current_cd["Daytime"] !== null) {
let difference = now - current_cd["Daytime"];
if (difference < 259200000) {
log.info(`该垂钓点(白天)处于冷却状态,剩余时间: ${formatTimeDifference(259200000 - difference)}`);
log.info(`${file_name}(白天) 已跳过...`);
daytime = false;
fishing_time = "夜晚";
} else {
log.info(`该垂钓点(白天)未处于冷却状态,闲置时间: ${formatTimeDifference(difference - 259200000)}`);
}
}
if (current_cd["Nighttime"] !== null) {
let difference = now - current_cd["Nighttime"];
if (difference < 259200000) {
log.info(`该垂钓点(夜晚)处于冷却状态,剩余时间: ${formatTimeDifference(259200000 - difference)}`);
log.info(`${file_name}(夜晚) 已跳过...`);
if (daytime) {
fishing_time = "白天";
} else {
return null;
}
} else {
log.info(`该垂钓点(夜晚)未处于冷却状态,闲置时间: ${formatTimeDifference(difference - 259200000)}`);
}
}
} else if (fishing_time === "白天") {
if (current_cd["Daytime"] !== null) {
let difference = now - current_cd["Daytime"];
if (difference < 259200000) {
log.info(`该垂钓点(白天)处于冷却状态,剩余时间: ${formatTimeDifference(259200000 - difference)}`);
log.info(`${file_name}(白天) 已跳过...`);
return null;
} else {
log.info(`该垂钓点(白天)未处于冷却状态,闲置时间: ${formatTimeDifference(difference - 259200000)}`);
}
}
} else if (fishing_time === "夜晚") {
if (current_cd["Nighttime"] !== null) {
let difference = now - current_cd["Nighttime"];
if (difference < 259200000) {
log.info(`该垂钓点(夜晚)处于冷却状态,剩余时间: ${formatTimeDifference(259200000 - difference)}`);
log.info(`${file_name}(夜晚) 已跳过...`);
return null;
} else {
log.info(`该垂钓点(夜晚)未处于冷却状态,闲置时间: ${formatTimeDifference(difference - 259200000)}`);
}
}
}
}
}
//await pathingScript.runFile(base_path_pathing + file_name + ".json");
// 执行键鼠脚本
if (path_msg["addition"] === "GCM") {
@@ -417,11 +564,15 @@
// 调用自动钓鱼
// await genshin.autofishing(fishing_time_dic[fishing_time]["param"]);
await dispatcher.runTask(new SoloTask("AutoFishing", {
"fishingTimePolicy": fishing_time_dic[fishing_time]["param"],
"throwRodTimeOutTimeoutSeconds": time_out_throw,
"wholeProcessTimeoutSeconds": time_out_whole
}));
// await dispatcher.runTask(new SoloTask("AutoFishing", {
// "fishingTimePolicy": fishing_time_dic[fishing_time]["param"],
// "throwRodTimeOutTimeoutSeconds": time_out_throw,
// "wholeProcessTimeoutSeconds": time_out_whole
// }));
if (fishing_cd) {
write_archive(file_name, fishing_time, Date.now(), uid);
}
}
async function main() {
@@ -451,12 +602,33 @@
const auto_pick = typeof(settings.auto_pick) === 'undefined' ? false : settings.auto_pick;
// 读取4点自动领取月卡的设置
const auto_skip = typeof(settings.auto_skip) === 'undefined' ? false : settings.auto_skip;
// 读取垂钓点CD统计
const fishing_cd = typeof(settings.fishing_cd) === 'undefined' ? false: settings.fishing_cd;
// 读取终止时间
const kill_hour = typeof(settings.time_kill_hour) === 'undefined' ? "无" : settings.time_kill_hour;
const kill_minute = typeof(settings.time_kill_minute) === 'undefined' ? "无" : settings.time_kill_minute;
const is_time_kill = kill_hour !== "无" && kill_minute !== "无"; // 判断是否启用
let time_target = new Date();
// 获取当前用户UID
let uid = "default_user";
if (fishing_cd) {
const ocrRo = RecognitionObject.Ocr(166, 198, 120, 22);
genshin.returnMainUi();
await sleep(1000);
keyPress("Escape");
await sleep(1000);
let ocr = captureGameRegion().Find(ocrRo); // 当前页面OCR
if (ocr.isExist()) {
uid = ocr.text;
}
keyPress("Escape");
}
if (is_time_kill) {
let now = new Date();
time_target.setHours(parseInt(kill_hour), 10);
@@ -495,8 +667,7 @@
}
// 路径详细信息
const path_msg = get_pathing_msg(path_filter[i]);
try {
await sleep(100);
// try {
let current_msg = `${path_msg["area"]}-${path_msg["detail"]}`
log.info(`当前钓鱼点: ${current_msg}(进度: ${i + 1}/${path_filter.length})`);
if (path_continue === current_msg) {
@@ -509,13 +680,13 @@
continue;
}
await run_file(path_msg, time_out_throw, time_out_whole, is_con, block_gcm, block_fight, block_tsurumi, auto_skip);
} catch (error) {
const file_name = `${path_msg["area"]}-${path_msg["type"]}-${path_msg["detail"]}`;
log.info(`路径: ${file_name} 执行时出错,已跳过...\n错误信息: ${error}`)
}
await run_file(path_msg, time_out_throw, time_out_whole, is_con, block_gcm, block_fight, block_tsurumi, auto_skip, fishing_cd, uid);
// } catch (error) {
// const file_name = `${path_msg["area"]}-${path_msg["type"]}-${path_msg["detail"]}`;
// log.info(`路径: ${file_name} 执行时出错,已跳过...\n错误信息: ${error}`)
// }
}
}
await main();
})();
})();

View File

@@ -1,15 +1,14 @@
{
"manifest_version": 1,
"name": "提瓦特自动钓鱼(全流程+自选)",
"version": "2.1.0",
"bgi_version": "0.45.0",
"description": "脚本名称:提瓦特自动钓鱼(全流程+自选)\n功能描述支持自动追踪并垂钓bgi支持的全提瓦特垂钓点\n核心功能------------------------------>\n1.可自选地区、鱼类、鱼饵\n2.可直接钓取特定物品的兑换材料(例如渔获)\n3.脚本会根据需要的鱼类自动调节时间,不需要的时段会跳过\n4.支持部分地图追踪无法到达的钓鱼点(例如炽岩斗士急流鱼钓鱼点,枫丹廷东北钓鱼点、雷鸣仙垂钓点)\n5.支持从特定的垂钓点继续任务(仅启用所有垂钓点时可用)\n6.默认禁用需要战斗的路线如有需要请在JS脚本配置内启用\n7.支持自定义钓鱼超时时间\n8.支持设置定时关闭最多24小时\n9.4点自动领取月卡(可选)\n10.启用自动拾取(可选)\n注意事项------------------------------>\n1.部分点位涉及战斗,且队伍内不能有双风和跑步(不是冲刺)时加移速的角色\n2.跑图位必须是少男体型(防止键鼠路线[GCM]出错)\n3.同时选择鱼类和鱼饵的情况下按照以下逻辑选择路线: 所有被选的鱼类会被加入任务列表,如果选择的鱼饵中某个鱼饵不是已选的任何一个鱼类的对应的鱼饵,那么这个鱼饵对应的所有鱼类将被添加到任务列表\n4.JS脚本的设置内各设置项含有优先级如果存在高优先级且选项不为默认则只有最高优先级的设置项生效\n5.部分钓鱼点为路径追踪+键鼠脚本(GCM)的混合模式可能会出现因键鼠脚本误差卡死的情况如果出现这种情况请在JS脚本设置禁用键鼠路线来禁用所有包含键鼠脚本的钓鱼点\n---------------------------------------->\n作者提瓦特钓鱼玳师\n脚本反馈邮箱hijiwos@hotmail.com",
"version": "2.2.0",
"bgi_version": "0.47.0",
"description": "脚本名称:提瓦特自动钓鱼(全流程+自选)\n功能描述支持自动追踪并垂钓bgi支持的全提瓦特垂钓点\n核心功能------------------------------>\n1.可自选地区、鱼类、鱼饵\n2.可直接钓取特定物品的兑换材料(例如渔获)\n3.脚本会根据需要的鱼类自动调节时间,不需要的时段会跳过\n4.支持部分地图追踪无法到达的钓鱼点(例如炽岩斗士急流鱼钓鱼点,枫丹廷东北钓鱼点、雷鸣仙垂钓点)\n5.支持从特定的垂钓点继续任务(仅启用所有垂钓点时可用)\n6.默认禁用需要战斗的路线如有需要请在JS脚本配置内启用\n7.支持自定义钓鱼超时时间\n8.支持设置定时关闭最多24小时\n9.4点自动领取月卡(可选)\n10.自动记录垂钓点冷却时间(进入其他世界钓鱼时请关闭此功能)\n11.启用自动拾取(可选)\n注意事项------------------------------>\n1.部分点位涉及战斗,且队伍内不能有双风和跑步(不是冲刺)时加移速的角色\n2.跑图位必须是少男体型(防止键鼠路线[GCM]出错)\n3.同时选择鱼类和鱼饵的情况下按照以下逻辑选择路线: 所有被选的鱼类会被加入任务列表,如果选择的鱼饵中某个鱼饵不是已选的任何一个鱼类的对应的鱼饵,那么这个鱼饵对应的所有鱼类将被添加到任务列表\n4.JS脚本的设置内各设置项含有优先级如果存在高优先级且选项不为默认则只有最高优先级的设置项生效\n5.部分钓鱼点为路径追踪+键鼠脚本(GCM)的混合模式可能会出现因键鼠脚本误差卡死的情况如果出现这种情况请在JS脚本设置禁用键鼠路线来禁用所有包含键鼠脚本的钓鱼点\n---------------------------------------->\n作者提瓦特钓鱼玳师\n脚本反馈邮箱hijiwos@hotmail.com",
"authors": [
{
"name": "提瓦特钓鱼玳师",
"links": "https://github.com/Hijiwos"
"name": "提瓦特钓鱼玳师"
}
],
"settings_ui": "settings.json",
"main": "main.js"
}
}

View File

@@ -2,7 +2,8 @@
{
"name": "show_info",
"type": "input-text",
"label": "下方输入的内容用空格隔开、括号内是优先级\n只会执行当前非默认最高优先级的选项"
"label": "下方输入的内容用空格隔开、括号内是优先级\n只会执行当前非默认最高优先级的选项",
"default": "该输入框无需输入内容"
},
{
"name": "path_sort_area",
@@ -127,22 +128,32 @@
{
"name": "time_out_throw",
"type": "input-text",
"label": "自动抛竿未上钩超时时间(秒) 默认: 10"
"label": "自动抛竿未上钩超时时间(秒)",
"default": 10
},
{
"name": "time_out_whole",
"type": "input-text",
"label": "整个任务超时时间(秒) 默认: 300"
"label": "整个任务超时时间(秒)",
"default": 300
},
{
"name": "auto_pick",
"type": "checkbox",
"label": "启用自动拾取(默认禁用)"
"label": "启用自动拾取",
"default": false
},
{
"name": "auto_skip",
"type": "checkbox",
"label": "启用4点领取月卡(默认禁用)"
"label": "启用4点领取月卡",
"default": false
},
{
"name": "fishing_cd",
"type": "checkbox",
"label": "启用垂钓点CD统计(自动跳过冷却中的垂钓点)",
"default": true
},
{
"name": "time_kill_hour",
@@ -247,17 +258,20 @@
{
"name": "block_gcm",
"type": "checkbox",
"label": "禁用键鼠路线(默认启用键鼠路线)"
"label": "禁用键鼠路线(启用前请自行了解队伍配置要求)",
"default": false
},
{
"name": "block_fight",
"type": "checkbox",
"label": "启用战斗路线(默认禁用战斗路线)"
"label": "启用战斗路线(需要自行配置战斗策略)",
"default": false
},
{
"name": "block_tsurumi",
"type": "checkbox",
"label": "启用鹤观路线(默认禁用鹤观路线)"
"label": "启用鹤观路线(请确保任务已经完成,小道具交互的点位尚不可用)",
"default": false
},
{
"name": "path_select",

View File

@@ -687,6 +687,7 @@
//定义领取动作,好感队伍是否添加?
async function claimRewards() {
await genshin.returnMainUi();
log.info(`尝试领取奖励,优先${onerewards}'`);
let SHUN01 = await Textocr("接触地脉之花",1.5,2,0,1187,358,200,400);
if (SHUN01.found) {
@@ -1177,7 +1178,12 @@
await sleep(1000);
// 领取奖励,开始找地脉口
log.info(`开始本线路第 ${executedCount/2+1} 朵花的奖励领取`);
if (haoganq==1){log.info(`切换好感队伍:'${haogandui}'`);await genshin.returnMainUi(); await sleep(1000);await genshin.SwitchParty(haogandui);}
if (haoganq==1){log.info(
`切换好感队伍:'${haogandui}'`);
await genshin.returnMainUi();
await sleep(1000);
if (!await genshin.SwitchParty(haogandui))await genshin.returnMainUi();
}
shouldContinueChecking = false;
await sleep(500);
if (!(await claimRewards())) {

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 1,
"name": "全自动枫丹地脉花",
"version": "3.2",
"version": "3.3",
"bgi_version": "0.44.8",
"description": "枫丹地脉花蓝花金花通用。生存压力大请带盾奶避免纯水输出请注意说明文件。如有BUG请联系作者QQ:119996800",
"tags": [

View File

@@ -4,7 +4,7 @@
"type": "collect",
"author": "蜜柑魚",
"version": "1.0",
"description": "",
"description": " 路线信息该路线预计用时85.01秒包含以下怪物1只冰深渊法师、3只冰萤。",
"map_name": "Teyvat",
"bgi_version": "0.45.0",
"tags": [

View File

@@ -4,7 +4,7 @@
"type": "collect",
"author": "蜜柑魚",
"version": "1.0",
"description": "",
"description": " 路线信息该路线预计用时72.27秒包含以下怪物2只冰萤。",
"map_name": "Teyvat",
"bgi_version": "0.45.0",
"tags": [],

View File

@@ -4,7 +4,7 @@
"type": "collect",
"author": "蜜柑魚",
"version": "1.0",
"description": "",
"description": " 路线信息该路线预计用时57.21秒包含以下怪物3只冰萤。",
"map_name": "Teyvat",
"bgi_version": "0.45.0",
"tags": [

View File

@@ -4,7 +4,7 @@
"type": "collect",
"author": "蜜柑魚",
"version": "1.0",
"description": "",
"description": " 路线信息该路线预计用时78.17秒包含以下怪物3只冰萤。",
"map_name": "Teyvat",
"bgi_version": "0.45.0",
"tags": [],

View File

@@ -4,7 +4,7 @@
"type": "collect",
"author": "蜜柑魚",
"version": "1.0",
"description": "",
"description": " 路线信息该路线预计用时85.68秒包含以下怪物3只冰萤。",
"map_name": "Teyvat",
"bgi_version": "0.45.0",
"tags": [],

View File

@@ -4,7 +4,7 @@
"type": "collect",
"author": "蜜柑魚",
"version": "1.0",
"description": "",
"description": " 路线信息该路线预计用时125.14秒包含以下怪物2只冰萤。",
"map_name": "Teyvat",
"bgi_version": "0.45.0",
"tags": [],

View File

@@ -4,7 +4,7 @@
"type": "collect",
"author": "蜜柑魚",
"version": "1.0",
"description": "",
"description": " 路线信息该路线预计用时59.6秒包含以下怪物3只水萤。",
"map_name": "Teyvat",
"bgi_version": "0.45.0",
"tags": [],

View File

@@ -4,7 +4,7 @@
"type": "collect",
"author": "蜜柑魚",
"version": "1.0",
"description": "",
"description": " 路线信息该路线预计用时61.37秒包含以下怪物1只炽热骗骗花、2只雷萤。",
"map_name": "Teyvat",
"bgi_version": "0.45.0",
"tags": [],

View File

@@ -4,7 +4,7 @@
"type": "collect",
"author": "蜜柑魚",
"version": "1.0",
"description": "",
"description": " 路线信息该路线预计用时174秒包含以下怪物1只火箭丘丘人、1只爆弹丘丘人、2只雷萤。",
"map_name": "Teyvat",
"bgi_version": "0.45.0",
"tags": [],

View File

@@ -4,7 +4,7 @@
"type": "collect",
"author": "蜜柑魚",
"version": "1.0",
"description": "",
"description": " 路线信息该路线预计用时43.96秒包含以下怪物2只雷萤。",
"map_name": "Teyvat",
"bgi_version": "0.45.0",
"tags": [],

View File

@@ -4,7 +4,7 @@
"type": "collect",
"author": "蜜柑魚",
"version": "1.0",
"description": "",
"description": " 路线信息该路线预计用时66.73秒包含以下怪物3只水萤。",
"map_name": "Teyvat",
"bgi_version": "0.45.0",
"tags": [],

View File

@@ -1,6 +1,6 @@
// ==UserScript==
// @name 背包统计采集系统
// @version 2.30
// @version 2.40
// @description 识别路径文件,根据材料数量,自动执行路线,或者主动选择材料类别,统计材料数量
// @author 吉吉喵
// @match 原神版本5.6BGI 版本0.44.8
@@ -79,4 +79,5 @@
+ v2.27 修复计算材料数错误、目标数量临界值、"3"识别成"三"等bug
+ v2.28 材料更变时初始数量更新正常记录排除0位移和0数量的路径记录(可能是卡路径需手动根据0记录去甄别)新增材料名0后缀本地记录新增背包弹窗识别
+ v2.29 新增排除提示;调整平均时间成本计算;过滤掉差异较大的记录;
+ v2.30 更改路径专注模式默认值加log提示去除注释掉的调试log背包材料统计更改名为背包统计采集系统
+ v2.30 更改路径专注模式默认值加log提示去除注释掉的调试log背包材料统计更改名为背包统计采集系统
+ v2.40 优化背包识别时占用的内存;增加通知;

View File

@@ -3,6 +3,7 @@ const targetCount = Math.min(9999, Math.max(0, Math.floor(Number(settings.Target
const OCRdelay = Math.min(50, Math.max(0, Math.floor(Number(settings.OcrDelay) || 10))); // OCR基准时长
const imageDelay = Math.min(1000, Math.max(0, Math.floor(Number(settings.ImageDelay) || 0))); // 识图基准时长
const timeCost = Math.min(300, Math.max(0, Math.floor(Number(settings.TimeCost) || 30))); // 耗时和材料数量的比值,即一个材料多少秒
const notify = settings.notify || false;
// 定义映射表"unselected": "反选材料分类",
const material_mapping = {
"General": "一般素材",
@@ -97,7 +98,7 @@ const selected_materials_array = Object.keys(finalSettings)
};
// OCR识别文本
async function recognizeText(ocrRegion, timeout = 10000, retryInterval = 20, maxAttempts = 10, maxFailures = 3) {
async function recognizeText(ocrRegion, timeout = 10000, retryInterval = 20, maxAttempts = 10, maxFailures = 3, cachedFrame = null) {
let startTime = Date.now();
let retryCount = 0;
let failureCount = 0; // 用于记录连续失败的次数
@@ -117,11 +118,11 @@ const selected_materials_array = Object.keys(finalSettings)
"g": "9", "q": "9", "": "9",
};
const ra = cachedFrame || captureGameRegion();
while (Date.now() - startTime < timeout && retryCount < maxAttempts) {
let captureRegion = captureGameRegion();
let ocrObject = RecognitionObject.Ocr(ocrRegion.x, ocrRegion.y, ocrRegion.width, ocrRegion.height);
ocrObject.threshold = 0.85; // 适当降低阈值以提高速度
let resList = captureRegion.findMulti(ocrObject);
let resList = ra.findMulti(ocrObject);
if (resList.count === 0) {
failureCount++;
@@ -302,6 +303,7 @@ async function scanMaterials(materialsCategory, materialCategoryMap) {
// 扫描背包中的材料
for (let scroll = 0; scroll <= pageScrollCount; scroll++) {
const ra = captureGameRegion();
if (!foundPriorityMaterial) {
for (const { category, name } of priorityMaterialNames) {
if (recognizedMaterials.has(name)) {
@@ -318,7 +320,7 @@ async function scanMaterials(materialsCategory, materialCategoryMap) {
const recognitionObject = RecognitionObject.TemplateMatch(mat, 1146, startY, columnWidth, columnHeight);
recognitionObject.threshold = 0.8; // 设置识别阈值
const result = captureGameRegion().find(recognitionObject);
const result = ra.find(recognitionObject);
if (result.isExist() && result.x !== 0 && result.y !== 0) {
foundPriorityMaterial = true; // 标记找到前位材料
log.info(`发现当前或后位材料: ${name},开始全列扫描`);
@@ -340,7 +342,7 @@ async function scanMaterials(materialsCategory, materialCategoryMap) {
const recognitionObject = RecognitionObject.TemplateMatch(mat, scanX, startY, columnWidth, columnHeight);
recognitionObject.threshold = 0.85;
const result = captureGameRegion().find(recognitionObject);
const result = ra.find(recognitionObject);
await sleep(imageDelay);
if (result.isExist() && result.x !== 0 && result.y !== 0) {
@@ -353,7 +355,7 @@ async function scanMaterials(materialsCategory, materialCategoryMap) {
width: 66 + 2 * tolerance,
height: 22 + 2 * tolerance
};
const ocrResult = await recognizeText(ocrRegion, 1000, OCRdelay, 10, 3);
const ocrResult = await recognizeText(ocrRegion, 1000, 10, 10, 3);
materialInfo.push({ name, count: ocrResult.success ? ocrResult.text : "?" });
if (!hasFoundFirstMaterial) {
@@ -395,7 +397,7 @@ async function scanMaterials(materialsCategory, materialCategoryMap) {
// 检查是否到达最后一页
const sliderBottomRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/SliderBottom.png"), 1284, 916, 9, 26);
sliderBottomRo.threshold = 0.8;
const sliderBottomResult = captureGameRegion().find(sliderBottomRo);
const sliderBottomResult = ra.find(sliderBottomRo);
if (sliderBottomResult.isExist()) {
log.info("已到达最后一页!");
shouldEndScan = true;
@@ -471,12 +473,13 @@ const CultivationItemsRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync
const FoodRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Food.png"), 845, 31, 38, 38);
// 定义一个函数用于识别图像
async function recognizeImage(recognitionObject, timeout = 5000) {
async function recognizeImage(recognitionObject, timeout = 5000, cachedFrame=null) {
let startTime = Date.now();
const ra = cachedFrame || captureGameRegion();
while (Date.now() - startTime < timeout) {
try {
// 尝试识别图像
const imageResult = captureGameRegion().find(recognitionObject);
const imageResult = ra.find(recognitionObject);
if (imageResult.isExist() && imageResult.x !== 0 && imageResult.y !== 0) {
return { success: true, x: imageResult.x, y: imageResult.y };
}
@@ -675,8 +678,9 @@ async function MaterialPath(materialCategoryMap) {
// 自定义 basename 函数
function basename(filePath) {
const lastSlashIndex = filePath.lastIndexOf('\\'); // 或者使用 '/',取决于你的路径分隔符
return filePath.substring(lastSlashIndex + 1);
if (typeof filePath !== 'string') throw new Error('Invalid file path');
const lastSlash = Math.max(filePath.lastIndexOf('/'), filePath.lastIndexOf('\\'));
return filePath.substring(lastSlash + 1);
}
// 检查路径是否存在
function pathExists(path) {
@@ -1241,6 +1245,11 @@ function matchImageAndGetCategory(resourceName, imagesDir) {
// 假设 flattenedLowCountMaterials 是一个全局变量或在外部定义的变量
let currentMaterialName = null; // 用于记录当前材料名
// 全局累积差值统计(记录所有材料的总变化量)
const globalAccumulatedDifferences = {};
// 按材料分类的累积差值统计(记录每种材料的累计变化)
const materialAccumulatedDifferences = {};
// 遍历所有路径文件
for (const { path: pathingFilePath, resourceName } of allPaths) {
const pathName = basename(pathingFilePath); // 假设路径文件名即为材料路径
@@ -1281,17 +1290,28 @@ function matchImageAndGetCategory(resourceName, imagesDir) {
// 输出 resourceCategoryMap 以供调试
log.info(`resourceCategoryMap: ${JSON.stringify(resourceCategoryMap, null, 2)}`);
// 如果材料名发生变化,更新 flattenedLowCountMaterials
if (currentMaterialName !== resourceName) {
currentMaterialName = resourceName; // 更新当前材料名
// 调用背包材料统计(获取当前材料数量)
const updatedLowCountMaterials = await MaterialPath(resourceCategoryMap);
// 展平数组并按数量从小到大排序
flattenedLowCountMaterials = updatedLowCountMaterials
.flat()
.sort((a, b) => parseInt(a.count, 10) - parseInt(b.count, 10));
log.info(`材料名变更,更新了 flattenedLowCountMaterials`);
}
// 如果材料名发生变化,更新 flattenedLowCountMaterials
if (currentMaterialName !== resourceName) {
// 材料名变更前,输出上一材料的累积差值并通知
if (currentMaterialName && materialAccumulatedDifferences[currentMaterialName]) {
const prevDiffs = materialAccumulatedDifferences[currentMaterialName];
log.info(`材料[${currentMaterialName}]收集完成,累积差值:${JSON.stringify(prevDiffs, null, 2)}`);
if (notify) {
notification.Send(`材料[${currentMaterialName}]收集完成,累计获取:${JSON.stringify(prevDiffs, null, 2)}`);
}
}
currentMaterialName = resourceName; // 更新当前材料名
// 调用背包材料统计(获取当前材料数量)
const updatedLowCountMaterials = await MaterialPath(resourceCategoryMap);
// 展平数组并按数量从小到大排序
flattenedLowCountMaterials = updatedLowCountMaterials
.flat()
.sort((a, b) => parseInt(a.count, 10) - parseInt(b.count, 10));
log.info(`材料名变更,更新了 flattenedLowCountMaterials`);
// 初始化当前材料的累积差值记录
materialAccumulatedDifferences[resourceName] = {};
}
// 记录开始时间
const startTime = new Date().toLocaleString();
@@ -1321,22 +1341,34 @@ function matchImageAndGetCategory(resourceName, imagesDir) {
.flat()
.sort((a, b) => parseInt(a.count, 10) - parseInt(b.count, 10));
// 提取更新后的低数量材料的名称
const updatedLowCountMaterialNames = flattenedUpdatedMaterialCounts.map(material => material.name);
// 创建一个映射,用于存储更新前后的数量差值
const materialCountDifferences = {};
// 遍历更新后的材料数量,计算差值
flattenedUpdatedMaterialCounts.forEach(updatedMaterial => {
const originalMaterial = flattenedLowCountMaterials.find(material => material.name === updatedMaterial.name);
if (originalMaterial) {
const originalCount = parseInt(originalMaterial.count, 10);
const updatedCount = parseInt(updatedMaterial.count, 10);
const difference = updatedCount - originalCount;
materialCountDifferences[updatedMaterial.name] = difference;
}
});
// 遍历更新后的材料数量,计算差值
flattenedUpdatedMaterialCounts.forEach(updatedMaterial => {
const originalMaterial = flattenedLowCountMaterials.find(material => material.name === updatedMaterial.name);
if (originalMaterial) {
const originalCount = parseInt(originalMaterial.count, 10);
const updatedCount = parseInt(updatedMaterial.count, 10);
const difference = updatedCount - originalCount;
materialCountDifferences[updatedMaterial.name] = difference;
// 更新全局累积差值
if (globalAccumulatedDifferences[updatedMaterial.name]) {
globalAccumulatedDifferences[updatedMaterial.name] += difference;
} else {
globalAccumulatedDifferences[updatedMaterial.name] = difference;
}
// 更新当前材料的累积差值
if (materialAccumulatedDifferences[resourceName][updatedMaterial.name]) {
materialAccumulatedDifferences[resourceName][updatedMaterial.name] += difference;
} else {
materialAccumulatedDifferences[resourceName][updatedMaterial.name] = difference;
}
}
});
// 更新 flattenedLowCountMaterials 为最新的材料数量
flattenedLowCountMaterials = flattenedLowCountMaterials.map(material => {
@@ -1430,7 +1462,8 @@ async function monitorDisplacement(monitoring, resolve) {
}
// 识图点击主逻辑
async function imageClick() {
async function imageClick(cachedFrame = null) {
// 定义包含多个文件夹的根目录
const rootDir = "assets/imageClick";
@@ -1500,12 +1533,13 @@ async function imageClick() {
}
// 在屏幕上查找并点击图标
const ra = cachedFrame || captureGameRegion();
for (const foundRegion of foundRegions) {
const tolerance = 1; // 容错区间
const iconMat = file.readImageMatSync(`${iconDir}/${foundRegion.iconName}`);
const recognitionObject = RecognitionObject.TemplateMatch(iconMat, foundRegion.region.x - tolerance, foundRegion.region.y - tolerance, foundRegion.region.width + 2 * tolerance, foundRegion.region.height + 2 * tolerance);
recognitionObject.threshold = 0.9; // 设置识别阈值为 0.9
const result = captureGameRegion().find(recognitionObject);
const result = ra.find(recognitionObject);
if (result.isExist()) {
const x = Math.round(foundRegion.region.x + foundRegion.region.width / 2);
const y = Math.round(foundRegion.region.y + foundRegion.region.height / 2);

View File

@@ -1,13 +1,12 @@
{
"manifest_version": 1,
"name": "背包统计采集系统",
"version": "2.30",
"version": "2.40",
"bgi_version": "0.44.8",
"description": "默认四行为一页模板匹配材料OCR识别数量。\n数字太小可能无法识别用?代替。\n目前支持采集材料的数量统计+路径CD管理。",
"authors": [
{
"name": "吉吉喵",
"links": "https://github.com/JJMdzh"
"name": "吉吉喵"
}
],
"settings_ui": "settings.json",

View File

@@ -12,7 +12,12 @@
{
"name": "TimeCost",
"type": "input-text",
"label": "====================\n时间成本秒\n1数量的材料平均耗时,默认最多30"
"label": "====================\n时间成本秒\n一单位材料平均耗时默认30"
},
{
"name": "notify",
"type": "checkbox",
"label": "----------------------------------\n是否发送通知。默认否\n需在BGI开启JS通知并设置通知地址"
},
{
"name": "onlyPathing",
@@ -23,11 +28,6 @@
"否",
]
},
{
"name": "unselected",
"type": "checkbox",
"label": "====================\n反选下述【材料分类】"
},
{
"name": "Smithing",
"type": "checkbox",

View File

@@ -0,0 +1,159 @@
{
"info": {
"name": "A37-甜甜花-蒙德-风龙废墟-3个",
"type": "collect",
"authors": [
{
"name": "ddaodan",
"links": "https://github.com/ddaodan"
}
],
"version": "1.0",
"description": "",
"map_name": "Teyvat",
"bgi_version": "0.45.0",
"tags": [
"甜甜花",
"低效"
],
"last_modified_time": 1752589948172,
"enable_monster_loot_split": false
},
"positions": [
{
"id": 1,
"action": "",
"move_mode": "walk",
"type": "teleport",
"x": 338.5224609375,
"y": 2581.4443359375,
"action_params": ""
},
{
"id": 2,
"x": 329.70703125,
"y": 2613.593505859375,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 3,
"x": 297.548828125,
"y": 2631.80615234375,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 4,
"x": 288.7822265625,
"y": 2635.493408203125,
"type": "path",
"move_mode": "jump",
"action": "",
"action_params": ""
},
{
"id": 5,
"x": 280.7412109375,
"y": 2638.201171875,
"type": "path",
"move_mode": "walk",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 6,
"x": 297.9482421875,
"y": 2664.091796875,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 7,
"x": 307.85546875,
"y": 2662.037841796875,
"type": "path",
"move_mode": "walk",
"action": "",
"action_params": ""
},
{
"id": 8,
"x": 312.400390625,
"y": 2679.755859375,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 9,
"x": 341.3642578125,
"y": 2700.85693359375,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 10,
"x": 343.359375,
"y": 2711.08447265625,
"type": "path",
"move_mode": "walk",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 11,
"x": 352.4853515625,
"y": 2720.4521484375,
"type": "path",
"move_mode": "walk",
"action": "",
"action_params": ""
},
{
"id": 12,
"x": 397.7919921875,
"y": 2706.0576171875,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 13,
"x": 428.228515625,
"y": 2722.81640625,
"type": "path",
"move_mode": "fly",
"action": "",
"action_params": ""
},
{
"id": 14,
"x": 436.431640625,
"y": 2728.3076171875,
"type": "path",
"move_mode": "climb",
"action": "",
"action_params": ""
},
{
"id": 15,
"x": 449.4716796875,
"y": 2737.8056640625,
"type": "path",
"move_mode": "dash",
"action": "combat_script",
"action_params": "wait(0.2)"
}
]
}

View File

@@ -0,0 +1,122 @@
{
"info": {
"name": "A38-甜甜花-蒙德-风龙废墟-6个",
"type": "collect",
"authors": [
{
"name": "ddaodan",
"links": "https://github.com/ddaodan"
}
],
"version": "1.0",
"description": "",
"map_name": "Teyvat",
"bgi_version": "0.45.0",
"tags": [
"甜甜花"
],
"last_modified_time": 1752590200868,
"enable_monster_loot_split": false
},
"positions": [
{
"id": 1,
"x": 265.900390625,
"y": 2915.163330078125,
"type": "teleport",
"move_mode": "walk",
"action": "",
"action_params": ""
},
{
"id": 2,
"x": 246.80078125,
"y": 2921.912841796875,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 3,
"x": 258.36328125,
"y": 2950.13671875,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 4,
"x": 249.669921875,
"y": 2953.89306640625,
"type": "path",
"move_mode": "walk",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 5,
"x": 182.900390625,
"y": 2983.758544921875,
"type": "path",
"move_mode": "dash",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 6,
"x": 211.8994140625,
"y": 2968.329833984375,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 7,
"x": 210.693359375,
"y": 2912.490234375,
"type": "path",
"move_mode": "dash",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 8,
"x": 215.17578125,
"y": 2894.092529296875,
"type": "path",
"move_mode": "walk",
"action": "",
"action_params": ""
},
{
"id": 9,
"x": 227.5498046875,
"y": 2841.11279296875,
"type": "path",
"move_mode": "dash",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 10,
"x": 218.80859375,
"y": 2793.0849609375,
"type": "path",
"move_mode": "dash",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 11,
"x": 183.78515625,
"y": 2813.357666015625,
"type": "path",
"move_mode": "dash",
"action": "combat_script",
"action_params": "wait(0.2)"
}
]
}

View File

@@ -0,0 +1,104 @@
{
"info": {
"name": "A39-甜甜花-蒙德-风龙废墟-4个",
"type": "collect",
"authors": [
{
"name": "ddaodan",
"links": "https://github.com/ddaodan"
}
],
"version": "1.0",
"description": "",
"map_name": "Teyvat",
"bgi_version": "0.45.0",
"tags": [
"甜甜花"
],
"last_modified_time": 1752590391917,
"enable_monster_loot_split": false
},
"positions": [
{
"id": 1,
"x": -83.505859375,
"y": 2781.96240234375,
"type": "teleport",
"move_mode": "walk",
"action": "",
"action_params": ""
},
{
"id": 2,
"x": -75.0458984375,
"y": 2796.97509765625,
"type": "path",
"move_mode": "walk",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 3,
"x": -63.326171875,
"y": 2800.15966796875,
"type": "path",
"move_mode": "jump",
"action": "",
"action_params": ""
},
{
"id": 4,
"x": -17.49609375,
"y": 2806.5234375,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 5,
"x": -9.8095703125,
"y": 2811.401611328125,
"type": "path",
"move_mode": "walk",
"action": "",
"action_params": ""
},
{
"id": 6,
"x": -17.619140625,
"y": 2820.3408203125,
"type": "path",
"move_mode": "dash",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 7,
"x": 16.6865234375,
"y": 2830.87939453125,
"type": "path",
"move_mode": "walk",
"action": "",
"action_params": ""
},
{
"id": 8,
"x": 34.0068359375,
"y": 2838.2470703125,
"type": "path",
"move_mode": "jump",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 9,
"x": 54.18359375,
"y": 2839.83740234375,
"type": "path",
"move_mode": "dash",
"action": "combat_script",
"action_params": "wait(0.2)"
}
]
}

View File

@@ -0,0 +1,131 @@
{
"info": {
"name": "A40-甜甜花-蒙德-风龙废墟-8个",
"type": "collect",
"authors": [
{
"name": "ddaodan",
"links": "https://github.com/ddaodan"
}
],
"version": "1.0",
"description": "",
"map_name": "Teyvat",
"bgi_version": "0.45.0",
"tags": [
"甜甜花"
],
"last_modified_time": 1752590684153,
"enable_monster_loot_split": false
},
"positions": [
{
"id": 1,
"x": -83.5078125,
"y": 2781.964111328125,
"type": "teleport",
"move_mode": "walk",
"action": "",
"action_params": ""
},
{
"id": 2,
"x": -111.525390625,
"y": 2773.5107421875,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 3,
"x": -113.947265625,
"y": 2767.76953125,
"type": "path",
"move_mode": "walk",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 4,
"x": -117.115234375,
"y": 2731.22900390625,
"type": "path",
"move_mode": "dash",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 5,
"x": -63.05859375,
"y": 2746.0205078125,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 6,
"x": -12.376953125,
"y": 2754.87646484375,
"type": "path",
"move_mode": "dash",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 7,
"x": 12.16015625,
"y": 2741.99267578125,
"type": "path",
"move_mode": "dash",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 8,
"x": 13.513671875,
"y": 2711.87939453125,
"type": "path",
"move_mode": "dash",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 9,
"x": -16.31640625,
"y": 2702.379638671875,
"type": "path",
"move_mode": "dash",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 10,
"x": -32.5712890625,
"y": 2668.02587890625,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 11,
"x": -31.5224609375,
"y": 2643.4990234375,
"type": "path",
"move_mode": "dash",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 12,
"x": -56.794921875,
"y": 2610.231201171875,
"type": "path",
"move_mode": "dash",
"action": "combat_script",
"action_params": "wait(0.2)"
}
]
}

View File

@@ -0,0 +1,59 @@
{
"info": {
"name": "A41-甜甜花-蒙德-苍风高地-2个",
"type": "collect",
"authors": [
{
"name": "ddaodan",
"links": "https://github.com/ddaodan"
}
],
"version": "1.0",
"description": "",
"map_name": "Teyvat",
"bgi_version": "0.45.0",
"tags": [
"甜甜花"
],
"last_modified_time": 1752592132188,
"enable_monster_loot_split": false
},
"positions": [
{
"id": 1,
"x": -1130.478515625,
"y": 1598.20458984375,
"type": "teleport",
"move_mode": "walk",
"action": "",
"action_params": ""
},
{
"id": 2,
"x": -1129.69140625,
"y": 1619.1328125,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 3,
"x": -1113.71875,
"y": 1626.8740234375,
"type": "path",
"move_mode": "dash",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 4,
"x": -1107.154296875,
"y": 1638.41064453125,
"type": "path",
"move_mode": "dash",
"action": "combat_script",
"action_params": "wait(0.2)"
}
]
}

View File

@@ -0,0 +1,340 @@
{
"info": {
"name": "A42-甜甜花-蒙德-达达乌帕谷-15个",
"type": "collect",
"authors": [
{
"name": "ddaodan",
"links": "https://github.com/ddaodan"
}
],
"version": "1.0",
"description": "",
"map_name": "Teyvat",
"bgi_version": "0.45.0",
"tags": [
"甜甜花",
"高危"
],
"last_modified_time": 1752593958722,
"enable_monster_loot_split": false
},
"positions": [
{
"id": 1,
"x": -1866.927734375,
"y": 1331.5546875,
"type": "teleport",
"move_mode": "walk",
"action": "",
"action_params": ""
},
{
"id": 2,
"x": -1866.47265625,
"y": 1326.5107421875,
"type": "target",
"move_mode": "walk",
"action": "",
"action_params": ""
},
{
"id": 3,
"x": -1877.7265625,
"y": 1307.32421875,
"type": "path",
"move_mode": "jump",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 4,
"x": -1892.3154296875,
"y": 1304.412109375,
"type": "path",
"move_mode": "dash",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 5,
"x": -1898.1552734375,
"y": 1297.6953125,
"type": "path",
"move_mode": "jump",
"action": "",
"action_params": ""
},
{
"id": 6,
"x": -1926.3173828125,
"y": 1270.44091796875,
"type": "path",
"move_mode": "dash",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 7,
"x": -1915.009765625,
"y": 1230.3837890625,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 8,
"x": -1890.2353515625,
"y": 1215.853515625,
"type": "path",
"move_mode": "dash",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 9,
"x": -1905.970703125,
"y": 1205.07275390625,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 10,
"x": -1915.982421875,
"y": 1195.533203125,
"type": "path",
"move_mode": "fly",
"action": "stop_flying",
"action_params": "1000"
},
{
"id": 11,
"x": -1918.154296875,
"y": 1203.83935546875,
"type": "path",
"move_mode": "walk",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 12,
"x": -1891.4853515625,
"y": 1167.8583984375,
"type": "path",
"move_mode": "dash",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 13,
"x": -1839.1044921875,
"y": 1170.12451171875,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 14,
"x": -1829.490234375,
"y": 1177.4365234375,
"type": "path",
"move_mode": "jump",
"action": "",
"action_params": ""
},
{
"id": 15,
"x": -1827.8251953125,
"y": 1190,
"type": "path",
"move_mode": "climb",
"action": "",
"action_params": ""
},
{
"id": 16,
"x": -1819.185546875,
"y": 1190.2451171875,
"type": "path",
"move_mode": "walk",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 17,
"x": -1828.568359375,
"y": 1218.40234375,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 18,
"x": -1816.08984375,
"y": 1211.98681640625,
"type": "path",
"move_mode": "walk",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 19,
"x": -1800.7998046875,
"y": 1202.6865234375,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 20,
"x": -1772.0986328125,
"y": 1188.15234375,
"type": "path",
"move_mode": "fly",
"action": "",
"action_params": ""
},
{
"id": 21,
"x": -1727.9638671875,
"y": 1171.9873046875,
"type": "path",
"move_mode": "dash",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 22,
"x": -1696.17578125,
"y": 1175.85400390625,
"type": "path",
"move_mode": "dash",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 23,
"x": -1683.57421875,
"y": 1181.2666015625,
"type": "path",
"move_mode": "walk",
"action": "",
"action_params": ""
},
{
"id": 24,
"x": -1647.33203125,
"y": 1190.0732421875,
"type": "path",
"move_mode": "fly",
"action": "stop_flying",
"action_params": "",
"locked": false
},
{
"id": 25,
"x": -1647.33203125,
"y": 1190.0732421875,
"type": "path",
"move_mode": "walk",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 26,
"x": -1601.0869140625,
"y": 1197.1669921875,
"type": "path",
"move_mode": "fly",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 27,
"x": -1610.9990234375,
"y": 1172.95947265625,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 28,
"x": -1604.0791015625,
"y": 1172.05517578125,
"type": "path",
"move_mode": "walk",
"action": "",
"action_params": ""
},
{
"id": 29,
"x": -1578.8046875,
"y": 1163.041015625,
"type": "path",
"move_mode": "climb",
"action": "",
"action_params": ""
},
{
"id": 30,
"x": -1511.541015625,
"y": 1135.3994140625,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 31,
"x": -1445.6142578125,
"y": 1121.9482421875,
"type": "path",
"move_mode": "dash",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 32,
"x": -1407.20703125,
"y": 1152.6484375,
"type": "path",
"move_mode": "dash",
"action": "combat_script",
"action_params": "wait(0.2)"
},
{
"id": 33,
"x": -1382.96484375,
"y": 1188.517578125,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 34,
"x": -1355.0263671875,
"y": 1205.060546875,
"type": "path",
"move_mode": "walk",
"action": "",
"action_params": ""
},
{
"id": 35,
"x": -1359.1396484375,
"y": 1219.5361328125,
"type": "path",
"move_mode": "walk",
"action": "combat_script",
"action_params": "wait(0.2)"
}
]
}

View File

@@ -1,4 +1,4 @@
## 当前进度 225/2409
## 当前进度 263/2409
## 未收录点位
以下点位因为一些原因未收录
@@ -10,5 +10,4 @@
|4480|蒙德望风山地|位于地图边界BGI无法定位|
|7080|蒙德晨曦酒庄|位于地图边界BGI无法定位|
|7113|蒙德晨曦酒庄|位于地图边界BGI无法定位|
|44782|蒙德风龙废墟|未找到,可能已被移除|
|74402|蒙德风龙废墟|位于地图边界BGI无法定位|