Reliable On One Lane, Unreliable On The Other
WebTransport split into unidirectional streams and datagrams, snapshot rate decoupled from tick rate, and an NTP-style clock sync with outlier rejection.
Two Kinds Of Traffic
Reliable unidirectional QUIC streams auth, welcome, game events
Unreliable QUIC datagrams input commands, snapshotsreadIncomingStreams() reassembles chunked messages. The client sends its last 3 commands per packet; the server rejects seq <= lastInputSeq.
Snapshots Got Their Own Rate
--snapshotrate and GameServerConfig.snapshotRate decouple snapshots from ticks — 30Hz snapshots against a 125Hz sim. A SnapshotBuffer with auto-adjusting interpolation delay derived from arrival jitter, linear interpolation, and velocity-based extrapolation on packet loss.
Clock Sync
An NTP-like offset estimate via Ping/Pong — message types 0x09 and 0x0A with float64 timestamps — burst sampling 5 pings on connect, outlier rejection, and resync every 30 seconds.
The Detail Worth Keeping
V2NetworkClient.visualOffset absorbs reconciliation corrections and decays
them over ~83ms instead of teleporting the cameraEighty-three milliseconds is what interpolation delay plus a little slack buys you. It is the difference between a correction the player never notices and a rubber band.
Also: rotation sync via flag 0x08, server-side grenade bounce/timeout/gravity, the shockwave rendered as a solid disc, a cl_netgraph cvar, and engine.json's title moving to game.json.
Known Issues: LightGrid dimension mismatch warnings on some FBSP maps.