use std::marker::PhantomData;
use bevy::{
ecs::{component::Mutable, entity::MapEntities},
prelude::*,
};
use crate::{LoadWorld, LoadWorldSystems, RollbackEntityMap};
pub struct ResourceMapEntitiesPlugin<R>
where
R: Resource<Mutability = Mutable> + MapEntities,
{
_phantom: PhantomData<R>,
}
impl<R> Default for ResourceMapEntitiesPlugin<R>
where
R: Resource<Mutability = Mutable> + MapEntities,
{
fn default() -> Self {
Self {
_phantom: default(),
}
}
}
impl<R> ResourceMapEntitiesPlugin<R>
where
R: Resource<Mutability = Mutable> + MapEntities,
{
pub fn update(world: &mut World) {
world.resource_scope(|world: &mut World, map: Mut<RollbackEntityMap>| {
apply_rollback_map_to_resource_inner::<R>(world, map);
});
}
}
fn apply_rollback_map_to_resource_inner<R>(world: &mut World, map: Mut<RollbackEntityMap>)
where
R: Resource<Mutability = Mutable> + MapEntities,
{
if let Some(mut resource) = world.get_resource_mut::<R>() {
resource.map_entities(&mut map.as_ref());
}
trace!("Mapped {}", disqualified::ShortName::of::<R>());
}
impl<R> Plugin for ResourceMapEntitiesPlugin<R>
where
R: Resource<Mutability = Mutable> + MapEntities,
{
fn build(&self, app: &mut App) {
app.add_systems(LoadWorld, Self::update.in_set(LoadWorldSystems::Mapping));
}
}