跳到正文

刷特位置选择可视化

对应 2026-08 工作区(inf_nav_team_nearest 1):扩展做一次多源反向 Dijkstra,每个 Nav 区域记录「到最近可用生还者的路径距离 + 归属 owner」;插件按 10 个固定距离层由近到远搜索,层内按 Flow 从前到后消费。灰墙 = 不可走区域,可以直观看到“路径距离 ≠ 直线距离”。生还者可以直接拖动;拖动后按当前状态重算距离场。

松开以在浏览器中解析(VPK / ZIP / BSP / NAV)
墙 / 不可走 距离 <250u 排除圈 当前搜索层(半开区间) 正在评估的候选 被过滤(原因见日志) 被接受进评分池 最终刷点 → 连线指向 owner 不可刷区域(安全屋/救援柜/救援车标记,仅图模式) 地图几何墙面(2D 线框 / 3D 半透明) 隐形墙(playerclip) 静态道具盒(更淡=估计尺寸) 枪械与弹药点位 医疗物品点位 投掷物点位 升级包点位 其他物品点位 阻挡实体盒(env_*_blocker) 门 / 电梯 / 可动实体盒 其他 solid 实体盒 警报车 按钮 / 救援 / 加油口 / 机枪台

2D 模式:左键直接抓取生还者拖动,空白处拖动即平移视野,滚轮以光标为中心缩放,双击复位;「画墙 / 擦墙」选中后按住拖动绘制(仅内置网格)。

图模式可见性:加载几何数据后对 BSP 三角做真实射线检测(world+disp 全部三角参与遮挡,含地板/天花板;隐形墙不遮挡视线;直线距离 ≤1800 才检测);未加载几何时回退「直线 ≤1500、|Δz| ≤120、绕路比 ≤1.6」启发式。导出数据只含地面连接(无梯子边)。真实地图数据在服务器上用 sm_navgraph_export 命令导出后,通过「导入地图 JSON」加载。

三方图无需服务器:把 .vpk / .zip / 裸 .bsp+.nav 拖进画面或点「解析本地图」。浏览器本地解析,文件不上传;不支持 .7z/.rar(请先解压出 vpk)。解析结果是地图文件预置集:没有 Anne stripper 的 blocker、没有 director 回合物品,flow 是自算近似。官图或需要运行时真相时,继续用下拉框 / 「导入地图 JSON」加载 sm_navgraph_export 导出。

生还者状态(点击开关,可拖动位置)

「上限」= SI_Target_limit 的 targetLimit((特感上限/可动人数)+1)。队首(Flow 最高者)判定容量时上限 ×2。达到上限后退出参与集合,距离场按剩余成员重算(对应插件里的指纹重置 + 快照重建)。

本次搜索状态

层: - 已检: 0 评分池: 0/12 已刷: 0

场景存档(浏览器本地)

搜索日志(对应 [FIND]/[SpawnPerf] 口径)

一次普通刷特尝试的完整流程(team-nearest 分支)

0. 参与集合遍历生还者:存活、未被控、未倒地、未达目标容量(队首上限×2)→ (client, navId) 列表。任何成员移动/容量变化都会改变指纹 → 重置游标并重建快照。
1. 扩展快照worker 线程一次多源反向 Dijkstra(AnneBuildTeamNavCandidateSnapshot):每个 Nav 得到「min 路径距离 + owner」;剔除距任意生还者 <250u 直线的区域;全体候选按 Flow 降序建 flowOrder。
2. 距离分层10 层固定边界 250/350/500/700/900/1150/1400/1700/2000/2400/3000,与职业 min/finalMax 相交后半开取层;空层直接跳过(AdvanceToUsableBand)。
3. owner 检查层内按 Flow 从前往后取候选:owner 已失效 → ownerInvalid++ 跳过;owner 已达容量 → ownerCapacity++ 跳过(不再重置游标)。然后把评估帧绑定到 owner(眼位/脚位/进度桶)。
4. 硬过滤Nav flags → 后方硬拒绝(cand−owner < −8,HJC −4;owner≥90% 时豁免)→ 冷却 → 同桶上限(默认关) → 随机点:硬分散 100u/距离/排除圈 → 卡壳 → 可见性 → 路径可达。
5. 评分距离带契合、Flow 前后梯度(后方软扣分,HJC ×2.5)、高度、核密度(贴脸交战特感不计;核半径随特感上限收缩)→ 总分≤0 淘汰。
6. 选优刷出评分池收满 12 个或本层耗尽 → 最高分刷出,commit 记到 owner;全部层耗尽 → Director Range 兜底(2000u 直线上限)。

本页与真实实现的对应关系 / 简化说明

真实实现本页演示
AnneSpawn_NavCandidatesPrepareTeam / CollectTeam(多源 Dijkstra,owner=实现最短路的生还者,平距取小编号)网格 8 向 Dijkstra,逐格记录 dist+owner,平距取小编号;1 格 = 50u
TEAM_NAV_LAYER_EDGES 10 层 ∩ 职业 [classMin, min(finalMax, inf_SpawnDistanceMax×2)],半开区间、末层闭区间完全一致(按所选职业裁剪,空层跳过)
层内 flowOrder:Flow 降序(前方优先),team 模式不做三分位交错、不洗牌一致(Flow=横向进度)
距任意生还者直线 <max(250, inf_SpawnDistanceMin) 排除;可见性 trace;卡壳;路径复核排除圈 + 网格视线(Bresenham 过墙判定);卡壳/路径复核省略
inf_score_behind_reject_gap 8 / _hjc 4;owner 进度≥90 只扣分不硬拒一致
SpawnScore_BuildCandidate 多因子评分 + 12 个候选预算选优前方奖励 − 后方梯度 − 距离偏离 − 核密度;硬分散 100u 硬拒;预算 12 选优
SI_Target_limit: limit=(上限/可动人数)+1,队首×2(仅刷特容量口径)一致;每刷 1 只 owner 计数 +1,达限后退出参与集合并重算距离场
层耗尽 → Director Range(DIRECTOR_FALLBACK_MAX_TEAM_DISTANCE=2000 直线)兜底提示性标注(随机可行远点)
核密度(贴脸不计、核半径随上限收缩) / 硬分散(固定 100u) / Nav 冷却 / 传送监督冷却、硬分散 100u、核密度(半径随上限收缩)已做;传送监督省略
真实地图 Nav 图(sm_navgraph_export 导出:区域中心/角点/flow/属性位/有向边)图模式:同一状态机跑在导入的邻接表上;加载几何数据后可见性为真实三角射线检测(与引擎 trace 仍有细微差异:无动态 prop、无玻璃材质语义),无几何时回退启发式(直线 ≤1500、|Δz| ≤120、绕路比 ≤1.6);无梯子边,IsValidFlags 的终局分支未复刻
blocked 快照由扩展逐帧从引擎实时读取(电梯/门/nav_block 等动态阻挡)图模式「封锁区域」手动标记,Dijkstra 与候选收集直接跳过被封锁节点
物品/阻挡实体层为地图加载后的运行时快照(天然含 stripper 增删改);Director 回合开始可能按物品密度删减部分预置点可视化按快照原样渲染物品图标与阻挡盒,不模拟 Director 的删减,仅 v2 导出数据可用
与旧模式(inf_nav_team_nearest 0)的区别:旧模式每个职业锁定单一目标生还者,从该目标出发做单源距离场,距离带按职业线性扩圈,层内做近/中/远三分位交错 + 洗牌;新模式全队一张距离场,owner 由最短路自然产生,距离层全职业统一,层内改为“前方优先”。