As reviewed: the host cannot tell a VR client from a modified flat one,
so a client could claim a hand 0.4 world units to any side and shoot
around a corner without its camera ever being exposed (the line from the
eye to the hand stops shooting through walls, not around edges).
- The hand must be where one firing at the target can be: no more than
0.05 world units (0.15 m) behind the eye along the line to the target,
0.2 (0.6 m: a lean and a hand held out) to its side, and 0.1 (0.3 m)
above the eye (distributed_fire_origin_shape).
- The hands are looked from only after no eye (nor vehicle gun) had a
line, and the hits only a hand let through are counted in the host's
log of clients' hits.
- network.fire_origins (true by default; also a dedicated server's
setting) turns the hand off: from the camera and vehicles' guns only.
- The message is distributed message 93 (92 is now the client's build).
- A client sends its fire origin when it changes and every eighth tick,
not every tick.
Checked: ninja android builds without warnings in the changed files;
test_fire_origins.py (15 cases with 9 negative controls: ownership,
reach, the store, the resend and its record, and each of the shape's
three limits) passes, run on macOS as 64-bit; the rest of the harness
fails there only where it did before (32-bit layouts); network_format.py
--record adds message 93 and its structs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>