Repository navigation
ntre_redlight_ctg: navmesh rework - #139
Merged
sunzenshen merged 4 commits intoOct 14, 2026
Merged
Conversation
One file. Against master: 1077 -> 895 areas, 858,940 -> 722,681 bytes; 103 areas no spawn or objective reaches (10 pockets) -> 0; 8 areas the engine blocks at every round start -> 0. - Areas CNavArea::UpdateBlocked finds solid at their center at round start are cut around the obstacle or dropped. - Standing room is carved around props, and 5 walk links a player hull cannot cross (a wall brush, a panel van, two cars) are cut. - Hand edits where test bots got stuck: a wall gap and a street lamp. - Unreachable floor is removed: two rooftop regions with no way up and raised tops no bot can climb; one top at +59 u gets a Recon climb. - Re-analyzed in game after the edits.
Renumbers area ids only, so an id-keyed diff against master reads sensibly: 889 of the 895 areas carry the id of the master area they match, kept ids that moved more than 64 u from their master location drop from 11 to 3, and the diff shows 6 added / 188 removed areas. Geometry, connections, attributes and the analyzed visibility data are unchanged (verified topology-identical).
sunzenshen
commented
Sep 28, 2026
sunzenshen
marked this pull request as ready for review
September 28, 2026 07:37
An outside review of this mesh found walk links that run one way only and raised tops reached only by climbs no class makes. - One-way links, each swept with a player hull in both directions by the engine's hull audit: cut both ways the four pairs blocked both ways (a wall, a signpost, a panel van, a car); restore the missing direction of the three pairs clear both ways. - Delete the ledge at (-238, 1025, 188), 159 u over the street, which a player cannot get onto. - Remove the 78 u climb onto the police van roof near (-738, 200) and the 67 u climb onto the destroyed mech near (-1512, 1188): no class plans the first, and the second is over a Recon's jump. A player reaches both by chained jumps, so they stay as areas bots can drop off. Existing areas keep their ids. Re-analyzed in game (same graph, fresh visibility).
The engine hull audit run for the review fixes also lists areas no player hull fits in. Where the blocker is static and no bot was seen in the area in 48 test matches, delete it: inside the planter bushes near (962, -1450) and (962, -1690) with the strips on the bush tops, under the destroyed mech, under a panel van and two cars, on the winged car whose wing sits over its roof, beside a vending machine, between a mailbox and a fire box, a ledge by a street lamp, and slivers against walls and on a box top (20 areas, 14 hiding spots). Also delete the two areas under the scooter near (-1824, 469). Bots squeezing between it and the street lamp made 38 % of the stuck events in the test matches. The scooter can be pushed but stays put in play; the floor round it keeps the way past. Cut 309 <-> 1698, blocked by a wall on every lane both ways. Existing areas keep their ids. Re-analyzed in game (same graph, fresh visibility).
sunmachine
approved these changes
Oct 14, 2026
sunmachine
left a comment
There was a problem hiding this comment.
I got really worried looking at this one in the audit until I actually finished reading the PR detail in full. Makes complete sense what happened!
DELETE SUPER THIN SECTIONS. HYPOTHETICAL PATH FOR ATTACKER INCREASES BY 40%. Literally not a real problem, looks great.
sunmachine
approved these changes
Oct 14, 2026
sunmachine
left a comment
There was a problem hiding this comment.
Passes analysis and eyetest in Wireframe.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.


ntre_redlight_ctg: navmesh rework
One file,
neo/maps/nav/ntre_redlight_ctg.nav.Dependencies and status
Needs (worse than master, or broken, without it):
NAV_MESH_AVOIDmarks. Its 2NAV_MESH_PRECISEareas use the movement rules of Bots follow their path on NAV_MESH_PRECISE areas neo#2168 (merged). The scooter is carved because it does not move when bots press it (commit 4), so the mesh does not wait on runtime prop avoidance either.Helped by (measured better with it; the mesh does not wait on it):
PRECISE+CLIFFfall edges it cuts falls further than #2168 alone (its "Evidence").Pending before review:
At a glance
Four commits:
1. What changed
CNavArea::UpdateBlockedfinds a solid (mostly a prop) at the center of 8 of master's areas on every restart. The path cost then refuses them for the whole round, so bots plan routes they cannot take. They are cut around the obstacle or dropped.2. Id alignment
889 of the 895 areas carry the id of the master area they match. Kept ids that sit more than 64 u from their master location drop from 11 to 3, and an id-keyed diff shows 6 added / 188 removed areas. Geometry, connections, attributes and the analysis data are unchanged by this step.
3-4. Review fixes
An outside review of this PR found walk links that run one way only and raised tops that only climbs no class can make lead to. Commit 3 fixes those:
Beyond the review (commit 4). The engine hull audit of commit 3's mesh (a player hull also stood every 4 u on every area) lists areas no hull fits in and links blocked on every lane in both directions. Each was checked against whether bots stood in it or crossed it in the test matches below, and the stuck events near it.
Kept: two small areas the audit reads blocked that bots stand in (near (1219, -219) and (-1562, 88)), and six pairs blocked by props that move (recycle bins, a fence door, a paper lantern).
Existing areas keep their ids. Re-analyzed in game after each commit.
How it was tested
Reachability:
Master against this mesh, same bot code, one batch. Byte-identical copies of the map, one carrying each
.nav. CTG with the ghost pinned at each of the 6 ghost spawns, 3 matches each, 30 bots, default weapon damage. The count excludes stuck events in the spawn crush at round start and the weapon-scavenging behavior.FAIL_NO_PATH_EXISTSmove failures 19.1 -> 9.9 a matchBots still see and shoot across the mesh. 96 % of kills are between bots in different nav areas and 90 % in non-adjacent ones, the same as on master (kill distance median 657 u against 642 u).
Commits 3-4 against commits 1-2 (2026-10-02), on upstream master + #2176 + #2186 with logging, the same design (each of the 6 ghost spawns pinned, 30 bots, default weapon damage, 8 matches at a time). Every match reached match end with 0 asserts and no crash (120 matches).
FAIL_NO_PATH_EXISTS12.0 -> 14.2; kills 50.8 -> 49.4; ghost captures 0 -> 1 of 48 rounds; 96 % of kills between bots in different nav areas (97 % before)How the pinned-ghost probes work
The offline checks show that the mesh links an area to a spawn. They do not show that a bot will walk there: a link can cross a gap the player hull cannot fit through, or lead along a route path planning never picks. To test one area in game, the area is made the objective and bots are sent to get it.
sv_neo_ghost_spawn_pos "x y z". It replaces the position the round's chosen ghost spawn would have used, so any point becomes the CTG objective. The ghost is dropped a little above the area and settles onto it as it would from a real spawn. The map file is not edited..navby map name, so the harness copies the.bspbyte for byte under a second name (for examplentre_oilstainb_ctg) that loads its own.nav. The same pin then runs on both meshes in one batch. The copy only carries the second mesh; the ghost comes from the cvar.On this map. Earlier screens on older revisions got pickups at the largest floor region removed from master's mesh (4/4) and at one area no bot had visited. A pocket at (-488, 1375, 308) was 0/6, closest 295 u, with its control picked up 3/3. The two rooftop regions were judged from the map geometry, not probed.
Fixed since: the street lamp deaths
Commits 1-2 listed a handful of world-damage deaths by the street lamp near (-1804, 458) on both meshes (2 on master, 3 here over 18 matches each) as a property of the map. They happen in the area under the scooter beside the lamp (all 18 in the 2026-10-02 batches); commit 4 removes it, and the batch had none.