The Game Was Running at Half Speed
Pickups became server-authoritative, armor started working, and a 125Hz scheduler discovered it had been running at 62.5Hz the whole time.
The Scheduler Was Wrong
The dedicated server was running at ~62.5Hz instead of 125Hz — half of real-time. Not a rounding error, not a variance in frame pacing: the clock was half speed.
Everything downstream inherited it. In-game time, weapon timers, respawns and projectile speeds were all roughly 2x slow. Fights dragged. Grenades arced like they had been thrown from the floor.
The fix was to make the scheduler track real time, and then the honest part: weapon balance had to be retuned for the corrected clock. Some of what "felt right" before was a balance pass against a broken stopwatch. Instagun, voltaic chain lightning, the grenade-launcher baseline — all re-measured once the clock was telling the truth.
This is the release we point at when someone asks what changed, so it is worth saying plainly: the game was wrong, in a way only a fixed-rate simulation can expose, and we shipped the fix alongside a rebalance rather than quietly patching the timer and hoping nobody noticed.
Ghost Weapons
Map pickups were client-driven events with a local respawn timer, which meant a weapon could look collectible on your screen while the server had other plans. The classic desync, and it was ours.
Pickups are now server-authoritative, driven by an active-set replicated in every snapshot. Armor followed the same route: a single 0-100 plate pool masked behind the Quake item_armor names, with per-type respawns and a first-spawn delay so nobody gets an early armor tax.
Armour also never worked. A parameter mix-up was passing armor-piercing where armor-absorption was expected, so armor degraded nothing and shielded nothing. It is fixed for both self and enemy damage.
Moon Jump, Explained
Demo forensics turned up the best bug in the release.
The server advanced a player's physics per received input command, and skipped the step entirely when no input arrived. Which meant a client's framerate decided its own gravity: throttle your connection, receive less input, and you fall slower. Slow clients were on the moon.
Physics now advances exactly one dt per server tick, regardless of what the client sent. No client can slow, skip, or bank its own movement.
The same demo-forensics pass found that recording built the snapshot twice and lost the one-shot combat events, so .shagdemo files loaded into an empty scene and showed no fight at all. It is now a faithful replay: recorded map rendered locally with no live server, POV and third-person, real team colours, plus a one-command demo:record that runs a headless server against AI bots.
The Anti-Cheat, Honestly Framed
There is a telemetry and detection layer here, and the design note is more useful than the feature list. For an open-source game the goal is stated as raise the cost, thin the herd — not defeat every cheat. Impossible-version detection is impossible to ship responsibly on day one, so everything is log-only until it is calibrated against real matches.
The server simulation is now RNG-deterministic, which is what makes demo:verify possible: replay a demo and prove the outcome still comes out the same. Tamper-evident, offline, no server required.
Also In This One
Usermod sanitising at ingest — NaN and infinite values rejected, pitch clamped, yaw wrapped, wish direction unit-clamped — at one auditable choke point, with the identical clamp in client prediction so predicted and simulated states cannot diverge. Movement effect timers derived from an absolute sim clock, after crouch-slide and ledge-grab visuals double-advanced on reconciliation. First-shot shader flicker, GL projectile ghost trails, fall damage as a server authority, and a manga print-slab HUD.
Known Issues and Known Unverified Items are listed in full in the changelog, including the parts that are still unproven.