mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-08-03 11:29:22 -04:00
A WotLK MO_TRANSPORT publishes where it is on its route: GAMEOBJECT_LEVEL is the route's period in milliseconds, and the high int16 of GAMEOBJECT_DYNAMIC is how far through that period the hull currently is, as a fraction of 65535. Neither field was being read, so the client animated on a period it worked out for itself from distance over speed — and when that came out shorter than the server's, the ferry simply lapped its shore until the schedule caught up. The phase is a fraction, so it maps onto whatever timeline the client's spline has without the two periods needing to agree, and it keeps agreeing as the ride goes on because it advances at the server's rate rather than a derived one. Both fields are WotLK-only; nothing earlier published a transport's phase. On those expansions fieldIndex returns 0xFFFF, the clock is never adopted, and the existing local animation runs unchanged — covered by a test, along with the wrap and a zero period, which is what every non-transport GameObject reports. This syncs the cycle, not the position within it. The client still animates one map's slice of a cross-continent route on its own geometry, so where the hull sits at a given phase is still the client's own answer; what changes is that it completes exactly one cycle per server cycle instead of several. Matching the position too means mapping the phase onto the sub-interval of the full route that belongs to this map, which is a larger change to how slices are built.