use bevy::{
ecs::component::{ComponentHooks, StorageType},
prelude::*,
};
use crate::{ecs::CommandsExt, event::OnScore, scoring::Score};
#[derive(Reflect)]
#[derive(Clone, Copy, PartialEq, Debug, Default)]
#[reflect(Component)]
pub struct FixedScore {
value: Score,
}
impl FixedScore {
pub fn new(value: impl Into<Score>) -> Self {
Self { value: value.into() }
}
pub fn value(&self) -> Score {
self.value
}
pub fn set_value(&mut self, value: impl Into<Score>) {
self.value = value.into();
}
fn observer(trigger: Trigger<OnScore>, mut target: Query<(&mut Score, &FixedScore)>) {
let Ok((mut actor_score, settings)) = target.get_mut(trigger.entity()) else {
return;
};
*actor_score = settings.value();
}
}
impl Component for FixedScore {
const STORAGE_TYPE: StorageType = StorageType::Table;
fn register_component_hooks(hooks: &mut ComponentHooks) {
hooks.on_add(|mut world, _entity, _component| {
#[derive(Resource, Default)]
struct FixedScoreObserverSpawned;
world
.commands()
.once::<FixedScoreObserverSpawned>()
.observe(Self::observer);
});
}
}