Files
wow/docs/mount_travel_plan.md
2026-03-18 09:04:37 +08:00

124 lines
5.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 脱战无目标上马跑路:实现方案(不改代码版)
本文档描述如何在 **`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`(建议 812 秒)
- **动作**
-`stop_all()`(移动会导致上马失败)
- 按一次坐骑键/宏
- `sleep(0.2~0.4)`(给客户端一点时间响应)
- 再进入 `navigate()`
- **切回战斗**
-`combat or target`:立刻 `stop_all()` 并进入战斗逻辑
**优点**
- 不需要改游戏状态协议,改动面最小。
**风险**
- 如果你绑定的“坐骑键”在已上马时会取消坐骑,那么盲按可能导致“按一下下马”。因此必须:
- 冷却要长812s
- 触发条件要保守(最好配合方案 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`: 812 秒
- `mount_dist_threshold`: 815
- `mount_press_settle_sleep`: 0.20.4 秒
- 关键注意:
- 上马前必须 `stop_all()`,否则容易上马失败。
- 与拾取/剥皮冻结窗口协调:冻结窗口未结束前,不要上马、不导航。
### 路径 2工业级稳定方案 A
- 增加 `mounted` 状态输入,形成闭环状态机。
- 上马只在 `mounted=False` 时触发,几乎消除“误下马/抖动”。
## 与拾取/剥皮的冲突处理(重要)
读条/交互(拾取、剥皮)会被以下动作打断:
- 任何移动键(尤其是 `W`)或转向键脉冲
- 换目标(如 Tab
- 再次进入战斗/获得目标
因此强烈建议:
- 在拾取/剥皮窗口内:**完全禁止导航与 Tab**(冻结移动/找怪)。
- 冻结窗口结束后再允许“上马与跑路”逻辑。
## 验收标准(你实现后怎么判断对不对)
- **脱战无目标**:角色停止原地抖动 → 成功上马 → 开始连续巡逻移动。
- **途中遭遇**:一出现 `combat=True``target=True` → 立即停下并进入战斗逻辑(不再继续按 W
- **不会抖动**:不会出现“每隔 1 秒按一下坐骑导致上马/下马来回切”的现象。