diff --git a/src/sound/icon.rs b/src/sound/icon.rs index 1a6cdbd..e645c2e 100644 --- a/src/sound/icon.rs +++ b/src/sound/icon.rs @@ -9,7 +9,7 @@ use crate::{ commands::RunIfExistsExt, core::Player, exploration::ExplorationFocused, - visibility::{Visible, VisibleEntities}, + visibility::{VisibilityChanged, Visible, VisibleEntities}, }; #[derive(Component, Clone, Debug)] @@ -242,6 +242,38 @@ fn exploration_focus_removed( } } +fn reset_timer_on_visibility_gain( + mut events: EventReader, + player: Query>, + mut icons: Query<&mut SoundIcon>, + children: Query<&Children>, +) { + for event in events.iter() { + if let VisibilityChanged::Gained { viewer, viewed } = event { + if player.get(*viewer).is_ok() { + let mut targets = vec![]; + if icons.get(*viewed).is_ok() { + targets.push(viewed); + } + if let Ok(children) = children.get(*viewed) { + for child in children.iter() { + if icons.get(*child).is_ok() { + targets.push(&*child); + } + } + } + for icon in targets.iter_mut() { + if let Ok(mut icon) = icons.get_mut(**icon) { + if let Some(timer) = icon.interval.as_mut() { + timer.set_elapsed(timer.duration()); + } + } + } + } + } + } +} + #[derive(Clone, Debug, Default)] pub struct SoundIconConfig { pub states: Vec, @@ -273,6 +305,7 @@ where .add_system_to_stage( CoreStage::PostUpdate, exploration_focus_removed.after(exploration_focus_changed), - ); + ) + .add_system_to_stage(CoreStage::PostUpdate, reset_timer_on_visibility_gain); } }