use crate::prelude::*;
use beet_core::prelude::*;
#[derive(Clone, Component)]
#[component(storage = "SparseSet",on_add=on_add::<T>)]
pub struct TriggerDeferred<T: EntityTargetEvent> {
event: T,
}
impl<T> Default for TriggerDeferred<T>
where
T: EntityTargetEvent + Default,
{
fn default() -> Self { Self::new(default()) }
}
impl TriggerDeferred<GetOutcome> {
pub fn get_outcome() -> Self { default() }
}
impl<T: EntityTargetEvent> TriggerDeferred<T> {
pub fn new(event: T) -> Self { Self { event } }
}
fn on_add<T: EntityTargetEvent>(mut world: DeferredWorld, cx: HookContext) {
let entity = cx.entity;
world.commands().queue(move |world: &mut World| -> Result {
let ev = world
.entity_mut(entity)
.take::<TriggerDeferred<T>>()
.ok_or_else(|| bevyhow!("TriggerDeferred: component missing"))?;
world
.entity_mut(entity)
.insert(OnSpawnDeferred::trigger_target(ev.event));
Ok(())
});
}
#[cfg(test)]
mod test {
use crate::prelude::*;
use beet_core::prelude::*;
#[test]
fn works() {
let mut world = World::new();
let observers = observer_ext::observe_triggers::<Outcome>(&mut world);
world.spawn((TriggerDeferred::get_outcome(), EndWith(Outcome::Pass)));
observers.len().xpect_eq(0);
world.run_system_cached(OnSpawnDeferred::flush).unwrap();
observers.len().xpect_eq(1);
observers.get_index(0).unwrap().xpect_eq(Outcome::Pass);
}
}