From 63d5a2793e6012f72636d6ac520b7334758acca1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B1=90?= <121607261+jiegedabaobei@users.noreply.github.com> Date: Mon, 13 Apr 2026 01:15:59 +0800 Subject: [PATCH] =?UTF-8?q?=E9=94=84=E5=9C=B0=E5=B0=8F=E5=B8=83=E4=B8=81+?= =?UTF-8?q?=E6=89=B9=E5=8F=91+=E5=9B=A2=E8=B4=AD=E9=A3=8E=E6=81=AF?= =?UTF-8?q?=E8=8A=B14.12=20(#3112)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AAA-Artifacts-Bulk-Supply/CDInfo/mno.json | 1 + .../清怪/305【清怪】稻妻-踏鞴砂.json | 6 +- .../执行/502枫丹-黎翡区神像3.json | 2 +- .../执行/522枫丹-水仙十字结社书馆2.json | 13 +- .../执行/221璃月-沉玉上谷神像东1.json | 6 +- .../清怪/304【清怪】稻妻-神无卓6.json | 70 +-- .../优先收尾路线/清怪/305【清怪】稻妻-踏鞴砂.json | 6 +- .../01普通/626【多人】纳塔-悠悠集市西13.json | 17 +- .../高铁2号线/01普通/502枫丹-黎翡区神像3.json | 2 +- .../js/AAA-Artifacts-Bulk-Supply/command.json | 1 + repo/js/AAA-Artifacts-Bulk-Supply/main.js | 46 ++ .../AAA-Artifacts-Bulk-Supply/manifest.json | 2 +- .../AAA-Artifacts-Bulk-Supply/settings.json | 15 +- repo/js/ArtifactsGroupPurchasing/README.md | 26 +- .../执行/624【收尾】纳塔-悠悠集市③-11.json | 113 ++-- .../执行/626【多人】纳塔-悠悠集市西13.json | 17 +- .../执行/629【多人】纳塔-悠悠集市西北岸8.json | 10 +- .../风息花/执行/01蒙德-风车镇-风息花14.json | 328 ++++++++++ .../风息花/执行/02蒙德-风车镇-风息花10.json | 247 ++++++++ repo/js/ArtifactsGroupPurchasing/command.json | 1 + repo/js/ArtifactsGroupPurchasing/main.js | 593 ++++++++++++++++-- .../js/ArtifactsGroupPurchasing/manifest.json | 2 +- .../js/ArtifactsGroupPurchasing/settings.json | 29 +- .../js/ArtifactsGroupPurchasing/匹配信息.json | 32 + ...夫 传奇.json => G001挪德卡莱-拉斯科尔尼科夫 传奇.json} | 2 +- .../pathing/0-汐酱/D012须弥沙漠沙虫隧道.json | 6 +- .../D013【沙暴】须弥沙漠三运河之地.json | 18 +- .../0-汐酱/ZB020璃月层岩地下狭光道西.json | 44 +- .../G011挪德卡莱月矩力设计局东南-1.json | 21 +- 29 files changed, 1428 insertions(+), 248 deletions(-) create mode 100644 repo/js/AAA-Artifacts-Bulk-Supply/CDInfo/mno.json create mode 100644 repo/js/AAA-Artifacts-Bulk-Supply/command.json create mode 100644 repo/js/ArtifactsGroupPurchasing/assets/ArtifactsPath/风息花/执行/01蒙德-风车镇-风息花14.json create mode 100644 repo/js/ArtifactsGroupPurchasing/assets/ArtifactsPath/风息花/执行/02蒙德-风车镇-风息花10.json create mode 100644 repo/js/ArtifactsGroupPurchasing/command.json create mode 100644 repo/js/ArtifactsGroupPurchasing/匹配信息.json rename repo/js/AutoHoeingOneDragon/pathing/0-传奇/{B001挪德卡莱-拉斯科尔尼科夫 传奇.json => G001挪德卡莱-拉斯科尔尼科夫 传奇.json} (93%) diff --git a/repo/js/AAA-Artifacts-Bulk-Supply/CDInfo/mno.json b/repo/js/AAA-Artifacts-Bulk-Supply/CDInfo/mno.json new file mode 100644 index 000000000..4554da121 --- /dev/null +++ b/repo/js/AAA-Artifacts-Bulk-Supply/CDInfo/mno.json @@ -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"] \ No newline at end of file diff --git a/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/优先收尾路线/清怪/305【清怪】稻妻-踏鞴砂.json b/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/优先收尾路线/清怪/305【清怪】稻妻-踏鞴砂.json index f98ffdf13..e9e9d3546 100644 --- a/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/优先收尾路线/清怪/305【清怪】稻妻-踏鞴砂.json +++ b/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/优先收尾路线/清怪/305【清怪】稻妻-踏鞴砂.json @@ -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 } ] } \ No newline at end of file diff --git a/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/普通98点1号线/执行/502枫丹-黎翡区神像3.json b/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/普通98点1号线/执行/502枫丹-黎翡区神像3.json index aaa708b7c..917eee6ce 100644 --- a/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/普通98点1号线/执行/502枫丹-黎翡区神像3.json +++ b/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/普通98点1号线/执行/502枫丹-黎翡区神像3.json @@ -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", diff --git a/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/普通98点1号线/执行/522枫丹-水仙十字结社书馆2.json b/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/普通98点1号线/执行/522枫丹-水仙十字结社书馆2.json index ad5076a18..0e85078a7 100644 --- a/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/普通98点1号线/执行/522枫丹-水仙十字结社书馆2.json +++ b/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/普通98点1号线/执行/522枫丹-水仙十字结社书馆2.json @@ -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, diff --git a/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/普通98点2号线/执行/221璃月-沉玉上谷神像东1.json b/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/普通98点2号线/执行/221璃月-沉玉上谷神像东1.json index bc23852f8..11df14320 100644 --- a/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/普通98点2号线/执行/221璃月-沉玉上谷神像东1.json +++ b/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/普通98点2号线/执行/221璃月-沉玉上谷神像东1.json @@ -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 } ] } \ No newline at end of file diff --git a/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/联机收尾/优先收尾路线/清怪/304【清怪】稻妻-神无卓6.json b/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/联机收尾/优先收尾路线/清怪/304【清怪】稻妻-神无卓6.json index 2330e14fc..d6fcd47fa 100644 --- a/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/联机收尾/优先收尾路线/清怪/304【清怪】稻妻-神无卓6.json +++ b/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/联机收尾/优先收尾路线/清怪/304【清怪】稻妻-神无卓6.json @@ -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 } ] } \ No newline at end of file diff --git a/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/联机收尾/优先收尾路线/清怪/305【清怪】稻妻-踏鞴砂.json b/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/联机收尾/优先收尾路线/清怪/305【清怪】稻妻-踏鞴砂.json index f98ffdf13..e9e9d3546 100644 --- a/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/联机收尾/优先收尾路线/清怪/305【清怪】稻妻-踏鞴砂.json +++ b/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/联机收尾/优先收尾路线/清怪/305【清怪】稻妻-踏鞴砂.json @@ -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 } ] } \ No newline at end of file diff --git a/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/高铁/高铁1号线/01普通/626【多人】纳塔-悠悠集市西13.json b/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/高铁/高铁1号线/01普通/626【多人】纳塔-悠悠集市西13.json index f2ef82720..0bc5880d8 100644 --- a/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/高铁/高铁1号线/01普通/626【多人】纳塔-悠悠集市西13.json +++ b/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/高铁/高铁1号线/01普通/626【多人】纳塔-悠悠集市西13.json @@ -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, diff --git a/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/高铁/高铁2号线/01普通/502枫丹-黎翡区神像3.json b/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/高铁/高铁2号线/01普通/502枫丹-黎翡区神像3.json index aaa708b7c..917eee6ce 100644 --- a/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/高铁/高铁2号线/01普通/502枫丹-黎翡区神像3.json +++ b/repo/js/AAA-Artifacts-Bulk-Supply/assets/ArtifactsPath/高铁/高铁2号线/01普通/502枫丹-黎翡区神像3.json @@ -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", diff --git a/repo/js/AAA-Artifacts-Bulk-Supply/command.json b/repo/js/AAA-Artifacts-Bulk-Supply/command.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/repo/js/AAA-Artifacts-Bulk-Supply/command.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/repo/js/AAA-Artifacts-Bulk-Supply/main.js b/repo/js/AAA-Artifacts-Bulk-Supply/main.js index 2d6576f3c..f3ef51770 100644 --- a/repo/js/AAA-Artifacts-Bulk-Supply/main.js +++ b/repo/js/AAA-Artifacts-Bulk-Supply/main.js @@ -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 = /[\\/:*?"<>|]/; diff --git a/repo/js/AAA-Artifacts-Bulk-Supply/manifest.json b/repo/js/AAA-Artifacts-Bulk-Supply/manifest.json index 80d335d5a..97419006d 100644 --- a/repo/js/AAA-Artifacts-Bulk-Supply/manifest.json +++ b/repo/js/AAA-Artifacts-Bulk-Supply/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "AAA狗粮批发", - "version": "2.3.0", + "version": "2.3.1", "tags": [ "狗粮" ], diff --git a/repo/js/AAA-Artifacts-Bulk-Supply/settings.json b/repo/js/AAA-Artifacts-Bulk-Supply/settings.json index 3760a858e..1e466c31c 100644 --- a/repo/js/AAA-Artifacts-Bulk-Supply/settings.json +++ b/repo/js/AAA-Artifacts-Bulk-Supply/settings.json @@ -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【不跑联机狗粮别填】" } ] \ No newline at end of file diff --git a/repo/js/ArtifactsGroupPurchasing/README.md b/repo/js/ArtifactsGroupPurchasing/README.md index 62f709b7c..7cb6cdf26 100644 --- a/repo/js/ArtifactsGroupPurchasing/README.md +++ b/repo/js/ArtifactsGroupPurchasing/README.md @@ -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 \ No newline at end of file diff --git a/repo/js/ArtifactsGroupPurchasing/assets/ArtifactsPath/度假村/执行/624【收尾】纳塔-悠悠集市③-11.json b/repo/js/ArtifactsGroupPurchasing/assets/ArtifactsPath/度假村/执行/624【收尾】纳塔-悠悠集市③-11.json index 636b0eae0..c6feb8905 100644 --- a/repo/js/ArtifactsGroupPurchasing/assets/ArtifactsPath/度假村/执行/624【收尾】纳塔-悠悠集市③-11.json +++ b/repo/js/ArtifactsGroupPurchasing/assets/ArtifactsPath/度假村/执行/624【收尾】纳塔-悠悠集市③-11.json @@ -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, diff --git a/repo/js/ArtifactsGroupPurchasing/assets/ArtifactsPath/度假村/执行/626【多人】纳塔-悠悠集市西13.json b/repo/js/ArtifactsGroupPurchasing/assets/ArtifactsPath/度假村/执行/626【多人】纳塔-悠悠集市西13.json index f2ef82720..0bc5880d8 100644 --- a/repo/js/ArtifactsGroupPurchasing/assets/ArtifactsPath/度假村/执行/626【多人】纳塔-悠悠集市西13.json +++ b/repo/js/ArtifactsGroupPurchasing/assets/ArtifactsPath/度假村/执行/626【多人】纳塔-悠悠集市西13.json @@ -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, diff --git a/repo/js/ArtifactsGroupPurchasing/assets/ArtifactsPath/度假村/执行/629【多人】纳塔-悠悠集市西北岸8.json b/repo/js/ArtifactsGroupPurchasing/assets/ArtifactsPath/度假村/执行/629【多人】纳塔-悠悠集市西北岸8.json index 55753d64c..4be6efee7 100644 --- a/repo/js/ArtifactsGroupPurchasing/assets/ArtifactsPath/度假村/执行/629【多人】纳塔-悠悠集市西北岸8.json +++ b/repo/js/ArtifactsGroupPurchasing/assets/ArtifactsPath/度假村/执行/629【多人】纳塔-悠悠集市西北岸8.json @@ -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 } ] } \ No newline at end of file diff --git a/repo/js/ArtifactsGroupPurchasing/assets/ArtifactsPath/风息花/执行/01蒙德-风车镇-风息花14.json b/repo/js/ArtifactsGroupPurchasing/assets/ArtifactsPath/风息花/执行/01蒙德-风车镇-风息花14.json new file mode 100644 index 000000000..4f134e5dd --- /dev/null +++ b/repo/js/ArtifactsGroupPurchasing/assets/ArtifactsPath/风息花/执行/01蒙德-风车镇-风息花14.json @@ -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 + } + ] +} \ No newline at end of file diff --git a/repo/js/ArtifactsGroupPurchasing/assets/ArtifactsPath/风息花/执行/02蒙德-风车镇-风息花10.json b/repo/js/ArtifactsGroupPurchasing/assets/ArtifactsPath/风息花/执行/02蒙德-风车镇-风息花10.json new file mode 100644 index 000000000..5588578fa --- /dev/null +++ b/repo/js/ArtifactsGroupPurchasing/assets/ArtifactsPath/风息花/执行/02蒙德-风车镇-风息花10.json @@ -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 + } + ] +} \ No newline at end of file diff --git a/repo/js/ArtifactsGroupPurchasing/command.json b/repo/js/ArtifactsGroupPurchasing/command.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/repo/js/ArtifactsGroupPurchasing/command.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/repo/js/ArtifactsGroupPurchasing/main.js b/repo/js/ArtifactsGroupPurchasing/main.js index c699d3583..d61badc3c 100644 --- a/repo/js/ArtifactsGroupPurchasing/main.js +++ b/repo/js/ArtifactsGroupPurchasing/main.js @@ -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; } \ No newline at end of file diff --git a/repo/js/ArtifactsGroupPurchasing/manifest.json b/repo/js/ArtifactsGroupPurchasing/manifest.json index 02c28884f..0b0e97da1 100644 --- a/repo/js/ArtifactsGroupPurchasing/manifest.json +++ b/repo/js/ArtifactsGroupPurchasing/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "AAA狗粮联机团购", - "version": "1.14.3", + "version": "2.0.0", "tags": [ "狗粮" ], diff --git a/repo/js/ArtifactsGroupPurchasing/settings.json b/repo/js/ArtifactsGroupPurchasing/settings.json index 2bdbb2b49..bf9cfe65c 100644 --- a/repo/js/ArtifactsGroupPurchasing/settings.json +++ b/repo/js/ArtifactsGroupPurchasing/settings.json @@ -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", diff --git a/repo/js/ArtifactsGroupPurchasing/匹配信息.json b/repo/js/ArtifactsGroupPurchasing/匹配信息.json new file mode 100644 index 000000000..888481c69 --- /dev/null +++ b/repo/js/ArtifactsGroupPurchasing/匹配信息.json @@ -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" + } +} \ No newline at end of file diff --git a/repo/js/AutoHoeingOneDragon/pathing/0-传奇/B001挪德卡莱-拉斯科尔尼科夫 传奇.json b/repo/js/AutoHoeingOneDragon/pathing/0-传奇/G001挪德卡莱-拉斯科尔尼科夫 传奇.json similarity index 93% rename from repo/js/AutoHoeingOneDragon/pathing/0-传奇/B001挪德卡莱-拉斯科尔尼科夫 传奇.json rename to repo/js/AutoHoeingOneDragon/pathing/0-传奇/G001挪德卡莱-拉斯科尔尼科夫 传奇.json index 5063d7a8a..2950c1c97 100644 --- a/repo/js/AutoHoeingOneDragon/pathing/0-传奇/B001挪德卡莱-拉斯科尔尼科夫 传奇.json +++ b/repo/js/AutoHoeingOneDragon/pathing/0-传奇/G001挪德卡莱-拉斯科尔尼科夫 传奇.json @@ -12,7 +12,7 @@ "last_modified_time": 1774279450618, "map_match_method": "", "map_name": "Teyvat", - "name": "B001挪德卡莱-拉斯科尔尼科夫 传奇", + "name": "G001挪德卡莱-拉斯科尔尼科夫 传奇", "tags": [], "type": "collect", "version": "1.0" diff --git a/repo/js/AutoHoeingOneDragon/pathing/0-汐酱/D012须弥沙漠沙虫隧道.json b/repo/js/AutoHoeingOneDragon/pathing/0-汐酱/D012须弥沙漠沙虫隧道.json index a1beaccfa..d59453ed7 100644 --- a/repo/js/AutoHoeingOneDragon/pathing/0-汐酱/D012须弥沙漠沙虫隧道.json +++ b/repo/js/AutoHoeingOneDragon/pathing/0-汐酱/D012须弥沙漠沙虫隧道.json @@ -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 } ] } \ No newline at end of file diff --git a/repo/js/AutoHoeingOneDragon/pathing/0-汐酱/D013【沙暴】须弥沙漠三运河之地.json b/repo/js/AutoHoeingOneDragon/pathing/0-汐酱/D013【沙暴】须弥沙漠三运河之地.json index 1e758ee6c..0b2b3d424 100644 --- a/repo/js/AutoHoeingOneDragon/pathing/0-汐酱/D013【沙暴】须弥沙漠三运河之地.json +++ b/repo/js/AutoHoeingOneDragon/pathing/0-汐酱/D013【沙暴】须弥沙漠三运河之地.json @@ -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, diff --git a/repo/js/AutoHoeingOneDragon/pathing/0-汐酱/ZB020璃月层岩地下狭光道西.json b/repo/js/AutoHoeingOneDragon/pathing/0-汐酱/ZB020璃月层岩地下狭光道西.json index 95d0b9dfa..55e2d749b 100644 --- a/repo/js/AutoHoeingOneDragon/pathing/0-汐酱/ZB020璃月层岩地下狭光道西.json +++ b/repo/js/AutoHoeingOneDragon/pathing/0-汐酱/ZB020璃月层岩地下狭光道西.json @@ -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 } ] } \ No newline at end of file diff --git a/repo/js/AutoHoeingOneDragon/pathing/1-莫酱/G011挪德卡莱月矩力设计局东南-1.json b/repo/js/AutoHoeingOneDragon/pathing/1-莫酱/G011挪德卡莱月矩力设计局东南-1.json index 25ee2a6e5..ee66ca545 100644 --- a/repo/js/AutoHoeingOneDragon/pathing/1-莫酱/G011挪德卡莱月矩力设计局东南-1.json +++ b/repo/js/AutoHoeingOneDragon/pathing/1-莫酱/G011挪德卡莱月矩力设计局东南-1.json @@ -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 } ] } \ No newline at end of file