the troll gate stops flickering, the signpost lands, the chair holds

- a fix16 animation key is signed: Zul'Farrak's troll gate was drawing its burnt twin inside the intact one (a −1.0 key read as +1.0, so the cull never fired) — 24 two-state models stop showing both states, 65 fade curves lose an over-bright tail
- a GameObject is placed by its quaternion, not its facing: the Ravenwind arm of the Feralas signpost comes down from mid-air onto the post, and 1,411 visible spawns — 123 of them chairs — take their authored tilt; the inspector shows it
- sitting in a chair holds: a jumpless fall puts nothing on the wire until it lands and heartbeats on the ordinary 500 ms deadline, so the stalled frames inside the chair's collider no longer send the moving flag that stood you back up; and the use cursor greys past the chair's own 3.0 yd reach
- README's "Not built yet" catches up: guilds, the pet bar, fishing, the dressing room, macros, key bindings and addons are in

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Sam
2026-08-20 19:10:13 +07:00
co-authored by Claude Fable 5
parent d2b3492cd5
commit a047a31aea
14 changed files with 564 additions and 103 deletions
@@ -582,8 +582,10 @@ impl ObjectFields {
/// the wire carried no component at all (vmangos omits zero fields from the create mask, and
/// an identity-ish quat still sends its nonzero `w`/`z`); absent components within a
/// partially-sent quat read as the create-block zero default, so a pure-yaw spawn
/// (`x = y = 0`, the live-data norm) round-trips exactly. Consumed by the type-11 transport
/// evaluator (elevators/lifts rotate their keyframe offsets through this).
/// (`x = y = 0`, the live-data norm) round-trips exactly. This is the field a GameObject is
/// *placed* by — the reference builds its render matrix from this quaternion and never from
/// `GAMEOBJECT_FACING` (decision 1459) — and the basis a type-11 lift rotates its keyframe
/// offsets through.
pub fn gameobject_rotation(&self) -> Option<[f32; 4]> {
let any_sent = (0..4u16).any(|i| self.contains(FIELD_GAMEOBJECT_ROTATION + i));
any_sent.then(|| {