~starkingdoms/starkingdoms

ref: 1bcde11a581ededd03b6e60e8e97048f7556ad66 starkingdoms/crates/unified/src/client/net/incoming_parts.rs -rw-r--r-- 1.6 KiB
1bcde11a — core netcode: part updates (mystery performance issue, probably related to lots of malloc()) 8 days ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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");
            }
        }
    }
}