From f18de7ccdea7f94328848206a286986b6673da10 Mon Sep 17 00:00:00 2001 From: Erik Date: Thu, 14 May 2026 20:20:21 +0200 Subject: [PATCH] fix(B.6 slice 2): don't cancel autowalk on the companion InterpretedMotionState MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prior trace (launch-slice2.log) showed ACE follows every mt=0x06 MoveToObject immediately with an mt=0x00 InterpretedMotionState (cmd=0x0007 RunForward, fwdSpd=2.86) — the locomotion echo for the same auto-walk, NOT a cancel. My wiring was treating the second packet as 'server intent changed' and calling EndServerAutoWalk, which killed the auto-walk on frame 1. Result: [autowalk-begin] immediately followed by [autowalk-end reason=motion-non-moveto] and zero visible motion. Remove the over-eager cancel. The two natural cancel paths remain: arrival detection inside ApplyAutoWalkOverlay, and user-input cancellation (any movement key). A fresh MoveToObject re-targets via BeginServerAutoWalk overwrite, which is the correct sticky-targeting behavior. --- src/AcDream.App/Rendering/GameWindow.cs | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/AcDream.App/Rendering/GameWindow.cs b/src/AcDream.App/Rendering/GameWindow.cs index 76b09d7..6d002a9 100644 --- a/src/AcDream.App/Rendering/GameWindow.cs +++ b/src/AcDream.App/Rendering/GameWindow.cs @@ -3345,13 +3345,19 @@ public sealed class GameWindow : IDisposable $"[autowalk-begin] dest=({destWorld.X:F2},{destWorld.Y:F2},{destWorld.Z:F2}) minDist={pathData.MinDistance:F2} objDist={pathData.DistanceToObject:F2} towards={update.MotionState.MoveTowards}")); } } - else if (_playerController.IsServerAutoWalking) - { - // A non-MoveTo motion arrived (e.g., Ready, or a - // user-input echo) — server's auto-walk intent is - // gone; release the local driver. - _playerController.EndServerAutoWalk("motion-non-moveto"); - } + // Note: do NOT cancel auto-walk on a non-MoveTo motion + // arriving. The trace (2026-05-14, launch-slice2.log) + // shows ACE follows every mt=0x06 MoveToObject + // immediately with an mt=0x00 InterpretedMotionState + // (cmd=0x0007 RunForward, fwdSpd=2.86) — the + // companion locomotion echo, NOT a cancel. The two + // travel as separate packets but both belong to the + // same auto-walk. Cancelling on the InterpretedMotionState + // killed the auto-walk on frame 1. Arrival detection + // (inside ApplyAutoWalkOverlay) and user-input + // cancellation (same) are the two natural end paths; + // a fresh MoveToObject re-targets via BeginServerAutoWalk + // overwrite. } } else