Skip to content

raid-walk: re-place hires frozen on a navmesh island at the placement point - #439

Merged
pjerra merged 1 commit into
devfrom
fix/place-unfreeze
Nov 8, 2026
Merged

pjerra merged 1 commit into
devfrom
fix/place-unfreeze

Conversation

@pjerra

@pjerra pjerra commented Nov 8, 2026

Copy link
Copy Markdown
Owner

After a raid-walk --place, two seats in every Zul'Gurub Jin'do raid stood frozen at the placement point for the whole first fight. This happened in walks 54 and 55, in 20 of 20 raids. Fights with the pair frozen won 22 % of the time; fights without it won 50-71 %.

Cause. A live repro on a test server found it. The spread=5 place drops those seats onto a small navmesh island next to the step-516 place point, and that island is disconnected from the rest of the mesh. From there every move fails with NOPATH (reach spell / reach melee return dispatch-short path=0x8). An offline path-check confirms there is no path.

Change: the unfreeze check. From 15 s to 120 s after the first watch sample following a place, the walk judges every hire. The judging uses the poll's own time, with a freshness limit of 15 s. A hire counts as frozen when all of these hold:

  • it has stood within 2 yd of the same spot for 10 s;
  • it is inside spread+6 yd of the place point;
  • it is more than 35 yd from the MT;
  • the MT is more than 15 yd from the place point.

The 35 yd figure comes from the repro: the frozen pair was 58-60 yd from the MT's first fight.

Re-place. The commander goes .go xyz onto the MT at z+2. The walk waits for the landing to be confirmed within 5 yd, then .summons the hire. Limits:

  • at most 2 re-places per hire;
  • at most 3 failed summons per hire, 5 s apart;
  • at most 3 .go failures in a row;
  • the check stops on MT death or a wipe.

Every placement move re-arms the check (retry, retreat, reuse or bind gather), and the old arm's summary line is written first.

Logs. placement: re-placed <bot> (frozen at x,y,z for <s>s), failure lines, and a closing placement: frozen=<n> re-placed=<n>.

Flag. On by default for --place; turn it off with --no-place-unfreeze.

Known limits:

  • A .summon counts as done when the GM line is sent. The walk does not wait for the hire's new position. The walk report's FROZEN-AT-PLACE flag catches a hire that stayed frozen.
  • The commander stays beside the MT, possibly inside its fight.

Tests. Table tests for the frozen rule, plus driver tests through the real pollOnce with frames 6-13 s old. They cover:

  • a caster near the point that is not frozen;
  • a landing delayed past 500 ms;
  • summon and .go failures;
  • the window start;
  • re-arms;
  • a wipe, a dead MT, and die-and-revive;
  • two frozen hires in one tick.

Mutations on each rule were caught. vm-test ta passes in full, and the targeted -race run (Unfreeze|FrozenBots|TestPlace|TestParse) passes.

Reviews. Codex adversarial plus a cold review, three rounds.

… point

Cause: the spread=5 place drops seats onto a disconnected navmesh island beside
the ZG Jin'do place point, where every move fails with NOPATH. Rule: under 2 yd
moved in 10 s, inside spread+6 yd of the point, over 35 yd from the MT, MT over
15 yd from the point, judged on the poll's time. Action: .go xyz onto the MT at
z+2, landing confirmed, then .summon; at most 2 re-places per hire, with failure
caps. Re-armed on every placement move. --no-place-unfreeze turns it off.
@pjerra
pjerra merged commit 7388065 into dev Nov 8, 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