1+ from qfluentwidgets import FluentIcon
2+ import re
3+ import time
4+ import win32con
5+ import win32gui
6+ import cv2
7+
8+ from ok import Logger , TaskDisabledException , Box
9+ from ok import find_boxes_by_name
10+ from src .tasks .DNAOneTimeTask import DNAOneTimeTask
11+ from src .tasks .CommissionsTask import CommissionsTask , Mission , QuickMoveTask
12+ from src .tasks .BaseCombatTask import BaseCombatTask
13+
14+ logger = Logger .get_logger (__name__ )
15+
16+
17+ class Auto70jjbTask (DNAOneTimeTask , CommissionsTask , BaseCombatTask ):
18+
19+ def __init__ (self , * args , ** kwargs ):
20+ super ().__init__ (* args , ** kwargs )
21+ self .icon = FluentIcon .FLAG
22+ self .description = "全自动"
23+ self .default_config .update ({
24+ '轮次' : 1 ,
25+ '波次超时时间' : 120 ,
26+ })
27+ self .config_description = {
28+ '轮次' : '打几个轮次' ,
29+ '波次超时时间' : '超时后将重启' ,
30+ }
31+ self .setup_commission_config ()
32+ self .name = "自动70级皎皎币本"
33+ self .action_timeout = 10
34+ self .quick_move_task = QuickMoveTask (self )
35+
36+ def run (self ):
37+ DNAOneTimeTask .run (self )
38+ try :
39+ return self .do_run ()
40+ except TaskDisabledException as e :
41+ pass
42+ except Exception as e :
43+ logger .error ('AutoDefence error' , e )
44+ raise
45+ self .quick_move_task .stop ()
46+
47+ def do_run (self ):
48+ self .init_param ()
49+ self .load_char ()
50+ _wave = - 1
51+ _wait_next_wave = False
52+ _skill_time = 0
53+ _wave_start = 0
54+ self .quick_move_task .stop ()
55+ if self .in_team ():
56+ self .open_in_mission_menu ()
57+ self .sleep (0.5 )
58+ while True :
59+ if self .in_team ():
60+ self .get_wave_info ()
61+ if self .current_wave != - 1 :
62+ if self .current_wave != _wave :
63+ _wave = self .current_wave
64+ _wave_start = time .time ()
65+ _wait_next_wave = False
66+
67+ if not _wait_next_wave and time .time () - _wave_start >= self .config .get ('波次超时时间' , 120 ):
68+ self .log_info ('任务超时' )
69+ self .open_in_mission_menu ()
70+ self .sleep (0.5 )
71+ _wait_next_wave = True
72+
73+ if not _wait_next_wave :
74+ _skill_time = self .use_skill (_skill_time )
75+
76+ _status = self .handle_mission_interface (stop_func = self .stop_func )
77+ if _status == Mission .START or _status == Mission .STOP :
78+ if _status == Mission .STOP :
79+ self .restart_mission ()
80+ self .log_info ('任务中止,已重启' )
81+ self .init_param ()
82+ else :
83+ self .log_info ('任务完成' )
84+ self .wait_until (self .in_team , time_out = 30 )
85+ win32gui .SendMessage (self .hwnd .hwnd , win32con .WM_KEYDOWN , 0xA4 , 0 )
86+ self .sleep (2 )
87+ self .walk_to_aim ()
88+ win32gui .SendMessage (self .hwnd .hwnd , win32con .WM_KEYUP , 0xA4 , 0 )
89+ _wave_start = time .time ()
90+ elif _status == Mission .CONTINUE :
91+ self .log_info ('任务继续' )
92+ self .wait_until (self .in_team , time_out = 30 )
93+ self .current_wave = - 1
94+ self .sleep (0.2 )
95+
96+ def init_param (self ):
97+ self .stop_mission = False
98+ self .current_round = - 1
99+ self .current_wave = - 1
100+ self .quick_move_task .stop ()
101+
102+ def stop_func (self ):
103+ self .get_round_info ()
104+ n = self .config .get ('轮次' , 3 )
105+ if n == 1 or self .current_round >= n :
106+ return True
107+
108+ def find_next_hint (self , x1 , y1 , x2 , y2 , s , box_name = 'hint_text' ):
109+ texts = self .ocr (box = self .box_of_screen (x1 , y1 , x2 , y2 , hcenter = True ),
110+ target_height = 540 , name = box_name )
111+ fps_text = find_boxes_by_name (texts ,
112+ re .compile (s , re .IGNORECASE ))
113+ if fps_text :
114+ return True
115+ return False
116+
117+ def find_and_click (self , x1 , y1 , x2 , y2 , s ):
118+ if self .find_next_hint (x1 , y1 , x2 , y2 , s ):
119+ self .click ((x1 + x2 )/ 2 , (y1 + y2 )/ 2 , after_sleep = 0.5 )
120+ return True
121+ return False
122+
123+ def wait_hint (self , x1 , y1 , x2 , y2 , hint , timeout = 2 ):
124+ if self .wait_until (lambda : self .find_next_hint (x1 , y1 , x2 , y2 , hint ), time_out = timeout ):
125+ self .sleep (0.2 )
126+ return True
127+ return False
128+
129+ def reset_and_transport (self ):
130+ self .open_in_mission_menu ()
131+ self .sleep (0.5 )
132+ self .click (0.73 , 0.92 , after_sleep = 0.5 )
133+ self .click (0.35 , 0.03 , after_sleep = 0.5 )
134+ self .click (0.35 , 0.03 , after_sleep = 0.5 )
135+ self .click (0.60 , 0.32 , after_sleep = 0.5 )
136+ self .click (0.59 , 0.56 , after_sleep = 1 )
137+
138+ def walk_to_aim (self ):
139+ if self .find_next_hint (0.18 ,0.52 ,0.23 ,0.55 ,r'保护目标' ):
140+ #无电梯
141+ self .send_key_down ('w' )
142+ self .sleep (8.5 )
143+ self .send_key_up ('w' )
144+ self .send_key_down ('a' )
145+ self .sleep (0.2 )
146+ self .send_key_up ('a' )
147+ self .middle_click (after_sleep = 0.5 )
148+ self .send_key_down ('w' )
149+ self .sleep (6 )
150+ self .send_key_down ('d' )
151+ self .sleep (5.6 )
152+ self .send_key_up ('d' )
153+ self .sleep (23 )
154+ self .send_key_up ('w' )
155+ self .sleep (0.2 )
156+ #分支1直接到达,分支2继续往前走,复位不可
157+ if self .find_next_hint (0.46 ,0.37 ,0.51 ,0.41 ,r'保护目标' ):
158+ self .send_key_down ('w' )
159+ self .sleep (7.5 )
160+ self .send_key ('space' , down_time = 0.2 , after_sleep = 2.7 )
161+ self .send_key_up ('w' )
162+ return
163+ self .send_key ('w' , down_time = 12.1 , after_sleep = 0.2 )
164+ if self .find_next_hint (0.77 ,0.34 ,0.83 ,0.38 ,r'保护目标' ):
165+ #电梯右
166+ self .sleep (0.5 )
167+ self .send_key ('space' ,down_time = 0.2 ,after_sleep = 0.2 )
168+ self .send_key ('w' , down_time = 0.8 ,after_sleep = 0.2 )
169+ self .send_key ('d' , down_time = 0.2 ,after_sleep = 0.2 )
170+ self .middle_click (after_sleep = 0.5 )
171+ self .send_key ('w' , down_time = 3.4 ,after_sleep = 0.2 )
172+ self .send_key_down ('a' )
173+ self .sleep (3.4 )
174+ self .send_key_down ('w' )
175+ self .sleep (2.6 )
176+ self .send_key_up ('a' )
177+ self .sleep (2.1 )
178+ self .send_key ('a' , down_time = 0.4 ,after_sleep = 6.4 )
179+ self .send_key_up ('w' )
180+ self .sleep (0.2 )
181+ self .send_key ('a' , down_time = 6.1 ,after_sleep = 0.2 )
182+ self .send_key ('w' , down_time = 8 ,after_sleep = 0.2 )
183+ #两种地图均可复位到达
184+ self .reset_and_transport ()
185+ return
186+ if self .find_next_hint (0.17 ,0.39 ,0.23 ,0.43 ,r'保护目标' ):
187+ #电梯左
188+ self .sleep (0.5 )
189+ self .send_key ('space' ,down_time = 0.2 ,after_sleep = 0.2 )
190+ self .send_key_down ('w' )
191+ self .sleep (3.8 )
192+ self .send_key ('d' , down_time = 0.4 , after_sleep = 3 )
193+ self .send_key ('d' , down_time = 0.4 , after_sleep = 6.7 )
194+ self .send_key_up ('w' )
195+ self .sleep (0.2 )
196+ self .send_key ('a' , down_time = 0.2 , after_sleep = 0.2 )
197+ self .middle_click (after_sleep = 0.5 )
198+ self .send_key_down ('w' )
199+ self .sleep (8.7 )
200+ self .send_key ('d' , down_time = 1 , after_sleep = 0.5 )
201+ self .send_key ('d' , down_time = 0.6 , after_sleep = 1.3 )
202+ self .send_key ('d' , down_time = 0.6 , after_sleep = 6.2 )
203+ self .send_key ('d' , down_time = 0.4 , after_sleep = 0.5 )
204+ self .send_key ('d' , down_time = 0.4 , after_sleep = 4.5 )
205+ self .send_key_up ('w' )
206+ #两种地图均可复位到达
207+ self .reset_and_transport ()
208+ return
209+ #电梯中
210+ self .sleep (0.5 )
211+ self .send_key ('space' ,down_time = 0.2 ,after_sleep = 0.2 )
212+ self .send_key_down ('w' )
213+ self .sleep (4.8 )
214+ self .send_key ('d' , down_time = 1.8 , after_sleep = 9.6 )
215+ self .send_key ('d' , down_time = 3.4 , after_sleep = 3.4 )
216+ self .send_key_up ('w' )
217+ self .sleep (0.2 )
218+ self .send_key ('a' , down_time = 1.9 , after_sleep = 0.2 )
219+ self .send_key ('w' , down_time = 6 , after_sleep = 0.2 )
220+ #两种地图均可复位到达
221+ self .reset_and_transport ()
222+ #finish
223+ return
0 commit comments