use avian2d::prelude::{AngularVelocity, LinearVelocity};
use bevy::log::{debug, warn};
use bevy::prelude::{Commands, MessageReader, ResMut, Transform};
use bevy_transform_interpolation::hermite::TransformHermiteEasing;
use bevy_transform_interpolation::interpolation::TransformInterpolation;
use crate::client::net::AngularVelocitySource;
use crate::prelude::Query;
use crate::shared::ecs::{Part, Temperature};
use crate::shared::net::part::{PartDto};
use crate::shared::net::ServerEntityMap;
pub fn handle_incoming_parts(
mut msgs: MessageReader<PartDto>,
mut q_parts: Query<(&mut Part, &mut Transform, &mut Temperature, &mut LinearVelocity, &mut AngularVelocity)>,
mut entity_map: ResMut<ServerEntityMap>,
mut commands: Commands
) {
for part in msgs.read() {
if let Some(local_entity) = entity_map.server_to_client.get(&part.server_entity) {
let Ok((mut part_data, mut transform, mut temperature, mut linvel, mut angvel)) = q_parts.get_mut(*local_entity) else {
warn!("local part entity {:?} for part srv:{:?} doesn't exist? skipping update, this is a bug", local_entity, part.server_entity);
continue;
};
part.part.update(part_data);
part.transform.update(transform);
part.temperature.update(temperature);
part.linvel.update(linvel);
part.angvel.update(angvel);
} else {
// Spawn new part
let e = commands.spawn((
part.part.data().clone(),
*part.transform.data(),
*part.temperature.data(),
*part.linvel.data(),
*part.angvel.data(),
TransformInterpolation,
//TransformHermiteEasing
)).id();
entity_map.server_to_client.insert(part.server_entity, e.clone());
entity_map.client_to_server.insert(e.clone(), part.server_entity);
debug!(?part.part, "spawned new part");
}
}
}