diff --git a/src/combat/CombatCheck.py b/src/combat/CombatCheck.py index 151504a..eb9ce73 100644 --- a/src/combat/CombatCheck.py +++ b/src/combat/CombatCheck.py @@ -25,7 +25,7 @@ class CombatCheck: self.boss_health_box = None self.boss_health = None self.out_of_combat_reason = "" - self.combat_check_interval = 0.8 + self.combat_check_interval = 1 self._last_liberation = 0 @property @@ -48,7 +48,8 @@ class CombatCheck: logger.info('out of combat start double check') if self.debug: self.screenshot('out of combat start double check') - if self.wait_until(self.check_health_bar, time_out=1.2, wait_until_before_delay=0): + if self.wait_until(self.check_health_bar, time_out=1.2, wait_until_before_delay=0, + wait_until_check_delay=0): return True self.out_of_combat_reason = reason self.do_reset_to_false() @@ -142,10 +143,10 @@ class CombatCheck: def find_target_enemy(self): start = time.time() target_enemy = self.find_one('target_enemy_white', box=self.target_area_box, - use_gray_scale=True, threshold=0.83, + use_gray_scale=True, threshold=0.7, frame_processor=keep_only_white) - # if self.debug and target_enemy is not None: - # self.screenshot('find_target_enemy') + if self.debug and target_enemy is None: + self.screenshot('find_target_enemy') logger.debug(f'find_target_enemy {target_enemy} {time.time() - start}') return target_enemy is not None @@ -162,16 +163,19 @@ class CombatCheck: if not self.check_target_enemy(): return self.reset_to_false(recheck=False, reason="no target enemy") if self.check_count_down(): - return True + return self.log_time(now, 'check_count_down') if self.boss_lv_template is not None: if self.check_boss(): - return True + return self.log_time(now, 'check_boss') if self.check_health_bar(): - return True + return self.log_time(now, 'check_health_bar') + if self.find_target_enemy(): + return self.log_time(now, 'find_target_enemy') if self.ocr_lv_text(): - return True + return self.log_time(now, 'ocr_lv_text') + self.next_frame() if self.target_enemy(): - return True + return self.log_time(now, 'target_enemy') logger.error('target_enemy failed, try recheck break out of combat') return self.reset_to_false(recheck=True, reason='target enemy failed') else: @@ -188,6 +192,10 @@ class CombatCheck: self._in_combat = True return True + def log_time(self, start, name): + logger.debug(f'check cost {name} {time.time() - start}') + return True + def ocr_lv_text(self): lvs = self.ocr(box=self.target_area_box, match=re.compile(r'lv\.\d{1,3}', re.IGNORECASE), @@ -197,9 +205,10 @@ class CombatCheck: def check_target_enemy(self): if self.calculate_color_percentage(text_white_color, self.get_box_by_name('box_target_enemy')) == 0: + logger.info(f'check target_enemy failed, wait 3 seconds') if self.wait_until(lambda: self.calculate_color_percentage(text_white_color, self.get_box_by_name('box_target_enemy')) != 0, - wait_until_before_delay=0, + wait_until_before_delay=0, wait_until_check_delay=0, time_out=3): return True self.log_error( diff --git a/src/task/AutoCombatTask.py b/src/task/AutoCombatTask.py index abec3c0..4a113e8 100644 --- a/src/task/AutoCombatTask.py +++ b/src/task/AutoCombatTask.py @@ -2,7 +2,7 @@ from qfluentwidgets import FluentIcon from ok.logging.Logger import get_logger from ok.task.TriggerTask import TriggerTask -from src.task.BaseCombatTask import BaseCombatTask, NotInCombatException +from src.task.BaseCombatTask import BaseCombatTask, NotInCombatException, CharDeadException logger = get_logger(__name__) @@ -22,11 +22,17 @@ class AutoCombatTask(BaseCombatTask, TriggerTask): try: logger.debug(f'autocombat loop {self.chars}') self.get_current_char().perform() + except CharDeadException: + logger.info(f'char dead try teleport to heal') + try: + self.teleport_to_heal() + except Exception as e: + logger.error('teleport to heal error', e) except NotInCombatException as e: logger.info(f'auto_combat_task_out_of_combat {e}') if self.debug: self.screenshot(f'auto_combat_task_out_of_combat {e}') - break + break def trigger(self): if self.in_combat(): diff --git a/src/task/BaseCombatTask.py b/src/task/BaseCombatTask.py index bfa0951..49dd28b 100644 --- a/src/task/BaseCombatTask.py +++ b/src/task/BaseCombatTask.py @@ -68,6 +68,27 @@ class BaseCombatTask(BaseWWTask, FindFeature, OCR, CombatCheck): self.next_frame() logger.info(f'send_key_and_wait_animation timed out {key}') + def teleport_to_heal(self): + self.info['Death Count'] = self.info.get('Death Count', 0) + 1 + self.send_key('esc') + self.sleep(1) + self.log_info('click m to open the map') + self.send_key('m') + self.sleep(2) + for i in range(4): + self.click_relative(0.94, 0.29, after_sleep=0.5) + logger.info(f'click zoom') + self.click_relative(0.91, 0.77, after_sleep=1) + self.click_relative(0.63, 0.17, after_sleep=1, name="first_map") + self.log_info('click change map') + self.click_relative(0.77, 0.15, after_sleep=1) + self.click_relative(0.48, 0.26, after_sleep=1) + logger.info(f'click heal') + travel = self.wait_feature('gray_teleport', raise_if_not_found=True, time_out=3) + self.click_box(travel, relative_x=1.5) + self.wait_in_team_and_world(time_out=20) + self.sleep(2) + def raise_not_in_combat(self, message, exception_type=None): logger.error(message) if self.reset_to_false(reason=message): @@ -197,7 +218,6 @@ class BaseCombatTask(BaseWWTask, FindFeature, OCR, CombatCheck): if post_action: post_action() - self.next_frame() logger.info(f'switch_next_char end {(current_char.last_switch_time - start):.3f}s') def get_liberation_key(self): diff --git a/src/task/FarmWorldBossTask.py b/src/task/FarmWorldBossTask.py index da1ad0c..b4e890b 100644 --- a/src/task/FarmWorldBossTask.py +++ b/src/task/FarmWorldBossTask.py @@ -48,26 +48,6 @@ class FarmWorldBossTask(BaseCombatTask): # not current in use because not stable, right now using one click to scroll down - def teleport_to_heal(self): - self.info['Death Count'] = self.info.get('Death Count', 0) + 1 - self.send_key('esc') - self.sleep(1) - self.log_info('click m to open the map') - self.send_key('m') - self.sleep(2) - for i in range(4): - self.click_relative(0.94, 0.29, after_sleep=0.5) - logger.info(f'click zoom') - self.click_relative(0.91, 0.77, after_sleep=1) - self.log_info('click change map') - self.click_relative(0.77, 0.15, after_sleep=1) - self.click_relative(0.48, 0.26, after_sleep=1) - logger.info(f'click heal') - travel = self.wait_feature('gray_teleport', raise_if_not_found=True, time_out=3) - self.click_box(travel, relative_x=1.5) - self.wait_in_team_and_world(time_out=20) - self.sleep(2) - def run(self): self.set_check_monthly_card() self.check_main()