锄地小布丁+批发+团购风息花4.12 (#3112)

This commit is contained in:
2026-04-13 01:15:59 +08:00
committed by GitHub
parent f6c9fe0fc2
commit 63d5a2793e
29 changed files with 1428 additions and 248 deletions

View File

@@ -0,0 +1 @@
["assets\\ArtifactsPath\\普通98点2号线\\执行\\214璃月-轻策庄3.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\216璃月-珉林北4.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\218璃月-奥藏山右下2.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\220璃月-采浇谷4.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\221璃月-沉玉上谷神像东1.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\229璃月-沉玉谷灵濛山书洞3.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\401须弥-须弥城5.json","assets\\ArtifactsPath\\额外\\所有额外\\激活\\4须弥额外激活CD.json","assets\\ArtifactsPath\\额外\\所有额外\\激活\\5枫丹额外激活CD.json","assets\\ArtifactsPath\\额外\\所有额外\\激活\\6纳塔额外激活CD.json","assets\\ArtifactsPath\\额外\\所有额外\\激活\\98璃月层岩额外激活CD.json","assets\\ArtifactsPath\\优先收尾路线\\准备\\305【激活程序】稻妻-踏鞴砂狸猫炸药桶.json","assets\\ArtifactsPath\\额外\\所有额外\\准备\\000【复位程序】稻妻踏鞴砂大炮点.json","assets\\ArtifactsPath\\额外\\所有额外\\准备\\001【激活程序】稻妻大炮1.json","assets\\ArtifactsPath\\额外\\所有额外\\准备\\001【激活程序】稻妻大炮2.json","assets\\ArtifactsPath\\额外\\所有额外\\准备\\003【激活程序】纳塔-鸡鸡.json","assets\\ArtifactsPath\\优先收尾路线\\清怪\\305【清怪】稻妻-踏鞴砂.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\406须弥-卡萨扎莱宫南2.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\412须弥-阿如村3.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\413须弥-阿如村西2.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\415须弥-圣显厅北2.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\429须弥-花海锋刃林泽3.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\503枫丹-芒索斯山东麓2.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\505枫丹-科学院左沙滩2.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\514枫丹-莫尔泰神像3.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\520枫丹-自身之塔南3.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\521枫丹-白松镇3.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\603纳塔-悬木人声望2.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\619度假村传送过渡.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\620纳塔-悠悠集市南8.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\621纳塔-悠悠集市西南3.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\625纳塔-悠悠集市南3.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\631纳塔-悠悠集市西北5.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\633纳塔-彩彩崖东北5.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\635纳塔-呼呼丘3.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\636纳塔-呼呼丘西北沙滩3.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\638纳塔-浪浪湾8.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\641纳塔-刺梨岩1.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\646纳塔-刺梨岩内部乔克力宫2.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\703挪德卡莱-空寂走廊东南1.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\704挪德卡莱-月矩力设计局神像4.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\705挪德卡莱-月矩力设计局东1.json","assets\\ArtifactsPath\\普通98点2号线\\执行\\707挪德卡莱-虚海望神像2.json","assets\\ArtifactsPath\\优先收尾路线\\执行\\305【收尾】稻妻-踏鞴砂①-10.json","assets\\ArtifactsPath\\优先收尾路线\\执行\\305【收尾】稻妻-踏鞴砂②-7.json","assets\\ArtifactsPath\\优先收尾路线\\执行\\305【收尾】稻妻-踏鞴砂③-8.json","assets\\ArtifactsPath\\额外\\所有额外\\执行\\01【额外】稻妻-踏鞴砂大炮点5.json","assets\\ArtifactsPath\\额外\\所有额外\\执行\\02【额外】须弥-水天丛林7.json","assets\\ArtifactsPath\\额外\\所有额外\\执行\\03【额外】须弥-凡爷屋顶罐子1.json","assets\\ArtifactsPath\\额外\\所有额外\\执行\\04【额外】枫丹-科学院瓶子3.json","assets\\ArtifactsPath\\额外\\所有额外\\执行\\05【额外】纳塔-鸡屁股9.json","assets\\ArtifactsPath\\额外\\所有额外\\执行\\06【额外】纳塔-灵谜纹13.json","assets\\ArtifactsPath\\额外\\所有额外\\执行\\98【额外】璃月-层岩地下1.json"]

View File

@@ -9,7 +9,7 @@
"bgi_version": "0.45.0",
"description": "",
"enable_monster_loot_split": false,
"last_modified_time": 1764059087578,
"last_modified_time": 1776003122805,
"map_match_method": "",
"map_name": "Teyvat",
"name": "305【清怪】稻妻-踏鞴砂",
@@ -114,8 +114,8 @@
"id": 11,
"move_mode": "dash",
"type": "path",
"x": -3314.56640625,
"y": -3557.91015625
"x": -3299.580078125,
"y": -3560.787109375
}
]
}

View File

@@ -46,7 +46,7 @@
},
{
"action": "combat_script",
"action_params": "keypress(f),w(0.3),keypress(f),w(0.1),keypress(f),wait(0.2),keypress(f);万叶 attack(0.08),keydown(E),wait(0.48),keyup(E),attack(0.2),wait(0.5);琴 attack(0.08),keydown(E),wait(0.4),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,-3500),wait(1.8),keyup(E),wait(0.3),click(middle);",
"action_params": "keypress(f),w(0.3),keypress(f),wait(0.2),keypress(f),wait(0.2),keypress(f),wait(0.1);万叶 attack(0.08),keydown(E),wait(0.48),keyup(E),attack(0.2),wait(0.5);琴 attack(0.08),keydown(E),wait(0.4),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,-3500),wait(1.8),keyup(E),wait(0.3),click(middle);",
"id": 4,
"move_mode": "climb",
"type": "target",

View File

@@ -9,7 +9,7 @@
"bgi_version": "0.45.0",
"description": "",
"enable_monster_loot_split": false,
"last_modified_time": 1770278701597,
"last_modified_time": 1776002835504,
"map_match_method": "",
"map_name": "Teyvat",
"name": "522枫丹-水仙十字结社书馆2",
@@ -78,23 +78,22 @@
"id": 7,
"move_mode": "run",
"type": "path",
"x": 4194.8759765625,
"y": 3238.830810546875
"x": 4200.208984375,
"y": 3239.8115234375
},
{
"action": "",
"action_params": "",
"id": 8,
"move_mode": "walk",
"move_mode": "climb",
"type": "path",
"x": 4201.57275390625,
"y": 3233.929443359375
"x": 4201.8427734375,
"y": 3233.0859375
},
{
"action": "",
"action_params": "",
"id": 9,
"locked": false,
"move_mode": "climb",
"type": "orientation",
"x": 4199.11962890625,

View File

@@ -9,7 +9,7 @@
"bgi_version": "0.45.0",
"description": "",
"enable_monster_loot_split": false,
"last_modified_time": 1766670576398,
"last_modified_time": 1776003941780,
"map_match_method": "",
"map_name": "Teyvat",
"name": "221璃月-沉玉上谷神像东1",
@@ -41,8 +41,8 @@
"id": 3,
"move_mode": "swim",
"type": "target",
"x": 1153.9072265625,
"y": 1941.32861328125
"x": 1154.125,
"y": 1941.27197265625
}
]
}

View File

@@ -1,58 +1,58 @@
{
"info": {
"name": "304【清怪】稻妻-神无卓6",
"type": "collect",
"authors": [
{
"name": "",
"links": ""
"links": "",
"name": ""
}
],
"version": "1.0",
"description": "",
"map_name": "Teyvat",
"bgi_version": "0.45.0",
"tags": [],
"last_modified_time": 1755711727224,
"description": "",
"enable_monster_loot_split": false,
"map_match_method": ""
"last_modified_time": 1776003188553,
"map_match_method": "",
"map_name": "Teyvat",
"name": "304【清怪】稻妻-神无卓6",
"tags": [],
"type": "collect",
"version": "1.0"
},
"positions": [
{
"id": 1,
"action": "",
"action_params": "",
"id": 1,
"move_mode": "walk",
"type": "teleport",
"x": -3394.65625,
"y": -3555.20703125,
"action_params": ""
"y": -3555.20703125
},
{
"id": 2,
"x": -3410.072265625,
"y": -3553.2158203125,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 3,
"x": -3442.953125,
"y": -3571.88671875,
"type": "path",
"move_mode": "fly",
"action": "stop_flying",
"action_params": ""
},
{
"id": 4,
"x": -3465.5,
"y": -3576.642578125,
"type": "path",
"action_params": "",
"id": 2,
"move_mode": "dash",
"type": "path",
"x": -3410.072265625,
"y": -3553.2158203125
},
{
"action": "stop_flying",
"action_params": "",
"id": 3,
"move_mode": "fly",
"type": "path",
"x": -3442.953125,
"y": -3571.88671875
},
{
"action": "fight",
"action_params": ""
"action_params": "",
"id": 4,
"move_mode": "dash",
"type": "path",
"x": -3458.75,
"y": -3575.3751213740343
}
]
}

View File

