Files
WoWee/include/rendering/animation_controller.hpp
Josh Anderson 6adc272def Fix falling animation while riding, revert to flat tram orientation,
guard against corrupt-position disembark

Three separate fixes from this round's live testing:

1. Falling animation during a smooth ride ("kept like playing the
   falling animation the whole time"). The M2 ride-lock code
   overwrites render position directly every frame, so the camera
   controller's own gravity/collision correctly finds no real ground
   under a moving platform over open track and reports not-grounded -
   right for physics, but that fed straight into the animation FSM as
   "falling" for the whole ride. Added AnimationController::
   setM2TransportRiding() to override just the animation-facing
   grounded signal while actively riding, without touching the camera
   controller's real physics/collision (needed for walk-while-riding
   to keep working).

2. Reverted tram orientation from a clamped partial pitch back to a
   full flatten. The clamp was added to address an earlier "clipping
   into the ground" report, but a live comparison against the real
   game client confirmed real Deeprun Tram cars stay level through
   elevation changes - any visible tilt is wrong regardless of
   clipping trade-offs.

3. Live data caught a transient position corruption: after riding
   smoothly for ~70s, one frame produced player=(-44.9,2309.03,..) vs
   tram=(2309.83,-45.4,..) - the player's X and Y are each within ~1
   unit of the tram's Y and X respectively, an axis swap rather than a
   real position, yielding horizDist~3330 and an instant disembark
   right as the tram approached the destination platform ("kicked me
   off when I almost got to the other station"). Root cause not yet
   found (suspected: a raw server-coordinate movement update landing
   without the usual serverToCanonical swap - that conversion has the
   same X/Y-swap shape as the corruption, and a "MSG_MOVE_TELEPORT_ACK:
   not enough data for movement info" was logged moments later in the
   same session). Added a sanity guard: skip the disembark check
   entirely on a physically-impossible single-frame jump rather than
   trusting it, so a future occurrence can't eject the player over
   open track on bad data while the real source gets tracked down.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-10 06:28:54 -05:00

13 KiB