fix(combat): escape occupied login positions

Port retail's radius-aware placement ring so a relogging player is seated beside creatures occupying the saved location, and register the local body in the shared resolved-shadow pipeline. Route new forward movement and jump through AbortAutomaticAttack so repeat combat cancels immediately on movement.

Co-Authored-By: Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-12 22:20:17 +02:00
parent e671b8a5c4
commit 00fe993f6f
11 changed files with 643 additions and 16 deletions

View file

@ -46,6 +46,58 @@ Copy this block when adding a new issue:
---
## #207 — Repeat attack continues after movement begins
**Status:** IN-PROGRESS — fix shipped 2026-07-12, pending live gate
**Severity:** HIGH
**Component:** combat / input
**Description:** With Repeat Attacks enabled, starting to move did not stop the
attack loop, making combat difficult to disengage from.
**Root cause:** The attack controller had no port of
`ClientCombatSystem::AbortAutomaticAttack`, and semantic movement input was
never forwarded to combat as retail's `ACCmdInterp::HandleNewForwardMovement`
does.
**Resolution:** Forward, backward, autorun, and jump press transitions now send
the retail cancel-attack event, clear repeat mode, and hide an active combat
power build. Turns and sidesteps remain independent, matching the retail
command-list split. Controller tests prove movement sends one cancel and that a
later AttackDone cannot launch another repeat.
**Research:** `docs/research/2026-07-12-login-placement-and-repeat-cancel-pseudocode.md`
**Acceptance:** Enable Repeat Attacks, start attacking, then press forward. The
attack loop stops immediately and movement proceeds normally.
## #206 — Relogging into a monster leaves the player stuck
**Status:** IN-PROGRESS — fix shipped 2026-07-12, pending live gate
**Severity:** HIGH
**Component:** physics / login lifecycle
**Description:** If a monster moved onto the character's saved position while
the user was logged out, logging back in placed both bodies together and the
character could not escape.
**Root cause:** Login used the cell/floor-only `Resolve` snap and omitted retail
`CTransition::find_placement_pos`, the radius-aware nearest-clear-position
search. The local player was also omitted from the shadow registry, so remote
creatures could not collide/de-overlap against it as retail physics objects do.
**Resolution:** The retail four-metre concentric compass-ring placement search
is ported into Core and runs after login's existing AdjustPosition/floor snap.
The local player now registers a normal multipart collision shadow, skips that
shadow in its own transition, and republishes the resolved body position through
the same shared synchronizer as remotes. A flat-world conformance test begins
inside a monster and proves the selected position clears both bodies.
**Research:** `docs/research/2026-07-12-login-placement-and-repeat-cancel-pseudocode.md`
**Acceptance:** Log out beside a monster, let it occupy the saved position, and
log back in. The character is seated at the nearest clear point and can move.
## #205 — Auto Target clears the toolbar and includes friendly creatures
**Status:** DONE — 2026-07-12, user confirmed the replacement target appears correctly