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, mut q_parts: Query<(&mut Part, &mut Transform, &mut Temperature, &mut LinearVelocity, &mut AngularVelocity)>, mut entity_map: ResMut, 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"); } } }