Files
bettergi-scripts-list/repo/js/买菜/main.js
听雨♪ 6a07c4c1c3 [JS脚本]购买食材-自动购物 (#397)
* 注销系统用户的js脚本

一个注销系统用户的js脚本,用于用于远程本地多用户桌面

* 一个购买食材-自动购物的JS脚本

一个自动买菜脚本, 目前添加了15个NPC

* [JS脚本]买菜脚本BUG修复

修复了志村勘兵卫寻路问题.

* [JS脚本]购买食材-自动购物BUG修复

1、修复了一键购买时sleep时间较短,小概率跳过部分商品的BUG
2、修复了少女体型角色在无移速加成时,稻妻杂物NPC葵的寻路BUG

* [JS脚本][BUG修复]购买食材-自动购物

修复了阻塞函数genshin.returnMainUi()未加await导致外部报错的BUG :)

* [JS脚本]自动加工食材

自动食材加工, 可自动获取加工完成食材,可指定制作食材
2025-03-06 20:52:28 +08:00

229 lines
6.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// main.js
let NPC_list = {};
async function setTime(hour, minute) {
// 关于setTime
// 原作者: Tim
// 脚本名称: SetTimeMinute - 精确调整游戏时间到分钟
// 脚本版本: 1.0
// Hash: f5c2547dfc286fc643c733d630f775e8fbf12971
// 设置游戏分辨率和DPI缩放
setGameMetrics(1920, 1080, 1);
// 圆心坐标
const centerX = 1441;
const centerY = 501.6;
// 半径
const r1 = 30;
const r2 = 150;
const r3 = 300;
const stepDuration = 50;
function getPosition(r, index) {
let angle = index * Math.PI / 720;
return [Math.round(centerX + r * Math.cos(angle)), Math.round(centerY + r * Math.sin(angle))];
}
async function mouseClick(x, y) {
moveMouseTo(x, y);
await sleep(50);
leftButtonDown();
await sleep(50);
leftButtonUp();
await sleep(stepDuration);
}
async function mouseClickAndMove(x1, y1, x2, y2) {
moveMouseTo(x1, y1);
await sleep(50);
leftButtonDown();
await sleep(50);
moveMouseTo(x2, y2);
await sleep(50);
leftButtonUp();
await sleep(stepDuration);
}
async function setTime(hour, minute) {
const end = (hour + 6) * 60 + minute-20;
const n = 3;
for (let i = - n + 1; i < 1; i++) {
let [x,y] = getPosition(r1, end + i * 1440 / n);
await mouseClick(x, y);
}
let [x1,y1] = getPosition(r2, end + 5);
let [x2, y2] = getPosition(r3, end + 20 + 0.5);
await mouseClickAndMove(x1, y1, x2, y2);
}
let h = Math.floor(hour+minute/60);
const m = Math.floor(hour*60+minute)-h*60;
h = ((h % 24) + 24) % 24;
log.info(`设置时间到 ${h}${m}`);
await keyPress("Escape");
await sleep(1000);
await click(50,700);
await sleep(2000);
await setTime(h, m);
await sleep(1000);
await click(1500,1000);//确认
await sleep(18000);
await keyPress("Escape");
await sleep(2000);
await keyPress("Escape");
await sleep(2000);
// 最后恢复到听雨的分辨率
setGameMetrics(2560, 1440, 1.5);
}
// 快速购买
async function QucikBuy(count = 1) {
for (let i = 0; i < count; i++) {
// 点击购买/兑换
click(2230, 1370);
await sleep(100); // 等待窗口弹出
// 选中左边点
moveMouseTo(1000, 806);
await sleep(100);
leftButtonDown();
await sleep(50);
// 向右滑动
moveMouseBy(1200, 0);
await sleep(200);
leftButtonUp();
await sleep(100);
// 点击弹出页的购买/兑换 1560, 1040
click(1560, 1040);
await sleep(500);
// 点击空白处关闭
click(936, 230);
await sleep(2000);
}
}
// 跳过对话
async function Spik(count) {
await sleep(100);
for (let i = 0; i < count; i++) {
keyPress("VK_F");
await sleep(2000);
}
}
async function AutoPath(locationName) {
try {
let filePath = `assets/AutoPath/${locationName}.json`;
await pathingScript.runFile(filePath);
sleep(2000);
return true;
} catch (error) {
log.error(`执行 ${locationName} 路径时发生错误`);
log.error(error.message);
}
return false;
}
async function AutoBuy(npc) {
let npc_name = NPC_list[npc].npc_name;
log.info(`自动寻路, 前往 ${npc_name} 所在`)
if (await AutoPath(NPC_list[npc].location_name)) {
await Spik(NPC_list[npc].spik_count);
log.info("已打开商店界面")
await QucikBuy(NPC_list[npc].item_count);
await sleep(1000);
await genshin.returnMainUi();
log.info(`${npc_name} 的商品购买完毕`)
} else {
log.error("寻路错误, 跳过购买任务")
};
}
(async function () {
// ==================== 加载NPC列表 ===================
try {
const NPCText = file.readTextSync("NPC_list.json");
NPC_list = JSON.parse(NPCText);
log.info("NPC信息加载完成");
} catch (e) {
log.error("NPC信息文件损坏脚本终止");
return;
}
//设置脚本环境的游戏分辨率和DPI缩放
setGameMetrics(2560, 1440, 1.5);
log.info("┌───────────────────────────────────────────────────┐");
log.info(" 在设置中勾选禁用的NPC.")
await sleep(400);
log.info(" 调试器添加脚本后, 右键脚本->修改JS脚本自定义配置.")
await sleep(400);
log.info(" 但是, BetterGI有Bug, 只能现实9个设置...")
await sleep(400);
log.info(" 要不, 你直接删掉不想要的NPC文件吧, 删除方法: ")
await sleep(400);
log.info(" JS脚本->打开目录->进入当前项目/assets/AutoPath文件夹")
await sleep(400);
log.info("└───────────────────────────────────────────────────┘")
await sleep(400);
try {
for (let key in NPC_list) {
let name = NPC_list[key].npc_name;
log.info(`======== 当前目标NPC: ${name} ========`);
await sleep(400);
if (settings[key]) {
log.info(` 玩家已标记, 跳过`);
continue;
};
if (NPC_list[key].daytimeOnly == 1) {
log.info("当前NPC只有白天才刷新, 调整时间");
await sleep(3000);
await setTime(9, 0);
} else if (NPC_list[key].daytimeOnly == 2) {
log.info("当前NPC只有晚上更合适, 调整时间");
await sleep(3000);
await setTime(20, 0);
}
await AutoBuy(key);
await sleep(2000);
};
} catch (e) {
log.error(`发生异常: ${e.message}`);
await sleep(3000);
} finally {
log.info("┌────────────────────────────┐")
log.info(" 感谢您的使用, 任务已全部完成")
log.info(" 拜拜")
log.info(" Done.")
log.info("└────────────────────────────┘")
}
})();