# 脱战无目标上马跑路：实现方案（不改代码版）

本文档描述如何在 **`combat=False` 且 `target=False`** 时自动 **上马跑路/巡逻**，并在 **进入战斗或获得目标** 时立刻切回战斗逻辑。先给方案与落地路径，后续再按本文改代码实现。

## 目标与约束

- **目标**：没目标、没进战斗时，上马并持续移动（使用现有 `CoordinatePatrol.navigate()` 作为跑路/巡逻引擎）。
- **切回**：一旦 `combat=True` 或 `target=True`，立即停止移动并进入战斗逻辑（必要时下马/取消坐骑）。
- **稳定性**：避免反复按坐骑键导致“上马→下马→上马”抖动；避免与拾取/剥皮互相打断。

## 方案总览（按稳定性排序）

### 方案 A（推荐，最稳）：增加 `mounted` 状态 → 状态机闭环

**核心思路**：像当前读 `combat/target` 一样，再增加一个 `mounted`（是否在坐骑上）状态输入，然后用“小状态机”确保行为可控。

- **进入赶路条件**：`not combat` 且 `not target`
  - 若 `mounted=False`：按一次上马键/坐骑宏
  - 等待 `mounted=True`（带超时，例如 3 秒）
  - `mounted=True` 后开始 `navigate()`（持续按 W + 转向）
- **进入战斗条件**：`combat or target`
  - `stop_all()` 立刻停下
  - 如需要可按一次“取消坐骑/下马”（可选）
  - 执行战斗逻辑

**优点**
- 不依赖固定 sleep，不卡延迟，几乎不会误触“下马”。
- 不会因为公共CD、网络卡顿、瞬时移动导致上马失败后一直走路。

**前置条件**
- 需要能从游戏侧输出 `mounted` 状态（WeakAura/插件/像素条协议增加一格均可）。

---

### 方案 B（无需新增状态，最快落地）：盲按坐骑 + 冷却防抖

**核心思路**：不检测是否已经上马，只在满足条件时以**较低频率**尝试上马，并通过冷却与节流避免反复触发。

- **触发条件**（建议都满足）：
  - `not combat` 且 `not target`
  - 不在“脱战拾取/剥皮冻结窗口”内（避免打断交互）
  - 距离阈值满足（见方案 C）
  - 距离上次尝试上马已超过 `mount_try_cooldown`（建议 8–12 秒）
- **动作**：
  - 先 `stop_all()`（移动会导致上马失败）
  - 按一次坐骑键/宏
  - `sleep(0.2~0.4)`（给客户端一点时间响应）
  - 再进入 `navigate()`
- **切回战斗**：
  - 若 `combat or target`：立刻 `stop_all()` 并进入战斗逻辑

**优点**
- 不需要改游戏状态协议，改动面最小。

**风险**
- 如果你绑定的“坐骑键”在已上马时会取消坐骑，那么盲按可能导致“按一下下马”。因此必须：
  - 冷却要长（8–12s）
  - 触发条件要保守（最好配合方案 C 的距离阈值）
  - 坐骑键尽量绑定为“更不容易误下马”的宏（见方案 D）

---

### 方案 C（更像真人、效率更高）：基于距离阈值决定是否上马

**核心思路**：只有在“要跑很远”的时候才上马，短距离巡逻不浪费上马时间，也减少误触发频率。

- 计算当前位置到下一航点距离 `dist`
- 当 `dist > mount_dist_threshold` 才允许上马尝试

**推荐阈值**
- `mount_dist_threshold = 8 ~ 15`（以你当前坐标系单位为准，按实际体感调整）

**与方案 B 的组合建议**
- 实际落地强烈建议用 **方案 C + 方案 B**：距离足够远才进行低频盲按上马。

---

### 方案 D（强烈建议配套）：使用“智能坐骑宏”降低误下马

为了降低脚本“盲按一次”带来的不确定性，建议把坐骑键绑定为更可控的宏/按键策略：

- **尽量避免**：同一个键在“已上马”时必定执行下马的行为（会增加误下马概率）
- **建议**：脚本侧通过冷却和距离阈值尽量“只按一次”，并把坐骑宏设计为“尽量只上马”

> 注：不同版本/服环境宏条件支持不完全一致；这里给的是方向，具体宏内容以你客户端可用语法为准。

## 推荐落地路径（按投入产出）

### 路径 1（最快能用）：方案 C + 方案 B

- **一套就能跑起来**，不改 `game_state` 协议。
- 关键参数：
  - `mount_try_cooldown`: 8–12 秒
  - `mount_dist_threshold`: 8–15
  - `mount_press_settle_sleep`: 0.2–0.4 秒
- 关键注意：
  - 上马前必须 `stop_all()`，否则容易上马失败。
  - 与拾取/剥皮冻结窗口协调：冻结窗口未结束前，不要上马、不导航。

### 路径 2（工业级稳定）：方案 A

- 增加 `mounted` 状态输入，形成闭环状态机。
- 上马只在 `mounted=False` 时触发，几乎消除“误下马/抖动”。

## 与拾取/剥皮的冲突处理（重要）

读条/交互（拾取、剥皮）会被以下动作打断：

- 任何移动键（尤其是 `W`）或转向键脉冲
- 换目标（如 Tab）
- 再次进入战斗/获得目标

因此强烈建议：

- 在拾取/剥皮窗口内：**完全禁止导航与 Tab**（冻结移动/找怪）。
- 冻结窗口结束后再允许“上马与跑路”逻辑。

## 验收标准（你实现后怎么判断对不对）

- **脱战无目标**：角色停止原地抖动 → 成功上马 → 开始连续巡逻移动。
- **途中遭遇**：一出现 `combat=True` 或 `target=True` → 立即停下并进入战斗逻辑（不再继续按 W）。
- **不会抖动**：不会出现“每隔 1 秒按一下坐骑导致上马/下马来回切”的现象。

