Set elapsed time of sound icons to their duration on visibility gain so they begin playing immediately.

This commit is contained in:
Nolan Darilek 2022-06-07 09:13:03 -05:00
parent 828a0ca0b3
commit a1edab98f9

View File

@ -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<VisibilityChanged>,
player: Query<Entity, With<Player>>,
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<S> {
pub states: Vec<S>,
@ -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);
}
}