naia_shared/world/host/
global_diff_handler.rs1use 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}