Repository navigation
ntre_isolation_ctg: navmesh rework - #144
Merged
sunzenshen merged 3 commits intoOct 14, 2026
Merged
Conversation
One file. Against master: 6347 -> 5685 areas, 51,021,013 -> 40,250,206 bytes; 169 areas no spawn or objective reaches (16 pockets) -> 0; 86 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. - Hand edits where test bots got stuck: the hut eave (a crouch strip on its approach) and a drop across a displacement cut. - Unreachable floor is removed: a roof region and raised tops linked out only by drops of 74-175 u; two small tops get a Recon climb. - Re-analyzed in game after the edits.
Renumbers area ids only, so an id-keyed diff against master reads sensibly: 5682 of the 5685 areas carry the id of the master area they match, kept ids that moved more than 64 u from their master location drop from 38 to 16, and the diff shows 3 added / 665 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 08:07
An outside review of this mesh found walk links that run one way only, a climb whose drop back was cut, and floor reached only by climbs no bot plans. Each one-way pair was swept with a player hull in both directions by the engine's hull audit: - Cut both ways the five pairs blocked both ways; restore the missing direction of the twenty pairs a hull can cross, most of them hut doorways 32-40 u wide. Delete five 25 u areas the half cuts ended in that sit inside clip brushes and walls, among them one by a fence near (-1160, 812) bots pressed against. - Make the step onto the roof near (290, 2875), its only way in, two-way, and restore the reverse of a 16 u step on a slope near (1036, -1600), one-way on master. - Restore the drop from a wall-top strip near (-3345, -888) whose climb was kept. - Climb-only tops: delete the pocket nothing can get onto near (-3333, -729); cut the climbs of 80 u or more into three pockets a player reaches only with a full-height jump, and keep them as drop-only floor. Beyond the review, from the same audit: delete ten more areas no player hull fits in (clip brushes, walls, a sloped wall, bamboo), and cut six pairs blocked both ways that bots never or seldom cross. Existing areas keep their ids. Re-analyzed in game (same graph, fresh visibility).
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_isolation_ctg: navmesh rework
One file,
neo/maps/nav/ntre_isolation_ctg.nav.Dependencies and status
Needs (worse than master, or broken, without it):
NAV_MESH_PRECISE,NAV_MESH_CLIFForNAV_MESH_AVOIDmarks, and the mesh beats master on upstream bot code (see below).Helped by (measured better with it; the mesh does not wait on it):
Pending before review:
At a glance
Three commits:
1. What changed
CNavArea::UpdateBlockedfinds a solid at the center of 86 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
5682 of the 5685 areas carry the id of the master area they match. Kept ids that sit more than 64 u from their master location drop from 38 to 16, and an id-keyed diff shows 3 added / 665 removed areas. Geometry, connections, attributes and the analysis data are unchanged by this step.
3. Review fixes
An outside review of the mesh listed walk links that run one way only and floor the body called reachable that only climbs no bot plans lead to. Every one-way pair was swept with a player hull both ways by an engine hull audit (a harness-only test build: a hull is stood every 4 u on every area and swept every 4 u across every link), and the mesh's level links were checked the same way.
From the review:
Beyond the review, from the same audit (bot positions from 32 matches on this mesh):
Every kept area keeps its id. Re-analyzed in game.
How it was tested
BLOCKED_LINKS map=ntre_isolation_ctg level_pairs=14532 oneway=0 keep=0 cut=1 area=0 check=92 entity=0: the cut is the link bots cross (above), the checks the slope, stair and gap links.nav, run interleaved. CTG with the ghost pinned at the map's one ghost spawn, 16 matches, 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 10.2 -> 7.8 a matchHow 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. On an older revision, the largest floor region removed from master's mesh was probed on both meshes, 12 runs each: 4/12 pickups (10/12 reached) on the reworked mesh against 3/12 (7/12) on master's. A first 4-run screen had shown the opposite (1/4 against 3/4); it did not hold at 12 runs.