본문으로 건너뛰기

스폰 위치 선택 시각화

2026-08 워크스페이스(inf_nav_team_nearest 1) 대응: 확장이 멀티소스 역방향 다익스트라를 한 번 실행해 각 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] 기준에 대응)

일반 스폰 시도 1회의 전체 흐름(team-nearest 분기)

0. 참여 집합생존자 순회: 생존, 제압되지 않음, 다운되지 않음, 목표 용량 미달(선두는 상한 ×2) → (client, navId) 목록. 멤버의 이동/용량 변화는 지문을 바꿔 커서를 리셋하고 스냅샷을 다시 만듭니다.
1. 확장 스냅샷worker 스레드가 멀티소스 역방향 다익스트라를 한 번 실행(AnneBuildTeamNavCandidateSnapshot): 각 Nav가 「최소 경로 거리 + owner」를 얻습니다. 임의 생존자로부터 직선 250u 미만 영역은 제거하고, 전체 후보를 Flow 내림차순으로 flowOrder에 정렬합니다.
2. 거리 레이어고정 경계 250/350/500/700/900/1150/1400/1700/2000/2400/3000의 10개 레이어를 병과의 min/finalMax와 교차해 반개구간으로 취합니다. 빈 레이어는 건너뜁니다(AdvanceToUsableBand).
3. owner 검사레이어 안에서 Flow 앞쪽부터 후보를 가져옵니다: owner가 무효 → ownerInvalid++ 후 건너뜀, owner가 용량 도달 → ownerCapacity++ 후 건너뜀(커서는 리셋하지 않음). 그런 다음 평가 프레임을 owner(시점/발 위치/진행 버킷)에 바인딩합니다.
4. 하드 필터Nav 플래그 → 후방 하드 거부(cand−owner < −8, HJC는 −4, owner≥90%면 면제) → 쿨다운 → 동일 버킷 상한(기본 꺼짐) → 랜덤 지점: 하드 분산 100u/거리/제외권 → 끼임 → 가시성 → 경로 도달성.
5. 점수 평가거리대 적합, Flow 전후 기울기(후방은 소프트 감점, HJC ×2.5), 높이, 커널 밀도(붙어서 교전 중인 특감은 제외, 핵 반지름은 특감 상한에 따라 축소) → 총점 ≤0이면 탈락.
6. 최적 선택 후 스폰점수 풀이 12개를 채우거나 해당 레이어 소진 → 최고 점수를 스폰하고 commit을 owner에 기록. 전체 레이어 소진 → Director Range 폴백(직선 2000u 상한).

이 페이지와 실제 구현의 대응 관계 / 단순화 설명

실제 구현이 페이지 데모
AnneSpawn_NavCandidatesPrepareTeam / CollectTeam(멀티소스 다익스트라, owner=최단 경로를 만든 생존자, 동일 거리는 낮은 번호)8방향 그리드 다익스트라로 셀마다 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는 최단 경로에서 자연히 정해지며, 거리 레이어는 전 병과 공통, 레이어 안은 "전방 우선"입니다.