naia_shared/world/host/
global_diff_handler.rs

1use std::{collections::HashMap, hash::Hash, net::SocketAddr};
2
3use crate::{ComponentKind, GlobalWorldManagerType};
4
5use super::mut_channel::{MutChannel, MutReceiver, MutReceiverBuilder, MutSender};
6
7pub struct GlobalDiffHandler<E: Copy + Eq + Hash> {
8    mut_receiver_builders: HashMap<(E, ComponentKind), MutReceiverBuilder>,
9}
10
11impl<E: Copy + Eq + Hash> GlobalDiffHandler<E> {
12    pub fn new() -> Self {
13        Self {
14            mut_receiver_builders: HashMap::new(),
15        }
16    }
17
18    pub fn register_component(
19        &mut self,
20        global_world_manager: &dyn GlobalWorldManagerType<E>,
21        entity: &E,
22        component_kind: &ComponentKind,
23        diff_mask_length: u8,
24    ) -> MutSender {
25        if self
26            .mut_receiver_builders
27            .contains_key(&(*entity, *component_kind))
28        {
29            panic!("Component cannot register with Server more than once!");
30        }
31
32        let (sender, builder) = MutChannel::new_channel(global_world_manager, diff_mask_length);
33
34        self.mut_receiver_builders
35            .insert((*entity, *component_kind), builder);
36
37        sender
38    }
39
40    pub fn deregister_component(&mut self, entity: &E, component_kind: &ComponentKind) {
41        self.mut_receiver_builders
42            .remove(&(*entity, *component_kind));
43    }
44
45    pub fn receiver(
46        &self,
47        address: &Option<SocketAddr>,
48        entity: &E,
49        component_kind: &ComponentKind,
50    ) -> Option<MutReceiver> {
51        if let Some(builder) = self.mut_receiver_builders.get(&(*entity, *component_kind)) {
52            return builder.build(address);
53        }
54        None
55    }
56}