extends RefCounted # Plain data holder for one body's snapshot state (§2.4 of multiplayer-todo.md). # Deliberately not Ship/Ball themselves, and deliberately not a scene-tree # node — NetCodec's pack/unpack must stay callable from pure-function tests # with no live scene. Phase 2's snapshot writer fills one of these per body # per tick from the real RigidBody3D state; Phase 2's interpolator does the # reverse. # # avel_range must match what the sender quantised with (SHIP_AVEL_RANGE vs # BALL_AVEL_RANGE in net_codec.gd) — it is not carried on the wire, because # slot order already tells both peers which body is which (§1.3: "entities # are addressed by integer slot, never by path"). var position := Vector3.ZERO var rotation := Quaternion.IDENTITY var linear_velocity := Vector3.ZERO var angular_velocity := Vector3.ZERO var frozen := false var turbo := false var thrust_z := 0.0 # -1..1; re-quantised to a 3-bit bin on the wire var stalled := false var avel_range := 4.0 # NetCodec.SHIP_AVEL_RANGE; set to BALL_AVEL_RANGE for the ball