脚本归档

This commit is contained in:
秋云
2025-05-10 04:32:37 +08:00
parent 7ff9e840c8
commit 9c59b69101
99 changed files with 481 additions and 478 deletions

View File

@@ -1,44 +1,44 @@
····前言····
地脉花脚本的情况和采集、跑狗粮略有不同,比较特殊。请浏览此文档,尤其注意标*内容。本人也是BGI新人没有什么编程经验如有问题还请海涵。——v7群 平面镜
····省流····
1放在调度器使用记得进行js设置和战斗配置。生存压力大死人会断。尽量盾奶都带。
2不能纯水要有大范围后台。
3有小概率出问题可能导致清体力失败请自行留意。
····点位确认····
地脉花有固定刷新点位,(金币花和经验花通用)按照线路刷新,有第一个点就会有后续的一条线。
所以由用户确定好第一个点位之后,找到并执行一整条线路即可。
一条路线结束后,会随机出另一条路线。此时如果还需要继续,则继续手动找出第一个点位并匹配路线。
***这些路线已经经过我的数次测试。路线确认基本没有问题。
····领取奖励····
此脚本会优先使用浓缩,再使用自回体,不会使用脆弱树脂(月亮)。请放心使用。
····其他事项(战斗、脚本)····
1可能因波次原因导致战斗中途判定结束因而战斗命令执行两次。
2按F和找地脉花都被执行两次因为地脉花一个不打后面的就不会刷出来、***所以必须尽量保证每一朵都被打完且领取成功。***
3自动拾取概率误触地脉花则会卡死不动。关闭自动拾取也没用因为bgi默认跑脚本的时候开启自动拾取。除非后续bgi制作组解决此问题。
***bgi有脱离这个卡死的功能所以这个问题可能不会影响挂机流程的完整但是会浪费很多时间。***
***有概率转视角卡住时点到原神画面外导致bgi停工***
4不建议使用那维莱特纯水输出会有水免疫怪物。***枫丹地脉花生存压力稍大,练度低的玩家请绕行。***
***如果战斗中死亡,可能导致执行失败。
5地脉花的开启和领取还是有很小概率失败。也有可能部分怪物边缘ob导致无法击杀。这将导致后续路线全部失效建议在挂地脉花时保持对屏幕的余光观察。
6配队建议加入盾、奶最好有大范围追踪C位如C2神子、C1千织、芙宁娜等。记得不要纯水。聚怪不刚需。更推荐千织和神子可以杀掉边缘ob的水怪。
····可能出错的路径····
枫丹地脉花-路线2 秋分山西侧锚点左下-4秋分山左下下下
枫丹地脉花-路线1 厄里那斯-点3厄里那斯神像右下_
枫丹地脉花-路线4 柔灯港上锚点-3锚点左左上
此点位可能卡住,因为小螃蟹不被算作敌怪,导致检测战斗结束时误判为结束。
枫丹地脉花-路线2 秋分山西侧锚点左下-5秋分山左左下下
此点位可能卡住因为BGI传送时可能点错锚点。这是BGI的bug。请等待修复。
····前言····
地脉花脚本的情况和采集、跑狗粮略有不同,比较特殊。请浏览此文档,尤其注意标*内容。本人也是BGI新人没有什么编程经验如有问题还请海涵。——v7群 平面镜
····省流····
1放在调度器使用记得进行js设置和战斗配置。生存压力大死人会断。尽量盾奶都带。
2不能纯水要有大范围后台。
3有小概率出问题可能导致清体力失败请自行留意。
····点位确认····
地脉花有固定刷新点位,(金币花和经验花通用)按照线路刷新,有第一个点就会有后续的一条线。
所以由用户确定好第一个点位之后,找到并执行一整条线路即可。
一条路线结束后,会随机出另一条路线。此时如果还需要继续,则继续手动找出第一个点位并匹配路线。
***这些路线已经经过我的数次测试。路线确认基本没有问题。
····领取奖励····
此脚本会优先使用浓缩,再使用自回体,不会使用脆弱树脂(月亮)。请放心使用。
····其他事项(战斗、脚本)····
1可能因波次原因导致战斗中途判定结束因而战斗命令执行两次。
2按F和找地脉花都被执行两次因为地脉花一个不打后面的就不会刷出来、***所以必须尽量保证每一朵都被打完且领取成功。***
3自动拾取概率误触地脉花则会卡死不动。关闭自动拾取也没用因为bgi默认跑脚本的时候开启自动拾取。除非后续bgi制作组解决此问题。
***bgi有脱离这个卡死的功能所以这个问题可能不会影响挂机流程的完整但是会浪费很多时间。***
***有概率转视角卡住时点到原神画面外导致bgi停工***
4不建议使用那维莱特纯水输出会有水免疫怪物。***枫丹地脉花生存压力稍大,练度低的玩家请绕行。***
***如果战斗中死亡,可能导致执行失败。
5地脉花的开启和领取还是有很小概率失败。也有可能部分怪物边缘ob导致无法击杀。这将导致后续路线全部失效建议在挂地脉花时保持对屏幕的余光观察。
6配队建议加入盾、奶最好有大范围追踪C位如C2神子、C1千织、芙宁娜等。记得不要纯水。聚怪不刚需。更推荐千织和神子可以杀掉边缘ob的水怪。
····可能出错的路径····
枫丹地脉花-路线2 秋分山西侧锚点左下-4秋分山左下下下
枫丹地脉花-路线1 厄里那斯-点3厄里那斯神像右下_
枫丹地脉花-路线4 柔灯港上锚点-3锚点左左上
此点位可能卡住,因为小螃蟹不被算作敌怪,导致检测战斗结束时误判为结束。
枫丹地脉花-路线2 秋分山西侧锚点左下-5秋分山左左下下
此点位可能卡住因为BGI传送时可能点错锚点。这是BGI的bug。请等待修复。

