System order
Lightyear provides several SystemSets that you can use to run your systems in the correct order.
The main things to keep in mind are:
- All packets are read during the
PreUpdateschedule. This is also where all components that were received are replicated to the Client World. - All packets are sent during the
PostUpdateschedule. All messages that were buffered are then sent to the remote, and all replication messages (entity spawn, component updated, etc.) are also sent - There are 2
SystemSetsthat you should interact with:BufferInputs: this is where you should be runningclient.add_inputs()so that they are buffered and sent to the server correctlyMain: this is where all yourFixedUpdateSchedule systems (physics, etc.) should be run, so that they interact correctly with client-side prediction, etc.
Here is a simplified version of the system order:
---
title: Simplified SystemSet order
---
stateDiagram-v2
classDef flush font-style:italic;
ReceiveFlush: Flush
PreUpdate --> FixedUpdate
FixedUpdate --> PostUpdate
state PreUpdate {
Receive --> ReceiveFlush
ReceiveFlush --> Prediction
ReceiveFlush --> Interpolation
}
state FixedUpdate {
TickUpdate --> BufferInputs
BufferInputs --> Main
}
state PostUpdate {
Send
}
Full system order
---
title: SystemSet order
---
stateDiagram-v2
classDef flush font-style:italic;
SpawnPredictionHistory : SpawnHistory
SpawnInterpolationHistory : SpawnHistory
SpawnPredictionHistoryFlush : Flush
SpawnInterpolationHistoryFlush : Flush
SpawnPredictionFlush : Flush
SpawnInterpolationFlush: Flush
CheckRollbackFlush: Flush
DespawnFlush: Flush
ReceiveFlush: Flush
FixedUpdatePrediction: Prediction
PreUpdate --> FixedUpdate
FixedUpdate --> PostUpdate
state PreUpdate {
Receive --> ReceiveFlush
ReceiveFlush --> Prediction
ReceiveFlush --> Interpolation
}
state Prediction {
SpawnPrediction --> SpawnPredictionFlush
SpawnPredictionFlush --> SpawnPredictionHistory
SpawnPredictionHistory --> SpawnPredictionHistoryFlush
SpawnPredictionHistoryFlush --> CheckRollback
CheckRollback --> CheckRollbackFlush
CheckRollbackFlush --> Rollback
}
state Interpolation {
SpawnInterpolation --> SpawnInterpolationFlush
SpawnInterpolationFlush --> SpawnInterpolationHistory
SpawnInterpolationHistory --> SpawnInterpolationHistoryFlush
SpawnInterpolationHistoryFlush --> Despawn
Despawn --> DespawnFlush
DespawnFlush --> Interpolate
}
state FixedUpdate {
TickUpdate --> BufferInputs
BufferInputs --> WriteInputEvent
WriteInputEvent --> Main
Main --> ClearInputEvent
Main --> FixedUpdatePrediction
}
state FixedUpdatePrediction {
PredictionEntityDespawn --> PredictionEntityDespawnFlush
PredictionEntityDespawnFlush --> UpdatePredictionHistory
UpdatePredictionHistory --> IncrementRollbackTick : if rollback
}
state PostUpdate {
state Send {
SendEntityUpdates --> SendComponentUpdates
SendComponentUpdates --> SendInputMessage
SendInputMessage --> SendPackets
}
--
Sync
}