Skip to content

plan-check: also run the server's exact path query - #304

Merged
pjerra merged 4 commits into
devfrom
feat/plancheck-server-path
Oct 24, 2026
Merged

pjerra merged 4 commits into
devfrom
feat/plancheck-server-path

Conversation

@pjerra

@pjerra pjerra commented Oct 24, 2026

Copy link
Copy Markdown
Owner

plan-check now also asks the server's exact path query, so a plan point the live server would refuse is flagged before a live run.

Why: three live stops on 2026-10-24 (Windhorn Canyon step 641, Hateforge Quarry step 96, a Stormwrought Ruins ledge) passed the old offline check. The navmesh files are byte-identical on both sides; the query differs (the server searches 2048 nodes, plan-check 65535; the run leader treats points within 3 yd as reached; steep polys; the start height).

What changes:

  • nd_server_path in navdetour.cpp: a literal port of the core's path query (2048 nodes, 256 polys, 256 smooth points, the core's filter, end-distance and +3 yd start rules).
  • Planner.ServerPath and ServerMoveVerdict (mirrors the module's move check); Planner.Plan is unchanged.
  • plancheck: after an offline-complete hop, the server query is asked too (new reason server unreachable), plus the 3 yd arrival rule (a direct hop inside it is never sent live).
  • turtle-agent path-check -map <id> -mmaps <dir> <from xyz> <to xyz>: replay a live refusal.
  • The no-cgo build stays green (make nocgo runs in make test).

Known limits (README): the module's 25 yd stand-in search, the lead-spot gather and too-far are not modelled; the check plans from plan points, not from a bot's real floor height; a pull whose pack is already gone moves nobody live, which the static walk does not model.

Tests: 7 navmesh fixtures from the three live cases, plan-check fixtures (Hateforge, Windhorn 820), mutations for the node count, the +3 rule, the server walk, the arrival gate and the check order. An audit of all 50 plans with this check found 53 new refusals in 18 dungeons (most fixed by waypoints since).

plan-check walks every hop on the offline query (65535 nodes, steep
excluded, straight path). The server refuses some of those hops live:
its query keeps 2048 search nodes and 256 polys, includes steep ground,
and builds a smoothed path of at most 256 points, and the run leader's
CheckMove refuses NOPATH and no-progress incomplete legs. A direct hop
inside the arrival radius (kArriveYd, 3 yd) is never sent: WalkTo counts
it reached and the party stays behind.

nd_server_path replays BuildPolyPath + findSmoothPath with the server's
filter; Planner.ServerPath/ServerMoveVerdict expose the type bits and
the CheckMove verdict; the check fails such hops as server unreachable
or hop inside the arrival radius and walks on from where the server
leaves the party. New path-check replays one hop from logged positions.
@pjerra
pjerra marked this pull request as ready for review October 24, 2026 08:03
@pjerra
pjerra merged commit f38e184 into dev Oct 24, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant