0
0
mirror of https://github.com/ok-oldking/ok-wuthering-waves.git synced 2025-06-03 09:25:19 +00:00

优化传送治疗

This commit is contained in:
firedcto@gmail.com 2024-10-04 23:44:43 +08:00
parent d5bc88457a
commit fabd21ce12
4 changed files with 49 additions and 34 deletions

View File

@ -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(

View File

@ -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():

View File

@ -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):

View File

@ -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()