Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2.0 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. try_step exposes the same path as a Result<Snapshot, script::Fault>;
step panics on script failure. Authority/replay require a loaded, started GSC
program.
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.
See ENTITIES.md for snapshots and GSC-RUNTIME.md for script execution.