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::PartUpdatePacket; 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 msg in msgs.read() { 'to_next_part: for part in &msg.updated_parts { 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 'to_next_part }; if part.part_data_changed { *part_data = part.part.clone(); } *transform = part.transform; *temperature = part.temperature; } else { // Spawn new part let e = commands.spawn(( part.part.clone(), part.transform, part.temperature, )).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"); } } } }