From 10ebf0b2cff1bcd7e474e6d0bf8002b67be6ac2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E9=B9=8F?= Date: Wed, 25 Mar 2026 17:48:20 +0800 Subject: [PATCH] =?UTF-8?q?200~=E6=94=BB=E5=87=BB=E5=89=8D=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E6=9C=89=E6=95=88=E7=9B=AE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/coordinate_patrol.cpython-311.pyc | Bin 23662 -> 23719 bytes auto_bot_move.py | 30 +++++++++++++++--- coordinate_patrol.py | 5 +-- docs/history.md | 7 +++- 4 files changed, 35 insertions(+), 7 deletions(-) diff --git a/__pycache__/coordinate_patrol.cpython-311.pyc b/__pycache__/coordinate_patrol.cpython-311.pyc index 1eb05b5cd9f0c307824b6000ad751e50d9b748db..ee091988e336b4637ed4a0f8137a29526f089ee0 100644 GIT binary patch delta 266 zcmaF2gK_yzM&9MTyj%=GkhuJC=Fg416Lc93HqX;7V`2=N{LxT+@&iN5$+iaKj9ilo zjf5v>7^pFFPwqD`7v-q}>Pg|PVgr&qRX`JJIZI?GpS6>k{MA5`k!v%*AqO*WQ4Ua1 zNKrPBEDG4HVq(Y0$T- bool: + """ + 判断当前 `state['target']` 是否是“可攻击的有效目标”。 + 主要用 `target` 信号 + `target_hp` 是否为合理值,过滤掉 OCR/像素误判导致的假目标。 + """ + if not state.get('target'): + return False + target_hp = state.get('target_hp') + if target_hp is None: + return False + try: + target_hp = int(target_hp) + except (TypeError, ValueError): + return False + # 目标血量为 0 基本可以视为无效/已死/不可交互目标 + if target_hp <= 0: + return False + return True + def _should_stop(self) -> bool: try: return bool(self._stop_check()) @@ -224,7 +243,8 @@ class AutoBotMove: return # 3. 战斗/有目标:停止移动,执行攻击逻辑;仅在「跑向怪」短窗口内做卡死检测 - in_combat_or_target = bool(state['combat'] or state['target']) + effective_target = self._is_effective_target(state) + in_combat_or_target = bool(state['combat'] or effective_target) if in_combat_or_target: # 被动进战时立即打断进食等待,转入正常战斗流程 self._eating_started_at = None @@ -236,7 +256,7 @@ class AutoBotMove: self.patrol_controller.reset_stuck() # 跑向怪阶段的卡死检测:只在目标血量为 100% 时认为是在“刚刚开怪、接近怪物”,避免残血目标也触发跑向怪卡死逻辑 target_hp = state.get('target_hp') - if target_hp is not None and target_hp >= 100: + if effective_target and target_hp is not None and target_hp >= 100: try: if self.patrol_controller.stuck_handler.check_stuck( state, self.patrol_controller.last_turn_end_time @@ -248,7 +268,9 @@ class AutoBotMove: return except Exception: pass - self.execute_combat_logic(state) + # 只有在“有效目标”成立时才真正执行攻击按键 + if effective_target: + self.execute_combat_logic(state) self._was_in_combat_or_target = True return else: @@ -285,7 +307,7 @@ class AutoBotMove: self.patrol_controller.navigate(state) # 5. 顺便每隔几秒按一下 Tab(主动找怪) - if not state['target'] and (time.time() - self.last_tab_time > 2.0): + if not effective_target and (time.time() - self.last_tab_time > 2.0): pydirectinput.press(KEY_TAB) self.last_tab_time = time.time() diff --git a/coordinate_patrol.py b/coordinate_patrol.py index d9bddec..a6d28a8 100644 --- a/coordinate_patrol.py +++ b/coordinate_patrol.py @@ -304,10 +304,11 @@ class CoordinatePatrol: # 2. 距离判断 dist = self.get_distance(current_pos, target_pos) if dist < threshold: - # 到点后保持平滑过渡:不松开 W,只松开左右修正键 - # 避免 patrol 连续多点时出现“刹一下再走”的抖动。 + # 到点后停止前进:松开 W,避免到达后仍持续向前移动 + # (该函数被 death/logistics 等模块用于“到点就交互/停止”。) pydirectinput.keyUp("a") pydirectinput.keyUp("d") + pydirectinput.keyUp("w") self.reset_stuck() return True diff --git a/docs/history.md b/docs/history.md index cb19c6e..452bfcc 100644 --- a/docs/history.md +++ b/docs/history.md @@ -52,7 +52,7 @@ ### `navigate_to_point` 对齐 `navigate` 优化 -- **到点处理**:`coordinate_patrol.py` 的 `navigate_to_point` 到达判定后不再调用 `stop_all()`,改为仅松开左右修正键并保持 `W` 前进,从而实现连续平滑过渡。 +- **到点处理**:`coordinate_patrol.py` 的 `navigate_to_point` 到达判定后不再调用 `stop_all()`,改为仅松开左右修正键并**松开 `w` 停止前进**,避免到点后仍持续向前移动。(用于 death/logistics 等“到点就交互/停止”场景) - **转向触发逻辑**:`navigate_to_point` 转向决策按 `navigate` 的三档策略调整(死区直行、阈值外脉冲转向、死区与阈值之间不修正),降低航点附近左右抖动。 ### `navigate_path` 对齐 `navigate` 优化 @@ -64,3 +64,8 @@ - 将项目中所有键盘按键调用(`pyautogui.keyDown/keyUp/press`)替换为对应的 `pydirectinput.keyDown/keyUp/press` - 涉及文件:`coordinate_patrol.py`、`stuck_handler.py`、`death_manager.py`、`player_movement.py`、`combat_engine.py` +### 攻击前校验有效目标 + +- `auto_bot_move.py`:在 `execute_logic` 的战斗/攻击分支中增加对 `state['target']` 的有效性判定,要求 `target_hp` 存在且 `> 0`,避免对无效/已死目标误触发攻击按键 +- 同步调整:战斗调用 `execute_combat_logic()` 以及脱战阶段的 `Tab` 寻怪条件,均改为基于有效目标 `effective_target` +