diff --git a/src/AcDream.App/Input/PlayerMovementController.cs b/src/AcDream.App/Input/PlayerMovementController.cs index a73338a..ada4855 100644 --- a/src/AcDream.App/Input/PlayerMovementController.cs +++ b/src/AcDream.App/Input/PlayerMovementController.cs @@ -1140,7 +1140,20 @@ public sealed class PlayerMovementController // early return) skips Update entirely, so reaching this line implies // we're in a valid in-world pose. _heartbeatAccum += dt; - HeartbeatDue = _heartbeatAccum >= HeartbeatInterval; + // B.6+B.7 (2026-05-15): bump heartbeat from 1 Hz to ~10 Hz while + // the body is actively moving (auto-walk OR user pressing W/A/S/D). + // ACE's server-side CreateMoveToChain polls WithinUseRadius every + // ~0.1 s using the latest Player.Location; 1 Hz heartbeats leave + // up to 1 s of stale position data on the server, which meant + // ACE's MoveToChain rejected our re-sent Use action as still + // out-of-range. With 10 Hz updates ACE sees us approaching in + // ~real-time and the server-side chain converges normally — + // retires the arrival-margin / re-send / flush-AP workarounds. + bool activelyMoving = _autoWalkActive + || input.Forward || input.Backward + || input.StrafeLeft || input.StrafeRight; + float effectiveInterval = activelyMoving ? 0.1f : HeartbeatInterval; + HeartbeatDue = _heartbeatAccum >= effectiveInterval; if (HeartbeatDue) _heartbeatAccum = 0f; // K-fix5 (2026-04-26): local-animation-cycle pacing. Visual rate