脚本归档
@@ -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。请等待修复。
|
||||
|
||||
|
||||
|
||||
@@ -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}`);
|
||||
}
|
||||
|
||||
|
||||
|
||||
})();
|
||||
|
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 () {
|
||||
|
||||
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 毫秒
|
||||
})();
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
[
|
||||
{
|
||||
"name": "specifyHours",
|
||||
"type": "input-text",
|
||||
"label": "指定等待直到下一个 HH:MM 的时(默认:4)"
|
||||
},
|
||||
{
|
||||
"name": "specifyMinutes",
|
||||
"type": "input-text",
|
||||
"label": "指定等待直到下一个 HH:MM 的分钟(默认:0)"
|
||||
}
|
||||
[
|
||||
{
|
||||
"name": "specifyHours",
|
||||
"type": "input-text",
|
||||
"label": "指定等待直到下一个 HH:MM 的时(默认:4)"
|
||||
},
|
||||
{
|
||||
"name": "specifyMinutes",
|
||||
"type": "input-text",
|
||||
"label": "指定等待直到下一个 HH:MM 的分钟(默认:0)"
|
||||
}
|
||||
]
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
)();
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
"version": "1.0",
|
||||
"bgiversion" : "0.34.6",
|
||||
"description": "异步调用独立战斗任务,根据OCR结果判断战斗是否结束,不建议直接使用,仅供其他脚本作者参考",
|
||||
"tags" : [ "示例" ],
|
||||
"authors": [
|
||||
{
|
||||
"name": "秋云",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"manifest_version": 1,
|
||||
"name": "烹饪熟练度一键拉满",
|
||||
"version": "1.1",
|
||||
"tags": ["烹饪"],
|
||||
"description": "如果总是差一点,请自行在js设置中加减合适的时间,烹饪不可用的时候,请选择合适的置信度。此外感谢万民堂对本脚本的大力支持。下面是一段广告:亲朋聚宴哪家强?吃虎岩找万民堂!璃月厨王掌厨房,菜品质量有保障!服务热情更在行,欢声笑语聚满堂!",
|
||||
"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"));
|
||||
|
||||
(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);
|
||||
}
|
||||
|
||||
})();
|
||||
@@ -3,6 +3,7 @@
|
||||
"name": "自动领取成就奖励",
|
||||
"version": "1.0",
|
||||
"description": "所以米桑什么时候实装一键领取?",
|
||||
"tags" : [ "OCR" ],
|
||||
"authors": [
|
||||
{
|
||||
"name": "柒叶子",
|
||||