diff --git a/server/Cargo.lock b/server/Cargo.lock index 3adb44117..d8913abde 100644 --- a/server/Cargo.lock +++ b/server/Cargo.lock @@ -1256,7 +1256,7 @@ dependencies = [ [[package]] name = "settled-reach-server" -version = "0.1.33" +version = "0.1.34" dependencies = [ "bevy_app", "bevy_ecs", diff --git a/server/src/bridge/mod.rs b/server/src/bridge/mod.rs index c78182c86..c88912621 100644 --- a/server/src/bridge/mod.rs +++ b/server/src/bridge/mod.rs @@ -227,7 +227,10 @@ impl Plugin for BridgePlugin { receive_bridge_inputs.before(crate::simulation::input::process_player_input), debug::handle_debug_commands .after(crate::simulation::input::process_player_input) - .after(crate::simulation::economy::tick_economy_simulation) + // Note: NOT ordered after tick_economy_simulation — that creates a + // schedule cycle (debug → observer → advance_tick → econ → debug). + // GetEconState reads from EconStateResource which may be one tick + // stale on economy-tick boundaries. Acceptable for debug tooling. .before(crate::perception::observer::compute_observer_snapshot), crate::perception::observer::compute_visibility_geometry .after(crate::simulation::movement::validate_movement), diff --git a/server/src/simulation/mod.rs b/server/src/simulation/mod.rs index 7e0575baf..6f2edd14f 100644 --- a/server/src/simulation/mod.rs +++ b/server/src/simulation/mod.rs @@ -181,7 +181,13 @@ impl Plugin for SimulationPlugin { Update, ( economy::tick_economy_simulation - .after(time::advance_tick) + .after(input::process_player_input) + // Note: runs BEFORE advance_tick, not after. The economy checks + // time.tick which is the CURRENT tick (not yet advanced). This + // avoids a schedule cycle: observer_snapshot → X → advance_tick + // → tick_economy → observer_snapshot. Running before advance_tick + // means the economy triggers on tick 9 instead of 10 — a naming + // difference, not a correctness issue. .before(crate::perception::observer::compute_observer_snapshot), economy::serve_econ_state_query .after(economy::tick_economy_simulation)