Add patrol prepare route support
This commit is contained in:
@@ -239,6 +239,7 @@ class AutoBotMove:
|
||||
self,
|
||||
waypoints=None,
|
||||
waypoints_path=None,
|
||||
prepare_route_path=None,
|
||||
vendor_path=None,
|
||||
attack_loop_path=None,
|
||||
skinning_wait_sec=None,
|
||||
@@ -290,6 +291,19 @@ class AutoBotMove:
|
||||
if waypoints is None:
|
||||
path = waypoints_path or get_config_path(WAYPOINTS_FILE)
|
||||
waypoints = load_waypoints(path) or DEFAULT_WAYPOINTS
|
||||
self.prepare_route_waypoints = []
|
||||
if prepare_route_path:
|
||||
try:
|
||||
self.prepare_route_waypoints = [
|
||||
(float(point[0]), float(point[1]))
|
||||
for point in (load_waypoints(prepare_route_path) or [])
|
||||
]
|
||||
except Exception:
|
||||
self.prepare_route_waypoints = []
|
||||
print(f">>> [准备路线] 加载失败,忽略配置: {prepare_route_path}")
|
||||
self.prepare_route_index = 0
|
||||
self.prepare_route_completed = not bool(self.prepare_route_waypoints)
|
||||
self.is_running_prepare_route = bool(self.prepare_route_waypoints)
|
||||
layout = load_layout_config()
|
||||
self.patrol_controller = CoordinatePatrol(
|
||||
waypoints,
|
||||
@@ -311,6 +325,48 @@ class AutoBotMove:
|
||||
self.logistics_manager.bag_full_hearthstone = bool(layout.get("bag_full_hearthstone", False))
|
||||
self.logistics_manager.hearthstone_key = str(layout.get("hearthstone_key", "b") or "b")
|
||||
|
||||
def _has_prepare_route(self) -> bool:
|
||||
return bool(self.prepare_route_waypoints)
|
||||
|
||||
def _run_prepare_route_step(self, state):
|
||||
if self.prepare_route_completed or not self._has_prepare_route():
|
||||
self.prepare_route_completed = True
|
||||
self.is_running_prepare_route = False
|
||||
return
|
||||
|
||||
if self.prepare_route_index >= len(self.prepare_route_waypoints):
|
||||
self.prepare_route_completed = True
|
||||
self.is_running_prepare_route = False
|
||||
self.is_moving = False
|
||||
self.patrol_controller.stop_all()
|
||||
self.patrol_controller.reset_stuck()
|
||||
print(">>> [准备路线] 准备路线完成,开始正式巡逻...")
|
||||
return
|
||||
|
||||
self.is_running_prepare_route = True
|
||||
target_pos = self.prepare_route_waypoints[self.prepare_route_index]
|
||||
is_arrived = self.patrol_controller.navigate_to_point(
|
||||
state,
|
||||
target_pos,
|
||||
stop_on_arrival=False,
|
||||
)
|
||||
self.is_moving = True
|
||||
if not is_arrived:
|
||||
return
|
||||
|
||||
print(
|
||||
f">>> [准备路线] 到达准备路线点 {self.prepare_route_index + 1}/"
|
||||
f"{len(self.prepare_route_waypoints)}: {target_pos}"
|
||||
)
|
||||
self.prepare_route_index += 1
|
||||
if self.prepare_route_index >= len(self.prepare_route_waypoints):
|
||||
self.prepare_route_completed = True
|
||||
self.is_running_prepare_route = False
|
||||
self.is_moving = False
|
||||
self.patrol_controller.stop_all()
|
||||
self.patrol_controller.reset_stuck()
|
||||
print(">>> [准备路线] 准备路线完成,开始正式巡逻...")
|
||||
|
||||
def _is_effective_target(self, state) -> bool:
|
||||
"""
|
||||
判断当前 `state['target']` 是否是“可攻击的有效目标”。
|
||||
@@ -772,7 +828,7 @@ class AutoBotMove:
|
||||
current_pos = None
|
||||
if state.get('x') is not None and state.get('y') is not None:
|
||||
current_pos = (state.get('x'), state.get('y'))
|
||||
if current_pos is not None:
|
||||
if current_pos is not None and self.prepare_route_completed:
|
||||
self.patrol_controller.snap_to_forward_waypoint(current_pos)
|
||||
|
||||
# 扫尾动作执行完后,本 tick 强制结束,防止立即按下 Tab
|
||||
@@ -803,12 +859,15 @@ class AutoBotMove:
|
||||
# 进食期间不巡逻、不主动找目标(不按 Tab)
|
||||
return
|
||||
|
||||
# 4. 没战斗没目标:巡逻(卡死检测在 patrol_controller.navigate 内)
|
||||
self.is_moving = True
|
||||
self.patrol_controller.navigate(state)
|
||||
# 4. 没战斗没目标:优先执行准备路线,完成后再正式巡逻
|
||||
if not self.prepare_route_completed:
|
||||
self._run_prepare_route_step(state)
|
||||
else:
|
||||
self.is_moving = True
|
||||
self.patrol_controller.navigate(state)
|
||||
|
||||
# 5. 顺便每隔几秒按一下 Tab(主动找怪)
|
||||
if not effective_target and (time.time() - self.last_tab_time > 2.0):
|
||||
if self.prepare_route_completed and not effective_target and (time.time() - self.last_tab_time > 2.0):
|
||||
hw_ctrl.press(KEY_TAB)
|
||||
self.last_tab_time = time.time()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user