脚本归档
@@ -1,44 +1,44 @@
|
|||||||
····前言····
|
····前言····
|
||||||
地脉花脚本的情况和采集、跑狗粮略有不同,比较特殊。请浏览此文档,尤其注意标*内容。本人也是BGI新人,没有什么编程经验,如有问题,还请海涵。——v7群 平面镜
|
地脉花脚本的情况和采集、跑狗粮略有不同,比较特殊。请浏览此文档,尤其注意标*内容。本人也是BGI新人,没有什么编程经验,如有问题,还请海涵。——v7群 平面镜
|
||||||
|
|
||||||
|
|
||||||
····省流····
|
····省流····
|
||||||
1,放在调度器使用,记得进行js设置和战斗配置。生存压力大,死人会断。尽量盾奶都带。
|
1,放在调度器使用,记得进行js设置和战斗配置。生存压力大,死人会断。尽量盾奶都带。
|
||||||
2,不能纯水,要有大范围后台。
|
2,不能纯水,要有大范围后台。
|
||||||
3,有小概率出问题,可能导致清体力失败,请自行留意。
|
3,有小概率出问题,可能导致清体力失败,请自行留意。
|
||||||
|
|
||||||
|
|
||||||
····点位确认····
|
····点位确认····
|
||||||
地脉花有固定刷新点位,(金币花和经验花通用)按照线路刷新,有第一个点就会有后续的一条线。
|
地脉花有固定刷新点位,(金币花和经验花通用)按照线路刷新,有第一个点就会有后续的一条线。
|
||||||
所以由用户确定好第一个点位之后,找到并执行一整条线路即可。
|
所以由用户确定好第一个点位之后,找到并执行一整条线路即可。
|
||||||
一条路线结束后,会随机出另一条路线。此时如果还需要继续,则继续手动找出第一个点位并匹配路线。
|
一条路线结束后,会随机出另一条路线。此时如果还需要继续,则继续手动找出第一个点位并匹配路线。
|
||||||
***这些路线已经经过我的数次测试。路线确认基本没有问题。
|
***这些路线已经经过我的数次测试。路线确认基本没有问题。
|
||||||
|
|
||||||
|
|
||||||
····领取奖励····
|
····领取奖励····
|
||||||
此脚本会优先使用浓缩,再使用自回体,不会使用脆弱树脂(月亮)。请放心使用。
|
此脚本会优先使用浓缩,再使用自回体,不会使用脆弱树脂(月亮)。请放心使用。
|
||||||
|
|
||||||
|
|
||||||
····其他事项(战斗、脚本)····
|
····其他事项(战斗、脚本)····
|
||||||
1,可能因波次原因导致战斗中途判定结束,因而战斗命令执行两次。
|
1,可能因波次原因导致战斗中途判定结束,因而战斗命令执行两次。
|
||||||
2,按F和找地脉花都被执行两次,因为地脉花一个不打,后面的就不会刷出来、***所以必须尽量保证每一朵都被打完且领取成功。***
|
2,按F和找地脉花都被执行两次,因为地脉花一个不打,后面的就不会刷出来、***所以必须尽量保证每一朵都被打完且领取成功。***
|
||||||
3,!!自动拾取概率误触地脉花,则会卡死不动。关闭自动拾取也没用,因为bgi默认跑脚本的时候开启自动拾取。除非后续bgi制作组解决此问题。
|
3,!!自动拾取概率误触地脉花,则会卡死不动。关闭自动拾取也没用,因为bgi默认跑脚本的时候开启自动拾取。除非后续bgi制作组解决此问题。
|
||||||
***bgi有脱离这个卡死的功能,所以这个问题可能不会影响挂机流程的完整,但是会浪费很多时间。***
|
***bgi有脱离这个卡死的功能,所以这个问题可能不会影响挂机流程的完整,但是会浪费很多时间。***
|
||||||
***有概率转视角卡住时,点到原神画面外,导致bgi停工***
|
***有概率转视角卡住时,点到原神画面外,导致bgi停工***
|
||||||
4,不建议使用那维莱特纯水输出,会有水免疫怪物。***枫丹地脉花生存压力稍大,练度低的玩家请绕行。***
|
4,不建议使用那维莱特纯水输出,会有水免疫怪物。***枫丹地脉花生存压力稍大,练度低的玩家请绕行。***
|
||||||
***如果战斗中死亡,可能导致执行失败。
|
***如果战斗中死亡,可能导致执行失败。
|
||||||
5,!!!地脉花的开启和领取还是有很小概率失败。也有可能部分怪物边缘ob导致无法击杀。这将导致后续路线全部失效,建议在挂地脉花时保持对屏幕的余光观察。!!!
|
5,!!!地脉花的开启和领取还是有很小概率失败。也有可能部分怪物边缘ob导致无法击杀。这将导致后续路线全部失效,建议在挂地脉花时保持对屏幕的余光观察。!!!
|
||||||
6,配队建议:加入盾、奶,最好有大范围追踪C位如C2神子、C1千织、芙宁娜等。记得不要纯水。聚怪不刚需。更推荐千织和神子,可以杀掉边缘ob的水怪。
|
6,配队建议:加入盾、奶,最好有大范围追踪C位如C2神子、C1千织、芙宁娜等。记得不要纯水。聚怪不刚需。更推荐千织和神子,可以杀掉边缘ob的水怪。
|
||||||
|
|
||||||
|
|
||||||
····可能出错的路径····
|
····可能出错的路径····
|
||||||
枫丹地脉花-路线2 秋分山西侧锚点左下-4:秋分山左下下下
|
枫丹地脉花-路线2 秋分山西侧锚点左下-4:秋分山左下下下
|
||||||
枫丹地脉花-路线1 厄里那斯-点3:厄里那斯神像右下_
|
枫丹地脉花-路线1 厄里那斯-点3:厄里那斯神像右下_
|
||||||
枫丹地脉花-路线4 柔灯港上锚点-3:锚点左左上
|
枫丹地脉花-路线4 柔灯港上锚点-3:锚点左左上
|
||||||
此点位可能卡住,因为小螃蟹不被算作敌怪,导致检测战斗结束时误判为结束。
|
此点位可能卡住,因为小螃蟹不被算作敌怪,导致检测战斗结束时误判为结束。
|
||||||
|
|
||||||
枫丹地脉花-路线2 秋分山西侧锚点左下-5:秋分山左左下下
|
枫丹地脉花-路线2 秋分山西侧锚点左下-5:秋分山左左下下
|
||||||
此点位可能卡住,因为BGI传送时可能点错锚点。这是BGI的bug。请等待修复。
|
此点位可能卡住,因为BGI传送时可能点错锚点。这是BGI的bug。请等待修复。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,220 +1,220 @@
|
|||||||
(async function () {
|
(async function () {
|
||||||
const startTime = Date.now();
|
const startTime = Date.now();
|
||||||
setGameMetrics(1920, 1080, 1);
|
setGameMetrics(1920, 1080, 1);
|
||||||
|
|
||||||
|
|
||||||
//================= 1.设定路线 =================
|
//================= 1.设定路线 =================
|
||||||
|
|
||||||
const folder1 = 'assets/枫丹地脉花-路线1 厄里那斯/';
|
const folder1 = 'assets/枫丹地脉花-路线1 厄里那斯/';
|
||||||
const folder2 = 'assets/枫丹地脉花-路线2 秋分山西侧锚点左下/';
|
const folder2 = 'assets/枫丹地脉花-路线2 秋分山西侧锚点左下/';
|
||||||
const folder3 = 'assets/枫丹地脉花-路线3 秋分山西侧锚点右/';
|
const folder3 = 'assets/枫丹地脉花-路线3 秋分山西侧锚点右/';
|
||||||
const folder4 = 'assets/枫丹地脉花-路线4 柔灯港上锚点/';
|
const folder4 = 'assets/枫丹地脉花-路线4 柔灯港上锚点/';
|
||||||
const folder5 = 'assets/枫丹地脉花-路线5 新枫丹科学院左锚点/';
|
const folder5 = 'assets/枫丹地脉花-路线5 新枫丹科学院左锚点/';
|
||||||
const folder6 = 'assets/枫丹地脉花-路线6 芒索斯山东麓/';
|
const folder6 = 'assets/枫丹地脉花-路线6 芒索斯山东麓/';
|
||||||
|
|
||||||
const pathing1 = [
|
const pathing1 = [
|
||||||
"枫丹地脉花-路线1 厄里那斯-1:厄里那斯神像下.json",
|
"枫丹地脉花-路线1 厄里那斯-1:厄里那斯神像下.json",
|
||||||
"枫丹地脉花-路线1 厄里那斯-2:厄里那斯神像右下.json",
|
"枫丹地脉花-路线1 厄里那斯-2:厄里那斯神像右下.json",
|
||||||
"枫丹地脉花-路线1 厄里那斯-3:厄里那斯神像右下_.json",
|
"枫丹地脉花-路线1 厄里那斯-3:厄里那斯神像右下_.json",
|
||||||
"枫丹地脉花-路线1 厄里那斯-4:厄里那斯神像右下下下.json",
|
"枫丹地脉花-路线1 厄里那斯-4:厄里那斯神像右下下下.json",
|
||||||
"枫丹地脉花-路线1 厄里那斯-5:厄里那斯神像下下下下.json",
|
"枫丹地脉花-路线1 厄里那斯-5:厄里那斯神像下下下下.json",
|
||||||
"枫丹地脉花-路线1 厄里那斯-6:厄里那斯神像下下下.json",
|
"枫丹地脉花-路线1 厄里那斯-6:厄里那斯神像下下下.json",
|
||||||
];
|
];
|
||||||
|
|
||||||
const pathing2 = [
|
const pathing2 = [
|
||||||
"枫丹地脉花-路线2 秋分山西侧锚点左下-1:秋分山左下.json",
|
"枫丹地脉花-路线2 秋分山西侧锚点左下-1:秋分山左下.json",
|
||||||
"枫丹地脉花-路线2 秋分山西侧锚点左下-2:秋分山左下+.json",
|
"枫丹地脉花-路线2 秋分山西侧锚点左下-2:秋分山左下+.json",
|
||||||
"枫丹地脉花-路线2 秋分山西侧锚点左下-3:秋分山左下下.json",
|
"枫丹地脉花-路线2 秋分山西侧锚点左下-3:秋分山左下下.json",
|
||||||
"枫丹地脉花-路线2 秋分山西侧锚点左下-4:秋分山左下下下.json",
|
"枫丹地脉花-路线2 秋分山西侧锚点左下-4:秋分山左下下下.json",
|
||||||
"枫丹地脉花-路线2 秋分山西侧锚点左下-5:秋分山左左下下.json",
|
"枫丹地脉花-路线2 秋分山西侧锚点左下-5:秋分山左左下下.json",
|
||||||
];
|
];
|
||||||
|
|
||||||
const pathing3 = [
|
const pathing3 = [
|
||||||
"枫丹地脉花-路线3 秋分山西侧锚点右-1:锚点右.json",
|
"枫丹地脉花-路线3 秋分山西侧锚点右-1:锚点右.json",
|
||||||
"枫丹地脉花-路线3 秋分山西侧锚点右-2:锚点右右.json",
|
"枫丹地脉花-路线3 秋分山西侧锚点右-2:锚点右右.json",
|
||||||
"枫丹地脉花-路线3 秋分山西侧锚点右-3:锚点右右右.json",
|
"枫丹地脉花-路线3 秋分山西侧锚点右-3:锚点右右右.json",
|
||||||
"枫丹地脉花-路线3 秋分山西侧锚点右-4:东侧锚点上.json",
|
"枫丹地脉花-路线3 秋分山西侧锚点右-4:东侧锚点上.json",
|
||||||
];
|
];
|
||||||
|
|
||||||
const pathing4 = [
|
const pathing4 = [
|
||||||
"枫丹地脉花-路线4 柔灯港上锚点-1:锚点左上.json",
|
"枫丹地脉花-路线4 柔灯港上锚点-1:锚点左上.json",
|
||||||
"枫丹地脉花-路线4 柔灯港上锚点-2:锚点左上+.json",
|
"枫丹地脉花-路线4 柔灯港上锚点-2:锚点左上+.json",
|
||||||
"枫丹地脉花-路线4 柔灯港上锚点-3:锚点左左上.json",
|
"枫丹地脉花-路线4 柔灯港上锚点-3:锚点左左上.json",
|
||||||
"枫丹地脉花-路线4 柔灯港上锚点-4:锚点左上++.json",
|
"枫丹地脉花-路线4 柔灯港上锚点-4:锚点左上++.json",
|
||||||
];
|
];
|
||||||
|
|
||||||
const pathing5 = [
|
const pathing5 = [
|
||||||
"枫丹地脉花-路线5 新枫丹科学院左锚点-1:锚点左上.json",
|
"枫丹地脉花-路线5 新枫丹科学院左锚点-1:锚点左上.json",
|
||||||
"枫丹地脉花-路线5 新枫丹科学院左锚点-2:锚点上.json",
|
"枫丹地脉花-路线5 新枫丹科学院左锚点-2:锚点上.json",
|
||||||
"枫丹地脉花-路线5 新枫丹科学院左锚点-3:科学院左上锚点.json",
|
"枫丹地脉花-路线5 新枫丹科学院左锚点-3:科学院左上锚点.json",
|
||||||
"枫丹地脉花-路线5 新枫丹科学院左锚点-4:科学院左上锚点左上.json",
|
"枫丹地脉花-路线5 新枫丹科学院左锚点-4:科学院左上锚点左上.json",
|
||||||
];
|
];
|
||||||
|
|
||||||
const pathing6 = [
|
const pathing6 = [
|
||||||
"枫丹地脉花-路线6 芒索斯山东麓-1:锚点下.json",
|
"枫丹地脉花-路线6 芒索斯山东麓-1:锚点下.json",
|
||||||
"枫丹地脉花-路线6 芒索斯山东麓-2:锚点右.json",
|
"枫丹地脉花-路线6 芒索斯山东麓-2:锚点右.json",
|
||||||
"枫丹地脉花-路线6 芒索斯山东麓-3:锚点左.json",
|
"枫丹地脉花-路线6 芒索斯山东麓-3:锚点左.json",
|
||||||
"枫丹地脉花-路线6 芒索斯山东麓-4:锚点左上.json",
|
"枫丹地脉花-路线6 芒索斯山东麓-4:锚点左上.json",
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// ================= 2. 配置读取 =================
|
// ================= 2. 配置读取 =================
|
||||||
|
|
||||||
let filePath; // 声明变量
|
let filePath; // 声明变量
|
||||||
if (settings.path === undefined) { // 检查用户是否选了地址
|
if (settings.path === undefined) { // 检查用户是否选了地址
|
||||||
log.error("请在游戏中确认想刷地脉的首点位置,然后在js设置中选择路线。",);
|
log.error("请在游戏中确认想刷地脉的首点位置,然后在js设置中选择路线。",);
|
||||||
throw new Error("用户未设置路线,已终止执行"); // 没选就报错后停止
|
throw new Error("用户未设置路线,已终止执行"); // 没选就报错后停止
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
filePath = settings.path
|
filePath = settings.path
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 路线映射表-将用户设置映射对应路线
|
// 路线映射表-将用户设置映射对应路线
|
||||||
const pathingMap = {
|
const pathingMap = {
|
||||||
"路线1 厄里那斯": pathing1,
|
"路线1 厄里那斯": pathing1,
|
||||||
"路线2 秋分山西侧锚点左下": pathing2,
|
"路线2 秋分山西侧锚点左下": pathing2,
|
||||||
"路线3 秋分山西侧锚点右": pathing3,
|
"路线3 秋分山西侧锚点右": pathing3,
|
||||||
"路线4 柔灯港上锚点": pathing4,
|
"路线4 柔灯港上锚点": pathing4,
|
||||||
"路线5 新枫丹科学院左锚点": pathing5,
|
"路线5 新枫丹科学院左锚点": pathing5,
|
||||||
"路线6 芒索斯山东麓": pathing6
|
"路线6 芒索斯山东麓": pathing6
|
||||||
};
|
};
|
||||||
|
|
||||||
const folderMap = {
|
const folderMap = {
|
||||||
"路线1 厄里那斯": folder1,
|
"路线1 厄里那斯": folder1,
|
||||||
"路线2 秋分山西侧锚点左下": folder2,
|
"路线2 秋分山西侧锚点左下": folder2,
|
||||||
"路线3 秋分山西侧锚点右": folder3,
|
"路线3 秋分山西侧锚点右": folder3,
|
||||||
"路线4 柔灯港上锚点": folder4,
|
"路线4 柔灯港上锚点": folder4,
|
||||||
"路线5 新枫丹科学院左锚点": folder5,
|
"路线5 新枫丹科学院左锚点": folder5,
|
||||||
"路线6 芒索斯山东麓": folder6
|
"路线6 芒索斯山东麓": folder6
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// 输出选择的路线
|
// 输出选择的路线
|
||||||
log.info(`已选择路线:${settings.path}`);
|
log.info(`已选择路线:${settings.path}`);
|
||||||
|
|
||||||
// 定义路线常量
|
// 定义路线常量
|
||||||
const selectedPath = pathingMap[filePath];
|
const selectedPath = pathingMap[filePath];
|
||||||
const selectedFolder = folderMap[filePath];
|
const selectedFolder = folderMap[filePath];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 读取原始次数配置
|
// 读取原始次数配置
|
||||||
const rawTimes = settings.times ? settings.times : "6";
|
const rawTimes = settings.times ? settings.times : "6";
|
||||||
|
|
||||||
// 验证是否为数字
|
// 验证是否为数字
|
||||||
let timesValue;
|
let timesValue;
|
||||||
if (!/^-?\d+\.?\d*$/.test(rawTimes)) { // 匹配整数和小数
|
if (!/^-?\d+\.?\d*$/.test(rawTimes)) { // 匹配整数和小数
|
||||||
timesValue = 6
|
timesValue = 6
|
||||||
log.info("⚠️ 刷本次数设置不为数字,改为默认值6");
|
log.info("⚠️ 刷本次数设置不为数字,改为默认值6");
|
||||||
} else {
|
} else {
|
||||||
// 转换为数字
|
// 转换为数字
|
||||||
const num = parseFloat(rawTimes);
|
const num = parseFloat(rawTimes);
|
||||||
|
|
||||||
// 范围检查
|
// 范围检查
|
||||||
if (num < 1) {
|
if (num < 1) {
|
||||||
timesValue = 1;
|
timesValue = 1;
|
||||||
log.info(`⚠️ 次数 ${num} 小于1,已调整为1`);
|
log.info(`⚠️ 次数 ${num} 小于1,已调整为1`);
|
||||||
} else if (num > 6) {
|
} else if (num > 6) {
|
||||||
timesValue = 6;
|
timesValue = 6;
|
||||||
log.info(`⚠️ 次数 ${num} 大于6,已调整为6`);
|
log.info(`⚠️ 次数 ${num} 大于6,已调整为6`);
|
||||||
} else {
|
} else {
|
||||||
// 处理小数
|
// 处理小数
|
||||||
if (!Number.isInteger(num)) {
|
if (!Number.isInteger(num)) {
|
||||||
timesValue = Math.floor(num);
|
timesValue = Math.floor(num);
|
||||||
log.info(`⚠️ 次数 ${num} 不是整数,已向下取整为 ${timesValue}`);
|
log.info(`⚠️ 次数 ${num} 不是整数,已向下取整为 ${timesValue}`);
|
||||||
} else {
|
} else {
|
||||||
timesValue = num;
|
timesValue = num;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const timesConfig = { value: timesValue };
|
const timesConfig = { value: timesValue };
|
||||||
|
|
||||||
//已定义好路线路径、刷本次数的常量。现在需要定义领取动作,并做刷本动作,并保持自动拾取关闭。路线为selectedFolder+selectedPath,次数为timesConfig
|
//已定义好路线路径、刷本次数的常量。现在需要定义领取动作,并做刷本动作,并保持自动拾取关闭。路线为selectedFolder+selectedPath,次数为timesConfig
|
||||||
|
|
||||||
|
|
||||||
//路径存在性检查
|
//路径存在性检查
|
||||||
|
|
||||||
|
|
||||||
if (selectedPath) {
|
if (selectedPath) {
|
||||||
for (const jsonFile of selectedPath) {
|
for (const jsonFile of selectedPath) {
|
||||||
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
throw new Error("未找到路径文件");
|
throw new Error("未找到路径文件");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//定义领取动作
|
//定义领取动作
|
||||||
async function claimRewards() {
|
async function claimRewards() {
|
||||||
|
|
||||||
log.info("尝试领取奖励,优先使用浓缩,按下两次esc避免使用月亮");
|
log.info("尝试领取奖励,优先使用浓缩,按下两次esc避免使用月亮");
|
||||||
|
|
||||||
for (let i = 0; i < 6; i++) {
|
for (let i = 0; i < 6; i++) {
|
||||||
keyPress("F");
|
keyPress("F");
|
||||||
await sleep(i < 5 ? 400 : 600);
|
await sleep(i < 5 ? 400 : 600);
|
||||||
}
|
}
|
||||||
|
|
||||||
click(918, 760);
|
click(918, 760);
|
||||||
await sleep(1600);
|
await sleep(1600);
|
||||||
|
|
||||||
keyPress("VK_ESCAPE");
|
keyPress("VK_ESCAPE");
|
||||||
await sleep(800);
|
await sleep(800);
|
||||||
keyPress("VK_ESCAPE");
|
keyPress("VK_ESCAPE");
|
||||||
await sleep(800);
|
await sleep(800);
|
||||||
|
|
||||||
}
|
}
|
||||||
//定义了领取动作为claimRewards
|
//定义了领取动作为claimRewards
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// ================= 3. 主执行逻辑 =================
|
// ================= 3. 主执行逻辑 =================
|
||||||
try {
|
try {
|
||||||
|
|
||||||
// 计算实际执行次数(取用户设置次数与路线长度的最小值)
|
// 计算实际执行次数(取用户设置次数与路线长度的最小值)
|
||||||
const maxExecutions = Math.min(timesConfig.value, selectedPath.length);
|
const maxExecutions = Math.min(timesConfig.value, selectedPath.length);
|
||||||
log.info(`本条路线执行至第 ${maxExecutions} 朵花`);
|
log.info(`本条路线执行至第 ${maxExecutions} 朵花`);
|
||||||
|
|
||||||
// 按顺序执行路径文件
|
// 按顺序执行路径文件
|
||||||
let executedCount = 0;
|
let executedCount = 0;
|
||||||
for (const jsonFile of selectedPath) {
|
for (const jsonFile of selectedPath) {
|
||||||
if (executedCount >= maxExecutions) {
|
if (executedCount >= maxExecutions) {
|
||||||
log.info("已达到执行次数,终止运行");
|
log.info("已达到执行次数,终止运行");
|
||||||
break; // 条件1触发:次数限制
|
break; // 条件1触发:次数限制
|
||||||
}
|
}
|
||||||
|
|
||||||
// 关闭自动拾取
|
// 关闭自动拾取
|
||||||
dispatcher.addTimer(new RealtimeTimer("AutoPick", { forceInteraction: false }));
|
dispatcher.addTimer(new RealtimeTimer("AutoPick", { forceInteraction: false }));
|
||||||
|
|
||||||
// 执行单个路径文件
|
// 执行单个路径文件
|
||||||
log.info(`开始执行第 ${executedCount + 1}/${maxExecutions} 次路径:${jsonFile}`);
|
log.info(`开始执行第 ${executedCount + 1}/${maxExecutions} 次路径:${jsonFile}`);
|
||||||
|
|
||||||
await pathingScript.runFile(`${selectedFolder}${jsonFile}`);
|
await pathingScript.runFile(`${selectedFolder}${jsonFile}`);
|
||||||
|
|
||||||
// 领取奖励
|
// 领取奖励
|
||||||
log.info(`此时应该可以按F接触地脉花`);
|
log.info(`此时应该可以按F接触地脉花`);
|
||||||
log.info(`开始第 ${executedCount + 1} 朵花的奖励领取`);
|
log.info(`开始第 ${executedCount + 1} 朵花的奖励领取`);
|
||||||
await claimRewards();
|
await claimRewards();
|
||||||
|
|
||||||
// 确保重新开启自动拾取
|
// 确保重新开启自动拾取
|
||||||
dispatcher.addTimer(new RealtimeTimer("AutoPick", { forceInteraction: true }));
|
dispatcher.addTimer(new RealtimeTimer("AutoPick", { forceInteraction: true }));
|
||||||
|
|
||||||
|
|
||||||
// 冷却等待(可选)
|
// 冷却等待(可选)
|
||||||
await sleep(1000);
|
await sleep(1000);
|
||||||
|
|
||||||
executedCount++;
|
executedCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
log.info("本次地脉花路线已执行完毕。");
|
log.info("本次地脉花路线已执行完毕。");
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
log.error(`执行过程中发生错误:${error.message}`);
|
log.error(`执行过程中发生错误:${error.message}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
Before Width: | Height: | Size: 620 KiB After Width: | Height: | Size: 620 KiB |
|
Before Width: | Height: | Size: 225 KiB After Width: | Height: | Size: 225 KiB |
|
Before Width: | Height: | Size: 233 KiB After Width: | Height: | Size: 233 KiB |
|
Before Width: | Height: | Size: 372 KiB After Width: | Height: | Size: 372 KiB |
|
Before Width: | Height: | Size: 314 KiB After Width: | Height: | Size: 314 KiB |
|
Before Width: | Height: | Size: 380 KiB After Width: | Height: | Size: 380 KiB |
@@ -1,68 +1,68 @@
|
|||||||
(async function () {
|
(async function () {
|
||||||
|
|
||||||
const defaultHours = 4;
|
const defaultHours = 4;
|
||||||
const defaultMinutes = 0;
|
const defaultMinutes = 0;
|
||||||
|
|
||||||
function validateAndSetDefaults(specifyHours, specifyMinutes) {
|
function validateAndSetDefaults(specifyHours, specifyMinutes) {
|
||||||
if (isNaN(specifyHours) || specifyHours > 23 || specifyHours == '') {
|
if (isNaN(specifyHours) || specifyHours > 23 || specifyHours == '') {
|
||||||
if (specifyHours > 23) {
|
if (specifyHours > 23) {
|
||||||
log.warn("设置指定时间错误,请使用 0~23 时,将使用默认值:4时");
|
log.warn("设置指定时间错误,请使用 0~23 时,将使用默认值:4时");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
log.warn("你没有设置指定时,将使用默认值:4时");
|
log.warn("你没有设置指定时,将使用默认值:4时");
|
||||||
}
|
}
|
||||||
|
|
||||||
specifyHours = defaultHours;
|
specifyHours = defaultHours;
|
||||||
}
|
}
|
||||||
if (isNaN(specifyMinutes) || specifyMinutes > 59 || specifyMinutes == '') {
|
if (isNaN(specifyMinutes) || specifyMinutes > 59 || specifyMinutes == '') {
|
||||||
if (specifyMinutes > 59) {
|
if (specifyMinutes > 59) {
|
||||||
log.warn("设置指定时间错误,请使用 0~59 分,将使用默认值:0分");
|
log.warn("设置指定时间错误,请使用 0~59 分,将使用默认值:0分");
|
||||||
} else {
|
} else {
|
||||||
log.warn("你没有设置指定分钟,将使用默认值:0分");
|
log.warn("你没有设置指定分钟,将使用默认值:0分");
|
||||||
}
|
}
|
||||||
specifyMinutes = defaultMinutes;
|
specifyMinutes = defaultMinutes;
|
||||||
}
|
}
|
||||||
log.info(`---------------将等待至 ${specifyHours}:${specifyMinutes} ---------------`)
|
log.info(`---------------将等待至 ${specifyHours}:${specifyMinutes} ---------------`)
|
||||||
return { specifyHours, specifyMinutes };
|
return { specifyHours, specifyMinutes };
|
||||||
}
|
}
|
||||||
|
|
||||||
// 計算相差時間微秒
|
// 計算相差時間微秒
|
||||||
function getTimeUntilNextTime(validatedHours, validatedMinutes) {
|
function getTimeUntilNextTime(validatedHours, validatedMinutes) {
|
||||||
const now = new Date();
|
const now = new Date();
|
||||||
const nextTime = new Date(
|
const nextTime = new Date(
|
||||||
now.getFullYear(),
|
now.getFullYear(),
|
||||||
now.getMonth(),
|
now.getMonth(),
|
||||||
now.getDate(),
|
now.getDate(),
|
||||||
validatedHours, validatedMinutes, 0, 0
|
validatedHours, validatedMinutes, 0, 0
|
||||||
);
|
);
|
||||||
|
|
||||||
// 如果現在時間已經過了今天的 4 點,則計算明天的 4 點
|
// 如果現在時間已經過了今天的 4 點,則計算明天的 4 點
|
||||||
if (now >= nextTime) {
|
if (now >= nextTime) {
|
||||||
nextTime.setDate(nextTime.getDate() + 1);
|
nextTime.setDate(nextTime.getDate() + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return nextTime - now;
|
return nextTime - now;
|
||||||
}
|
}
|
||||||
|
|
||||||
setGameMetrics(1920, 1080, 2);
|
setGameMetrics(1920, 1080, 2);
|
||||||
// 启用自动拾取的实时任务
|
// 启用自动拾取的实时任务
|
||||||
dispatcher.addTimer(new RealtimeTimer("AutoPick"));
|
dispatcher.addTimer(new RealtimeTimer("AutoPick"));
|
||||||
// 启用自动剧情的实时任务
|
// 启用自动剧情的实时任务
|
||||||
dispatcher.addTimer(new RealtimeTimer("AutoSkip"));
|
dispatcher.addTimer(new RealtimeTimer("AutoSkip"));
|
||||||
// 讀取參數
|
// 讀取參數
|
||||||
let specifyHours = Number(settings.specifyHours);
|
let specifyHours = Number(settings.specifyHours);
|
||||||
let specifyMinutes = Number(settings.specifyMinutes);
|
let specifyMinutes = Number(settings.specifyMinutes);
|
||||||
|
|
||||||
const { specifyHours: validatedHours, specifyMinutes: validatedMinutes } = validateAndSetDefaults(specifyHours, specifyMinutes);
|
const { specifyHours: validatedHours, specifyMinutes: validatedMinutes } = validateAndSetDefaults(specifyHours, specifyMinutes);
|
||||||
|
|
||||||
// 計算相差時間微秒
|
// 計算相差時間微秒
|
||||||
const timeUntilNextTime = getTimeUntilNextTime(validatedHours, validatedMinutes);
|
const timeUntilNextTime = getTimeUntilNextTime(validatedHours, validatedMinutes);
|
||||||
log.info(`等待 ${Math.floor((timeUntilNextTime / 60000 / 60))} 小时 ${(timeUntilNextTime / 60000 % 60).toFixed(0)} 分 ,直到下一个 ${validatedHours} : ${validatedMinutes}`);
|
log.info(`等待 ${Math.floor((timeUntilNextTime / 60000 / 60))} 小时 ${(timeUntilNextTime / 60000 % 60).toFixed(0)} 分 ,直到下一个 ${validatedHours} : ${validatedMinutes}`);
|
||||||
// 多等待10秒
|
// 多等待10秒
|
||||||
await sleep(timeUntilNextTime + 10000);
|
await sleep(timeUntilNextTime + 10000);
|
||||||
log.info(`时间到了!现在是 ${specifyHours}:${specifyMinutes}`);
|
log.info(`时间到了!现在是 ${specifyHours}:${specifyMinutes}`);
|
||||||
|
|
||||||
//1秒 = 1000 毫秒
|
//1秒 = 1000 毫秒
|
||||||
//10秒 = 10000 毫秒
|
//10秒 = 10000 毫秒
|
||||||
//1分鐘 = 60000 毫秒
|
//1分鐘 = 60000 毫秒
|
||||||
})();
|
})();
|
||||||
@@ -1,16 +1,16 @@
|
|||||||
{
|
{
|
||||||
"manifest_version": 1,
|
"manifest_version": 1,
|
||||||
"name": "等待到指定时间(默认凌晨4点)",
|
"name": "等待到指定时间(默认凌晨4点)",
|
||||||
"version": "1.0",
|
"version": "1.0",
|
||||||
"bgi_version": "0.42.0",
|
"bgi_version": "0.42.0",
|
||||||
"description": "等待到指定时间(默认凌晨4点),适用于等到第二天4点执行其他任务",
|
"description": "等待到指定时间(默认凌晨4点),适用于等到第二天4点执行其他任务",
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
"name": "蜜柑魚",
|
"name": "蜜柑魚",
|
||||||
"link": "https://github.com/this-Fish"
|
"link": "https://github.com/this-Fish"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"settings_ui": "settings.json",
|
"settings_ui": "settings.json",
|
||||||
"main": "main.js"
|
"main": "main.js"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"name": "specifyHours",
|
"name": "specifyHours",
|
||||||
"type": "input-text",
|
"type": "input-text",
|
||||||
"label": "指定等待直到下一个 HH:MM 的时(默认:4)"
|
"label": "指定等待直到下一个 HH:MM 的时(默认:4)"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "specifyMinutes",
|
"name": "specifyMinutes",
|
||||||
"type": "input-text",
|
"type": "input-text",
|
||||||
"label": "指定等待直到下一个 HH:MM 的分钟(默认:0)"
|
"label": "指定等待直到下一个 HH:MM 的分钟(默认:0)"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -1,36 +1,36 @@
|
|||||||
(
|
(
|
||||||
async function () {
|
async function () {
|
||||||
const codes = [
|
const codes = [
|
||||||
"NODKRAI0910",
|
"NODKRAI0910",
|
||||||
"VOYNICHGUILD",
|
"VOYNICHGUILD",
|
||||||
"THEWILDHUNT",
|
"THEWILDHUNT",
|
||||||
"LIGHTKEEPERS",
|
"LIGHTKEEPERS",
|
||||||
"FROSTMOONSCIONS"
|
"FROSTMOONSCIONS"
|
||||||
];
|
];
|
||||||
//输入兑换码,兑换码与兑换码之间要以英文逗号隔开,如: "123","123",兑换码要用""框起
|
//输入兑换码,兑换码与兑换码之间要以英文逗号隔开,如: "123","123",兑换码要用""框起
|
||||||
await sleep(3000);
|
await sleep(3000);
|
||||||
keyPress("VK_ESCAPE");
|
keyPress("VK_ESCAPE");
|
||||||
await sleep(1000);
|
await sleep(1000);
|
||||||
click(55,793);
|
click(55,793);
|
||||||
await sleep(1000);
|
await sleep(1000);
|
||||||
click(162,569);
|
click(162,569);
|
||||||
await sleep(1000);
|
await sleep(1000);
|
||||||
click(1649,210);
|
click(1649,210);
|
||||||
await sleep(1000);
|
await sleep(1000);
|
||||||
keyDown("VK_LSHIFT");
|
keyDown("VK_LSHIFT");
|
||||||
keyUp("VK_LSHIFT");
|
keyUp("VK_LSHIFT");
|
||||||
for (const code of codes){
|
for (const code of codes){
|
||||||
click(734,506);
|
click(734,506);
|
||||||
await sleep(1000);
|
await sleep(1000);
|
||||||
for(const cod of code){
|
for(const cod of code){
|
||||||
keyPress("VK_"+cod);
|
keyPress("VK_"+cod);
|
||||||
}
|
}
|
||||||
//keyUp("VK_LSHIFT");
|
//keyUp("VK_LSHIFT");
|
||||||
await sleep(1000);
|
await sleep(1000);
|
||||||
click(1164,735);
|
click(1164,735);
|
||||||
await sleep(1000);
|
await sleep(1000);
|
||||||
click(991,744);
|
click(991,744);
|
||||||
await sleep(5500);
|
await sleep(5500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)();
|
)();
|
||||||
@@ -1,17 +1,17 @@
|
|||||||
{
|
{
|
||||||
"manifest_version": 1,
|
"manifest_version": 1,
|
||||||
"name": "领取兑换码", // 名称
|
"name": "领取兑换码", // 名称
|
||||||
"version": "1.0", // 版本
|
"version": "1.0", // 版本
|
||||||
"bgi_version": "0.36.1", // 适用于 BetterGI 的最低版本,BetterGI低于此版本会提示
|
"bgi_version": "0.36.1", // 适用于 BetterGI 的最低版本,BetterGI低于此版本会提示
|
||||||
"description": "自动领兑换码,自行打开main.js配置,适用多账号玩家。", // 描述
|
"description": "自动领兑换码,自行打开main.js配置,适用多账号玩家。", // 描述
|
||||||
// 作者信息
|
// 作者信息
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
"name": "白玉狻猊",
|
"name": "白玉狻猊",
|
||||||
"link": "https://github.com/LaughingCatGGG"
|
"link": "https://github.com/LaughingCatGGG"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
// 入口文件
|
// 入口文件
|
||||||
"main": "main.js"
|
"main": "main.js"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4,6 +4,7 @@
|
|||||||
"version": "1.0",
|
"version": "1.0",
|
||||||
"bgiversion" : "0.34.6",
|
"bgiversion" : "0.34.6",
|
||||||
"description": "异步调用独立战斗任务,根据OCR结果判断战斗是否结束,不建议直接使用,仅供其他脚本作者参考",
|
"description": "异步调用独立战斗任务,根据OCR结果判断战斗是否结束,不建议直接使用,仅供其他脚本作者参考",
|
||||||
|
"tags" : [ "示例" ],
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
"name": "秋云",
|
"name": "秋云",
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"manifest_version": 1,
|
"manifest_version": 1,
|
||||||
"name": "烹饪熟练度一键拉满",
|
"name": "烹饪熟练度一键拉满",
|
||||||
"version": "1.1",
|
"version": "1.1",
|
||||||
|
"tags": ["烹饪"],
|
||||||
"description": "如果总是差一点,请自行在js设置中加减合适的时间,烹饪不可用的时候,请选择合适的置信度。此外感谢万民堂对本脚本的大力支持。下面是一段广告:亲朋聚宴哪家强?吃虎岩找万民堂!璃月厨王掌厨房,菜品质量有保障!服务热情更在行,欢声笑语聚满堂!",
|
"description": "如果总是差一点,请自行在js设置中加减合适的时间,烹饪不可用的时候,请选择合适的置信度。此外感谢万民堂对本脚本的大力支持。下面是一段广告:亲朋聚宴哪家强?吃虎岩找万民堂!璃月厨王掌厨房,菜品质量有保障!服务热情更在行,欢声笑语聚满堂!",
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.6 KiB |
@@ -1,70 +1,70 @@
|
|||||||
const receiveRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/receive.png"));
|
const receiveRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/receive.png"));
|
||||||
|
|
||||||
(async function () {
|
(async function () {
|
||||||
|
|
||||||
const topLeft = {x: 192, y: 281}; // 左上角坐标
|
const topLeft = {x: 192, y: 281}; // 左上角坐标
|
||||||
const bottomRight = {x: 1738, y: 984}; // 右下角坐标
|
const bottomRight = {x: 1738, y: 984}; // 右下角坐标
|
||||||
const rows = 3; // 行数
|
const rows = 3; // 行数
|
||||||
const cols = 7; // 列数
|
const cols = 7; // 列数
|
||||||
const topLeft1 = {x: 190, y: 870}; // 左上角坐标
|
const topLeft1 = {x: 190, y: 870}; // 左上角坐标
|
||||||
const bottomRight1 = {x: 1735, y: 870}; // 右下角坐标
|
const bottomRight1 = {x: 1735, y: 870}; // 右下角坐标
|
||||||
const rows1 = 1; // 行数
|
const rows1 = 1; // 行数
|
||||||
const cols1 = 7; // 列数
|
const cols1 = 7; // 列数
|
||||||
let sum = 1;
|
let sum = 1;
|
||||||
let sum1= 0;
|
let sum1= 0;
|
||||||
//用于点击多个点位
|
//用于点击多个点位
|
||||||
async function autoClick(
|
async function autoClick(
|
||||||
topLeft, // 左上角点位 {x, y}
|
topLeft, // 左上角点位 {x, y}
|
||||||
bottomRight, // 右下角点位 {x, y}
|
bottomRight, // 右下角点位 {x, y}
|
||||||
rows, // 行数
|
rows, // 行数
|
||||||
cols // 列数
|
cols // 列数
|
||||||
) {
|
) {
|
||||||
// 计算每个点之间的水平和垂直间距
|
// 计算每个点之间的水平和垂直间距
|
||||||
let stepX = cols > 1 ? (bottomRight.x - topLeft.x) / (cols - 1) : 0; // 处理单列情况
|
let stepX = cols > 1 ? (bottomRight.x - topLeft.x) / (cols - 1) : 0; // 处理单列情况
|
||||||
let stepY = rows > 1 ? (bottomRight.y - topLeft.y) / (rows - 1) : 0; // 处理单行情况
|
let stepY = rows > 1 ? (bottomRight.y - topLeft.y) / (rows - 1) : 0; // 处理单行情况
|
||||||
// 从左到右,从上到下依次点击
|
// 从左到右,从上到下依次点击
|
||||||
for (let row = 0; row < rows; row++) {
|
for (let row = 0; row < rows; row++) {
|
||||||
for (let col = 0; col < cols; col++) {
|
for (let col = 0; col < cols; col++) {
|
||||||
// 计算当前点的坐标并四舍五入
|
// 计算当前点的坐标并四舍五入
|
||||||
let x = Math.round(topLeft.x + col * stepX);
|
let x = Math.round(topLeft.x + col * stepX);
|
||||||
let y = Math.round(topLeft.y + row * stepY);
|
let y = Math.round(topLeft.y + row * stepY);
|
||||||
// 执行点击
|
// 执行点击
|
||||||
click(x, y);
|
click(x, y);
|
||||||
await sleep(1000);
|
await sleep(1000);
|
||||||
log.info(`第${sum}次识别`);
|
log.info(`第${sum}次识别`);
|
||||||
sum++;
|
sum++;
|
||||||
let receive = captureGameRegion().find(receiveRo);
|
let receive = captureGameRegion().find(receiveRo);
|
||||||
await sleep(1000);
|
await sleep(1000);
|
||||||
while(receive.isExist()){
|
while(receive.isExist()){
|
||||||
receive.click();
|
receive.click();
|
||||||
await sleep(500);
|
await sleep(500);
|
||||||
sum1++;
|
sum1++;
|
||||||
log.info(`成功识别${sum1}次`);
|
log.info(`成功识别${sum1}次`);
|
||||||
|
|
||||||
click(400,1010);//点击空白处
|
click(400,1010);//点击空白处
|
||||||
await sleep(500);
|
await sleep(500);
|
||||||
receive = captureGameRegion().find(receiveRo);
|
receive = captureGameRegion().find(receiveRo);
|
||||||
}
|
}
|
||||||
|
|
||||||
click(400,1010);//如果是本行最后一个成就会自动翻页
|
click(400,1010);//如果是本行最后一个成就会自动翻页
|
||||||
await sleep(500);
|
await sleep(500);
|
||||||
keyPress("ESCAPE");
|
keyPress("ESCAPE");
|
||||||
// 等待1秒
|
// 等待1秒
|
||||||
await sleep(1000);
|
await sleep(1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//主流程
|
//主流程
|
||||||
await genshin.returnMainUi();
|
await genshin.returnMainUi();
|
||||||
await sleep(1000);
|
await sleep(1000);
|
||||||
keyPress("ESCAPE");
|
keyPress("ESCAPE");
|
||||||
await sleep(1000);
|
await sleep(1000);
|
||||||
click(670 ,420 );//点击成就
|
click(670 ,420 );//点击成就
|
||||||
await sleep(2000);
|
await sleep(2000);
|
||||||
await autoClick(topLeft, bottomRight, rows, cols);
|
await autoClick(topLeft, bottomRight, rows, cols);
|
||||||
for (let i = 0; i < 6; i++) {
|
for (let i = 0; i < 6; i++) {
|
||||||
await autoClick(topLeft1, bottomRight1, rows1, cols1);
|
await autoClick(topLeft1, bottomRight1, rows1, cols1);
|
||||||
}
|
}
|
||||||
|
|
||||||
})();
|
})();
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
"name": "自动领取成就奖励",
|
"name": "自动领取成就奖励",
|
||||||
"version": "1.0",
|
"version": "1.0",
|
||||||
"description": "所以米桑什么时候实装一键领取?",
|
"description": "所以米桑什么时候实装一键领取?",
|
||||||
|
"tags" : [ "OCR" ],
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
"name": "柒叶子",
|
"name": "柒叶子",
|
||||||