The Server Started Throwing Grenades
Projectiles are created and simulated entirely on the server, snapshotted as entities, and delta-compressed into half the size.
Authority Moves Upstream
Projectiles are now created and simulated entirely on the server and shipped in snapshots as proj_ entities, with a dedicated SnapshotBuffer for lerping. Client-side raycasting and client-side movement for projectiles were removed.
The client keeps only what is cosmetic: grenade rotation from velocity via a quaternion, and blue trails.
Speed Went Up Because The Tick Was Fixed
snapshot rate 30Hz -> 60Hz (every 2 ticks at 125Hz)
interp delay 100ms -> 50ms
jitter mult 2x -> 1x stddev, clamped 16-150ms
rocket 1150 -> 1800 UPS (+56%)
grenade 1000 -> 1560 UPS (+56%)
falling gravity multiplier 1.8 -> 1.25Faster projectiles and a shorter interpolation delay together mean a grenade travels nearly its own length between the snapshots that describe it. That is a deliberate trade and it is stated as one.
Compression
A 64-entry snapshot history ring buffer with per-client lastAckedTick baselines: 50-70% smaller snapshots. MovementValidator anti-warp — rate cap plus a time budget, with silent drops and a strike counter.
Knockback became a server-side impulse queue ahead of the movement simulation, with distance falloff and per-weapon splashRadius, splashDamage and knockbackScale.
And The Logging
Removed flood-causing [KB-DIAG], [KB-RENDER], [EXPLOSION] console.log statementsKnown Issues: LightGrid dimension mismatch warnings on some FBSP maps.