Repository navigation
Bots break a vent cover in a crawl gap along their path - #2231
Merged
sunzenshen merged 1 commit intoOct 17, 2026
Merged
Conversation
A bot whose path runs through a crouch-height gap closed by a func_breakable vent cover never clears it: the check that nothing stands in front of the breakable sweeps the standing body, which meets the gap's lintel first, so the vent is dropped and the bot presses against it until the stuck monitor gives up. Sweep a crouched body when the standing one meets something else first. The look for breakables also stopped at a drop segment, so a bot leaving a duct by a drop had no path line to sweep. A drop's ledge is walked at the height of the floor above before the fall, so that leg now counts for breakables (the prop detour keeps ground legs only). Seen on ntre_rise_ctg, where ladders 3 and 4 stand in shafts entered through such vents: no bot ever climbed either before this.
This was referenced Oct 15, 2026
sunzenshen
marked this pull request as ready for review
October 15, 2026 03:57
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.
Description
A bot whose path runs through a crouch-height gap closed by a breakable vent cover never breaks the cover. It presses against it until its stuck handling gives up and it leaves. The path follower's look for breakables (
CNEOBotPathObstacles, from #2197) keeps a breakable only when nothing else stands in front of it on the way, and checks that by sweeping the bot's standing body along the path. In a crawl gap the standing body meets the gap's lintel first, so the cover is dropped as "something else is in front of it". The look also stopped at the first segment of the path that is not walked on the ground, so from inside a duct that the path leaves by a drop, there was nothing to sweep at all.ntre_rise_ctghits both: ladders 3 (-219, -952) and 4 (355, 376) stand in shafts entered through such gaps, each a 56 u high slot closed by afunc_breakablevent cover (health 5). No bot ever climbed either ladder: bots crouch-jump onto the slot's sill, press the cover, and leave after about 5 s; bots that come down ladder 3 into the shaft press the cover from inside.What this PR does
neo_bot_path_obstacles.cpponly:DROP_DOWNsegment's position is the point past the ledge at the height of the floor above, which the bot walks to before it falls, so that leg now counts for breakables. The prop detour keeps sweeping ground legs only.How to test
map ntre_rise_ctg,sv_cheats 1,neo_bot_quota 12, join spectator.PathClearBreakable), crouch through, and reach the ladder.Risk
UTIL_TraceHulla path leg up to it).Results
Linux dedicated servers, Release builds of upstream master (at #2203) with test-only logging (kills, stuck events, ladder ends, round and match end), without and with the change; the Debug build for the assert check is upstream master with this PR and #2232 plus the same logging. Every match below reached match end with 0 asserts and a clean exit. XP held at one rank tier per match, rotated across matches.
ntre_rise_ctg, the two vents (navmesh as merged in NeotokyoRebuild/neoAssets#160). 12 bots, Recons only, the attacking team spawned at the vent's room, the ghost pinned past the ladder's top, low damage so the run is about movement, 2 matches a spot:At ladder 4 every bot that reached the sill broke the vent; most then re-planned another route, because the engine's round-start blocked-area test marks ladder 4's top area (under a 48 u hatch) blocked one second into the round, so every path planned after that avoids the ladder. That is a separate fix, not in this PR.
22 maps with ladders, normal play (one match per ghost / juggernaut spawn, 172 matches an arm, 30 bots, default damage 1.485, interleaved 8 wide; the "with" build also carried #2232). This PR's crouched sweep kept a breakable 8 times in the 172 matches: breakable furniture props (stools, a shelf) on
ntre_marketa_ctg(4) andntre_tarmac_ctg(1), a glass pane onntre_rogue_ctg(1, found on a drop's ledge leg), a breakable panel onntre_threadplate_ctg(1) andntre_rise_ctg(1, a window). Elsewhere the two builds run the same code paths. Totals without -> with: kills 5725 -> 5916, ladder climbs completed up 1087 -> 1068 and down 169 -> 188, CTG captures 11 -> 17 of 153 rounds; stuck events 1685 -> 1200, a difference carried by single matches on maps where neither change fired (one match a spawn, so per-map stuck counts vary that much between runs).Debug build: 14 matches (the six
ntre_rise_ctgladder runs above and one 30-bot match each onntre_rise_ctg,ntre_terminal_jgr,ntre_marketa_ctg,ntre_rogue_ctg,ntre_threadplate_ctg,ntre_tarmac_ctg,ntre_saitama_ctg,ntre_ridgeline_ctg): 14 of 14 at match end, 0 asserts.Not run: a Windows build.
Approaches tried and dropped
Toolchain
Linked Issues