Repository navigation
ntre_ridgeline_ctg: navmesh rework and hillside ladder - #143
Merged
sunzenshen merged 8 commits intoOct 14, 2026
Merged
Conversation
One file. Against master: 3473 -> 2981 areas, 9,497,958 -> 7,418,183 bytes; 91 areas no spawn or objective reaches (24 pockets) -> 0; 31 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. - 3 walk links a player hull cannot cross (handrails) are cut. - Hand edits where test bots got stuck: twin ramps and the stair rail between them, a stairway between handrails, catwalk railings too low for a ducked Support, and a sliver. - Stranded floor is reconnected: return links where bots walk out within step height, and one-way Recon climbs (+50, +51, +65 u); the rest, above every class's crouch jump or unlinkable, is removed. - NAV_MESH_AVOID on the tower-base strip where bots stall. - Re-analyzed in game after the edits.
Renumbers area ids only, so an id-keyed diff against master reads sensibly: 2979 of the 2981 areas carry the id of the master area they match, kept ids that moved more than 64 u from their master location drop from 43 to 14, and the diff shows 2 added / 494 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:03
sunzenshen
marked this pull request as draft
September 28, 2026 08:36
Contributor
Author
|
Draft: Going to take a second look at an alleged stray ladder that everyone so far missed. |
An outside review of this mesh found walk links that run one way only, three pits Assault and Support bots can enter and not leave, 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 nine pairs blocked both ways (low walls, pipes, a sloped wall, a stair handrail, an air conditioner, a tree, and the crouch alley near (550, -950), which the audit swept with a crouched hull and bots failed); restore the missing direction of the eight pairs that are clear. Delete the strip inside the power-line tower near (458, -262) that three more ran through. - The pipe trenches near (1625, 2280), (1012, 438) and (1762, 638) are left only by 48 u climbs, which Assault and Support bots do not plan: cut the drops into them and keep the climbs out, so no path leads in and a Recon that lands there climbs out. The climb out of the trench near (1000, 1050), whose drop was already cut, stays as that trench's exit the same way. - Climb-only tops: delete the two pockets nothing can get onto; cut the climbs of 68 u or more into the six a player reaches only by chained or full-height jumps, and keep them as drop-only floor. Beyond the review, from the same audit: delete thirteen more areas no player hull fits in (handrails, low walls, a tree, a radio tower, a radar cone, a cooling unit), and cut two pairs blocked both ways by a plow and a turret. The east plateau near (1400, -900), which nav reached only through the areas inside the tree and the radar cone (as on master), is left with no way in. Existing areas keep their ids. Re-analyzed in game (same graph, fresh visibility).
The east plateau (87 areas, 26 hiding spots: the pipe rack east of the radar deck and the hillside it leads to) had no way in. The radar deck is fenced by handrails 39 u tall, under every class's jump, and a hop over the north rail's east end lands on the crossbeam that runs to the rack. - Add 17368 on the rail's top bar by its east end and 17369 on the crossbeam behind it, linked 1720 <-> 17368 <-> 17369 <-> 13942 (a 39 u climb and drop each way). Both are PRECISE: the bar is 3 u wide and the crossbeam leaves a hull 7-11 u of footing. - Extend 13942 north by 8 u so the crossbeam strip meets it. The old way in ran through areas inside the radar cone and a tree, deleted in the previous commit. Pinned-ghost probes: bots of every class picked up a ghost placed on the rack, none on the previous mesh. In 24 paired matches no bot went there unprompted, and stuck events did not rise (x0.81, 95 % interval [0.59, 1.15]). Existing areas keep their ids; the new ones take the next free ids. Re-analyzed in game (same graph, fresh visibility).
The map's one ladder, by the catwalk near (1080, 3070), had no nav ladder, so bots never planned a climb there. Add ladder 1: bottom on the hillside (5058), top on the ladder's own top (17362), which walks onto the catwalk (507); 507 and 17362 both list it for the way down. The ladder brush is a slab turned 60 degrees and 32 u deep in y. The ladder line sits on its south face, where a climbing hull clears it; at the brush's center, climbing bots were placed inside the slab and hung there. The bottom is at the ground (z -35), not at the brush's bottom 70 u under it. Landing on 17362 rather than the catwalk's center keeps bots from overshooting onto the light pole beside it. Pinned-ghost probes on the catwalk (30 bots, 8 matches): the team that spawns south climbs it about 6 times a match, 38 of 41 top exits land on the slab or catwalk, and the ghost is taken in every match. Existing areas keep their ids. Re-analyzed in game (same graph).
Contributor
Author
Move nav ladder 1 from 3.5 units in front of func_ladder brush 765's turned face onto the face, centered across its width, where the editor's nav_build_ladder would place it. Same areas, links and ids. Measured on the 60-degree brush with the A/D ladder rig (32 runs a placement, two builds): climbs stuck on the ladder 39 -> 9, up approach timeouts 115 -> 79, OnStuck within 300 u of the ladder 211 -> 97. In ordinary 30-bot matches with #2170 + #2175 + #2176 (36 matches) the ladder-foot spot drops 0.61 -> 0.11 events a match and stuck episodes 2.00 -> 1.83 a match, no new spot. It also lets review tools pair the ladder with its brush.
Area 16523's 25 unit strip runs between tree02's trunk and the hillside at (1111, 1648), a gap narrower than a player, so bots walking it to 16519 pressed into the trunk until the stuck monitor fired. Cut the 16523 <-> 16519 link; routes go round west of the tree by 5056, 1972 and 1987. Same areas and ids. Watched with Jinrai spawned north of the tree and the ghost south of it (8 matches a mesh): stalls at the trunk in 6 of 8 matches before, none after. In ordinary 30-bot matches with #2170 + #2175 + #2176 (36 matches) the spot drops 0.61 -> 0 events a match, stuck episodes 2.44 -> 2.22 a match, no new spot.
Bots crossing into area 1983 aimed at x 1150, 2 u from the low wall (concrete_slopedwall_rough) beside the 17268 pocket. The hull met the wall's north tip end-on, slid to its west side and walked into the pocket, pressing there 4-10 s. Move 1983's west edge to x 1166 so the crossings sit a hull half-width off the wall, and delete 15155, the 25 u connector at the tip. Re-analyzed. Package build, 30 bots: spot runs 4/16 -> 1/16; same-size screen (6 pins x3) spot 0.56 -> 0.22 events a match, no new spot nearby. ntnav review: -1 area, -6 links, no reachability change.
sunzenshen
force-pushed
the
navmesh-ridgeline-release
branch
from
October 8, 2026 01:10
b905a1b to
af2c7df
Compare
Contributor
Author
|
I'm opening this one up for review as the complementing PR with NeotokyoRebuild/neo#2176 , as there's only one single ladder to test on this map. |
sunzenshen
marked this pull request as ready for review
October 9, 2026 04:43
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_ridgeline_ctg: navmesh rework
One file,
neo/maps/nav/ntre_ridgeline_ctg.nav.Dependencies and status
Needs (worse than master, or broken, without it):
NAV_MESH_AVOIDareas. This mesh marks the tower-base strip (area 16274)AVOID.NAV_MESH_PRECISEareas, and steer their velocity in the air over them. This mesh marks the two areas of the rail hop onto the east plateau (17368, the handrail's 3 u top bar, and 17369, a crossbeam with 7-11 u of footing)PRECISE.Without them the mesh still loads and works, and the marks are ignored.
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 (mostly a prop) at the center of 31 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.NAV_MESH_AVOIDon the tower-base strip (area 16274), a 25 u strip between handrails and the power-line tower where most bot visits stalled. The mesh keeps it connected; the mark asks bots to route around it.func_ladder, brush 765) had no nav ladder. The brush is an 18 u slab whose climbing face points at yaw 60, 30 degrees off the map's y axis, with no tilt (measured from the BSP's brush planes). The ladder line lies on that face, centered across its 31 u width, where the editor'snav_build_ladderwould put it. The bottom is on the hillside ground (area 5058, z -35), not at the brush's bottom 70 u under it; the top is the slab's own top area (17362), which walks onto the catwalk (507), and 17362 and 507 both list the ladder for the way down.Review fixes
An outside review of the mesh listed walk links that run one way only, three pits Assault and Support bots can enter and not leave, and floor 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.
East plateau
The plateau (87 areas, 26 hiding spots) is the pipe rack that runs east from the radar deck and the hillside at its far end, 100-290 u above the floor around it. On master, nav reached it only through areas inside the tree near (1408, -1588) and beside the radar cone near (650, -637), where a player hull does not fit, so bots never got there; every other link leaves it by a drop. Those areas are removed (above). A player gets on from the deck: the deck is fenced by handrails whose top bar is 39 u above it, under every class's jump (Support and Assault 45 u, Recon 62 u; Support bots plan climbs up to 43 u), and a hop over the north rail's east end lands on the crossbeam that runs to the rack.
NAV_MESH_PRECISE(#2175).How it was tested
Offline checks of the final mesh (no game run):
CLIFFmarkBLOCKED_LINKS map=ntre_ridgeline_ctg level_pairs=6219 oneway=0 keep=0 cut=1 area=1 check=11 entity=5(the low-wall link and the bunker door above; the entities are the window glass; the 11checkpairs are blocked both ways past props and displacement edges and account for 1 stuck event in 18 matches on this mesh). The audit ran before the ladder and the edits after it; those add no walk link (they remove 8) and only move one area's edge away from a wall.The shipping states, one batch. Byte-identical copies of the map, one carrying each
.nav, so the arms interleave. CTG with the ghost pinned at each of the 6 ghost spawns, 3 matches each, 30 bots, default weapon damage (1.485), 1 round, 8 matches at a time. All 54 matches reached match end with 0 asserts. Arm C ran the mesh before the low-wall edit (af2c7df); that edit is measured on its own below. Stuck counts exclude the spawn crush at round start and the weapon-scavenging behavior; an episode is one bot's stuck events less than 10 s apart. Arms B and C ran the ladder PR (#2176) as it was before its latest fixes; the ladder's own tests below run its current code.PRECISE,CLIFForAVOIDmark, and the three code PRs act only on those.The low-wall edit (af2c7df), on its own. Same build and settings as arm C, the mesh before and after the edit. With the ghost pinned at the 4 spawns whose routes pass the wall, 4 matches each: bots in the pocket in 4 of 16 matches before, 1 of 16 after. All 6 pins, 3 matches each (18 a mesh): the spot 0.56 -> 0.22 stuck events a match, no new spot near the edited areas.
The ladder, a climbing rig. Jinrai spawned at the ladder's foot with the ghost on the catwalk (climbs up), or on the catwalk with the ghost at the foot (climbs down), 12 bots, one 3-minute round, a tenth of weapon damage, a 2 s pre-round freeze, 8 runs at a time.
Where the ladder line goes was settled first, on test builds of the bot code from before the ladder PR's latest fixes, 32 runs a placement. With the line on the face, against a first placement a few units in front of it: climbs stuck on the ladder 39 -> 9, up approaches that timed out 115 -> 79, stuck events within 300 u of the ladder 211 -> 97. In ordinary matches with the same settings as the survey above (18 a mesh), the stuck spot at the ladder's foot went 0.61 -> 0.11 events a match, with no new spot. An earlier probe (ghost on the catwalk, 30 bots, 8 matches a mesh) had bots climbing it about 6 times a match, 0 without the ladder. Two earlier fits were dropped too: the line at the brush's center put a climbing bot's hull inside the slab (754 stuck events near it in 8 matches), and landing on the catwalk's center made some bots overshoot onto a light pole beside it.
Master's ladder code against the ladder PR, on this mesh, 32 runs up and 32 down each, plus 16 down runs on a test-only copy of this mesh with the 140 u drop link beside the ladder (17362 -> 11894) cut, so that descents must use the ladder:
On master, 3-6 bots a run stand wedged in the brush at the foot for most of the round. With the ladder PR, a climb starts at the ladder line and the bot runs on across the catwalk; a descent steps out over the top and climbs down. With the drop link kept, about 4 in 10 bots still take the drop, which costs no health.
The ladder's foot in ordinary matches, on the ladder PR's current code: 30 bots, default weapon damage, the ghost pinned at each of the 6 spawns twice, 12 matches a build, master and the ladder PR in one batch. Stuck events within 300 u of the ladder: master 684 (57 a match; bots wedged at the foot in 3 of the 12 matches), the ladder PR 0 in 12 matches (the placement screen above had 0.11 a match). Climbs up finished 14 of 25 on master, 31 of 32 on the ladder PR; runs with a bot held at the ladder 9 and 0. No new stuck spot within 300 u of the ladder; the map's stuck events 849 -> 119, kills 296 against 306, no fall death near the ladder in either build.
The east plateau, pinned-ghost probes. The ghost is placed on the rack by a harness-only server cvar (see "How the pinned-ghost probes work"), at the rack's first area (700, -600) and further along it (900, -588), with the deck (600, -750) as a control. Each match runs 12 bots of one class or the even roster, 3 matches a spot, at default damage, on upstream master with #2170 and #2175. Every class gets on and takes the ghost. With #2175 as it stands, bots took the ghost at the rack spots in 24 of 48 matches (Support in 3 of 12) and at the control in 11 of 12, and 10 % of hop traversals ended off the hop (17 of 165). Without its airborne steering, 24 % did (45 of 191).
Known items
Tried and dropped
PRECISEareas, as a fix for the rail-hop overshoot: no bot sprinted on the hop any more, but the off-hop rate stayed at 24 % (16 of 67). The falls are climb momentum, which #2175's airborne steering addresses instead.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 that loads its own.nav. The same pin then runs on both meshes in one batch.