热血江湖助手 · 分析资料站← 报告总目录助手主页
分区:15_助手版本迭代说明源文件:躲避开加速_改动说明.md篇幅:5.5 KB收录:2026-10-19 17:10

防杀躲避加速 —— 改动说明


一、你贴的日志暴露了什么

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),两个数字才同时成立——

也就是说:"危险点"根本不是发现仇人时的位置,判定基准在采样那一刻就是漂的。

原因:当前坐标x/y 是全局变量,全工程 18 处 刷新坐标() 在写、无锁。而防杀触发时,人物正被 "回补返回挂机" 带着往挂机点走(多坐标寻路 就是它调用的,7482/7550 行)——执行寻路call 每 200ms 刷新一次坐标并指挥人物移动。所以日志里的"位移",测的是人物被寻路带走多远,不是"回城有没有生效"。

第1次那个"回城未生效"是误判(差 71 就过线),白飞一次;第2次那个"已脱离"也证明不了是飞图造成的。


二、改动思路:换判据,不是调小超时

飞图是跨图传送,落地后 当前地图ID 会先于坐标稳定地变成回城地图——这条信号 1 秒内就能拿到。原代码完全没用它,只在死等"位移 ≥ 1000",所以慢,且不可靠。

改动分两处:

1) 等待离开原地(543 行起)

新增两个参数,循环内增加"地图ID"判据并优先于位移判断:

项改前改后
参数原x, 原y, 位移阈值, 超时原x, 原y, 位移阈值, 超时, 目标地图ID, 轮询毫秒
判据只有位移 ≥ 阈值先判 当前地图ID = 目标地图ID,位移降级为兜底
轮询间隔硬编码 500ms参数化,默认 150ms
阈值兜底值1000400

传 目标地图ID = 0 时不启用地图判据(回城符是原地回城、地图不变,只能靠位移)。

2) 防杀测试 躲避段(6541 行起)


三、预期效果

场景改前改后
跨图飞图生效第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 条全「信息」级)
项目.etprjt2e 后已用 .pre13 还原,diff 一致
e2t 反查新增代码全部以真代码形式存活,3 条 【加速】 注释都保留
分层保真L1 代码级 0 差异(466 个子程序);L2 那 42 条是历史行尾注释损耗
二进制已到达回城地图 0→1、【加速】 0→3(改前 0)

改动范围:新增 29 行 / 删除 10 行,只落在 等待离开原地 一个块。


五、这次没动的(你知道就行)

  1. 躲避期间没有先停寻路。停止挂机() 仍在判定之后(6577 行)。所以判定期间人物还是可能被"回补返回挂机"带着走——现在靠地图ID判据绕过了这个问题,但"位移"这条兜底判据本质仍然不准。
  2. 停止挂机 对 多坐标寻路线程 是硬杀(11542 行)。日志证明 23:07:52/54 它还在输出,说明被枪毙时正卡在 执行寻路call 里跑置入代码——就是你代码里 11517 行注释自己担心的那条隐患。
  3. 执行寻路call 的超时是坏的(8701 行):.判断循环首 (真) 是死循环,超时 ≥ 30 只把日志注释掉了、没有 跳出循环。一旦被怪围住或地形挡住,这个线程永远退不出来,只能等强杀。
  4. 日志链路加锁那件事(上一轮做的)还在等你的两个选择 A/B。
本页由 Markdown 报告自动转排;如需原始 md,可在原会话工作区取用。