Skip to content

Commit 145ab2e

Browse files
authored
Merge pull request #21 from EFrostBlade:master
feat: 添加快速版30/65级魔之楔本自动任务
2 parents e4ef98b + e319e91 commit 145ab2e

4 files changed

Lines changed: 419 additions & 2 deletions

File tree

src/config.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ def make_bottom_right_black(frame): #可选. 某些游戏截图时遮挡UID使
126126
["src.tasks.AutoSkill", "AutoSkill"],
127127
["src.tasks.AutoExpulsion", "AutoExpulsion"],
128128
["src.tasks.Auto65ArtifactTask", "Auto65ArtifactTask"],
129+
["src.tasks.Auto65ArtifactTask_Fast", "Auto65ArtifactTask_Fast"],
129130
["src.tasks.Auto70jjbTask", "Auto70jjbTask"],
130131
["src.tasks.AutoDefence", "AutoDefence"],
131132
["src.tasks.AutoExploration", "AutoExploration"],
@@ -135,6 +136,7 @@ def make_bottom_right_black(frame): #可选. 某些游戏截图时遮挡UID使
135136
'trigger_tasks':[
136137
["src.tasks.AutoCombatTask", "AutoCombatTask"],
137138
["src.tasks.AutoMoveTask", "AutoMoveTask"],
139+
["src.tasks.AutoAimTask", "AutoAimTask"],
138140
["src.tasks.ClickDialogTask", "ClickDialogTask"],
139141
]
140142
}
Lines changed: 265 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,265 @@
1+
from qfluentwidgets import FluentIcon
2+
import time
3+
import win32con
4+
5+
from ok import Logger, TaskDisabledException
6+
from src.tasks.DNAOneTimeTask import DNAOneTimeTask
7+
from src.tasks.CommissionsTask import CommissionsTask, Mission
8+
from src.tasks.BaseCombatTask import BaseCombatTask
9+
10+
logger = Logger.get_logger(__name__)
11+
12+
13+
class Auto65ArtifactTask_Fast(DNAOneTimeTask, CommissionsTask, BaseCombatTask):
14+
"""
15+
移动更快的自动30/65级mod,路径参考EMT
16+
"""
17+
18+
def __init__(self, *args, **kwargs):
19+
super().__init__(*args, **kwargs)
20+
self.icon = FluentIcon.FLAG # 任务图标
21+
self.description = "全自动"
22+
23+
# 配置参数
24+
self.default_config.update(
25+
{
26+
"任务超时时间": 180, # 单次任务超时时间(秒)
27+
"刷几次": 999, # 重复次数
28+
}
29+
)
30+
31+
# 配置说明
32+
self.config_description.update(
33+
{
34+
"任务超时时间": "单次任务超时后将放弃并重新开始",
35+
"刷几次": "总共刷多少次副本",
36+
}
37+
)
38+
39+
# 设置委托相关配置
40+
self.setup_commission_config()
41+
42+
# 移除不需要的配置项
43+
self.default_config.pop("启用自动穿引共鸣", None)
44+
self.default_config.pop("自动选择首个密函和密函奖励", None)
45+
46+
# 任务名称(在UI中显示)
47+
self.name = "自动30/65级魔之楔本-移动更快" # 修改为你的副本名称
48+
self.action_timeout = 10
49+
50+
def run(self):
51+
"""主运行方法"""
52+
DNAOneTimeTask.run(self)
53+
self.move_mouse_to_safe_position()
54+
try:
55+
return self.do_run()
56+
except TaskDisabledException:
57+
logger.info("任务被禁用")
58+
except Exception as e:
59+
logger.error("AutoMyDungeonTask error", e)
60+
raise
61+
62+
def do_run(self):
63+
"""执行任务的核心逻辑"""
64+
# 加载角色信息
65+
self.load_char()
66+
67+
# 初始化变量
68+
_start_time = 0 # 任务开始时间
69+
_skill_time = 0 # 上次释放技能的时间
70+
_count = 0 # 完成次数计数器
71+
72+
# 如果已经在队伍中,先放弃当前任务
73+
if self.in_team():
74+
self.log_info("检测到已在队伍中,先放弃当前任务")
75+
self.give_up_mission()
76+
self.wait_until(lambda: not self.in_team(), time_out=30)
77+
78+
# 主循环
79+
while True:
80+
# 在队伍中时的逻辑(战斗中)
81+
if self.in_team():
82+
# 第一次进入队伍时记录开始时间
83+
if _start_time == 0:
84+
_start_time = time.time()
85+
self.log_info(f"开始第 {_count + 1} 次任务")
86+
87+
# 持续释放技能
88+
_skill_time = self.use_skill(_skill_time)
89+
90+
# 检查是否超时
91+
elapsed = time.time() - _start_time
92+
if elapsed >= self.config.get("任务超时时间", 180):
93+
logger.warning(f"任务超时 ({elapsed:.1f}秒),重新开始...")
94+
self.give_up_mission()
95+
self.wait_until(lambda: not self.in_team(), time_out=30)
96+
_start_time = 0 # 重置计时器
97+
98+
# 处理任务界面
99+
_status = self.handle_mission_interface()
100+
101+
if _status == Mission.START:
102+
# 任务完成
103+
elapsed = time.time() - _start_time if _start_time > 0 else 0
104+
_count += 1
105+
self.log_info(
106+
f"任务完成 [{_count}/{self.config.get('刷几次', 999)}] 用时: {elapsed:.1f}秒"
107+
)
108+
109+
# 检查是否达到目标次数
110+
if _count >= self.config.get("刷几次", 999):
111+
self.log_info(f"已完成全部 {_count} 次任务")
112+
self.soundBeep()
113+
return
114+
115+
# 等待重新进入队伍
116+
self.wait_until(self.in_team, time_out=30)
117+
118+
# 重置计时器
119+
_start_time = time.time()
120+
121+
# 走到目标位置
122+
try:
123+
self.walk_to_aim()
124+
except Exception as e:
125+
logger.error(f"移动到目标位置失败: {e}")
126+
self.give_up_mission()
127+
self.wait_until(lambda: not self.in_team(), time_out=30)
128+
_start_time = 0
129+
130+
# 短暂休眠
131+
self.sleep(0.2)
132+
133+
def reset_and_transport(self):
134+
"""
135+
搬运自70皎皎币的重置位置方法
136+
"""
137+
self.open_in_mission_menu()
138+
self.sleep(0.8)
139+
self.wait_until(
140+
lambda: self.find_next_hint(0.05, 0.01, 0.09, 0.05, r"设置"),
141+
post_action=self.click(0.73, 0.92, after_sleep=0.5),
142+
time_out=2,
143+
)
144+
self.wait_until(
145+
lambda: self.find_next_hint(0.06, 0.29, 0.12, 0.33, r"重置位置"),
146+
post_action=self.click(0.35, 0.03, after_sleep=0.5),
147+
time_out=2,
148+
)
149+
self.wait_until(
150+
lambda: self.find_next_hint(0.57, 0.54, 0.62, 0.58, r"确定"),
151+
post_action=lambda: (
152+
self.move_mouse_to_safe_position(),
153+
self.click(0.60, 0.32),
154+
self.move_back_from_safe_position(),
155+
self.sleep(1),
156+
),
157+
time_out=4,
158+
)
159+
self.wait_until(
160+
self.in_team,
161+
post_action=self.click(0.59, 0.56, after_sleep=0.5),
162+
time_out=2,
163+
)
164+
165+
def walk_to_aim(self):
166+
"""
167+
从起点走到目标位置的路径
168+
路径参考: EMT中的扼守-30or65.json,使用复位
169+
"""
170+
logger.info("开始移动到目标位置")
171+
move_start = time.time()
172+
173+
try:
174+
# ===== 根据扼守-30or65.json录制的路径 =====
175+
176+
# 0.52s: 开始向前移动
177+
self.sleep(2)
178+
self.send_key_down("w")
179+
180+
# 1.11s: 开始冲刺 (0.59s后)
181+
self.sleep(0.59)
182+
self.send_vk_down(win32con.VK_LSHIFT)
183+
184+
# 1.33s: 向左移动 (0.22s后)
185+
self.sleep(0.22)
186+
self.send_key_down("a")
187+
188+
# 2.41s: 停止前进 (1.08s后)
189+
self.sleep(1.08)
190+
self.send_key_up("w")
191+
192+
# 3.85s: 再次向前 (1.44s后)
193+
self.sleep(1.44)
194+
self.send_key_down("w")
195+
196+
# 3.94s: 停止向左 (0.09s后)
197+
self.sleep(0.09)
198+
self.send_key_up("a")
199+
200+
# 4.84s: 再次向左 (0.90s后)
201+
self.sleep(0.90)
202+
self.send_key_down("a")
203+
204+
# 5.22s-7.82s: Shift连续切换 (可能在调整位置)
205+
self.sleep(0.38)
206+
self.send_vk_up(win32con.VK_LSHIFT)
207+
self.sleep(0.24)
208+
self.send_vk(win32con.VK_LSHIFT, 0.35)
209+
self.sleep(0.79)
210+
self.send_vk(win32con.VK_LSHIFT, 0.41)
211+
self.sleep(0.80)
212+
self.send_vk_down(win32con.VK_LSHIFT)
213+
214+
# 9.09s: 停止前进 (1.27s后)
215+
self.sleep(1.27)
216+
self.send_key_up("w")
217+
218+
# 9.56s: 短暂前进 (0.47s后)
219+
self.sleep(0.47)
220+
self.send_key_down("w")
221+
222+
# 9.91s: 停止前进 (0.35s后)
223+
self.sleep(0.35)
224+
self.send_key_up("w")
225+
226+
# 10.70s: 跳跃 (0.79s后)
227+
self.sleep(0.79)
228+
self.send_key("space", down_time=0.09)
229+
230+
# 12.83s: 短暂后退调整 (2.04s后)
231+
self.sleep(2.04)
232+
self.send_key("s", down_time=0.09)
233+
234+
# 13.32s: 短暂前进调整 (0.40s后)
235+
self.sleep(0.40)
236+
self.send_key("w", down_time=0.10)
237+
238+
# 13.86s: 再次短暂后退 (0.44s后)
239+
self.sleep(0.44)
240+
self.send_key("s", down_time=0.10)
241+
242+
# 18.89s-18.99s: 释放所有移动键 (4.93s后)
243+
self.sleep(4.93)
244+
self.send_vk_up(win32con.VK_LSHIFT)
245+
self.sleep(0.10)
246+
self.send_key_up("a")
247+
248+
# 19.97s: 复位并传送到目标位置
249+
self.reset_and_transport()
250+
251+
# ===== 路径编写结束 =====
252+
253+
elapsed = time.time() - move_start
254+
logger.info(f"移动完成,用时 {elapsed:.1f}秒")
255+
256+
except Exception as e:
257+
logger.error(f"移动过程出错: {e}")
258+
raise
259+
finally:
260+
# 确保释放所有按键
261+
self.send_key_up("w")
262+
self.send_key_up("a")
263+
self.send_key_up("s")
264+
self.send_key_up("d")
265+
self.send_vk_up(win32con.VK_LSHIFT)

0 commit comments

Comments
 (0)