Repository navigation
ntre_tarmac_ctg: navmesh rework - #149
Merged
sunzenshen merged 7 commits intoOct 14, 2026
Merged
Conversation
One file. Against master: 1197 -> 935 areas, 911,889 -> 582,989 bytes; areas the engine blocks at every round start 14 -> 0. - Sliver areas merged into their neighbors on the same floor, and areas the engine blocks at round start (a brush or prop over their center) cut away. - Walk links a player hull cannot cross are cut: two drops through concrete walls (1348 -> 3420 near (384,-480); 317 -> 35 west of ladder 1), links through crates, seats, bench lockers and a flight-suit prop, and a link between areas that touch only at a corner. - The basin under the deck near (1480,1320), 33 u below the floor around it: routes no longer drop into it (from the deck and the east rim strip), its floor edges stand a half hull off the walls, and the six areas along its rim are PRECISE + CLIFF. - A 44 u climb into the crouch duct behind the tech door near (256,1034) is cut one way; the duct keeps its drop out. - The washroom areas stop short of the stall partitions. - Ladder 1 (1093,1239): its top was connected to nothing; it lands on the platform 317 again, for now as a climb exit only. - Removed: the desk top under the rack rail at ghost spawn 2 and an alcove behind a handrail end (blocked at every round start), and two drop-only pockets nothing can reach (a shelf 142 u up, a box top 118-131 u up). - Re-analyzed in game after the edits.
Renumbers area and ladder ids only, so an id-keyed diff against master reads sensibly: 932 of the 935 areas and both ladders carry the id of the master area they match. Areas are matched only within 64 u of height. Geometry, connections, attributes and the analyzed visibility data are unchanged (verified topology-identical).
The platform 317 lists ladder 1 down again, as on master, so the ladder is connected both ways. On upstream ladder code a bot going down from 317 stalls at the rail about every second round, as on master; with the ladder-descent fix in bot code it gets down in about a second. Re-analyzed in game.
Bots still fall into the basin under the deck now and then. Its rim is 33-34 u up, and under the deck slab there are 48 u between the rim and the slab, less than any standing hull and the Support's crouched one, so a climb out under the deck fails and bots stayed until they died. Open sky is only over the south trench and a strip past the slab's east edge. - 3077 is split at y 1225 as on master: the trench piece (3076) keeps the west exit to 3232, the piece under the slab loses it. - 3232 reaches south to y 1186, so that exit crosses in the open. - The exits under the slab are cut: from 54 west to 64 / 3232 and north to 7 / 39 / 595. - The east exits (54 / 597 / 912 -> 3237) stay. - Re-analyzed in game.
An outside review of this mesh found a 69 u climb kept after its drop back was cut, walk links that run one way only, and areas reached only by climbs no class makes. - Remove 3498 -> 3496 (69 u, over every class's limit). The ledge 3496 keeps its way in from 3489. - One-way links, each swept with a player hull in both directions by the engine's hull audit: cut both ways the five pairs blocked both ways (seats, a bench locker, a handrail); restore the missing direction of the two pairs clear both ways. - Remove the 78-80 u climbs onto three police van roofs and a crate stack. The two van roofs near (1125, 210) and (1600, 740) have no way up for a player either and are deleted. The van roof at (-1790, -400) and the crate stack at (2090, 1610) can be reached by chained jumps; they stay as drop-only areas. Existing areas keep their ids. 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 four areas no player hull fits in anywhere, each with every link blocked: under the rabbitfrog vehicle near (3437, -137), the bench lockers near (-662, 62), the robocart near (362, 537) and a pilot seat near (-312, 162). - Delete 2421, a sliver on the line of the low fence near (1234, -462). The opening beside it (907) stays the crossing. - Cut 1362 <-> 1364, a link across a 25 u gap holding a machine module and a wall near (-688, -488), and 3323 <-> 3504 through a fridge near (50, 630) that cannot move or break. - Cut 744 <-> 3456 across the large vent near (255, -475) and delete 3456, a 5 u strip that link was the only way onto. Links blocked by movable physics props are kept. Existing areas keep their ids. Re-analyzed in game (same graph, fresh visibility).
A connectivity check of the open navmesh PRs failed this mesh on two half cuts. Restore the drops whose climbs were kept: 972 -> 128 off the crate step near (2262, -375) and 3489 -> 277 off the parapet top near (-75, -352). Ghost spawn 7's mezzanine (z -144) was planned only by Recon, up the crate stack. Restore master's way in for every class, the 69 u drop 3496 -> 3498 off the parapet, one way (the climb back stays cut). Mark the parapet top (3489, 3496) NAV_MESH_AVOID: it is a 5 u strip bots fall off, and unmarked it drew Recons off the crate stack, so they reached the ghost later. Mark ladder 2's foot (885) AVOID: bots approaching the ladder there catch on a brush, and the restored routes sent more of them to it. The marks act through a path cost that honors AVOID (NeotokyoRebuild/neo#2170). Existing areas keep their ids; both 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-tarmac-release a4ad372 (NeotokyoRebuild#149): restore 972 -> 128, 3489 -> 277 and 3496 -> 3498 (ghost spawn 7 for every class); AVOID on the parapet top 3489 / 3496 and on ladder 2's foot 885.
This was referenced Oct 5, 2026
sunzenshen
marked this pull request as ready for review
October 9, 2026 05:08
sunmachine
approved these changes
Oct 14, 2026
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_tarmac_ctg: navmesh rework
One file,
neo/maps/nav/ntre_tarmac_ctg.nav. TheNAV_MESH_PRECISE+NAV_MESH_CLIFFmarks use the movement rules of NeotokyoRebuild/neo#2168 (merged). Most of it was measured on upstream master plus NeotokyoRebuild/neo#2176's unwanted-ladder release half and NeotokyoRebuild/neo#2186 ("Bots skip weapons they cannot reach", merged since), with harness logging added, and again with #2176's descent half on top.Dependencies and status
Needs (worse than master, or broken, without it):
NAV_MESH_AVOIDmarks on the parapet top (areas 3489, 3496) and ladder 2's foot (885): without it they do nothing, and Recons take the parapet to ghost spawn 7 as well (see "Ghost spawn 7")."#2176's unwanted-ladder release half" below is its changes 1 and 7; "its descent half" is its changes 3, 10 and 15.
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
PRECISE+CLIFF. Bots that fall in are routed to the exits a player can climb (below).Id alignment
922 of the 925 areas carry the id of the master area they match (the trench area split off for the basin's exits takes master's 3076 back), so an id-keyed diff against master reads sensibly. Both ladders keep ids 1 and 2. Areas are matched only within 64 u of height. The alignment changes ids only: geometry, connections, attributes and the analysis data are unchanged by it (verified topology-identical).
Ladder 1
Ladder 1 is a 34 u ladder on the south face of a pillar, from the floor area 35 up to the platform 317 east of its top. It is connected both ways, as on master.
The basin's exits
Bots still fall into the basin now and then, off the deck's south edge or the narrow rim strip on its east side. Its rim is 33-34 u up. Under the deck, between the rim and the deck's underside there are 48 u, less than any standing player hull (64-70 u) and than a crouching Support (59 u), so a climb out under the deck fails. The exits a player can climb are the south trench, which is open above, and a 12 u strip past the deck's east edge. Without the edits below, 13 of 16 bots that fell in (30 matches) pathed to exits under the deck and stayed until they died. With them 23 of 26 left again (60 matches), most through the trench within 15 s.
Basin stuck events: master 9.0 a match, without these edits 14.4, with them 0.9. Against the mesh without them, whole map x0.71 [0.37, 1.32].
Ghost spawn 7 and the parapet
NAV_MESH_AVOID. It is a 5 u strip bots fall off (16 of 28 bots leaving it in 530 matches went off its north side into the pit, 111-212 u down; none died). Marked, Recons keep the crate stack (28 of 28 rounds, median 17 s), and Assault and Support take the parapet, the only way in for them.NAV_MESH_AVOID. Bots approaching ladder 2 in the trench catch on a brush beside it, and the parapet routes sent more of them there. With the mark, bots use the ladder less (bot visits to 885 9.3 -> 2.5 a match) and the jams there stop (below).How it was tested
trigger_hurtand no other hurt volume, and no drop that kills a bot at full health (the deepest is 242 u, 2 damage). No bot died from a fall on this mesh in any match below..nav, run back to back. CTG, 2 rounds of 3 minutes with the ghost pinned at each of the 10 ghost spawns in turn, 2 runs each, 30 bots, default weapon damage, 8 matches at a time. Every match reached match end with 0 asserts and no crash (292 matches in all, probes and earlier revisions included). The stuck count isOnStuckplusFAIL_STUCKmove failures, excluding the spawn crush at round start and the weapon-scavenging behavior. This comparison ran on the mesh without the one-way-link, climb, roof, hull-audit, drop-back, parapet and AVOID edits (936 areas, 933 with master's ids); those were measured against the mesh without them, below.FAIL_NO_PATH_EXISTSmove failures 5.7 -> 8.0 a match, paired x0.78 [0.43, 1.47] (a heavy-tailed count; with the descent half 11.2 -> 10.5, x0.45 [0.19, 1.13]). "Fell off the path" failures 0.20 -> 0.00FAIL_NO_PATH_EXISTS9.4 -> 9.6 a match; kills 50.8 -> 50.2; ghost captures 28 -> 22 of 240 rounds; no fall deaths; 86 % of kills between bots in different nav areas on both.FAIL_NO_PATH_EXISTS11.3 -> 13.0; kills 50.8 -> 51.6; ghost captures 5 -> 5 of 60 rounds; no fall deaths; 87 % / 86 % of kills between bots in different nav areas.bot-navmesh-generation-researchwith logging; it carries #2170's AVOID cost, its research switches at their defaults), the same design (each of the 10 ghost spawns pinned, 2 runs each, 30 bots, default weapon damage, 8 matches at a time), 20 pairs, every match to match end with 0 asserts:FAIL_NO_PATH_EXISTS0.3 -> 1.2 a match; kills 51.2 -> 49.5; 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. To test one spot in game, the ghost is placed on it and bots are sent to get it.
sv_neo_ghost_spawn_pos "x y z", which replaces the position of the round's ghost spawn. The map file is not edited..bspunder a second name that loads its own.nav, so the same pin runs on both meshes in one batch.On this map
Both ends of both ladders were probed, 3 matches each, 12 bots, at a tenth of weapon damage, on the same build. Every probe was reached in 3 of 3 matches on both meshes (first pickup at 23-28 s): ladder 1's top (317) and foot (35), ladder 2's top (318) and foot (885).
Known, not changed
Earlier measurements (without the basin's exits)
These ran on the mesh without the basin's exits and the edits the master comparison above lacks. Master against it, the same comparison: x0.18 [0.09, 0.35]. Without ladder 1's descent as well, on upstream plus #2176's release only, 16 matches at a time, 30 pairs: x0.12 [0.08, 0.19].
Approaches tried and dropped