fix(#171): gate NPC UP hard-snaps while stuck — the sticky/snap tug-of-war (gate-1 residuals)

Gate 1 (2026-07-04): "better in general" + three residuals — monsters
pushed INTO the player, attacks with stale facing, position
"flashing/flapping instead of gliding". All three are ONE mechanism:
the legacy NPC UpdatePosition handler hard-snaps position, orientation,
and velocity/cycle UNCONDITIONALLY, fighting the armed sticky every UP
(ACE's authoritative rest pose sits ~0.6 m out and its server-side
facing lags the strafing target; the client stick holds 0.3 m + live
facing — oscillation at UP cadence).

Retail is immune by architecture, not by tuning: UP corrections flow
through the InterpolationManager into the SAME per-tick
PositionManager::adjust_offset chain where StickyManager::adjust_offset
OVERWRITES them while armed (0x00555190 chain order; 0x00555430 assigns
m_fOrigin). A server correction can never fight an armed stick
frame-by-frame. The remote-player branch already has exactly that
(queue -> combiner -> sticky overwrite); the legacy NPC path snaps
outside the chain.

Fix: suppress the NPC UP position/orientation/velocity-adoption snaps
while the entity is stuck (PositionManager.GetStickyObjectId() != 0) —
the retail chain semantics translated to the snap architecture.
LastServerPos/Time + cell bookkeeping still record; server truth
reasserts on the first UP after unstick, bounded by the 1 s sticky
lease. Register row TS-44 (same commit); retires with the S6/R6
interp-queue unification of the NPC path.

Apparatus: ACDREAM_PROBE_STICKY=1 — per-guid [sticky] lifecycle lines
(STICK / UNSTICK / LEASE-EXPIRE / TARGET-status teardown), per-armed-
tick steer lines (signed gap dist, applied delta, heading delta, live
resolve), and [sticky-snap-skip] at the suppressed-snap site.
PhysicsDiagnostics.ProbeStickyEnabled owns the flag (rule #5).

Full suite 4038 green. Awaiting gate 2 (pack melee vs retail).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-07-05 09:34:25 +02:00
parent 5bd2b8bc8b
commit 7a82317614
5 changed files with 90 additions and 4 deletions

View file

@ -100,6 +100,20 @@ MoveTo distance math. **SSOT:** `docs/research/2026-07-04-171-sticky-melee-hando
**Acceptance:** side-by-side vs retail in a scamp pack: attackers hold separation
+ face the player while it strafes; user visual gate.
**Gate 1 result (2026-07-04):** "in general it is better" but three residuals:
(1) monsters sometimes pushed INTO the player; (2) monsters sometimes attack
while facing the wrong way; (3) "flashing/flapping instead of gliding". All
three = ONE mechanism: the legacy NPC UP handler hard-snaps position (5678) +
orientation (5714) + velocity/cycle UNCONDITIONALLY, fighting the armed sticky
per tick (ACE's authoritative rest pose sits ~0.6 m out + lags the strafing
target's bearing; sticky pulls to 0.3 m + live facing → oscillation at UP
cadence). Retail is immune BY ARCHITECTURE: UPs flow through the
InterpolationManager into the same adjust_offset chain where sticky OVERWRITES
them while armed. **Residual fix:** suppress the NPC UP snaps while stuck
(register TS-44 — the retail chain semantics translated to the snap path) +
`ACDREAM_PROBE_STICKY=1` apparatus (`[sticky]` lifecycle/steer lines +
`[sticky-snap-skip]`, all per-guid). Awaiting gate 2.
## #170 — Remote creature chase+attack renders wrong vs retail (glide, over-frequency, uniform attack anims)
**Status:** DONE (2026-07-04) — **user visual gate PASSED** ("looks good, as close