@@ -9,7 +9,7 @@
"bgi_version": "0.45.0",
"description": "",
"enable_monster_loot_split": false,
"last_modified_time": 1764059087578,
"last_modified_time": 1776003122805,
"map_match_method": "",
"map_name": "Teyvat",
"name": "305【清怪】稻妻-踏鞴砂",
@@ -114,8 +114,8 @@
"id": 11,
"move_mode": "dash",
"type": "path",
"x": -3314.56640625,
"y": -3557.91015625
"x": -3299.580078125,
"y": -3560.787109375
}
]
}

View File

@@ -9,7 +9,7 @@
"bgi_version": "0.45.0",
"description": "",
"enable_monster_loot_split": false,
"last_modified_time": 1773815475561,
"last_modified_time": 1776002274087,
"map_match_method": "",
"map_name": "Teyvat",
"name": "626【多人】纳塔-悠悠集市西13",
@@ -256,6 +256,15 @@
"action": "",
"action_params": "",
"id": 27,
"move_mode": "jump",
"type": "path",
"x": 14104.529296875,
"y": 452.54443359375
},
{
"action": "",
"action_params": "",
"id": 28,
"move_mode": "dash",
"type": "path",
"x": 14100.10546875,
@@ -264,7 +273,7 @@
{
"action": "combat_script",
"action_params": "keypress(f),wait(0.2),keypress(f);万叶 attack(0.08),keydown(E),wait(0.7),keyup(E),attack(0.2);琴 attack(0.08),keydown(E),wait(0.4),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,-3500),wait(1.8),keyup(E),wait(0.3),click(middle);",
"id": 28,
"id": 29,
"move_mode": "climb",
"type": "target",
"x": 14100.10546875,
@@ -273,7 +282,7 @@
{
"action": "",
"action_params": "",
"id": 29,
"id": 30,
"move_mode": "climb",
"type": "path",
"x": 14102.3173828125,
@@ -282,7 +291,7 @@
{
"action": "combat_script",
"action_params": "keypress(f),wait(0.4);万叶 attack(0.08),keydown(E),wait(0.7),keyup(E),keydown(s),attack(0.2),keyup(s);琴 attack(0.08),keydown(E),wait(0.4),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,-3500),wait(1.8),keyup(E),wait(0.3),click(middle);",
"id": 30,
"id": 31,
"move_mode": "dash",
"type": "target",
"x": 14074.822265625,

View File

@@ -46,7 +46,7 @@
},
{
"action": "combat_script",
"action_params": "keypress(f),w(0.3),keypress(f),w(0.1),keypress(f),wait(0.2),keypress(f);万叶 attack(0.08),keydown(E),wait(0.48),keyup(E),attack(0.2),wait(0.5);琴 attack(0.08),keydown(E),wait(0.4),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,-3500),wait(1.8),keyup(E),wait(0.3),click(middle);",
"action_params": "keypress(f),w(0.3),keypress(f),wait(0.2),keypress(f),wait(0.2),keypress(f),wait(0.1);万叶 attack(0.08),keydown(E),wait(0.48),keyup(E),attack(0.2),wait(0.5);琴 attack(0.08),keydown(E),wait(0.4),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,-3500),wait(1.8),keyup(E),wait(0.3),click(middle);",
"id": 4,
"move_mode": "climb",
"type": "target",

View File

@@ -0,0 +1 @@
{}

View File

@@ -177,8 +177,54 @@ let lastsettimeTime = 0;
}
await writeRecord(accountName);
// 生成自动上线命令
await generateAutoOnlineCommand();
})();
// 生成自动上线命令
async function generateAutoOnlineCommand() {
if (settings.onlyActivate && state.runningEndingAndExtraRoute === "收尾额外A" && settings.autoOnline) {
try {
// 解析autoOnline字符串按-拆分
const autoOnlineParts = settings.autoOnline.split('-');
if (autoOnlineParts.length >= 3) {
const username = autoOnlineParts[0].trim();
const uid = autoOnlineParts[1].trim();
const room = autoOnlineParts[2].trim();
const notHost = false; // 固定为false
// 构造命令对象
const commandData = {
"mojiang-command": true,
"command": "online",
"params": {
"username": username,
"uid": uid,
"room": room,
"notHost": notHost
}
};
// 转换为JSON字符串
const jsonString = JSON.stringify(commandData, null, 2);
// 写入command.json文件
await file.writeText('command.json', jsonString, false);
log.info(`成功生成自动上线命令文件: command.json`);
log.info(`游戏名称: ${username}`);
log.info(`UID: ${uid}`);
log.info(`目标房间: ${room}`);
log.info(`是否不当房主: ${notHost}`);
} else {
log.warn(`autoOnline配置格式不正确需要至少包含游戏名称-UID-目标房间`);
}
} catch (error) {
log.error(`生成自动上线命令文件失败: ${error.message}`);
}
}
}
async function readRecord(accountName) {
/* ---------- 文件名合法性校验 ---------- */
const illegalCharacters = /[\\/:*?"<>|]/;

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 1,
"name": "AAA狗粮批发",
"version": "2.3.0",
"version": "2.3.1",
"tags": [
"狗粮"
],

View File

@@ -38,11 +38,6 @@
"type": "checkbox",
"label": "强制收尾路线交替执行"
},
{
"name": "onlyActivate",
"type": "checkbox",
"label": "只激活收尾和额外路线,不执行\n用于联机收尾获取更高收益\n【不跑联机狗粮别勾】"
},
{
"name": "fastMode",
"type": "checkbox",
@@ -96,5 +91,15 @@
"type": "input-text",
"label": "识别间隔(毫秒)\n两次检测f图标之间等待时间",
"default": "100"
},
{
"name": "onlyActivate",
"type": "checkbox",
"label": "只激活收尾和额外路线,不执行\n用于联机收尾获取更高收益\n【不跑联机狗粮别勾】"
},
{
"name": "autoOnline",
"type": "input-text",
"label": "自动上线,勾选上一个选项后生效\n尝试使用下面填写的游戏名称-uid-目标房间上线\n仅在需要跑联机时触发\n需要配合mojang使用\n如汐姐姐-114514-大澡堂\n【不跑联机狗粮别填】"
}
]

View File

@@ -1,25 +1 @@
## 琪零、功能及部分原理说明
1. 配合AAA狗粮批发实现联机收尾需要在AAA狗粮批发中勾选联机狗粮选项增加收尾路线数量获取更高收益
2. 支持半自动和全自动模式
3. 半自动模式手动进入后运行所有人手动进入世界后开启js队员将自动前往占位点房主将在识别到队员到位后按照人数执行对应的收尾路线并在结束后自动解散队伍
4. 全自动模式(按照下列配置自动进入并运行):参考下列配置配置好后,自动依次进入各个成员的世界
5. 原理在JS"AAA批发"中运行的神秘仪式,已将调查点刷新时间固定在那个时间了在明天4点重置前随意挑个时间都可以捡
## 芽一、使用方法及配置
1. 将脚本添加至调度器。
2. 右键点击脚本以修改 JS 自定义配置。
* **运行额外路线**:勾选后,处于单人世界时将执行额外路线,全自动模式下所有人的收尾路线完成后将回到自己世界执行额外路线
* **联机运行配置**找到至多不超过四个人组队参考运行时间双人2✖19分钟三人3✖40分钟四人4✖50分钟确定好每个成员的序号按照序号填写对应的uid和名称名称以申请进入世界界面为准如果存在特殊字符等难以识别的情况建议修改备注。更多细节可以加入qq群1057307824了解。
* **运行时使用队伍\&运行时使用角色的序号**:用于指定使用的角色,推荐的角色有:万叶/琴(吸取掉落物),迪希雅(传奇耐肘王)
* **路线选择**:非必要不建议更改,确实需要更改时建议多加尝试
* **调试时勾选,跳过路线执行逻辑** 用于调试初次组队时建议先找个时间勾选该选项运行一次确保流程正常后再全自动运行。此外当狗粮批发运行路线为收尾额外B时无法获取联机狗粮收益也可以勾选该选项来跳过你的路线节约时间。
## 三、其他建议
* **为万叶佩戴生命主词条或武器**多人运行时队伍中只有一个角色一旦角色死亡将进入复苏界面bgi暂时没有对该界面进行处理
* **ocr识别失败**等待队员进入世界时会识别申请列表中的名字部分设备或环境可能ocr效果不好当你发现无法正常让队友进入时可以截图申请进入的界面参考js文件夹中的targets文件夹中图片截图并裁剪只剩下名字部分后放入该文件夹
* **预留足够的背包空间**运行AAA狗粮批发将获取约150个圣遗物运行本js将获取约230个圣遗物请确保你的背包有足够的空间容纳这些圣遗物建议在AAA狗粮批发中选择分解或摧毁并预留380+的空间
* 不看github issue只接受通过qq反馈
联机群985946536

View File

@@ -9,7 +9,7 @@
"bgi_version": "0.45.0",
"description": "",
"enable_monster_loot_split": false,
"last_modified_time": 1765368085921,
"last_modified_time": 1775389614875,
"map_match_method": "",
"map_name": "Teyvat",
"name": "624【收尾】纳塔-悠悠集市③-11",
@@ -127,13 +127,13 @@
"y": 402.28759765625
},
{
"action": "combat_script",
"action_params": "keydown(Q),keypress(f),wait(0.8),keypress(f),keyup(Q),wait(0.1),j",
"action": "",
"action_params": "",
"id": 13,
"move_mode": "walk",
"type": "path",
"x": 13982.4375,
"y": 401.5609285513674
"x": 13982.6220703125,
"y": 404.330078125
},
{
"action": "",
@@ -145,63 +145,54 @@
"y": 389.4951171875
},
{
"action": "",
"action_params": "",
"action": "combat_script",
"action_params": "wait(0.4)",
"id": 15,
"move_mode": "run",
"type": "path",
"x": 13950.189453125,
"y": 384.017578125
},
{
"action": "combat_script",
"action_params": "keypress(f);万叶 attack(0.08),keydown(E),wait(0.7),keyup(E),keydown(s),attack(0.2),keyup(s),wait(1.8);琴 attack(0.08),keydown(E),wait(0.4),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,-3500),wait(1.8),keyup(E),wait(0.3),click(middle);",
"id": 16,
"move_mode": "climb",
"type": "target",
"x": 13947.2314453125,
"y": 382.4501953125
},
{
"action": "",
"action_params": "",
"id": 17,
"move_mode": "climb",
"type": "path",
"x": 13949.64453125,
"y": 384.25439453125
},
{
"action": "combat_script",
"action_params": "keypress(f),wait(0.2),keypress(f),wait(0.2),keypress(f),wait(0.2),keypress(f),wait(0.2),keypress(f);万叶 attack(0.08),keydown(E),wait(0.7),keyup(E),keydown(s),attack(0.2),keyup(s),wait(1);琴 attack(0.08),keydown(E),wait(0.4),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,-3500),wait(1.8),keyup(E),wait(0.3),click(middle);",
"id": 18,
"move_mode": "climb",
"type": "target",
"x": 13943.5732421875,
"y": 388.24951171875
},
{
"action": "",
"action_params": "",
"id": 19,
"move_mode": "run",
"type": "path",
"x": 13960.90625,
"y": 391.6565598631105
},
{
"action": "combat_script",
"action_params": "keypress(f);万叶 attack(0.08),keydown(E),wait(0.7),keyup(E),attack(0.2);琴 attack(0.08),keydown(E),wait(0.4),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,-3500),wait(1.8),keyup(E),wait(0.3),click(middle);",
"id": 20,
"move_mode": "dash",
"type": "target",
"x": 13964.7353515625,
"y": 393.1123046875
"x": 13946.7861328125,
"y": 382.31298828125
},
{
"action": "",
"action_params": "",
"id": 21,
"id": 16,
"move_mode": "jump",
"type": "path",
"x": 13948.3154296875,
"y": 388.31103515625
},
{
"action": "combat_script",
"action_params": "keydown(Q),keypress(f),wait(0.8),keypress(f),keyup(Q),wait(0.1),j,wait(0.4);万叶 attack(0.08),keydown(E),wait(0.7),keyup(E),keydown(s),attack(0.2),keyup(s),wait(1);琴 attack(0.08),keydown(E),wait(0.4),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,-3500),wait(1.8),keyup(E),wait(0.3),click(middle);",
"id": 17,
"move_mode": "climb",
"type": "target",
"x": 13943.0078125,
"y": 388.13232421875
},
{
"action": "",
"action_params": "",
"id": 18,
"move_mode": "dash",
"type": "path",
"x": 13956.84375,
"y": 390.9376744751744
},
{
"action": "combat_script",
"action_params": "keypress(f),wait(0.2),keypress(f),wait(0.2),keypress(f);万叶 attack(0.08),keydown(E),wait(0.7),keyup(E),attack(0.2);琴 attack(0.08),keydown(E),wait(0.4),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,-3500),wait(1.8),keyup(E),wait(0.3),click(middle);",
"id": 19,
"move_mode": "dash",
"type": "target",
"x": 13964.3818359375,
"y": 394.38134765625
},
{
"action": "",
"action_params": "",
"id": 20,
"move_mode": "climb",
"type": "path",
"x": 13969.43359375,
@@ -210,7 +201,7 @@
{
"action": "",
"action_params": "",
"id": 22,
"id": 21,
"move_mode": "climb",
"type": "target",
"x": 13965.6875,
@@ -219,7 +210,7 @@
{
"action": "",
"action_params": "",
"id": 23,
"id": 22,
"move_mode": "dash",
"type": "path",
"x": 13956.70703125,
@@ -228,7 +219,7 @@
{
"action": "",
"action_params": "",
"id": 24,
"id": 23,
"move_mode": "climb",
"type": "target",
"x": 13957.240234375,
@@ -237,7 +228,7 @@
{
"action": "combat_script",
"action_params": "keypress(f),wait(0.2),keypress(f),wait(0.2),keypress(f)",
"id": 25,
"id": 24,
"move_mode": "dash",
"type": "target",
"x": 13948.0263671875,
@@ -246,7 +237,7 @@
{
"action": "combat_script",
"action_params": "keypress(f),s(0.25);万叶 attack(0.08),keydown(E),wait(0.48),keyup(E),attack(0.2);琴 attack(0.08),keydown(E),wait(0.4),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,-3500),wait(1.8),keyup(E),wait(0.3),click(middle);",
"id": 26,
"id": 25,
"move_mode": "dash",
"type": "target",
"x": 13953.4462890625,
@@ -255,7 +246,7 @@
{
"action": "combat_script",
"action_params": "w(0.1);万叶 keydown(w),wait(0.2),j,wait(0.1),keyup(w),wait(0.5),attack(0.08),keydown(E),wait(0.7),keyup(E),attack(0.2);琴 keydown(w),wait(0.2),j,wait(0.1),keyup(w),wait(0.5),attack(0.08),keydown(E),wait(0.4),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,-3500),wait(1.8),keyup(E),wait(0.3),click(middle);",
"id": 27,
"id": 26,
"move_mode": "dash",
"type": "target",
"x": 13952.3701171875,

View File

@@ -9,7 +9,7 @@
"bgi_version": "0.45.0",
"description": "",
"enable_monster_loot_split": false,
"last_modified_time": 1773815475561,
"last_modified_time": 1776002274087,
"map_match_method": "",
"map_name": "Teyvat",
"name": "626【多人】纳塔-悠悠集市西13",
@@ -256,6 +256,15 @@
"action": "",
"action_params": "",
"id": 27,
"move_mode": "jump",
"type": "path",
"x": 14104.529296875,
"y": 452.54443359375
},
{
"action": "",
"action_params": "",
"id": 28,
"move_mode": "dash",
"type": "path",
"x": 14100.10546875,
@@ -264,7 +273,7 @@
{
"action": "combat_script",
"action_params": "keypress(f),wait(0.2),keypress(f);万叶 attack(0.08),keydown(E),wait(0.7),keyup(E),attack(0.2);琴 attack(0.08),keydown(E),wait(0.4),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,-3500),wait(1.8),keyup(E),wait(0.3),click(middle);",
"id": 28,
"id": 29,
"move_mode": "climb",
"type": "target",
"x": 14100.10546875,
@@ -273,7 +282,7 @@
{
"action": "",
"action_params": "",
"id": 29,
"id": 30,
"move_mode": "climb",
"type": "path",
"x": 14102.3173828125,
@@ -282,7 +291,7 @@
{
"action": "combat_script",
"action_params": "keypress(f),wait(0.4);万叶 attack(0.08),keydown(E),wait(0.7),keyup(E),keydown(s),attack(0.2),keyup(s);琴 attack(0.08),keydown(E),wait(0.4),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,0),wait(0.2),moveby(1000,-3500),wait(1.8),keyup(E),wait(0.3),click(middle);",
"id": 30,
"id": 31,
"move_mode": "dash",
"type": "target",
"x": 14074.822265625,

View File

@@ -9,7 +9,7 @@
"bgi_version": "0.45.0",
"description": "",
"enable_monster_loot_split": false,
"last_modified_time": 1771828606585,
"last_modified_time": 1774890427031,
"map_match_method": "",
"map_name": "Teyvat",
"name": "629【多人】纳塔-悠悠集市西北岸8",
@@ -204,8 +204,8 @@
"id": 21,
"move_mode": "dash",
"type": "target",
"x": 14058.787109375,
"y": 544.890625
"x": 14058.0068359375,
"y": 544.3740234375
},
{
"action": "",
@@ -222,8 +222,8 @@
"id": 23,
"move_mode": "climb",
"type": "target",
"x": 14018.7900390625,
"y": 580.296875
"x": 14018.1416015625,
"y": 580.37646484375
}
]
}

View File

@@ -0,0 +1,328 @@
{
"info": {
"authors": [
{
"links": "",
"name": "汐"
}
],
"bgi_version": "0.60.0",
"description": "",
"enable_monster_loot_split": false,
"last_modified_time": 1775931842019,
"map_match_method": "SIFT",
"map_name": "Teyvat",
"name": "01蒙德-风车镇-风息花14",
"tags": [],
"type": "collect",
"version": "1.0"
},
"positions": [
{
"action": "",
"action_params": "",
"id": 1,
"move_mode": "walk",
"type": "teleport",
"x": -154.2578125,
"y": 3085.71484375
},
{
"action": "",
"action_params": "",
"id": 2,
"move_mode": "dash",
"type": "path",
"x": -159.580078125,
"y": 3111.01806640625
},
{
"action": "",
"action_params": "",
"id": 3,
"move_mode": "walk",
"type": "path",
"x": -170.0625,
"y": 3126.87255859375
},
{
"action": "",
"action_params": "",
"id": 4,
"move_mode": "dash",
"type": "path",
"x": -171.634765625,
"y": 3130.38232421875
},
{
"action": "",
"action_params": "",
"id": 5,
"move_mode": "walk",
"type": "path",
"x": -197.11328125,
"y": 3122.0908203125
},
{
"action": "",
"action_params": "",
"id": 6,
"move_mode": "dash",
"type": "path",
"x": -200.015625,
"y": 3121.40087890625
},
{
"action": "",
"action_params": "",
"id": 7,
"move_mode": "walk",
"type": "path",
"x": -202.005859375,
"y": 3120.66162109375
},
{
"action": "",
"action_params": "",
"id": 8,
"move_mode": "walk",
"type": "path",
"x": -202.630859375,
"y": 3122.60205078125
},
{
"action": "",
"action_params": "",
"id": 9,
"move_mode": "walk",
"type": "path",
"x": -201.212890625,
"y": 3124.7734375
},
{
"action": "",
"action_params": "",
"id": 10,
"move_mode": "dash",
"type": "path",
"x": -196.59375,
"y": 3128.59375
},
{
"action": "",
"action_params": "",
"id": 11,
"move_mode": "walk",
"type": "path",
"x": -193.767578125,
"y": 3131.50830078125
},
{
"action": "",
"action_params": "",
"id": 12,
"move_mode": "dash",
"type": "path",
"x": -193.21875,
"y": 3158.61376953125
},
{
"action": "",
"action_params": "",
"id": 13,
"move_mode": "walk",
"type": "path",
"x": -190.515625,
"y": 3156.7666015625
},
{
"action": "combat_script",
"action_params": "wait(0.4)",
"id": 14,
"move_mode": "dash",
"type": "path",
"x": -172.021484375,
"y": 3146.56103515625
},
{
"action": "",
"action_params": "",
"id": 15,
"move_mode": "dash",
"type": "path",
"x": -169.623046875,
"y": 3161.44775390625
},
{
"action": "",
"action_params": "",
"id": 16,
"move_mode": "walk",
"type": "path",
"x": -168.677734375,
"y": 3164.3837890625
},
{
"action": "",
"action_params": "",
"id": 17,
"move_mode": "dash",
"type": "path",
"x": -162.927734375,
"y": 3165.20458984375
},
{
"action": "",
"action_params": "",
"id": 18,
"move_mode": "walk",
"type": "path",
"x": -158.90625,
"y": 3165.51220703125
},
{
"action": "",
"action_params": "",
"id": 19,
"move_mode": "dash",
"type": "path",
"x": -148.806640625,
"y": 3155.06640625
},
{
"action": "",
"action_params": "",
"id": 20,
"move_mode": "walk",
"type": "path",
"x": -147.375,
"y": 3151.56298828125
},
{
"action": "",
"action_params": "",
"id": 21,
"move_mode": "walk",
"type": "path",
"x": -146.986328125,
"y": 3150.498046875
},
{
"action": "",
"action_params": "",
"id": 22,
"move_mode": "walk",
"type": "path",
"x": -147.099609375,
"y": 3147.529296875
},
{
"action": "",
"action_params": "",
"id": 23,
"move_mode": "walk",
"type": "path",
"x": -148.30859375,
"y": 3143.3056640625
},
{
"action": "",
"action_params": "",
"id": 24,
"move_mode": "walk",
"type": "path",
"x": -148.958984375,
"y": 3139.326171875
},
{
"action": "",
"action_params": "",
"id": 25,
"move_mode": "dash",
"type": "path",
"x": -142.943359375,
"y": 3141.85546875
},
{
"action": "",
"action_params": "",
"id": 26,
"move_mode": "walk",
"type": "path",
"x": -140.791015625,
"y": 3144.00390625
},
{
"action": "",
"action_params": "",
"id": 27,
"move_mode": "dash",
"type": "path",
"x": -128.169921875,
"y": 3158.7197265625
},
{
"action": "",
"action_params": "",
"id": 28,
"move_mode": "walk",
"type": "path",
"x": -125.6640625,
"y": 3157.6123046875
},
{
"action": "",
"action_params": "",
"id": 29,
"move_mode": "dash",
"type": "path",
"x": -127.7265625,
"y": 3148.60888671875
},
{
"action": "",
"action_params": "",
"id": 30,
"move_mode": "walk",
"type": "path",
"x": -127.984375,
"y": 3145.05419921875
},
{
"action": "",
"action_params": "",
"id": 31,
"move_mode": "walk",
"type": "path",
"x": -122.77734375,
"y": 3147.244140625
},
{
"action": "",
"action_params": "",
"id": 32,
"move_mode": "walk",
"type": "path",
"x": -120.064453125,
"y": 3145.3818359375
},
{
"action": "",
"action_params": "",
"id": 33,
"move_mode": "walk",
"type": "path",
"x": -120.158203125,
"y": 3142.64697265625
},
{
"action": "combat_script",
"action_params": "wait(0.4)",
"id": 34,
"move_mode": "walk",
"type": "path",
"x": -119.861328125,
"y": 3140.26513671875
}
]
}

View File

@@ -0,0 +1,247 @@
{
"info": {
"authors": [
{
"links": "",
"name": "汐"
}
],
"bgi_version": "0.60.0",
"description": "",
"enable_monster_loot_split": false,
"last_modified_time": 1775932248582,
"map_match_method": "SIFT",
"map_name": "Teyvat",
"name": "02蒙德-风车镇-风息花10",
"tags": [],
"type": "collect",
"version": "1.0"
},
"positions": [
{
"action": "",
"action_params": "",
"id": 1,
"move_mode": "walk",
"type": "teleport",
"x": -154.62890625,
"y": 3085.7900390625
},
{
"action": "",
"action_params": "",
"id": 2,
"move_mode": "dash",
"type": "path",
"x": -165.208984375,
"y": 3073.70361328125
},
{
"action": "",
"action_params": "",
"id": 3,
"move_mode": "dash",
"type": "path",
"x": -173.830078125,
"y": 3072.68408203125
},
{
"action": "",
"action_params": "",
"id": 4,
"move_mode": "walk",
"type": "path",
"x": -176.919921875,
"y": 3071.86962890625
},
{
"action": "",
"action_params": "",
"id": 5,
"move_mode": "dash",
"type": "path",
"x": -180.05859375,
"y": 3061.87060546875
},
{
"action": "",
"action_params": "",
"id": 6,
"move_mode": "walk",
"type": "path",
"x": -181.09375,
"y": 3058.96923828125
},
{
"action": "",
"action_params": "",
"id": 7,
"move_mode": "dash",
"type": "path",
"x": -182.953125,
"y": 3052.927734375
},
{
"action": "",
"action_params": "",
"id": 8,
"move_mode": "walk",
"type": "path",
"x": -180.525390625,
"y": 3051.326171875
},
{
"action": "",
"action_params": "",
"id": 9,
"move_mode": "dash",
"type": "path",
"x": -164.447265625,
"y": 3043.1357421875
},
{
"action": "",
"action_params": "",
"id": 10,
"move_mode": "walk",
"type": "path",
"x": -160.873046875,
"y": 3041.068359375
},
{
"action": "",
"action_params": "",
"id": 11,
"move_mode": "dash",
"type": "path",
"x": -171.564453125,
"y": 3035.43017578125
},
{
"action": "",
"action_params": "",
"id": 12,
"move_mode": "dash",
"type": "path",
"x": -197.916015625,
"y": 3037.7998046875
},
{
"action": "",
"action_params": "",
"id": 13,
"move_mode": "walk",
"type": "path",
"x": -197.81640625,
"y": 3034.27978515625
},
{
"action": "",
"action_params": "",
"id": 14,
"move_mode": "dash",
"type": "path",
"x": -198.208984375,
"y": 3021.7451171875
},
{
"action": "",
"action_params": "",
"id": 15,
"move_mode": "walk",
"type": "path",
"x": -199.138671875,
"y": 3018.8251953125
},
{
"action": "",
"action_params": "",
"id": 16,
"move_mode": "dash",
"type": "path",
"x": -202.37109375,
"y": 3008.55908203125
},
{
"action": "",
"action_params": "",
"id": 17,
"move_mode": "walk",
"type": "path",
"x": -204.228515625,
"y": 3004.79833984375
},
{
"action": "",
"action_params": "",
"id": 18,
"move_mode": "walk",
"type": "path",
"x": -204.16796875,
"y": 3004.74658203125
},
{
"action": "",
"action_params": "",
"id": 19,
"move_mode": "walk",
"type": "path",
"x": -206.501953125,
"y": 3001.43310546875
},
{
"action": "",
"action_params": "",
"id": 20,
"move_mode": "dash",
"type": "path",
"x": -222.021484375,
"y": 3022.8017578125
},
{
"action": "",
"action_params": "",
"id": 21,
"move_mode": "walk",
"type": "path",
"x": -223.615234375,
"y": 3025.2890625
},
{
"action": "",
"action_params": "",
"id": 22,
"move_mode": "dash",
"type": "path",
"x": -230.73828125,
"y": 3034.4326171875
},
{
"action": "",
"action_params": "",
"id": 23,
"move_mode": "walk",
"type": "path",
"x": -232.609375,
"y": 3037.60546875
},
{
"action": "",
"action_params": "",
"id": 24,
"move_mode": "dash",
"type": "path",
"x": -222.8203125,
"y": 3041.7197265625
},
{
"action": "combat_script",
"action_params": "wait(1.5)",
"id": 25,
"move_mode": "walk",
"type": "path",
"x": -220.318359375,
"y": 3041.07861328125
}
]
}

View File

@@ -0,0 +1 @@
{}

View File

@@ -1,6 +1,9 @@
const runExtra = settings.runExtra || false;
const leaveTeamRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/leaveTeam.png"));
const scrollRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/拾取滚轮.png"), 1017, 496, 1093 - 581, 581 - 496);
const kick2pRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/kickButton.png"), 1520, 277, 230, 120);
const kick3pRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/kickButton.png"), 1520, 400, 230, 120);
const kick4pRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/kickButton.png"), 1520, 527, 230, 120);
let targetItems;
let pickupDelay = 100;
let timeMove = 1000;
@@ -22,12 +25,21 @@ let TMthreshold = +settings.TMthreshold || 0.9;
let doRunExtra = false;
let expGain;
let skipRunning = false;
let crashType = null; // 记录炸车类型
let rideTime = new Date().toISOString(); // 记录上车时间
let runnedEnding = false;
let onlineRecord = {
lastRunTime: new Date(0).toISOString(),
todayRecords: []
};
(async function () {
setGameMetrics(1920, 1080, 1);
dispatcher.AddTrigger(new RealtimeTimer("AutoSkip"));
// 读取运行记录
await readOnlineRecord();
if (settings.logName) {
expGain = await processArtifacts();
moraGain = await mora();
@@ -35,11 +47,46 @@ let runnedEnding = false;
await genshin.tpToStatueOfTheSeven();
await switchPartyIfNeeded(settings.partyName);
targetItems = await loadTargetItems();
if (settings.groupMode != "按照下列配置自动进入运行") {
if (settings.groupMode === "动进入运行") {
await genshin.clearPartyCache();
await runGroupPurchasing(runExtra);
}
if (settings.groupMode != "动进入运行") {
} else {
if (settings.groupMode === "按照下列配置自动进入运行") {
//直接使用自定义配置
} else {
//使用json文件覆写自定义配置
const jsonPath = "匹配信息.json";
try {
const jsonStr = file.ReadTextSync(jsonPath);
const jsonConfig = JSON.parse(jsonStr);
log.info(`成功读取并解析JSON配置文件: ${jsonPath}`);
// 设置yourIndex
if (jsonConfig.myPosition) {
settings.yourIndex = jsonConfig.myPosition;
log.info(`从JSON配置中设置yourIndex为: ${settings.yourIndex}`);
}
// 生成runningOrder固定为"1",只给第一个人跑)
if (jsonConfig.teamMembers && Array.isArray(jsonConfig.teamMembers)) {
const sortedMembers = jsonConfig.teamMembers.sort((a, b) => parseInt(a.position) - parseInt(b.position));
const runningOrder = "1"; // 固定为"1",只给第一个人跑
settings.runningOrder = runningOrder;
log.info(`从JSON配置中设置runningOrder为: ${settings.runningOrder}`);
// 设置每个位置的UID和Name
sortedMembers.forEach(member => {
const pos = member.position;
settings[`p${pos}UID`] = member.uid;
settings[`p${pos}Name`] = member.username;
log.info(`设置${pos}号玩家: ${member.username} (${member.uid})`);
});
}
} catch (error) {
log.error(`读取或解析JSON配置文件失败: ${error.message}`);
throw new Error(`JSON配置文件错误: ${error.message}`);
}
}
//解析与输出自定义配置
const raw = settings.runningOrder || "1234";
if (!/^[1-4]+$/.test(raw)) {
@@ -106,14 +153,18 @@ let runnedEnding = false;
notification.send(`将要进入序号${idx}uid为${settings[`p${idx}UID`]},名称为${settings[`p${idx}Name`]}的世界`);
}
let attempts = 0;
let enterSuccess = false;
while (attempts < 5) {
attempts++;
await autoEnter(autoEnterSettings);
enterSuccess = await autoEnter(autoEnterSettings);
//队员加入后要检查房主名称
if (autoEnterSettings.enterMode === "进入他人世界" && attempts != 5) {
if (await checkP1Name(settings[`p${idx}Name`])) {
if (enterSuccess && await checkP1Name(settings[`p${idx}Name`])) {
notification.send(`成功进入序号${idx}uid为${settings[`p${idx}UID`]},名称为${settings[`p${idx}Name`]}的世界`);
break;
} else if (!enterSuccess) {
log.error(`尝试加入序号${idx}uid为${settings[`p${idx}UID`]},名称为${settings[`p${idx}Name`]}的世界失败`);
break;
} else {
//进入了错误的世界,退出世界并重新加入,最后一次不检查
await sleep(1000);
@@ -144,6 +195,7 @@ let runnedEnding = false;
if (settings.runExtra && doRunExtra) {
await runGroupPurchasing(runExtra);
}
}
await genshin.tpToStatueOfTheSeven();
@@ -154,13 +206,28 @@ let runnedEnding = false;
const segments = settings.onlyRunPerfectly.split('');
// 逐段输出每段间隔1秒
const outputContent = [];
outputContent.push(`本次运行启用并触发了强迫症模式,且未完成收尾路线需要重新上线`);
for (const segment of segments) {
if (segment.trim()) { // 跳过空段落
log.info(segment.trim());
outputContent.push(segment.trim());
await sleep(1000);
}
}
// 写入运行结果.txt
try {
file.WriteTextSync('运行结果.txt', outputContent.join('\n'));
log.info(`已将运行结果写入运行结果.txt`);
} catch (error) {
log.error(`写入运行结果.txt失败: ${error.message}`);
}
await sleep(10000);
// 处理运行记录和重新上线
await handleOnlineRecordAndReonline(true, crashType);
return;
}
@@ -175,6 +242,11 @@ let runnedEnding = false;
{
log.info(`本次运行未启用或未触发强迫症模式,正常结束`);
// 准备输出内容
const outputContent = [];
outputContent.push(`本次运行未启用或未触发强迫症模式,正常结束`);
if (settings.normalEnding) {
// 按中文分号分割字符串
const segments = settings.normalEnding.split('');
@@ -183,10 +255,22 @@ let runnedEnding = false;
for (const segment of segments) {
if (segment.trim()) { // 跳过空段落
log.info(segment.trim());
outputContent.push(segment.trim());
await sleep(1000);
}
}
}
// 写入运行结果.txt
try {
file.WriteTextSync('运行结果.txt', outputContent.join('\n'));
log.info(`已将运行结果写入运行结果.txt`);
} catch (error) {
log.error(`写入运行结果.txt失败: ${error.message}`);
}
// 处理运行记录和重新上线
await handleOnlineRecordAndReonline(false);
}
}
)();
@@ -239,14 +323,55 @@ async function runGroupPurchasing(runExtra) {
notification.send(`强迫症模式启用中,队友不齐或未及时到位,跳过所有路线`);
await sleep(10000);
} else {
for (let i = 1; i <= totalNumber; i++) await runEndingPath(i);
let kick2pSuccess = true; // 标记2p是否成功踢人
for (let i = 1; i <= totalNumber; i++) {
await runEndingPath(i);
// 执行第2和第3组路线后如果设置了preKick则踢人
if (i === 2 || i === 3) {
if (settings.preKick) {
// 调用findTotalNumber()获取当前人数
const currentTotalNumber = await findTotalNumber();
let shouldKick = false;
let expectedNumber = i === 2 ? 4 : 3;
// 检查是否符合预期人数
if (i === 2 && currentTotalNumber === expectedNumber) {
shouldKick = true;
} else if (i === 3 && currentTotalNumber === expectedNumber && kick2pSuccess) {
shouldKick = true;
}
// 只有人数不符合预期时才通知
if (currentTotalNumber !== expectedNumber) {
const errorMsg = `执行${i}P路线后与预期人数不符当前人数${currentTotalNumber},预期人数:${expectedNumber}`;
log.error(errorMsg);
notification.error(errorMsg);
if (i === 2) kick2pSuccess = false;
} else if (i === 2) {
// 2P人数符合预期标记踢人成功
kick2pSuccess = true;
}
// 执行踢人逻辑
if (shouldKick) {
log.info(`执行${i}P路线后踢出对应占位号`);
await findAndClick(kick2pRo);
await sleep(500);
await findAndClick(confirmKickRo);
}
// 无论是否踢人,都返回主界面
await genshin.returnMainUi();
}
}
}
}
let kickAttempts = 0;
while (kickAttempts < 10) {
kickAttempts++;
await genshin.returnMainUi();
await keyPress("F2");
await sleep(2000);
await sleep(500);
await findAndClick(kickAllRo);
await sleep(500);
await findAndClick(confirmKickRo);
@@ -343,6 +468,7 @@ async function runGroupPurchasing(runExtra) {
log.warn("等待队友就绪超时");
if (settings.onlyRunPerfectly) {
skipRunning = true;
crashType = "waitForPlayersArrive"; // 情况2房主超时未等到所有队员到达预期坐标
doRunExtra = false;
}
return false;
@@ -371,35 +497,49 @@ async function runGroupPurchasing(runExtra) {
await genshin.moveMapTo(Math.round(point.x), Math.round(point.y));
/* 2. 取图标屏幕坐标 */
const pos = await getPlayerIconPos(i);
if (!pos || !pos.found) return false;
/* 3. 屏幕坐标 → 地图坐标(图标)*/
const mapZoomLevel = 2.0;
await genshin.setBigMapZoomLevel(mapZoomLevel);
const mapScaleFactor = 2.361;
const center = genshin.getPositionFromBigMap(); // 仅用于坐标系转换
const iconScreenX = pos.x;
const iconScreenY = pos.y;
/* 计算距离的内置函数 */
function calculateDistance(iconScreenX, iconScreenY, center) {
const iconMapX = (960 - iconScreenX) * mapZoomLevel / mapScaleFactor + center.x;
const iconMapY = (540 - iconScreenY) * mapZoomLevel / mapScaleFactor + center.y;
const dx = iconMapX - point.x;
const dy = iconMapY - point.y;
return Math.sqrt(dx * dx + dy * dy);
}
const iconMapX = (960 - iconScreenX) * mapZoomLevel / mapScaleFactor + center.x;
const iconMapY = (540 - iconScreenY) * mapZoomLevel / mapScaleFactor + center.y;
/* 1. 第一次:使用目标点位作为中心点 */
await genshin.setBigMapZoomLevel(mapZoomLevel);
await sleep(500);
const pos1 = await getPlayerIconPos(i);
if (!pos1 || !pos1.found) return false;
let dist = calculateDistance(pos1.x, pos1.y, { x: point.x, y: point.y });
log.info(`玩家 ${i}P 第1次检查(目标点位中心): 距离 ${dist.toFixed(2)} m`);
if (dist <= 20) return true;
/* 4. 计算“图标地图坐标”与“目标点位”的距离 */
const dx = iconMapX - point.x;
const dy = iconMapY - point.y;
const dist = Math.sqrt(dx * dx + dy * dy);
/* 2-4次使用屏幕中心点坐标 */
for (let attempt = 2; attempt <= 4; attempt++) {
if (attempt > 2) {
await sleep(500);
}
/* 5. 打印两种坐标及距离 */
log.info(`玩家 ${i}P`);
log.info(`├─ 屏幕坐标: (${iconScreenX}, ${iconScreenY})`);
log.info(`├─ 图标地图坐标: (${iconMapX.toFixed(2)}, ${iconMapY.toFixed(2)})`);
log.info(`├─ 目标点位坐标: (${point.x}, ${point.y})`);
log.info(`└─ 图标与目标点位距离: ${dist.toFixed(2)} m`);
await genshin.setBigMapZoomLevel(mapZoomLevel);
const pos = await getPlayerIconPos(i);
if (!pos || !pos.found) return false;
return dist <= 10; // 10 m 阈值,可按需调整
try {
dist = calculateDistance(pos.x, pos.y, genshin.getPositionFromBigMap());
log.info(`玩家 ${i}P 第${attempt}次检查(屏幕中心点): 距离 ${dist.toFixed(2)} m`);
if (dist <= 20) return true;
} catch (e) {
log.warn(`玩家 ${i}P 第${attempt}次检查失败: ${e.message}`);
}
}
log.info(`玩家 ${i}P 4次检查均未通过阈值20m`);
return false;
} catch (error) {
log.error(error.message);
return false;
@@ -649,6 +789,7 @@ async function autoEnter(autoEnterSettings) {
let enterCount = 0;
let targetsRo = [];
let enteredPlayers = [];
let success = false;
// ===== 初始化 =====
setGameMetrics(1920, 1080, 1);
@@ -674,6 +815,7 @@ async function autoEnter(autoEnterSettings) {
await sleep(500);
if (playerSign > 1) {
log.info(`加入成功,队伍编号 ${playerSign}`);
success = true;
break;
} else if (playerSign === -1) {
log.warn("队伍编号识别异常尝试按0p处理");
@@ -713,7 +855,7 @@ async function autoEnter(autoEnterSettings) {
await genshin.returnMainUi();
}
}
// 检查时间点,触发额外检测
const elapsed = new Date() - start;
const timePoints = [0.2, 0.4, 0.6, 0.8, 0.9];
@@ -726,7 +868,7 @@ async function autoEnter(autoEnterSettings) {
break;
}
}
// 继续执行,不在这里结束循环,由统一检查部分处理
if (await isYUI()) keyPress("VK_ESCAPE"); await sleep(500);
await genshin.returnMainUi();
@@ -778,11 +920,22 @@ async function autoEnter(autoEnterSettings) {
}
if (new Date() - start >= timeout * 60 * 1000) {
log.warn("超时未达到预定人数");
notification.error(`超时未达到预定人数`);
if (settings.onlyRunPerfectly) {
skipRunning = true;
doRunExtra = false;
if (enterMode === "进入他人世界") {
log.warn("队员超时未能进入房主世界");
notification.error(`队员超时未能进入房主世界`);
if (settings.onlyRunPerfectly) {
skipRunning = true;
crashType = "playerTimeoutEnterWorld"; // 情况3队员超时未能进入房主世界
doRunExtra = false;
}
} else {
log.warn("超时未达到预定人数");
notification.error(`超时未达到预定人数`);
if (settings.onlyRunPerfectly) {
skipRunning = true;
crashType = "waitForExpectedPlayers"; // 情况1房主超时未等到预期人数
doRunExtra = false;
}
}
}
@@ -829,6 +982,8 @@ async function autoEnter(autoEnterSettings) {
return hit;
} catch { return null; }
}
return success;
}
//切换队伍
@@ -1035,10 +1190,7 @@ async function findTotalNumber() {
await keyPress("F2");
await sleep(2000);
// 定义模板
const kick2pRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/kickButton.png"), 1520, 277, 230, 120);
const kick3pRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/kickButton.png"), 1520, 400, 230, 120);
const kick4pRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/kickButton.png"), 1520, 527, 230, 120);
// 使用全局定义模板
moveMouseTo(1555, 860); // 防止鼠标干扰
const gameRegion = captureGameRegion();
@@ -1693,4 +1845,367 @@ async function hasScroll(maxDuration = 10) {
}
/* 超时仍未识别到,返回失败 */
return false;
}
// 读取运行记录
async function readOnlineRecord() {
const logName = settings.logName || "默认账户";
const recordFilePath = `records/${logName}.json`;
try {
const recordStr = await file.readText(recordFilePath);
const record = JSON.parse(recordStr);
// 检查是否同一天北京时间凌晨4点分界
const lastRunTime = new Date(record.lastRunTime);
const now = new Date();
const isSameDay = isSameDayBeijing(lastRunTime, now);
if (!isSameDay) {
log.info(`上次运行时间与当前时间不在同一天,清空记录`);
onlineRecord = {
lastRunTime: new Date(0).toISOString(),
todayRecords: []
};
} else {
onlineRecord = record;
log.info(`成功读取运行记录,上次运行时间: ${onlineRecord.lastRunTime}`);
log.info(`今日运行记录数: ${onlineRecord.todayRecords.length}`);
}
} catch (error) {
log.warn(`读取运行记录文件失败: ${error.message},使用默认信息`);
onlineRecord = {
lastRunTime: new Date(0).toISOString(),
todayRecords: []
};
}
}
// 写入运行记录
async function writeOnlineRecord(isCrash) {
try {
// 读取匹配信息.json
const jsonPath = "匹配信息.json";
const jsonStr = file.ReadTextSync(jsonPath);
const jsonConfig = JSON.parse(jsonStr);
// 根据myPosition判断是否是房主修正notHost值
const isHost = parseInt(jsonConfig.myPosition) === 1;
const correctedOnlineInfo = {
...jsonConfig.onlineInfo,
notHost: !isHost // 如果是房主notHost应为false如果不是房主notHost应为true
};
// 构造本次运行记录
const record = {
onlineInfo: correctedOnlineInfo,
isCrash: isCrash,
endTime: new Date().toISOString()
};
// 添加到今日记录
onlineRecord.todayRecords.push(record);
onlineRecord.lastRunTime = new Date().toISOString();
// 写入文件
const logName = settings.logName || "默认账户";
const recordFilePath = `records/${logName}.json`;
await file.writeText(recordFilePath, JSON.stringify(onlineRecord, null, 2), false);
log.info(`成功写入运行记录文件: ${recordFilePath}`);
log.info(`本次运行${isCrash ? '炸车' : '正常结束'},结束时间: ${record.endTime}`);
log.info(`本次运行${isHost ? '是房主' : '不是房主'}记录的notHost值为: ${correctedOnlineInfo.notHost}`);
} catch (error) {
log.error(`写入运行记录文件失败: ${error.message}`);
}
}
// 处理运行记录和重新上线
async function handleOnlineRecordAndReonline(isCrash, crashType = null) {
// 写入本次运行记录到文件
await writeOnlineRecord(isCrash);
await sleep(1000);
// 如果是炸车,直接重新上线
if (isCrash) {
log.info(`炸车后重新上线,不消耗次数`);
await generateReonlineCommand(null, true, crashType);
return;
}
// 读取匹配信息.json获取本次的onlineInfo
let onlineInfo = null;
let jsonConfig = null;
try {
const jsonPath = "匹配信息.json";
const jsonStr = file.ReadTextSync(jsonPath);
jsonConfig = JSON.parse(jsonStr);
onlineInfo = jsonConfig.onlineInfo;
} catch (error) {
log.error(`读取匹配信息.json失败: ${error.message}`);
return;
}
// 正常结束,检查是否需要重新上线
const autoReonline = parseInt(settings.autoReonline) || 0;
// 计算正常运行的次数(不包含炸车的记录)
const normalRunCount = onlineRecord.todayRecords.filter(record => !record.isCrash).length;
log.info(`今日正常运行次数: ${normalRunCount},预定重新上线次数: ${autoReonline}`);
// 检查是否所有运行记录(不含炸车)均未当过房主
const hasBeenHost = onlineRecord.todayRecords.some(record =>
!record.isCrash && record.onlineInfo && !record.onlineInfo.notHost
);
log.info(`今日是否当过房主: ${hasBeenHost}`);
// 条件1运行次数未达标
const needReonlineByCount = normalRunCount < autoReonline;
// 条件2未当过房主
const needReonlineByHost = !hasBeenHost;
// 停止重新上线的条件:达到预定次数且当过房主
const shouldStopReonline = normalRunCount >= autoReonline && hasBeenHost;
if (shouldStopReonline) {
log.info(`今日上线次数已达到预定次数且当过房主,不再重新上线`);
// 如果settings.afterOneDragon存在单独启动该一条龙
if (settings.afterOneDragon) {
await generateOneDragonCommand(settings.afterOneDragon);
}
} else if (autoReonline > 0) {
log.info(`满足重新上线条件:${needReonlineByCount ? '次数未达标' : ''} ${needReonlineByCount && needReonlineByHost ? '且' : ''} ${needReonlineByHost ? '未当过房主' : ''}`);
let reonlineInfo = { ...onlineInfo };
// 根据用户明确的逻辑设置notHost
// 1. 如果上次上线勾选了不当房主,继续使用不当房主上线
if (onlineInfo.notHost) {
reonlineInfo.notHost = true;
log.info(`上次上线勾选了不当房主,继续使用不当房主上线`);
}
// 2. 如果当过了房主,则使用勾选不当房主
else if (hasBeenHost) {
reonlineInfo.notHost = true;
log.info(`今日已当过房主,使用勾选不当房主上线`);
}
// 3. 如果没当过房主,且匹配信息中没有勾选不当房主,则继续使用不勾选不当房主上线
else {
reonlineInfo.notHost = false;
log.info(`今日未当过房主,且上次未勾选不当房主,继续使用不勾选不当房主上线`);
}
// 生成重新上线命令
await generateReonlineCommand(reonlineInfo, false, null);
} else {
log.info(`autoReonline设置为0不执行自动重新上线`);
// 如果settings.afterOneDragon存在单独启动该一条龙
if (settings.afterOneDragon) {
await generateOneDragonCommand(settings.afterOneDragon);
}
}
}
// 生成重新上线命令
async function generateReonlineCommand(onlineInfo = null, isCrash = false, crashType = null) {
try {
// 如果没有提供onlineInfo则从匹配信息.json中读取
if (!onlineInfo) {
const jsonPath = "匹配信息.json";
const jsonStr = file.ReadTextSync(jsonPath);
const jsonConfig = JSON.parse(jsonStr);
onlineInfo = jsonConfig.onlineInfo;
}
// 构造命令对象
const commandData = {
"mojiang-command": true
};
// 如果是炸车
if (isCrash) {
// 情况2房主超时未等到所有队员到达预期坐标 - 无需报告,直接上线和启动一条龙
if (crashType === "waitForPlayersArrive") {
// 第一个指令:上线
commandData["command"] = "online";
commandData["params"] = {
"username": onlineInfo.gameName,
"uid": onlineInfo.uid,
"room": onlineInfo.targetRoom,
"notHost": onlineInfo.notHost
};
// 第二个指令:启动等待一条龙(如果存在)
if (settings.waitingOneDragon) {
commandData["command*"] = "start-dragon";
commandData["params*"] = {
"dragonName": settings.waitingOneDragon
};
log.info(`添加启动一条龙指令: ${settings.waitingOneDragon}`);
}
log.info(`情况2炸车直接上线和启动一条龙`);
}
// 其他情况:需要报告炸车信息、上线、启动等待一条龙
else {
// 读取完整的匹配信息.json获取teamMembers
let jsonConfig = null;
let teamMembers = [];
try {
const jsonPath = "匹配信息.json";
const jsonStr = file.ReadTextSync(jsonPath);
jsonConfig = JSON.parse(jsonStr);
teamMembers = jsonConfig.teamMembers || [];
} catch (error) {
log.error(`读取匹配信息.json失败: ${error.message}`);
}
// 构造crashInfo
let crashInfo = {};
if (crashType === "waitForExpectedPlayers") {
// 情况1房主超时未等到预期人数
// 说明自己在队伍中编号,成功进入的人如实写,没成功进入的人也如实写
crashInfo = {
"myPosition": jsonConfig ? jsonConfig.myPosition : "1",
"enteredPlayers": onlineInfo.enteredPlayers || [],
"notEnteredPlayers": onlineInfo.notEnteredPlayers || []
};
} else if (crashType === "waitForPlayersArrive") {
// 情况2房主超时未等到所有队员到达预期坐标
// 说明自己在队伍中编号,成功进入的人留空,没成功进入的人写自己
crashInfo = {
"myPosition": jsonConfig ? jsonConfig.myPosition : "1",
"enteredPlayers": [],
"notEnteredPlayers": [onlineInfo.gameName]
};
} else {
// 情况3队员超时未能进入房主世界
// 说明自己在队伍中编号,成功进入的人如实写,没成功进入的人也如实写
crashInfo = {
"myPosition": jsonConfig ? jsonConfig.myPosition : "1",
"enteredPlayers": [],
"notEnteredPlayers": []
};
}
// 第一个指令:报告炸车信息
commandData["command"] = "report-crash";
commandData["params"] = {
"crashType": crashType || "超时",
"rideTime": rideTime,
"rideMembers": teamMembers,
"crashInfo": crashInfo,
"rideIdentifier": onlineInfo.rideIdentifier || "" // 添加发车标识
};
// 第二个指令:上线
commandData["command*"] = "online";
commandData["params*"] = {
"username": onlineInfo.gameName,
"uid": onlineInfo.uid,
"room": onlineInfo.targetRoom,
"notHost": onlineInfo.notHost
};
// 第三个指令:启动等待一条龙(如果存在)
if (settings.waitingOneDragon) {
commandData["command**"] = "start-dragon";
commandData["params**"] = {
"dragonName": settings.waitingOneDragon
};
log.info(`添加启动一条龙指令: ${settings.waitingOneDragon}`);
}
log.info(`添加炸车报告指令`);
}
}
// 如果不是炸车但settings.waitingOneDragon存在添加启动一条龙指令
else if (settings.waitingOneDragon) {
commandData["command"] = "online";
commandData["params"] = {
"username": onlineInfo.gameName,
"uid": onlineInfo.uid,
"room": onlineInfo.targetRoom,
"notHost": onlineInfo.notHost
};
commandData["command*"] = "start-dragon";
commandData["params*"] = {
"dragonName": settings.waitingOneDragon
};
log.info(`添加启动一条龙指令: ${settings.waitingOneDragon}`);
}
// 正常情况:只上线
else {
commandData["command"] = "online";
commandData["params"] = {
"username": onlineInfo.gameName,
"uid": onlineInfo.uid,
"room": onlineInfo.targetRoom,
"notHost": onlineInfo.notHost
};
}
// 转换为JSON字符串
const jsonString = JSON.stringify(commandData, null, 2);
// 写入command.json文件
await file.writeText('command.json', jsonString, false);
log.info(`成功生成重新上线命令文件: command.json`);
log.info(`游戏名称: ${onlineInfo.gameName}`);
log.info(`UID: ${onlineInfo.uid}`);
log.info(`目标房间: ${onlineInfo.targetRoom}`);
log.info(`是否不当房主: ${onlineInfo.notHost}`);
if (isCrash) {
if (crashType === "waitForPlayersArrive") {
log.info(`情况2炸车直接上线和启动一条龙`);
} else {
log.info(`添加了炸车报告指令`);
}
} else if (settings.waitingOneDragon) {
log.info(`启动一条龙: ${settings.waitingOneDragon}`);
}
} catch (error) {
log.error(`生成重新上线命令文件失败: ${error.message}`);
}
}
// 生成启动一条龙命令
async function generateOneDragonCommand(dragonName) {
try {
// 构造命令对象
const commandData = {
"mojiang-command": true,
"command": "start-dragon",
"params": {
"dragonName": dragonName
}
};
// 转换为JSON字符串
const jsonString = JSON.stringify(commandData, null, 2);
// 写入command.json文件
await file.writeText('command.json', jsonString, false);
log.info(`成功生成启动一条龙命令文件: command.json`);
log.info(`启动一条龙: ${dragonName}`);
} catch (error) {
log.error(`生成启动一条龙命令文件失败: ${error.message}`);
}
}
// 判断两个时间是否为同一天北京时间凌晨4点分界
function isSameDayBeijing(date1, date2) {
const offset = 8 * 60 * 60 * 1000; // 北京时间UTC+8的偏移量
const boundary = 4 * 60 * 60 * 1000; // 凌晨4点
const time1 = date1.getTime() + offset;
const time2 = date2.getTime() + offset;
const day1 = Math.floor((time1 - boundary) / (24 * 60 * 60 * 1000));
const day2 = Math.floor((time2 - boundary) / (24 * 60 * 60 * 1000));
return day1 === day2;
}

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 1,
"name": "AAA狗粮联机团购",
"version": "1.14.3",
"version": "2.0.0",
"tags": [
"狗粮"
],

View File

@@ -24,13 +24,35 @@
"type": "input-text",
"label": "正常运行结束后间隔一秒输出按中文分号;分隔的内容"
},
{
"name": "autoReonline",
"type": "input-text",
"label": "自动重新上线\n运行联机结束后自动使用匹配信息.json中的信息重新在mojang上线\n填写所需的最小上线次数\n炸车后重新上线不消耗次数,正常当房主跑完一次后自动改为不当房主\n需要使用该功能时填4否则填0",
"default": "0"
},
{
"name": "preKick",
"type": "checkbox",
"label": "完成2/3p路线后提前踢出2/3p"
},
{
"name": "waitingOneDragon",
"type": "input-text",
"label": "联机等待一条龙名称,炸车或正常结束后重新上线时启动该一条龙进行等待\n需要配合mojang使用"
},
{
"name": "afterOneDragon",
"type": "input-text",
"label": "联机后一条龙名称,正常结束后且不再重新上线时启动该一条龙\n需要配合mojang使用"
},
{
"name": "groupMode",
"type": "select",
"label": "#############################################\n联机运行配置\n\n运行模式",
"options": [
"手动进入后运行",
"按照下列配置自动进入并运行"
"按照下列配置自动进入并运行",
"使用JSON配置文件"
],
"default": "手动进入后运行"
},
@@ -85,6 +107,11 @@
"type": "input-text",
"label": "4号的名称以游戏内实际显示为准有备注时填备注名"
},
{
"name": "jsonConfigPath",
"type": "input-text",
"label": "JSON配置文件路径\n选择'使用JSON配置文件'模式时填写\n相对路径或绝对路径匹配信息.json"
},
{
"name": "notify",
"type": "checkbox",

View File

@@ -0,0 +1,32 @@
{
"myPosition": "3",
"teamMembers": [
{
"username": "示例名称1",
"uid": "123456789",
"position": "1"
},
{
"username": "示例名称2",
"uid": "234567890",
"position": "2"
},
{
"username": "示例名称3",
"uid": "345678901",
"position": "3"
},
{
"username": "示例名称4",
"uid": "456789012",
"position": "4"
}
],
"onlineInfo": {
"gameName": "示例名称3",
"uid": "345678901",
"targetRoom": "大澡堂",
"notHost": true,
"rideIdentifier": "2026-04-08-大澡堂-1"
}
}

View File

@@ -12,7 +12,7 @@
"last_modified_time": 1774279450618,
"map_match_method": "",
"map_name": "Teyvat",
"name": "B001挪德卡莱-拉斯科尔尼科夫 传奇",
"name": "G001挪德卡莱-拉斯科尔尼科夫 传奇",
"tags": [],
"type": "collect",
"version": "1.0"

View File

@@ -11,7 +11,7 @@
"description": " 路线信息该路线预计用时61.47秒包含以下怪物1只遗迹重机。",
"enable_monster_loot_split": false,
"hash_res": "84542485",
"last_modified_time": 1774445651337,
"last_modified_time": 1775927590782,
"map_match_method": "",
"map_name": "Teyvat",
"name": "D012须弥沙漠沙虫隧道",
@@ -53,8 +53,8 @@
"id": 4,
"move_mode": "dash",
"type": "path",
"x": 4658.17578125,
"y": -996.7021484375
"x": 4649.369140625,
"y": -1003.609375
}
]
}

View File

@@ -9,7 +9,7 @@
"bgi_version": "0.45.0",
"description": " 路线信息该路线预计用时131.36秒包含以下怪物1只遗迹重机、2只遗迹巡弋者、0.5只伸缩风蕈兽。",
"enable_monster_loot_split": false,
"last_modified_time": 1773245413429,
"last_modified_time": 1775927178227,
"map_match_method": "",
"map_name": "Teyvat",
"name": "D013【沙暴】须弥沙漠三运河之地",
@@ -50,7 +50,7 @@
{
"action": "",
"action_params": "",
"id": 3,
"id": 4,
"move_mode": "walk",
"type": "teleport",
"x": 5173.60302734375,
@@ -59,7 +59,7 @@
{
"action": "stop_flying",
"action_params": "",
"id": 4,
"id": 5,
"move_mode": "fly",
"type": "path",
"x": 5162.541015625,
@@ -68,16 +68,16 @@
{
"action": "fight",
"action_params": "",
"id": 5,
"id": 6,
"move_mode": "dash",
"type": "path",
"x": 5152.812393347761,
"y": -527.9367269438635
"x": 5155.25,
"y": -528.7499696564919
},
{
"action": "",
"action_params": "",
"id": 6,
"id": 7,
"move_mode": "dash",
"type": "path",
"x": 5146.248356765498,
@@ -86,7 +86,7 @@
{
"action": "",
"action_params": "",
"id": 7,
"id": 8,
"move_mode": "jump",
"type": "path",
"x": 5139.562377547429,
@@ -95,7 +95,7 @@
{
"action": "fight",
"action_params": "",
"id": 8,
"id": 9,
"move_mode": "dash",
"type": "path",
"x": 5085.9853515625,

View File

@@ -11,7 +11,7 @@
"description": " 路线信息该路线预计用时85.72秒包含以下怪物1只黑蛇骑士·斩风之剑。",
"enable_monster_loot_split": false,
"hash_res": "58938884",
"last_modified_time": 1774340007451,
"last_modified_time": 1775998811313,
"map_match_method": "",
"map_name": "TheChasm",
"name": "ZB020璃月层岩地下狭光道西",
@@ -33,7 +33,7 @@
"action": "",
"action_params": "",
"id": 2,
"move_mode": "dash",
"move_mode": "run",
"type": "path",
"x": 1201.25,
"y": 523.3699999999999
@@ -53,8 +53,8 @@
"id": 4,
"move_mode": "dash",
"type": "path",
"x": 1150.7880859375,
"y": 453.1937255859375
"x": 1143.277587890625,
"y": 427.2767333984375
},
{
"action": "",
@@ -62,8 +62,8 @@
"id": 5,
"move_mode": "dash",
"type": "path",
"x": 1141.8287353515625,
"y": 425.6412353515625
"x": 1133.625,
"y": 375.5316065362251
},
{
"action": "",
@@ -71,44 +71,26 @@
"id": 6,
"move_mode": "dash",
"type": "path",
"x": 1133.6722412109375,
"y": 375.852783203125
},
{
"action": "",
"action_params": "",
"id": 7,
"move_mode": "dash",
"type": "path",
"x": 1115.956787109375,
"y": 368.720458984375
},
{
"action": "",
"action_params": "",
"id": 8,
"move_mode": "walk",
"id": 7,
"move_mode": "dash",
"type": "path",
"x": 1099.4421797061873,
"y": 376.5022937904687
},
{
"action": "",
"action_params": "",
"id": 9,
"move_mode": "walk",
"type": "path",
"x": 1083,
"y": 384.25
"x": 1079.475341796875,
"y": 364.6087646484375
},
{
"action": "fight",
"action_params": "",
"id": 10,
"id": 8,
"move_mode": "dash",
"type": "path",
"x": 1068.55,
"y": 377.52
"x": 1067.9388427734375,
"y": 382.093505859375
}
]
}

View File

@@ -10,7 +10,7 @@
"description": " 路线信息该路线预计用时65.85秒包含以下怪物1只愚人众特辖队·支援兵、1只愚人众特辖队·先锋士、1只愚人众特辖队·火刃突击队、2只巡陆艇·尖端全能攻坚型。",
"enable_monster_loot_split": false,
"hash_res": "75306089",
"last_modified_time": 1767367971274,
"last_modified_time": 1775929937104,
"map_match_method": "",
"map_name": "Teyvat",
"name": "G011挪德卡莱月矩力设计局东南-1",
@@ -41,19 +41,30 @@
"action": "fight",
"action_params": "",
"id": 3,
"locked": false,
"move_mode": "dash",
"type": "path",
"x": 9501.1982421875,
"y": 3091.154296875
},
{
"action": "fight",
"action_params": "",
"id": 4,
"locked": false,
"move_mode": "dash",
"type": "path",
"x": 9507.9736328125,
"y": 3098.14208984375
},
{
"action": "combat_script",
"action_params": "wait(1)",
"id": 4,
"id": 5,
"move_mode": "dash",
"type": "orientation",
"x": 9501.1982421875,
"y": 3091.154296875
"type": "path",
"x": 9507.9736328125,
"y": 3098.14208984375
}
]
}