* L.2g S2-blocker trace — what does a RETAIL OBSERVER do with ACE's * flags=0 "empty" UpdateMotion while the actor toggles walk/run? * * Attach target: the retail OBSERVER client (standing still, watching). * Driver: the user Shift-toggles + starts/stops the ACTOR from the other * retail client. * * Expected chain per decomp (to confirm or refute): * CPhysics::SetObjectMovement (gates, stamps) [SOM] + obj id * MovementManager::unpack_movement (10-way dispatch) [UNPACK] * CMotionInterp::move_to_interpreted_state (flat copy) [MTIS] + IMS dump * CMotionInterp::apply_interpreted_movement [AIM] * CMotionInterp::apply_raw_movement (local-player alt) [ARM] * CMotionInterp::DoInterpretedMotion per axis [DIM] + motion id * * The [MTIS] InterpretedMotionState dump on an empty UM is THE answer: * if forward_command=0x41000003 (Ready) is flat-applied and [DIM] shows * Ready, retail really does stop the remote — and the observer's clean * rendering must come from somewhere else. If the dump or the DIM stream * shows something else (e.g. WalkForward), we found the mechanism. * * Auto-detach: after 600 SetObjectMovement hits via .detach (NOT qd — * qd is silently ignored in bp actions, see project_retail_debugger.md). .logopen C:\Users\erikn\source\repos\acdream\.claude\worktrees\vigorous-joliot-f0c3ad\l2g-observer-trace.log .sympath C:\Users\erikn\source\repos\acdream\refs .symopt+ 0x40 .reload /f acclient.exe x acclient!CPhysics::SetObjectMovement x acclient!MovementManager::unpack_movement x acclient!CMotionInterp::move_to_interpreted_state x acclient!CMotionInterp::DoInterpretedMotion r $t0 = 0 bp acclient!CPhysics::SetObjectMovement "r $t0 = @$t0 + 1; .printf \"\\n[SOM %d] obj=%p movSeq=%x scSeq=%x auto=%x id: \", @$t0, poi(@esp+4), poi(@esp+10)&0xffff, poi(@esp+14)&0xffff, poi(@esp+18); dt acclient!CPhysicsObj poi(@esp+4) id; .if (@$t0 >= 250) { .detach } .else { gc }" bp acclient!MovementManager::unpack_movement ".printf \"[UNPACK] mm=%p\\n\", @ecx; gc" bp acclient!CMotionInterp::move_to_interpreted_state ".printf \"[MTIS] minterp=%p ims:\\n\", @ecx; dt acclient!InterpretedMotionState poi(@esp+4); gc" bp acclient!CMotionInterp::apply_interpreted_movement ".printf \"[AIM] minterp=%p\\n\", @ecx; gc" bp acclient!CMotionInterp::apply_raw_movement ".printf \"[ARM] minterp=%p\\n\", @ecx; gc" bp acclient!CMotionInterp::DoInterpretedMotion ".printf \"[DIM] minterp=%p motion=%08x\\n\", @ecx, poi(@esp+4); gc" g