use bevy::log::{debug, warn}; use bevy::prelude::{Commands, MessageReader, ResMut, Transform}; 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 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)) = 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); } else { // Spawn new part let e = commands.spawn(( part.part.data().clone(), *part.transform.data(), *part.temperature.data(), )).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"); } } }