use crate::prelude::*;
use beet_core::prelude::*;
use std::marker::PhantomData;
#[action(remove::<E , B>)]
#[derive(Debug, Component, Reflect)]
#[reflect(Component)]
pub struct RemoveOn<E: EntityTargetEvent, B: Bundle> {
pub target_entity: TargetEntity,
phantom: PhantomData<(E, B)>,
}
impl<E: EntityTargetEvent, B: Bundle> Default for RemoveOn<E, B> {
fn default() -> Self {
Self {
phantom: default(),
target_entity: default(),
}
}
}
impl<E: EntityTargetEvent, B: Bundle> RemoveOn<E, B> {
pub fn new_with_target(target_entity: TargetEntity) -> Self {
Self {
target_entity,
..default()
}
}
}
fn remove<E: EntityTargetEvent, B: Bundle>(
ev: On<E>,
mut commands: Commands,
query: Query<&RemoveOn<E, B>>,
agent_query: AgentQuery,
) -> Result {
let action = ev.target();
let remove_on = query.get(action)?;
let target = remove_on.target_entity.get(action, &agent_query);
commands.entity(target).remove::<B>();
Ok(())
}
#[cfg(test)]
mod test {
use crate::prelude::*;
use beet_core::prelude::*;
#[test]
fn on_run() {
let mut app = App::new();
app.add_plugins(ControlFlowPlugin::default());
let world = app.world_mut();
let entity = world
.spawn((Running, RemoveOn::<GetOutcome, Running>::default()))
.trigger_target(GetOutcome)
.flush()
.id();
world.get::<Running>(entity).xpect_none();
}
#[test]
fn on_result() {
let mut app = App::new();
app.add_plugins(ControlFlowPlugin::default());
let world = app.world_mut();
let entity = world
.spawn((
Running,
RemoveOn::<Outcome, Running>::default(),
EndWith(Outcome::Pass),
))
.trigger_target(GetOutcome)
.flush()
.id();
world.get::<Running>(entity).xpect_none();
}
}