diff --git a/crates/benilla-world/src/terrain_stream.rs b/crates/benilla-world/src/terrain_stream.rs index 36c7d5dd..0c2c41c4 100644 --- a/crates/benilla-world/src/terrain_stream.rs +++ b/crates/benilla-world/src/terrain_stream.rs @@ -446,8 +446,7 @@ impl Plugin for TerrainPlugin { update_current_area .after(crate::wmo_portal::WmoPvsSet) .in_set(AreaAuthoritySet), - ) - .add_systems(Update, queries::update_capture_camera_area.in_set(AreaAuthoritySet)); + ); } } diff --git a/crates/benilla-world/src/terrain_stream/queries.rs b/crates/benilla-world/src/terrain_stream/queries.rs index b1507a74..ce2c6701 100644 --- a/crates/benilla-world/src/terrain_stream/queries.rs +++ b/crates/benilla-world/src/terrain_stream/queries.rs @@ -21,21 +21,15 @@ pub struct CurrentArea(pub Option); #[derive(Resource, Default, PartialEq, Eq)] pub struct CaptureCameraArea(pub Option); -/// MONKEY (reviewfix-a): see [`CaptureCameraArea`]. -pub(super) fn update_capture_camera_area( - mut out: ResMut, - focus: Res, - streamer: Res, - adt_tiles: Res>, - camera: Query<&GlobalTransform, With>, - mut capture: Local>, +/// MONKEY (reviewfix-a): see [`CaptureCameraArea`]; a helper of [`update_current_area`] (one +/// system, so the schedule gains no new unordered pairs). +fn capture_camera_area( + out: &mut CaptureCameraArea, + streamer: &TerrainStreamer, + adt_tiles: &Assets, + eye: Option, ) { - if !*capture.get_or_insert_with(|| std::env::var_os("WOW_CAPTURE").is_some()) - || focus.body_pos().is_some() - { - return; - } - let Some(eye) = camera.iter().next().map(GlobalTransform::translation) else { + let Some(eye) = eye else { return; }; let wow = bevy_to_wow(eye); @@ -155,8 +149,18 @@ pub(super) fn update_current_area( adt_tiles: Res>, interior: Res, wmo_areas: Option>, + // MONKEY (reviewfix-a): the capture-only camera area (absent in unit-test worlds). + capture_area: Option>, + camera: Query<&GlobalTransform, With>, + mut capture: Local>, ) { let Some(wow) = focus.body_pos() else { + if let Some(mut out) = capture_area { + if *capture.get_or_insert_with(|| std::env::var_os("WOW_CAPTURE").is_some()) { + let eye = camera.iter().next().map(GlobalTransform::translation); + capture_camera_area(&mut out, &streamer, &adt_tiles, eye); + } + } // No avatar: the area dies with the character session, or the next login reads this // character's zone. `body_pos()` is `None` at both glue screens; a recoverable disconnect // keeps the body, and the area with it.