some_bevy_tools 0.2.4

A collection of tools which can be used in the Bevy Engine.
Documentation
//! Support for triggers.
use bevy::prelude::*;

use crate::collision_detection;
use crate::despawn;

/// Specify that a trigger should despawn after it was triggered the first time.
#[derive(Component, Default)]
pub struct SingleTrigger;

/// Remove single triggers after their first collision.
pub fn remove_after_collision<Emitter: Component>(
    mut commands: Commands,
    mut collision_events: EventReader<
        collision_detection::CollisionEventStart<Emitter, SingleTrigger>,
    >,
    query: Query<Entity, With<SingleTrigger>>,
) {
    for collision_event in collision_events.read() {
        if let Ok(entity) = query.get(collision_event.1) {
            commands
                .entity(entity)
                .insert(despawn::AutoDespawn::with_frames(1));
        }
    }
}

/// Plugin to add support for triggers.
#[derive(Default)]
pub struct PhysicsTriggerPlugin<Emitter: Component + Default, Trigger: Component + Default> {
    _marker: std::marker::PhantomData<(Emitter, Trigger)>,
}
impl<Emitter: Component + Default, Trigger: Component + Default> Plugin
    for PhysicsTriggerPlugin<Emitter, Trigger>
{
    fn build(&self, app: &mut App) {
        if !app.is_plugin_added::<collision_detection::CollisionDetectionPlugin<Emitter, SingleTrigger>>()
        {
            app.add_plugins(collision_detection::CollisionDetectionPlugin::<
                Emitter,
                SingleTrigger,
            >::default())
            .add_systems(Update, remove_after_collision::<Emitter>);
        }
        if !app.is_plugin_added::<despawn::AutoDespawnPlugin>() {
            app.add_plugins(despawn::AutoDespawnPlugin);
        }
        app.add_plugins(collision_detection::CollisionDetectionPlugin::<
            Emitter,
            Trigger,
        >::default());
    }
}