Clients own every projectile they fire: instant prediction, full local simulation, and the shooter's copy does all hit detection (impacts, explosions, piercing) which the host applies. No snap-back, instant impacts. All players need it.
Compatible with mods that update projectile visuals once per frame instead of every physics step (e.g. RiskOfFrames):
the visual hooks step aside when the update is deferred, and the "where the host has it" extrapolation measures real
elapsed time. No protocol change (works with 3.0.2).
3.0.2
Fixed: prediction ids are reused by the game, so a new shot's early hit reports could be applied to the previous
shot that used the same id (or stale reports could leak into the next shot). Every simulated shot now has a
unique serial on its confirmation and on all its reports.
Fixed: late overlap hits applied after the projectile was gone were checked against the wrong position. Each
attack's position and size are now recorded when it happens.
Fixed: late-applied hits could echo hit sparks back to the shooter.
Protocol v5: all players must update.
3.0.1
Fixed: a shot the client predicts but doesn't simulate (e.g. Predict All Projectiles off, or simulation turned
off for that projectile type) could never hit anything. The client now confirms each shot it simulates, and
unconfirmed shots are fully host-decided.
Fixed: an explosion whose hit report arrived just after the host copy detonated lost its damage. Late reports
now still apply for up to 1 s after the projectile is gone.
Fixed: item procs that make their own explosions (e.g. Brilliant Behemoth) could reuse the projectile's
injected hit list. (Found in verification.)
Going over the per-projectile report limit now hands the projectile to the host instead of silently dropping
reports.
Protocol v4: all players must update.
3.0.0
The shooter's own copy now does all hit detection: collisions, explosion radius hits and piercing, overlap
and damage-zone hits, against enemies where the shooter sees them. The host swaps its own detection for the
shooter's hit lists, so damage, procs, DoTs and debuffs still run through normal host code.
The host replays client-simulated projectiles on the shooter's timeline (spawned a small, configurable buffer
later), so reports are always on time. Its copy's own collisions are ignored while in sync, and the
wait-and-guess impact hold is gone.
Late reports are still applied to the attack they belong to; early ones (point-blank) are held until the host
copy exists.
Item procs that make their own explosions are never fed the projectile's hit list.
Hit sparks from client-detected hits are no longer echoed back to the shooter.
New host setting Client Report Buffer Seconds. Fast-forward now only applies to projectiles the client doesn't
simulate.
Protocol v3: all players must update.
2.0.0
Covers every projectile, vanilla and modded, instead of only simple ones.
Every projectile a client fires is predicted, including ones vanilla never predicts. The client pairs them with
the host's copy itself, so the host keeps network authority.
Predicted copies run the projectile's full host-side behaviour locally in a sandbox (homing, sticking,
boomerangs, fuses, detonations, children). Damage, procs, spawning and all network traffic from the sandbox are
blocked; effects and sounds play locally.
Every impact (not just the last one) is client-owned and replayed on the host, including bounce velocity.
The host pins its copy while it waits for the client's report, so a held impact happens where it happened.
The host no longer echoes back any effect or sound produced by a client-simulated projectile's own code.
New: other players' and enemies' projectiles are drawn where the host currently has them.
Self-healing: projectile types that fail when simulated locally fall back to plain prediction.
Protocol v2: all players must update.
1.0.0
Initial release: client-owned impacts for simple projectiles, host fast-forward, predicted visuals with
reconciliation, instant local impact effects.
Thunderstore development is made possible with ads. Please consider making an exception to your adblock.