124 lines
5.4 KiB
Markdown
124 lines
5.4 KiB
Markdown
# 脱战无目标上马跑路:实现方案(不改代码版)
|
||
|
||
本文档描述如何在 **`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 秒按一下坐骑导致上马/下马来回切”的现象。
|
||
|