[JS脚本]购买食材-自动购物 (#397)

* 注销系统用户的js脚本

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

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

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

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

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

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

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

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

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

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

自动食材加工, 可自动获取加工完成食材,可指定制作食材
This commit is contained in:
听雨♪
2025-03-06 20:52:28 +08:00
committed by GitHub
parent e38d258be8
commit 6a07c4c1c3
23 changed files with 1495 additions and 0 deletions

229
repo/js/买菜/main.js Normal file
View File

@@ -0,0 +1,229 @@
// 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("└────────────────────────────┘")
}
})();