D:/AI空间/rxjh/旧版本更新_修复后.e旧版本更新.代码/代码/窗口程序集_MainDialogWnd.form.e.txt旧版本更新_修复后.bak_躲避加速前_20261006_2314.e_patch/fix_躲避加速.py(幂等,可重复跑)23:07:36 发现仇人 → 23:07:50 判定脱险,整整 14 秒。逐行对上代码后,发现判定过程本身不可信:
| 时间 | 日志 | 代码 |
|---|---|---|
| 23:07:36 | 发现傻逼人物 | 6540 |
| 23:07:36 | 第1次:使用回城命令 | 走 .否则 分支 = 发包飞图 |
| 23:07:44 | 离开原地等待超时 8000ms | 等待离开原地 返回假 |
| 23:07:46 | 第2次:使用回城命令 | 又飞一次 |
| 23:07:50 | 已离开原地(位移 1038) | 这次过线 |
| 23:07:50 | 已成功脱离 → 暂停挂机 | 到这才停挂机 |
两个数字对不上:危险点是 (-1992,1429),3.5 秒后是 (-1997,977),欧氏距离只有 452,日志却写 1038。
反解:只有把危险点取在 ≈(-1063, 1429),两个数字才同时成立——
(-1992,1429) = 929 < 1000 → 判「未生效」(与日志一致)(-1997,977) = 1038 ≥ 1000 → 判「已脱离」(与日志吻合)也就是说:"危险点"根本不是发现仇人时的位置,判定基准在采样那一刻就是漂的。
原因:当前坐标x/y 是全局变量,全工程 18 处 刷新坐标() 在写、无锁。而防杀触发时,人物正被 "回补返回挂机" 带着往挂机点走(多坐标寻路 就是它调用的,7482/7550 行)——执行寻路call 每 200ms 刷新一次坐标并指挥人物移动。所以日志里的"位移",测的是人物被寻路带走多远,不是"回城有没有生效"。
第1次那个"回城未生效"是误判(差 71 就过线),白飞一次;第2次那个"已脱离"也证明不了是飞图造成的。
飞图是跨图传送,落地后 当前地图ID 会先于坐标稳定地变成回城地图——这条信号 1 秒内就能拿到。原代码完全没用它,只在死等"位移 ≥ 1000",所以慢,且不可靠。
改动分两处:
等待离开原地(543 行起)新增两个参数,循环内增加"地图ID"判据并优先于位移判断:
| 项 | 改前 | 改后 |
|---|---|---|
| 参数 | 原x, 原y, 位移阈值, 超时 | 原x, 原y, 位移阈值, 超时, 目标地图ID, 轮询毫秒 |
| 判据 | 只有位移 ≥ 阈值 | 先判 当前地图ID = 目标地图ID,位移降级为兜底 |
| 轮询间隔 | 硬编码 500ms | 参数化,默认 150ms |
| 阈值兜底值 | 1000 | 400 |
传 目标地图ID = 0 时不启用地图判据(回城符是原地回城、地图不变,只能靠位移)。
防杀测试 躲避段(6541 行起)危险地图ID 一起记(先 刷新地图())等待离开原地 (…, 400, 2500, 0, 150)(不启用地判据)等待离开原地 (…, 400, 2500, 目标地图ID, 150)| 场景 | 改前 | 改后 |
|---|---|---|
| 跨图飞图生效 | 第1轮死等 8 秒超时 → 重试 → 共 14 秒 | 地图ID一变即返回,1~2 秒 |
| 最坏(3 轮都没生效) | 3×8 + 2×2 = 28 秒 | 3×2.5 + 2×0.6 = 8.7 秒 |
| 回城符(同图) | 同上 | 靠位移判据,轮询从 500→150ms,响应快约 3 倍 |
日志上你会看到一条新记录:<br>已到达回城地图(地图ID 101,等待 900 毫秒),脱险成功
| 检查 | 结果 |
|---|---|
| 补丁断言 | 3 个锚点各命中 1 次;调用点 1→2;块结构配平 ✅ |
| BOM / 换行 | BOM=True、CRLF=12818、LF-only=0(与改前一致) |
| t2e 回转 | 0 错误 0 警告(18480 条全「信息」级) |
项目.etprj | t2e 后已用 .pre13 还原,diff 一致 |
| e2t 反查 | 新增代码全部以真代码形式存活,3 条 【加速】 注释都保留 |
| 分层保真 | L1 代码级 0 差异(466 个子程序);L2 那 42 条是历史行尾注释损耗 |
| 二进制 | 已到达回城地图 0→1、【加速】 0→3(改前 0) |
改动范围:新增 29 行 / 删除 10 行,只落在 等待离开原地 一个块。
停止挂机() 仍在判定之后(6577 行)。所以判定期间人物还是可能被"回补返回挂机"带着走——现在靠地图ID判据绕过了这个问题,但"位移"这条兜底判据本质仍然不准。停止挂机 对 多坐标寻路线程 是硬杀(11542 行)。日志证明 23:07:52/54 它还在输出,说明被枪毙时正卡在 执行寻路call 里跑置入代码——就是你代码里 11517 行注释自己担心的那条隐患。执行寻路call 的超时是坏的(8701 行):.判断循环首 (真) 是死循环,超时 ≥ 30 只把日志注释掉了、没有 跳出循环。一旦被怪围住或地形挡住,这个线程永远退不出来,只能等强杀。