Fix proxy stop/land animation linger & snap

Prevent proxies from continuing jog/landing animations after a remote stops and fix snap desyncs. Treat network-authoritative idle (graphSpeed < 0) as definitive and stop falling back to measured lerp speed; pin/snap position when remote is not locomoting and ensure transforms snap on stop receive. Shorten sender-side hold times for movement and jump states to reduce stale motion in packets, and use isMoving (not stale graphSpeed) for landing resume decisions. Changes in plugin sources and main config, plus an updated dev log entry.
This commit is contained in:
2026-06-05 16:12:34 +12:00
parent 9412fcf8ea
commit c4a7b6dedb
5 changed files with 69 additions and 13 deletions
+37 -1
View File
@@ -5106,4 +5106,40 @@ won't change cadence and we move to the velocity-driven movement rework. Next te
### Build Status
✅ **SUCCESS** - `xmake build` clean; DLL deployed to game F4SE/Plugins.
✅ **SUCCESS** - `xmake build` clean; DLL deployed to game F4SE/Plugins.
---
## 2026-06-05 — Proxy stop/land animation linger and snap desync
### Symptoms
- Jog (and other locomotion) kept playing ~1s after the remote stopped moving.
- Jump pose lingered after landing.
- On stop or small corrections, proxy snapped to server position but legs kept playing forward locomotion.
### Root Cause
`ApplyProxyLocomotionFrame` treated `puppetGraphSpeed = -1` (idle) as "use measured horizontal
speed from lerp/Move()". While the proxy still converged toward `targetPosition` after a stop
packet, measured speed stayed above the locomotion threshold and re-fed jog cadence via the
puppet hook even though animation sync had already requested idle.
Sender-side holds (`kMovementStopHoldDuration` 300ms, `kJumpStateHoldDuration` 400ms) also kept
`isMoving`/`isJumping` true in packets briefly after the actual stop/land.
### Fix
1. **Puppet idle is authoritative** — `ApplyProxyLocomotionFrame` no longer falls back to measured
speed when `a_graphSpeed < 0`; it zeros controller velocity and skips motion feedback.
2. **Decouple position from animation on stop** — `ApplySmoothFrameMovement` snaps to
`targetPosition` when the remote is not locomoting (no lerp glide). Same path when already at
target.
3. **Snap on stop receive** — `MoveSlotProxyToRemotePlayer` snaps transform when
`!isMoving || movementSpeed < 1`.
4. **Shorter sender holds** — movement stop 300→100ms, jump 150ms (was 400ms).
5. **Jump land tier** — landing locomotion resume uses `isMoving` only, not stale `graphSpeed`.
### Build Status
✅ **SUCCESS** — `xmake build` in `plugin/`.