A shot rewinds its recipient instead of deciding the hit for it
Status: Accepted (2026-11-02)
Context
A shooter aims at where it sees the victim, which is where the victim was one network delay ago, while the hit is computed by the victim's client at its current position. Without compensation, a player has to lead its targets by its ping. The server has no collision world: only the clients know whether a wall stands between the shooter and the victim, so the server cannot decide hits itself.
Decision
- For each recipient whose position the shot's ray passed near, the server computes where that recipient stood at the moment the shooter saw it: the recipient's accepted path at now minus the shooter's round-trip time, at most 400 ms back. It sends that position in the recipient's
RemoteWeaponShot. - The recipient moves its body there only for the duration of the shot's trace. The hit, walls, the body part and the damage stay the victim's own computation;
DamageReportand the victim-confirmed hit (ADR 0045) do not change. - Attribution and the server's
god_modesuspicion detector (ADR 0040) judge the hit against the same rewound position. The shooter'shitclaim still has no effect on damage.
Vehicles
- The server keeps the pose history of every vehicle (position and rotation from the controlling player's accepted frames). A gamemode move and a freeze change start that history anew from where the vehicle stands.
- A recipient sitting in a vehicle is rewound together with it: the server sends the vehicle's pose at the same moment, and for the trace the recipient puts its copy of the vehicle there, itself along with it. A vehicle the shooter sits in, a frozen one and a wrecked one are not rewound.
- Rays of vehicle guns (
VehicleShot) rewind recipients the same way asWeaponShot. The Rhino cannon's ray does not: it only sets the point of an explosion, and the explosion hits whoever is there now. - The
vehicle_god_modedetector judges hits against the same pose. - Vehicles a recipient controls without sitting in them (an empty vehicle it syncs, a remote-controlled vehicle, a trailer behind its truck) are not rewound: an empty vehicle mostly stands still, and the rest stays on leading the target.
Consequences
- A player who already made it around a corner can still be hit by what the shooter saw: the price of any compensation, bounded by the 400 ms cap.
- A shooter that holds back its acknowledgements to inflate its round-trip time can fire at where a target was up to 400 ms ago. A link worse than the cap again requires leading the target by the remainder.
- A shot near a recipient becomes a datagram of its own for that recipient instead of one shared relay.
Alternatives considered
- The shooter decides the hit and the server checks it against a rewound history. Without a collision world the server cannot tell a shot through a wall, so a cheat fires through any cover. It would also need a new trusted damage path and the body part from the shooter.
- The victim keeps the history and estimates the delay itself. The victim does not know the shooter's delay, so the server would have to send it anyway, and the server already holds a copy of the history; the server's tests also cover the rewind without a client.
