mirror of
https://github.com/horizon-rust/horizon-mods.git
synced 2026-11-07 11:05:58 -10:00
* voicechat-server: proximity voice chat on Horizon's own server A native server mod (voicechat_server 1.0.0): the server half for voice chat clients that speak Simple Voice Chat 2.6.x's protocol, such as azetech's Complex Voice Chat. The handshake rides Horizon's mod messages on voicechat: channel names; voices go over UDP through the server, sealed per player with AES-128-GCM, to the players nearby in the same dimension or in the speaker's group. A player without a voice client is never sent anything, and the UDP port opens only when the first voice client asks. The relay is a bundle crate (horizon-mixins 0.6.0): every native mod now pins horizon-mixins d9c83d7, since native.py builds them with one, and package includes a bundle's crates. Co-Authored-By: Claude Opus 5.5 <[email protected]> * voicechat-server: replay-proof re-authentication; packages carry LICENSE - A secret belongs to the first address that authenticates with it: an Authenticate copied and sent from another address is refused however long the client was quiet (the 5 s move rule is gone). Exact replays are dropped too: the last 64 control packets' nonces per player, and a 64-wide window on voice packets' sequence numbers. - A client the server stops hearing for 10 keep-alives gets a fresh secret over the game connection (Complex Voice Chat 2.1.0 reconnects on any voicechat:secret), keeping its group; the old key then opens nothing. So a NAT that rebinds recovers without a rejoin (2.1.0 never re-sends Authenticate after its ack, so the old move rule never helped it). - Secret requests: one answer a second a player (more requests meanwhile get one answer), the snapshot replaces what still waited. Group and state changes 2 a second (burst 10). At most 512 messages wait per player. - Client pings aren't echoed (the server never pings; SVC's server doesn't echo either), and the relay thread never spins on a socket error. - The glue lists the players on a message only when the sender is new, not on every voice chat message. - native.py package puts native/<mod>/LICENSE into the .hnmod as mixins/<id>/LICENSE (Horizon's bundle reader accepts LICENSE* there); the CI check requires it. Every native mod's package now carries its licence. Tests: a_replayed_handshake_after_a_silence_moves_nothing, a_client_the_server_stops_hearing_gets_a_fresh_secret, repeated_secret_requests_and_group_changes_stay_bounded. Co-Authored-By: Claude Opus 5.5 <[email protected]> --------- Co-authored-by: Claude Opus 5.5 <[email protected]>