use std::collections::HashMap;
use bevy::prelude::{Commands, Entity, EventReader, Query, RemovedComponents, ResMut, Resource};
use crate::client::components::{Confirmed, SyncComponent};
use crate::client::interpolation::interpolate::InterpolateStatus;
use crate::client::interpolation::interpolation_history::ConfirmedHistory;
use crate::shared::events::ComponentRemoveEvent;
#[derive(Resource, Default)]
pub struct InterpolationMapping {
pub confirmed_to_interpolated: HashMap<Entity, Entity>,
}
pub(crate) fn removed_components<C: SyncComponent>(
mut commands: Commands,
mut events: EventReader<ComponentRemoveEvent<C>>,
query: Query<&Confirmed>,
) {
for event in events.read() {
if let Ok(confirmed) = query.get(*event.entity()) {
if let Some(interpolated) = confirmed.interpolated {
if let Some(mut entity) = commands.get_entity(interpolated) {
entity.remove::<C>();
entity.remove::<ConfirmedHistory<C>>();
entity.remove::<InterpolateStatus<C>>();
}
}
}
}
}
pub(crate) fn despawn_interpolated(
mut commands: Commands,
mut mapping: ResMut<InterpolationMapping>,
mut query: RemovedComponents<Confirmed>,
) {
for entity in query.read() {
if let Some(interpolated) = mapping.confirmed_to_interpolated.remove(&entity) {
if let Some(mut entity_mut) = commands.get_entity(interpolated) {
entity_mut.despawn();
}
}
}
}