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