Shooter: lag-compensated hits

Click the range to shoot. The server rewinds every candidate to the instant you rendered it and tests the ray there (live.smooth({ hitTest })) - so a shot that landed on your screen lands on the server. Crank the latency slider: delayed sends still hit where you saw the target, because the rewind window is server-measured (uplink + interpolation) and capped by maxRewindMs: 400.

WASD / arrows to move, click to shoot.

Score

0

Authoritative: onHit credits the shooter through the shared apply (ctx.applyTo), so this number is the server's answer, not a local guess.

shots fired: 0

hit events seen: 0

Extra latency: 0ms

Delays your command/shoot sends with a setTimeout wrapper. The shot fires (and the muzzle flash draws) when the send actually leaves; the rewind then resolves it against the scene as rendered at that instant. Targets orbit slowly enough that a shot aimed at a rendered target stays inside its hitbox across the whole slider range.