mirror of
https://github.com/vladtrc/iw4L
synced 2026-10-26 10:19:50 -04:00
846ab99a73
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KkgiSVEPTbsVZ1RpARujF6
1.8 KiB
1.8 KiB
sim::step — the one funnel
pub fn step(
world: &mut SimWorld,
tick: Tick,
input: &TickInput,
msec: i32,
reason: StepReason,
) -> Snapshot
crates/sim/src/carrier.rs. Everything able to change the authoritative world
enters through TickInput and leaves through Snapshot. There is no second
door.
One function, three callers
Server authority, client prediction and replay all call this same step. They
differ only in StepReason:
| reason | meaning |
|---|---|
AuthorityFrame |
the authoritative advance — the only reason advances_authority_world() holds |
PredictNew |
the local client running ahead of the server |
Replay |
a recorded input stream played back |
A human at a keyboard and a bot both arrive as entries in TickInput.cmds.
sim cannot tell them apart, and nothing downstream needs to.
Why it is shaped this way
- State is explicit.
&mut SimWorldowns thebevy_ecsworld, so two of them step side by side without touching each other: one innet::authority::runtime, one innet::client::predict. - Time is an argument.
tickandmsecarrive per call instead of living in the world, so re-running a tick means passing it again. - Input is canonical.
TickInput::canonicalize()sorts commands and actions byClientId, so the same set of inputs is the same input whatever order the network delivered it in. - The snapshot is the return value, not a later pass over the world. What
is absent from
Snapshotcannot reach a client.
Coming back the other way
adopt_snapshot installs an authoritative snapshot; adopt_prediction_snapshot
reconciles the local client against one. Both live in crates/sim/src/adopt.rs
and answer with an AdoptReport.
Snapshot entity taxonomy: ENTITIES.md.