View File

@@ -1,220 +1,220 @@
(async function () {
const startTime = Date.now();
setGameMetrics(1920, 1080, 1);
//================= 1.设定路线 =================
const folder1 = 'assets/枫丹地脉花-路线1 厄里那斯/';
const folder2 = 'assets/枫丹地脉花-路线2 秋分山西侧锚点左下/';
const folder3 = 'assets/枫丹地脉花-路线3 秋分山西侧锚点右/';
const folder4 = 'assets/枫丹地脉花-路线4 柔灯港上锚点/';
const folder5 = 'assets/枫丹地脉花-路线5 新枫丹科学院左锚点/';
const folder6 = 'assets/枫丹地脉花-路线6 芒索斯山东麓/';
const pathing1 = [
"枫丹地脉花-路线1 厄里那斯-1厄里那斯神像下.json",
"枫丹地脉花-路线1 厄里那斯-2厄里那斯神像右下.json",
"枫丹地脉花-路线1 厄里那斯-3厄里那斯神像右下_.json",
"枫丹地脉花-路线1 厄里那斯-4厄里那斯神像右下下下.json",
"枫丹地脉花-路线1 厄里那斯-5厄里那斯神像下下下下.json",
"枫丹地脉花-路线1 厄里那斯-6厄里那斯神像下下下.json",
];
const pathing2 = [
"枫丹地脉花-路线2 秋分山西侧锚点左下-1秋分山左下.json",
"枫丹地脉花-路线2 秋分山西侧锚点左下-2秋分山左下+.json",
"枫丹地脉花-路线2 秋分山西侧锚点左下-3秋分山左下下.json",
"枫丹地脉花-路线2 秋分山西侧锚点左下-4秋分山左下下下.json",
"枫丹地脉花-路线2 秋分山西侧锚点左下-5秋分山左左下下.json",
];
const pathing3 = [
"枫丹地脉花-路线3 秋分山西侧锚点右-1锚点右.json",
"枫丹地脉花-路线3 秋分山西侧锚点右-2锚点右右.json",
"枫丹地脉花-路线3 秋分山西侧锚点右-3锚点右右右.json",
"枫丹地脉花-路线3 秋分山西侧锚点右-4东侧锚点上.json",
];
const pathing4 = [
"枫丹地脉花-路线4 柔灯港上锚点-1锚点左上.json",
"枫丹地脉花-路线4 柔灯港上锚点-2锚点左上+.json",
"枫丹地脉花-路线4 柔灯港上锚点-3锚点左左上.json",
"枫丹地脉花-路线4 柔灯港上锚点-4锚点左上++.json",
];
const pathing5 = [
"枫丹地脉花-路线5 新枫丹科学院左锚点-1锚点左上.json",
"枫丹地脉花-路线5 新枫丹科学院左锚点-2锚点上.json",
"枫丹地脉花-路线5 新枫丹科学院左锚点-3科学院左上锚点.json",
"枫丹地脉花-路线5 新枫丹科学院左锚点-4科学院左上锚点左上.json",
];
const pathing6 = [
"枫丹地脉花-路线6 芒索斯山东麓-1锚点下.json",
"枫丹地脉花-路线6 芒索斯山东麓-2锚点右.json",
"枫丹地脉花-路线6 芒索斯山东麓-3锚点左.json",
"枫丹地脉花-路线6 芒索斯山东麓-4锚点左上.json",
];
// ================= 2. 配置读取 =================
let filePath; // 声明变量
if (settings.path === undefined) { // 检查用户是否选了地址
log.error("请在游戏中确认想刷地脉的首点位置然后在js设置中选择路线。",);
throw new Error("用户未设置路线,已终止执行"); // 没选就报错后停止
}
else {
filePath = settings.path
}
// 路线映射表-将用户设置映射对应路线
const pathingMap = {
"路线1 厄里那斯": pathing1,
"路线2 秋分山西侧锚点左下": pathing2,
"路线3 秋分山西侧锚点右": pathing3,
"路线4 柔灯港上锚点": pathing4,
"路线5 新枫丹科学院左锚点": pathing5,
"路线6 芒索斯山东麓": pathing6
};
const folderMap = {
"路线1 厄里那斯": folder1,
"路线2 秋分山西侧锚点左下": folder2,
"路线3 秋分山西侧锚点右": folder3,
"路线4 柔灯港上锚点": folder4,
"路线5 新枫丹科学院左锚点": folder5,
"路线6 芒索斯山东麓": folder6
};
// 输出选择的路线
log.info(`已选择路线:${settings.path}`);
// 定义路线常量
const selectedPath = pathingMap[filePath];
const selectedFolder = folderMap[filePath];
// 读取原始次数配置
const rawTimes = settings.times ? settings.times : "6";
// 验证是否为数字
let timesValue;
if (!/^-?\d+\.?\d*$/.test(rawTimes)) { // 匹配整数和小数
timesValue = 6
log.info("⚠️ 刷本次数设置不为数字改为默认值6");
} else {
// 转换为数字
const num = parseFloat(rawTimes);
// 范围检查
if (num < 1) {
timesValue = 1;
log.info(`⚠️ 次数 ${num} 小于1已调整为1`);
} else if (num > 6) {
timesValue = 6;
log.info(`⚠️ 次数 ${num} 大于6已调整为6`);
} else {
// 处理小数
if (!Number.isInteger(num)) {
timesValue = Math.floor(num);
log.info(`⚠️ 次数 ${num} 不是整数,已向下取整为 ${timesValue}`);
} else {
timesValue = num;
}
}
}
const timesConfig = { value: timesValue };
//已定义好路线路径、刷本次数的常量。现在需要定义领取动作并做刷本动作并保持自动拾取关闭。路线为selectedFolder+selectedPath次数为timesConfig
//路径存在性检查
if (selectedPath) {
for (const jsonFile of selectedPath) {
}
} else {
throw new Error("未找到路径文件");
}
//定义领取动作
async function claimRewards() {
log.info("尝试领取奖励优先使用浓缩按下两次esc避免使用月亮");
for (let i = 0; i < 6; i++) {
keyPress("F");
await sleep(i < 5 ? 400 : 600);
}
click(918, 760);
await sleep(1600);
keyPress("VK_ESCAPE");
await sleep(800);
keyPress("VK_ESCAPE");
await sleep(800);
}
//定义了领取动作为claimRewards
// ================= 3. 主执行逻辑 =================
try {
// 计算实际执行次数(取用户设置次数与路线长度的最小值)
const maxExecutions = Math.min(timesConfig.value, selectedPath.length);
log.info(`本条路线执行至第 ${maxExecutions} 朵花`);
// 按顺序执行路径文件
let executedCount = 0;
for (const jsonFile of selectedPath) {
if (executedCount >= maxExecutions) {
log.info("已达到执行次数,终止运行");
break; // 条件1触发次数限制
}
// 关闭自动拾取
dispatcher.addTimer(new RealtimeTimer("AutoPick", { forceInteraction: false }));
// 执行单个路径文件
log.info(`开始执行第 ${executedCount + 1}/${maxExecutions} 次路径:${jsonFile}`);
await pathingScript.runFile(`${selectedFolder}${jsonFile}`);
// 领取奖励
log.info(`此时应该可以按F接触地脉花`);
log.info(`开始第 ${executedCount + 1} 朵花的奖励领取`);
await claimRewards();
// 确保重新开启自动拾取
dispatcher.addTimer(new RealtimeTimer("AutoPick", { forceInteraction: true }));
// 冷却等待(可选)
await sleep(1000);
executedCount++;
}
log.info("本次地脉花路线已执行完毕。");
} catch (error) {
log.error(`执行过程中发生错误:${error.message}`);
}
(async function () {
const startTime = Date.now();
setGameMetrics(1920, 1080, 1);
//================= 1.设定路线 =================
const folder1 = 'assets/枫丹地脉花-路线1 厄里那斯/';
const folder2 = 'assets/枫丹地脉花-路线2 秋分山西侧锚点左下/';
const folder3 = 'assets/枫丹地脉花-路线3 秋分山西侧锚点右/';
const folder4 = 'assets/枫丹地脉花-路线4 柔灯港上锚点/';
const folder5 = 'assets/枫丹地脉花-路线5 新枫丹科学院左锚点/';
const folder6 = 'assets/枫丹地脉花-路线6 芒索斯山东麓/';
const pathing1 = [
"枫丹地脉花-路线1 厄里那斯-1厄里那斯神像下.json",
"枫丹地脉花-路线1 厄里那斯-2厄里那斯神像右下.json",
"枫丹地脉花-路线1 厄里那斯-3厄里那斯神像右下_.json",
"枫丹地脉花-路线1 厄里那斯-4厄里那斯神像右下下下.json",
"枫丹地脉花-路线1 厄里那斯-5厄里那斯神像下下下下.json",
"枫丹地脉花-路线1 厄里那斯-6厄里那斯神像下下下.json",
];
const pathing2 = [
"枫丹地脉花-路线2 秋分山西侧锚点左下-1秋分山左下.json",
"枫丹地脉花-路线2 秋分山西侧锚点左下-2秋分山左下+.json",
"枫丹地脉花-路线2 秋分山西侧锚点左下-3秋分山左下下.json",
"枫丹地脉花-路线2 秋分山西侧锚点左下-4秋分山左下下下.json",
"枫丹地脉花-路线2 秋分山西侧锚点左下-5秋分山左左下下.json",
];
const pathing3 = [
"枫丹地脉花-路线3 秋分山西侧锚点右-1锚点右.json",
"枫丹地脉花-路线3 秋分山西侧锚点右-2锚点右右.json",
"枫丹地脉花-路线3 秋分山西侧锚点右-3锚点右右右.json",
"枫丹地脉花-路线3 秋分山西侧锚点右-4东侧锚点上.json",
];
const pathing4 = [
"枫丹地脉花-路线4 柔灯港上锚点-1锚点左上.json",
"枫丹地脉花-路线4 柔灯港上锚点-2锚点左上+.json",
"枫丹地脉花-路线4 柔灯港上锚点-3锚点左左上.json",
"枫丹地脉花-路线4 柔灯港上锚点-4锚点左上++.json",
];
const pathing5 = [
"枫丹地脉花-路线5 新枫丹科学院左锚点-1锚点左上.json",
"枫丹地脉花-路线5 新枫丹科学院左锚点-2锚点上.json",
"枫丹地脉花-路线5 新枫丹科学院左锚点-3科学院左上锚点.json",
"枫丹地脉花-路线5 新枫丹科学院左锚点-4科学院左上锚点左上.json",
];
const pathing6 = [
"枫丹地脉花-路线6 芒索斯山东麓-1锚点下.json",
"枫丹地脉花-路线6 芒索斯山东麓-2锚点右.json",
"枫丹地脉花-路线6 芒索斯山东麓-3锚点左.json",
"枫丹地脉花-路线6 芒索斯山东麓-4锚点左上.json",
];
// ================= 2. 配置读取 =================
let filePath; // 声明变量
if (settings.path === undefined) { // 检查用户是否选了地址
log.error("请在游戏中确认想刷地脉的首点位置然后在js设置中选择路线。",);
throw new Error("用户未设置路线,已终止执行"); // 没选就报错后停止
}
else {
filePath = settings.path
}
// 路线映射表-将用户设置映射对应路线
const pathingMap = {
"路线1 厄里那斯": pathing1,
"路线2 秋分山西侧锚点左下": pathing2,
"路线3 秋分山西侧锚点右": pathing3,
"路线4 柔灯港上锚点": pathing4,
"路线5 新枫丹科学院左锚点": pathing5,
"路线6 芒索斯山东麓": pathing6
};
const folderMap = {
"路线1 厄里那斯": folder1,
"路线2 秋分山西侧锚点左下": folder2,
"路线3 秋分山西侧锚点右": folder3,
"路线4 柔灯港上锚点": folder4,
"路线5 新枫丹科学院左锚点": folder5,
"路线6 芒索斯山东麓": folder6
};
// 输出选择的路线
log.info(`已选择路线:${settings.path}`);
// 定义路线常量
const selectedPath = pathingMap[filePath];
const selectedFolder = folderMap[filePath];
// 读取原始次数配置
const rawTimes = settings.times ? settings.times : "6";
// 验证是否为数字
let timesValue;
if (!/^-?\d+\.?\d*$/.test(rawTimes)) { // 匹配整数和小数
timesValue = 6
log.info("⚠️ 刷本次数设置不为数字改为默认值6");
} else {
// 转换为数字
const num = parseFloat(rawTimes);
// 范围检查
if (num < 1) {
timesValue = 1;
log.info(`⚠️ 次数 ${num} 小于1已调整为1`);
} else if (num > 6) {
timesValue = 6;
log.info(`⚠️ 次数 ${num} 大于6已调整为6`);
} else {
// 处理小数
if (!Number.isInteger(num)) {
timesValue = Math.floor(num);
log.info(`⚠️ 次数 ${num} 不是整数,已向下取整为 ${timesValue}`);
} else {
timesValue = num;
}
}
}
const timesConfig = { value: timesValue };
//已定义好路线路径、刷本次数的常量。现在需要定义领取动作并做刷本动作并保持自动拾取关闭。路线为selectedFolder+selectedPath次数为timesConfig
//路径存在性检查
if (selectedPath) {
for (const jsonFile of selectedPath) {
}
} else {
throw new Error("未找到路径文件");
}
//定义领取动作
async function claimRewards() {
log.info("尝试领取奖励优先使用浓缩按下两次esc避免使用月亮");
for (let i = 0; i < 6; i++) {
keyPress("F");
await sleep(i < 5 ? 400 : 600);
}
click(918, 760);
await sleep(1600);
keyPress("VK_ESCAPE");
await sleep(800);
keyPress("VK_ESCAPE");
await sleep(800);
}
//定义了领取动作为claimRewards
// ================= 3. 主执行逻辑 =================
try {
// 计算实际执行次数(取用户设置次数与路线长度的最小值)
const maxExecutions = Math.min(timesConfig.value, selectedPath.length);
log.info(`本条路线执行至第 ${maxExecutions} 朵花`);
// 按顺序执行路径文件
let executedCount = 0;
for (const jsonFile of selectedPath) {
if (executedCount >= maxExecutions) {
log.info("已达到执行次数,终止运行");
break; // 条件1触发次数限制
}
// 关闭自动拾取
dispatcher.addTimer(new RealtimeTimer("AutoPick", { forceInteraction: false }));
// 执行单个路径文件
log.info(`开始执行第 ${executedCount + 1}/${maxExecutions} 次路径:${jsonFile}`);
await pathingScript.runFile(`${selectedFolder}${jsonFile}`);
// 领取奖励
log.info(`此时应该可以按F接触地脉花`);
log.info(`开始第 ${executedCount + 1} 朵花的奖励领取`);
await claimRewards();
// 确保重新开启自动拾取
dispatcher.addTimer(new RealtimeTimer("AutoPick", { forceInteraction: true }));
// 冷却等待(可选)
await sleep(1000);
executedCount++;
}
log.info("本次地脉花路线已执行完毕。");
} catch (error) {
log.error(`执行过程中发生错误:${error.message}`);
}
})();

View File

Before

Width:  |  Height:  |  Size: 620 KiB

After

Width:  |  Height:  |  Size: 620 KiB

View File

Before

Width:  |  Height:  |  Size: 225 KiB

After

Width:  |  Height:  |  Size: 225 KiB

View File

Before

Width:  |  Height:  |  Size: 233 KiB

After

Width:  |  Height:  |  Size: 233 KiB

View File

Before

Width:  |  Height:  |  Size: 372 KiB

After

Width:  |  Height:  |  Size: 372 KiB

View File

Before

Width:  |  Height:  |  Size: 314 KiB

After

Width:  |  Height:  |  Size: 314 KiB

View File

Before

Width:  |  Height:  |  Size: 380 KiB

After

Width:  |  Height:  |  Size: 380 KiB

View File

@@ -1,68 +1,68 @@
(async function () {
const defaultHours = 4;
const defaultMinutes = 0;
function validateAndSetDefaults(specifyHours, specifyMinutes) {
if (isNaN(specifyHours) || specifyHours > 23 || specifyHours == '') {
if (specifyHours > 23) {
log.warn("设置指定时间错误,请使用 0~23 时将使用默认值4时");
}
else {
log.warn("你没有设置指定时将使用默认值4时");
}
specifyHours = defaultHours;
}
if (isNaN(specifyMinutes) || specifyMinutes > 59 || specifyMinutes == '') {
if (specifyMinutes > 59) {
log.warn("设置指定时间错误,请使用 0~59 分将使用默认值0分");
} else {
log.warn("你没有设置指定分钟将使用默认值0分");
}
specifyMinutes = defaultMinutes;
}
log.info(`---------------将等待至 ${specifyHours}${specifyMinutes} ---------------`)
return { specifyHours, specifyMinutes };
}
// 計算相差時間微秒
function getTimeUntilNextTime(validatedHours, validatedMinutes) {
const now = new Date();
const nextTime = new Date(
now.getFullYear(),
now.getMonth(),
now.getDate(),
validatedHours, validatedMinutes, 0, 0
);
// 如果現在時間已經過了今天的 4 點,則計算明天的 4 點
if (now >= nextTime) {
nextTime.setDate(nextTime.getDate() + 1);
}
return nextTime - now;
}
setGameMetrics(1920, 1080, 2);
// 启用自动拾取的实时任务
dispatcher.addTimer(new RealtimeTimer("AutoPick"));
// 启用自动剧情的实时任务
dispatcher.addTimer(new RealtimeTimer("AutoSkip"));
// 讀取參數
let specifyHours = Number(settings.specifyHours);
let specifyMinutes = Number(settings.specifyMinutes);
const { specifyHours: validatedHours, specifyMinutes: validatedMinutes } = validateAndSetDefaults(specifyHours, specifyMinutes);
// 計算相差時間微秒
const timeUntilNextTime = getTimeUntilNextTime(validatedHours, validatedMinutes);
log.info(`等待 ${Math.floor((timeUntilNextTime / 60000 / 60))} 小时 ${(timeUntilNextTime / 60000 % 60).toFixed(0)} 分 ,直到下一个 ${validatedHours} : ${validatedMinutes}`);
// 多等待10秒
await sleep(timeUntilNextTime + 10000);
log.info(`时间到了!现在是 ${specifyHours}${specifyMinutes}`);
//1秒 = 1000 毫秒
//10秒 = 10000 毫秒
//1分鐘 = 60000 毫秒
})();
(async function () {
const defaultHours = 4;
const defaultMinutes = 0;
function validateAndSetDefaults(specifyHours, specifyMinutes) {
if (isNaN(specifyHours) || specifyHours > 23 || specifyHours == '') {
if (specifyHours > 23) {
log.warn("设置指定时间错误,请使用 0~23 时将使用默认值4时");
}
else {
log.warn("你没有设置指定时将使用默认值4时");
}
specifyHours = defaultHours;
}
if (isNaN(specifyMinutes) || specifyMinutes > 59 || specifyMinutes == '') {
if (specifyMinutes > 59) {
log.warn("设置指定时间错误,请使用 0~59 分将使用默认值0分");
} else {
log.warn("你没有设置指定分钟将使用默认值0分");
}
specifyMinutes = defaultMinutes;
}
log.info(`---------------将等待至 ${specifyHours}${specifyMinutes} ---------------`)
return { specifyHours, specifyMinutes };
}
// 計算相差時間微秒
function getTimeUntilNextTime(validatedHours, validatedMinutes) {
const now = new Date();
const nextTime = new Date(
now.getFullYear(),
now.getMonth(),
now.getDate(),
validatedHours, validatedMinutes, 0, 0
);
// 如果現在時間已經過了今天的 4 點,則計算明天的 4 點
if (now >= nextTime) {
nextTime.setDate(nextTime.getDate() + 1);
}
return nextTime - now;
}
setGameMetrics(1920, 1080, 2);
// 启用自动拾取的实时任务
dispatcher.addTimer(new RealtimeTimer("AutoPick"));
// 启用自动剧情的实时任务
dispatcher.addTimer(new RealtimeTimer("AutoSkip"));
// 讀取參數
let specifyHours = Number(settings.specifyHours);
let specifyMinutes = Number(settings.specifyMinutes);
const { specifyHours: validatedHours, specifyMinutes: validatedMinutes } = validateAndSetDefaults(specifyHours, specifyMinutes);
// 計算相差時間微秒
const timeUntilNextTime = getTimeUntilNextTime(validatedHours, validatedMinutes);
log.info(`等待 ${Math.floor((timeUntilNextTime / 60000 / 60))} 小时 ${(timeUntilNextTime / 60000 % 60).toFixed(0)} 分 ,直到下一个 ${validatedHours} : ${validatedMinutes}`);
// 多等待10秒
await sleep(timeUntilNextTime + 10000);
log.info(`时间到了!现在是 ${specifyHours}${specifyMinutes}`);
//1秒 = 1000 毫秒
//10秒 = 10000 毫秒
//1分鐘 = 60000 毫秒
})();

View File

@@ -1,16 +1,16 @@
{
"manifest_version": 1,
"name": "等待到指定时间(默认凌晨4点)",
"version": "1.0",
"bgi_version": "0.42.0",
"description": "等待到指定时间(默认凌晨4点),适用于等到第二天4点执行其他任务",
"authors": [
{
"name": "蜜柑魚",
"link": "https://github.com/this-Fish"
}
],
"settings_ui": "settings.json",
"main": "main.js"
}
{
"manifest_version": 1,
"name": "等待到指定时间(默认凌晨4点)",
"version": "1.0",
"bgi_version": "0.42.0",
"description": "等待到指定时间(默认凌晨4点),适用于等到第二天4点执行其他任务",
"authors": [
{
"name": "蜜柑魚",
"link": "https://github.com/this-Fish"
}
],
"settings_ui": "settings.json",
"main": "main.js"
}

View File

@@ -1,12 +1,12 @@
[
{
"name": "specifyHours",
"type": "input-text",
"label": "指定等待直到下一个 HHMM 的时默认4"
},
{
"name": "specifyMinutes",
"type": "input-text",
"label": "指定等待直到下一个 HHMM 的分钟默认0"
}
[
{
"name": "specifyHours",
"type": "input-text",
"label": "指定等待直到下一个 HHMM 的时默认4"
},
{
"name": "specifyMinutes",
"type": "input-text",
"label": "指定等待直到下一个 HHMM 的分钟默认0"
}
]

View File

@@ -1,36 +1,36 @@
(
async function () {
const codes = [
"NODKRAI0910",
"VOYNICHGUILD",
"THEWILDHUNT",
"LIGHTKEEPERS",
"FROSTMOONSCIONS"
];
//输入兑换码,兑换码与兑换码之间要以英文逗号隔开,如: "123","123",兑换码要用""框起
await sleep(3000);
keyPress("VK_ESCAPE");
await sleep(1000);
click(55,793);
await sleep(1000);
click(162,569);
await sleep(1000);
click(1649,210);
await sleep(1000);
keyDown("VK_LSHIFT");
keyUp("VK_LSHIFT");
for (const code of codes){
click(734,506);
await sleep(1000);
for(const cod of code){
keyPress("VK_"+cod);
}
//keyUp("VK_LSHIFT");
await sleep(1000);
click(1164,735);
await sleep(1000);
click(991,744);
await sleep(5500);
}
}
(
async function () {
const codes = [
"NODKRAI0910",
"VOYNICHGUILD",
"THEWILDHUNT",
"LIGHTKEEPERS",
"FROSTMOONSCIONS"
];
//输入兑换码,兑换码与兑换码之间要以英文逗号隔开,如: "123","123",兑换码要用""框起
await sleep(3000);
keyPress("VK_ESCAPE");
await sleep(1000);
click(55,793);
await sleep(1000);
click(162,569);
await sleep(1000);
click(1649,210);
await sleep(1000);
keyDown("VK_LSHIFT");
keyUp("VK_LSHIFT");
for (const code of codes){
click(734,506);
await sleep(1000);
for(const cod of code){
keyPress("VK_"+cod);
}
//keyUp("VK_LSHIFT");
await sleep(1000);
click(1164,735);
await sleep(1000);
click(991,744);
await sleep(5500);
}
}
)();

View File

@@ -1,17 +1,17 @@
{
"manifest_version": 1,
"name": "领取兑换码", //
"version": "1.0", //
"bgi_version": "0.36.1", // BetterGI BetterGI
"description": "自动领兑换码自行打开main.js配置适用多账号玩家。", //
//
"authors": [
{
"name": "白玉狻猊",
"link": "https://github.com/LaughingCatGGG"
}
],
//
"main": "main.js"
}
{
"manifest_version": 1,
"name": "领取兑换码", //
"version": "1.0", //
"bgi_version": "0.36.1", // BetterGI BetterGI
"description": "自动领兑换码自行打开main.js配置适用多账号玩家。", //
//
"authors": [
{
"name": "白玉狻猊",
"link": "https://github.com/LaughingCatGGG"
}
],
//
"main": "main.js"
}

View File

@@ -4,6 +4,7 @@
"version": "1.0",
"bgiversion" : "0.34.6",
"description": "异步调用独立战斗任务根据OCR结果判断战斗是否结束不建议直接使用仅供其他脚本作者参考",
"tags" : [ "示例" ],
"authors": [
{
"name": "秋云",

View File

@@ -2,6 +2,7 @@
"manifest_version": 1,
"name": "烹饪熟练度一键拉满",
"version": "1.1",
"tags": ["烹饪"],
"description": "如果总是差一点请自行在js设置中加减合适的时间烹饪不可用的时候请选择合适的置信度。此外感谢万民堂对本脚本的大力支持。下面是一段广告亲朋聚宴哪家强吃虎岩找万民堂璃月厨王掌厨房菜品质量有保障服务热情更在行欢声笑语聚满堂",
"authors": [
{

View File

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@@ -1,70 +1,70 @@
const receiveRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/receive.png"));
(async function () {
const topLeft = {x: 192, y: 281}; // 左上角坐标
const bottomRight = {x: 1738, y: 984}; // 右下角坐标
const rows = 3; // 行数
const cols = 7; // 列数
const topLeft1 = {x: 190, y: 870}; // 左上角坐标
const bottomRight1 = {x: 1735, y: 870}; // 右下角坐标
const rows1 = 1; // 行数
const cols1 = 7; // 列数
let sum = 1;
let sum1= 0;
//用于点击多个点位
async function autoClick(
topLeft, // 左上角点位 {x, y}
bottomRight, // 右下角点位 {x, y}
rows, // 行数
cols // 列数
) {
// 计算每个点之间的水平和垂直间距
let stepX = cols > 1 ? (bottomRight.x - topLeft.x) / (cols - 1) : 0; // 处理单列情况
let stepY = rows > 1 ? (bottomRight.y - topLeft.y) / (rows - 1) : 0; // 处理单行情况
// 从左到右,从上到下依次点击
for (let row = 0; row < rows; row++) {
for (let col = 0; col < cols; col++) {
// 计算当前点的坐标并四舍五入
let x = Math.round(topLeft.x + col * stepX);
let y = Math.round(topLeft.y + row * stepY);
// 执行点击
click(x, y);
await sleep(1000);
log.info(`${sum}次识别`);
sum++;
let receive = captureGameRegion().find(receiveRo);
await sleep(1000);
while(receive.isExist()){
receive.click();
await sleep(500);
sum1++;
log.info(`成功识别${sum1}`);
click(400,1010);//点击空白处
await sleep(500);
receive = captureGameRegion().find(receiveRo);
}
click(400,1010);//如果是本行最后一个成就会自动翻页
await sleep(500);
keyPress("ESCAPE");
// 等待1秒
await sleep(1000);
}
}
}
//主流程
await genshin.returnMainUi();
await sleep(1000);
keyPress("ESCAPE");
await sleep(1000);
click(670 ,420 );//点击成就
await sleep(2000);
await autoClick(topLeft, bottomRight, rows, cols);
for (let i = 0; i < 6; i++) {
await autoClick(topLeft1, bottomRight1, rows1, cols1);
}
})();
const receiveRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/receive.png"));
(async function () {
const topLeft = {x: 192, y: 281}; // 左上角坐标
const bottomRight = {x: 1738, y: 984}; // 右下角坐标
const rows = 3; // 行数
const cols = 7; // 列数
const topLeft1 = {x: 190, y: 870}; // 左上角坐标
const bottomRight1 = {x: 1735, y: 870}; // 右下角坐标
const rows1 = 1; // 行数
const cols1 = 7; // 列数
let sum = 1;
let sum1= 0;
//用于点击多个点位
async function autoClick(
topLeft, // 左上角点位 {x, y}
bottomRight, // 右下角点位 {x, y}
rows, // 行数
cols // 列数
) {
// 计算每个点之间的水平和垂直间距
let stepX = cols > 1 ? (bottomRight.x - topLeft.x) / (cols - 1) : 0; // 处理单列情况
let stepY = rows > 1 ? (bottomRight.y - topLeft.y) / (rows - 1) : 0; // 处理单行情况
// 从左到右,从上到下依次点击
for (let row = 0; row < rows; row++) {
for (let col = 0; col < cols; col++) {
// 计算当前点的坐标并四舍五入
let x = Math.round(topLeft.x + col * stepX);
let y = Math.round(topLeft.y + row * stepY);
// 执行点击
click(x, y);
await sleep(1000);
log.info(`${sum}次识别`);
sum++;
let receive = captureGameRegion().find(receiveRo);
await sleep(1000);
while(receive.isExist()){
receive.click();
await sleep(500);
sum1++;
log.info(`成功识别${sum1}`);
click(400,1010);//点击空白处
await sleep(500);
receive = captureGameRegion().find(receiveRo);
}
click(400,1010);//如果是本行最后一个成就会自动翻页
await sleep(500);
keyPress("ESCAPE");
// 等待1秒
await sleep(1000);
}
}
}
//主流程
await genshin.returnMainUi();
await sleep(1000);
keyPress("ESCAPE");
await sleep(1000);
click(670 ,420 );//点击成就
await sleep(2000);
await autoClick(topLeft, bottomRight, rows, cols);
for (let i = 0; i < 6; i++) {
await autoClick(topLeft1, bottomRight1, rows1, cols1);
}
})();

View File

@@ -3,6 +3,7 @@
"name": "自动领取成就奖励",
"version": "1.0",
"description": "所以米桑什么时候实装一键领取?",
"tags" : [ "OCR" ],
"authors": [
{
"name": "柒叶子",