Repository navigation
ntre_terminal_jgr: navmesh rework - #140
Merged
sunzenshen merged 9 commits intoOct 14, 2026
Merged
Conversation
One file. Against master: 2660 -> 1940 areas, 3,776,964 -> 2,146,204 bytes; 69 areas no spawn or objective reaches (10 pockets) -> 0; 2 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. - 7 walk links a player hull cannot cross (handrails, a crossbeam, wall and floor brushes) are cut. - The crouch zone at the spawn-room exit is widened so bots duck before their hull reaches the lintel. - Hand edits where test bots got stuck: booth partitions, a machine module, stair landings and drops, a column, a rack foot and a railing. - Unreachable floor is removed: raised tops, ledges and a roof linked out only by drops of 76-268 u, above every class's crouch jump. - Re-analyzed in game after the edits.
Renumbers area ids only, so an id-keyed diff against master reads sensibly: 1938 of the 1940 areas carry the id of the master area they match, kept ids that moved more than 64 u from their master location drop from 128 to 59, and the diff shows 2 added / 722 removed areas. Geometry, connections, attributes and the analyzed visibility data are unchanged (verified topology-identical).
Contributor
Author
|
This one accidentally slipped through the phase 1 criteria, since this one has ladders. Need to reprocess this nav file before it's ready to review. |
The map has 50 ladder brushes and the mesh had no nav ladders, so the flatcar decks and car-end balconies (z 80) were out of reach (their only links in rise 73-80 u, over every class's jump) and the central platform's four 112 u ladders were unused. 48 nav ladders, each connected both ways: - 4 on the central platform's west and east walls (z 144 -> 256) - 28 on the north and south faces of 14 flatcars (floor -> deck) - 16 at car ends, floor -> balcony; two balconies get an area Ladder 31 (flatcar 432's north face) is descent-only: bots queued at it in the round-start rush and walked under the car's overhang. Brush 4479 (inside a deck) and 4486 (its foot is a hole) are left out. Area ids unchanged; new ids above master's. Re-analyzed in game.
The 25 u strip east of the fence at x -860 is split back into master's 9349 / 9350 / 9351 / 9352 with master's links and ids, so a bot through either gap walks into the area beyond it. Commit 1 had merged them into one strip: bots crossing a gap walked along the fence to the far portal and got stuck there more often than on master. Re-analyzed in game.
The ramp to the central platform (75 u wide, x -650..-75) climbs over open floor. Bots coming from the south-west met it at its foot's south-east corner, and their next path point was 220 u up the ramp: they walked along its south edge, slid off while it was still low, followed its side on the floor and slipped under it once it was high enough. From below they passed the ramp's path points one by one and pressed into the platform wall under its top. That was this mesh's largest stuck spot. The ramp's first 50 u (x -650..-600) is now its own area, so the path turns onto the ramp's center line while it is low enough to step on. Links and the other ids are unchanged; the new area takes an id above master's highest. Re-analyzed in game.
- Area 649 ran under the corner of a flatcar's wheel truck at (-1626, -1140), and bots turning north there pressed into it. That corner of the area is cut out, so the turn happens west of the truck. - Areas 45 and 50 ran to 5 u from the side of the flatcar at y 705. Bots coming up off the track at (0, 712) and turning east clipped the wheel truck at the car's west end. Area 45 is split at x 30; its east part and area 50 now stop 17 u short of the car. Every area stays reachable as before; the three new areas take ids above master's highest. Re-analyzed in game.
An outside review of this mesh found climbs kept after their drop back was cut, and walk links that run one way only. - Remove the ten one-way climbs of 70-144 u, over every class's limit: 1313 -> 222, 1565 -> 6493, 1608 -> 9246, 2071 -> 92, 6641 -> 9244, 9235 -> 6483, 9452 -> 109, 583 -> 9235, 334 -> 2036 and 342 -> 9410. No bot path used them. - Delete the platform building's roof (52 areas, z 378-647 over x 25..925, y -3450..-375). Its only way in was the 122 u climb 342 -> 9410, it has no ladder, and no walk or jump route leads up to it. - One-way links, each swept with a player hull in both directions by the engine's hull audit: cut both ways the two pairs blocked both ways (a crate, a tree); restore the missing direction of the ten pairs clear both ways. Existing areas keep their ids; the 48 nav ladders are unchanged. Re-analyzed in game (same graph, fresh visibility).
The engine hull audit run for the review fixes also lists level links blocked on every lane in both directions. Where the blocker is static and bots do not cross: - Delete three areas no player hull fits in anywhere: a crouch area under the robobag rack near (1962, -3640), an area under the tree near (-366, -3812) and the top of the AC unit near (537, -3562), which only 94 u climbs reached. - Delete 7634, a sliver on the bottom tread of the stair flight near (1166, -3162). Bots coming down the flight and heading for it hit the stair; the flight keeps its links to the floor. - Cut 8101 <-> 10248 through the handrail near (1200, -3712); bots go round it. Two links at the feet of other flights, which the audit reads blocked because its hull meets the first tread, are kept: bots cross them. Existing areas keep their ids; the 48 nav ladders are unchanged. Re-analyzed in game (same graph, fresh visibility).
A connectivity check of the open navmesh PRs failed this mesh on three half cuts left by commit 1's railing pass, which judged each direction of a link on its own: - Restore 8186 -> 3, the drop off the kcar roof near (1312, -4212) to the floor 51 u below. Its climb was kept, and bots on the roof dropped off it anyway. - Restore 10421 -> 323, the drop off the handrail top near (-50, -30) to the platform 46 u below. Its climb was kept. - Cut 1533 -> 6074, a 30 u climb from the ramp onto a stair top near (-88, -3880) through the stair's stringer: the engine hull audit finds no clear lane. Every class makes both restored drops (link walker). Existing areas keep their ids; the 48 nav ladders are unchanged. Re-analyzed in game (same graph, fresh visibility).
sunzenshen
added a commit
to sunzenshen/neoAssets
that referenced
this pull request
Oct 4, 2026
As navmesh-terminal-release 9473417 (NeotokyoRebuild#140): restore 8186 -> 3 and 10421 -> 323, cut 1533 -> 6074 through the stair stringer.
Contributor
Author
sunzenshen
marked this pull request as ready for review
October 9, 2026 04:05
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_terminal_jgr: navmesh rework
One file,
neo/maps/nav/ntre_terminal_jgr.nav. Most of it was measured on upstream master plus NeotokyoRebuild/neo#2176 and NeotokyoRebuild/neo#2186 ("Bots skip weapons they cannot reach", merged since), with harness logging added, and again with #2176 switched off.Dependencies and status
Needs (worse than master, or broken, without it):
The rest of the mesh needs no code change.
Helped by (measured better with it; the mesh does not wait on it):
Pending before review:
At a glance
What changed
CNavArea::UpdateBlockedfinds a solid at the center of 2 of master's areas (a prop and a brush) on every restart. They are cut around the obstacle.Nav ladders
The map has 50 ladder brushes (
CONTENTS_LADDER; no ladder entity) and master's mesh has no nav ladder, so bots never climbed. The flatcar decks and the balconies at the car ends (z 80) were out of reach: their only links in are "jumps" of 73-80 u from the track floor, more than any class can jump, which the bots' path cost refuses. This mesh has 48 nav ladders, each from the brush's own extent:Ladder 31 (the north face of the flatcar at (2038, -1200)) is descent-only (see "Approaches tried and dropped"). The flatcar keeps its south ladder both ways.
Two brushes get no ladder: one sits inside a flatcar's deck (floor at 80 u on both sides), and the other's foot is a hole in the floor slab down to z -64, 84 u below the brush.
The fence gaps
The fence at x -860 has two gaps. Master's four areas along its east side (9349-9352) are kept with their links and ids, so each gap leads straight into the area beyond it: 1.4 stuck events a match there (0.33 bot episodes).
The foot of the ramp to the platform
The ramp to the central platform is 75 u wide and climbs from the floor at x -650 to the platform at (-75, -450, 256) over open floor. Bots coming from the south-west met it at the south-east corner of its foot, and their next path point was 220 u up the ramp. They walked along its south edge, slid off while it was still low, followed its side on the floor and slipped under it once it was high enough to stand under. From below they passed the ramp's path points one by one and ended pressing into the platform wall under its top. Of 83 traced bots stuck there, 82 never set foot on the ramp. It was the largest stuck spot on this mesh without the edit and on master (master 8 events a match).
The first 50 u of the ramp (x -650..-600) is its own area, so the path turns onto the ramp's center line while the ramp is low enough to step onto. In the A/Bs below the spot goes from about 6 stuck events a match without that area to 0-0.04.
Wheel trucks
Id alignment
1885 of the 1893 areas carry the id of the master area they match, so an id-keyed diff against master reads sensibly. New areas (two balconies, the ramp's foot, three pieces at the wheel trucks) take ids above master's highest, and the fence areas keep master's 9349-9352. Ladders are numbered 1-48 (master has none). The alignment changes ids only: geometry, connections, attributes and the analysis data are unchanged by it.
How it was tested
.nav. JGR with the juggernaut pinned at each of its 5 spawn points in turn (sv_neo_jgr_spawn_force, Allow pinning the juggernaut to a specific spawn point neo#2169), 30 bots, default weapon damage, 8 matches at a time; every match reached match end with 0 asserts. The count excludes stuck events in the spawn crush at round start and the weapon-scavenging behavior. The master comparisons ran on this mesh without the audit, climb, roof and drop-back edits above; those edits were measured against the mesh without them. "The rework alone" is this mesh without its nav ladders, fence areas, ramp foot, wheel-truck cuts and those edits.FAIL_NO_PATH_EXISTS10.0 -> 4.9; "fell off the path" 8.6 -> 0.5; no fall deaths.FAIL_NO_PATH_EXISTS7.8 -> 6.2 (upstream build), 1.3 -> 1.2 (larger build); no fall deaths.FAIL_NO_PATH_EXISTS6.5 -> 6.5 a match; "fell off the path" 0.2 -> 0.4; no fall deaths. Kills 66.0 -> 63.3 a match, kills a minute of live round x0.94 [0.87, 1.01]: the direction flips between juggernaut spawns and between batches, and a third arm in one batch, with only the climb cuts and the roof removal, ran x1.09 [0.94, 1.28] against the mesh without them, so 25-match arms differ by about 10 % on this map. 90-91 % of kills between bots in different nav areas.FAIL_NO_PATH_EXISTS6.3 -> 6.8; no fall deaths; 92 % / 91 % of kills between bots in different nav areas.bot-navmesh-generation-researchwith logging, its research switches at their defaults), 5 runs a spawn, 25 pairs, every match to match end with 0 asserts:FAIL_NO_PATH_EXISTS0.9 -> 1.1 a match; kills 60.6 -> 64.2; no fall deathsHow 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. Terminal has no ghost spawns or capture zones, so here the probe also needs the server forced into CTG and two more harness patches that spawn the ghost and send bots to it without a capture zone. The areas removed as unreachable were judged from drop heights against the class crouch jumps, not probed, and the A/Bs above pin the juggernaut, not the ghost. The ladder probes ran on the harness research build, which has those patches.
Known, not changed
Earlier measurements (the rework alone, and the rework with its ladders and fence areas)
These ran on earlier revisions of this mesh. The rework alone (1940 areas) has no nav ladders and merges master's four fence areas into one strip, and lacks the ramp foot, the wheel-truck cuts and the audit, climb, roof and drop-back edits. "With ladders and fence areas" adds the 48 nav ladders and master's fence areas (1949 areas). Ids: 1938 of the 1940 areas of the rework alone carried master's ids (kept ids more than 64 u from their master location fell from 128 to 59, and an id-keyed diff showed 2 added / 722 removed areas), and 1941 of the 1949 with ladders and fence areas. Counting no walk link that climbs 68 u or more, the rework alone left 252 areas in 51 pockets out of reach.
FAIL_NO_PATH_EXISTSmove failures 7.3 -> 5.9 a matchFAIL_NO_PATH_EXISTSmove failures 9.7 -> 9.3 a match (x0.96 [0.74, 1.25]; master 10.5)Approaches tried and dropped