8389b08d31
Three channels: near (the speaker's own faction within /say's 25 yards, heard from where the speaker stands), group/raid and guild (any distance). Voice never rides the world socket: clients send 20 ms Opus frames over UDP to moonwell-voice-relay, which forwards each one only to whoever may hear it, from the state the core feeds it (faction, map, instance, position, group, guild), so no client can claim a place or a group of its own. The core vouches for a client with a signed ticket (`.mwvoice`). - crates/moonwell-voice: the ticket and feed formats (byte-checked against the core's own C++ output), the client-relay wire, routing, the relay binary; with `client`, the microphone and voice output on their own cpal streams, Opus through the vendored libopus (no cmake), per-speaker playout queues and the UDP session. - crates/moonwell/src/voice.rs: the game side: push-to-talk (Mouse4 by default) or voice activation, near speakers placed by distance and side, Lua MoonWell_Voice*, settings in moonwell-voice.toml, and the MoonWellVoice addon (voice.lua): the ticket, /voice and its settings window (devices by id with their Windows names, activation, key, threshold and meter, talk channel, channels heard, volumes, echo test). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>