use bevy_ecs::lifecycle::HookContext;
use bevy_ecs::prelude::*;
use bevy_ecs::world::DeferredWorld;
use crate::Static;
#[derive(Component)]
#[component(storage = "SparseSet")]
#[component(on_add = Self::on_add)]
pub struct SpawnUnrelated<B: Bundle, F: FnOnce(Entity) -> B>(pub F)
where
F: Static,
B: Static;
impl<B: Bundle, F: FnOnce(Entity) -> B> SpawnUnrelated<B, F>
where
F: Static,
B: Static,
{
fn on_add(mut world: DeferredWorld, ctx: HookContext) {
let entity = ctx.entity;
world.commands().queue(move |world: &mut World| {
let mut entity = world.entity_mut(entity);
let SpawnUnrelated(f) = entity.take::<Self>().unwrap();
let source = entity.id();
world.spawn(f(source));
});
}
}
#[derive(Component)]
#[component(storage = "SparseSet")]
#[component(on_add = Self::on_add)]
pub struct WithChild<B: Bundle, F: FnOnce(Entity) -> B>(pub F)
where
F: Static,
B: Static;
impl<B: Bundle, F: FnOnce(Entity) -> B> WithChild<B, F>
where
F: Static,
B: Static,
{
fn on_add(mut world: DeferredWorld, ctx: HookContext) {
let entity = ctx.entity;
world.commands().queue(move |world: &mut World| {
let mut entity = world.entity_mut(entity);
let WithChild(f) = entity.take::<Self>().unwrap();
entity.with_child(f(entity.id()));
});
}
}