use crate::prelude::*;
use beet_core::prelude::*;
use beet_flow::prelude::*;
#[derive(Debug, Clone, PartialEq, Component, Reflect)]
#[reflect(Default, Component)]
#[require(ContinueRun)]
pub struct EndOnArrive {
pub radius: f32,
}
impl Default for EndOnArrive {
fn default() -> Self { Self { radius: 0.5 } }
}
impl EndOnArrive {
pub fn new(radius: f32) -> Self { Self { radius } }
}
pub(crate) fn end_on_arrive(
mut commands: Commands,
agents: AgentQuery<(&GlobalTransform, &SteerTarget)>,
transforms: Query<&GlobalTransform>,
mut query: Query<(Entity, &EndOnArrive), With<Running>>,
) -> Result {
for (action, end_on_arrive) in query.iter_mut() {
let (transform, target) = agents.get(action)?;
if let Ok(target) = target.get_position(&transforms) {
if transform.translation().distance_squared(target)
<= end_on_arrive.radius.powi(2)
{
commands.entity(action).trigger_target(Outcome::Pass);
}
} else {
commands.entity(action).trigger_target(Outcome::Fail);
}
}
Ok(())
}