1use std::{collections::HashMap, marker::PhantomData, mem, net::SocketAddr, vec::IntoIter};
2
3use naia_shared::{
4 Channel, ChannelKind, ComponentKind, EntityEvent, EntityResponseEvent, GlobalResponseId,
5 Message, MessageContainer, MessageKind, Replicate, Request, ResponseSendKey, Tick,
6};
7
8use crate::NaiaClientError;
9
10pub struct Events<E: Copy> {
11 connections: Vec<SocketAddr>,
12 rejections: Vec<SocketAddr>,
13 disconnections: Vec<SocketAddr>,
14 client_ticks: Vec<Tick>,
15 server_ticks: Vec<Tick>,
16 errors: Vec<NaiaClientError>,
17 messages: HashMap<ChannelKind, HashMap<MessageKind, Vec<MessageContainer>>>,
18 requests: HashMap<ChannelKind, HashMap<MessageKind, Vec<(GlobalResponseId, MessageContainer)>>>,
19 spawns: Vec<E>,
20 despawns: Vec<E>,
21 publishes: Vec<E>,
22 unpublishes: Vec<E>,
23 auth_grants: Vec<E>,
24 auth_denies: Vec<E>,
25 auth_resets: Vec<E>,
26 inserts: HashMap<ComponentKind, Vec<E>>,
27 removes: HashMap<ComponentKind, Vec<(E, Box<dyn Replicate>)>>,
28 updates: HashMap<ComponentKind, Vec<(Tick, E)>>,
29 empty: bool,
30}
31
32impl<E: Copy> Default for Events<E> {
33 fn default() -> Self {
34 Events::new()
35 }
36}
37
38impl<E: Copy> Events<E> {
39 pub(crate) fn new() -> Self {
40 Self {
41 connections: Vec::new(),
42 rejections: Vec::new(),
43 disconnections: Vec::new(),
44 client_ticks: Vec::new(),
45 server_ticks: Vec::new(),
46 errors: Vec::new(),
47 messages: HashMap::new(),
48 requests: HashMap::new(),
49 spawns: Vec::new(),
50 despawns: Vec::new(),
51 publishes: Vec::new(),
52 unpublishes: Vec::new(),
53 auth_grants: Vec::new(),
54 auth_denies: Vec::new(),
55 auth_resets: Vec::new(),
56 inserts: HashMap::new(),
57 removes: HashMap::new(),
58 updates: HashMap::new(),
59 empty: true,
60 }
61 }
62
63 pub fn is_empty(&self) -> bool {
64 self.empty
65 }
66
67 pub fn read<V: Event<E>>(&mut self) -> V::Iter {
68 return V::iter(self);
69 }
70
71 pub fn has<V: Event<E>>(&self) -> bool {
72 return V::has(self);
73 }
74
75 pub fn has_messages(&self) -> bool {
77 !self.messages.is_empty()
78 }
79 pub fn take_messages(
80 &mut self,
81 ) -> HashMap<ChannelKind, HashMap<MessageKind, Vec<MessageContainer>>> {
82 mem::take(&mut self.messages)
83 }
84
85 pub fn has_requests(&self) -> bool {
87 !self.requests.is_empty()
88 }
89 pub fn take_requests(
90 &mut self,
91 ) -> HashMap<ChannelKind, HashMap<MessageKind, Vec<(GlobalResponseId, MessageContainer)>>> {
92 mem::take(&mut self.requests)
93 }
94
95 pub fn has_inserts(&self) -> bool {
97 !self.inserts.is_empty()
98 }
99 pub fn take_inserts(&mut self) -> Option<HashMap<ComponentKind, Vec<E>>> {
100 if self.inserts.is_empty() {
101 return None;
102 } else {
103 return Some(mem::take(&mut self.inserts));
104 }
105 }
106
107 pub fn has_updates(&self) -> bool {
109 !self.updates.is_empty()
110 }
111 pub fn take_updates(&mut self) -> Option<HashMap<ComponentKind, Vec<(Tick, E)>>> {
112 if self.updates.is_empty() {
113 return None;
114 } else {
115 return Some(mem::take(&mut self.updates));
116 }
117 }
118
119 pub fn has_removes(&self) -> bool {
121 !self.removes.is_empty()
122 }
123 pub fn take_removes(&mut self) -> Option<HashMap<ComponentKind, Vec<(E, Box<dyn Replicate>)>>> {
124 if self.removes.is_empty() {
125 return None;
126 } else {
127 return Some(mem::take(&mut self.removes));
128 }
129 }
130
131 pub(crate) fn push_connection(&mut self, socket_addr: &SocketAddr) {
134 self.connections.push(*socket_addr);
135 self.empty = false;
136 }
137
138 pub(crate) fn push_rejection(&mut self, socket_addr: &SocketAddr) {
139 self.rejections.push(*socket_addr);
140 self.empty = false;
141 }
142
143 pub(crate) fn push_disconnection(&mut self, socket_addr: &SocketAddr) {
144 self.disconnections.push(*socket_addr);
145 self.empty = false;
146 }
147
148 pub(crate) fn push_message(&mut self, channel_kind: &ChannelKind, message: MessageContainer) {
149 if !self.messages.contains_key(&channel_kind) {
150 self.messages.insert(*channel_kind, HashMap::new());
151 }
152 let channel_map = self.messages.get_mut(&channel_kind).unwrap();
153
154 let message_kind: MessageKind = message.kind();
155 if !channel_map.contains_key(&message_kind) {
156 channel_map.insert(message_kind, Vec::new());
157 }
158 let list = channel_map.get_mut(&message_kind).unwrap();
159 list.push(message);
160 self.empty = false;
161 }
162
163 pub(crate) fn push_request(
164 &mut self,
165 channel_kind: &ChannelKind,
166 global_response_id: GlobalResponseId,
167 request: MessageContainer,
168 ) {
169 if !self.requests.contains_key(&channel_kind) {
170 self.requests.insert(*channel_kind, HashMap::new());
171 }
172 let channel_map = self.requests.get_mut(&channel_kind).unwrap();
173
174 let message_kind: MessageKind = request.kind();
175 if !channel_map.contains_key(&message_kind) {
176 channel_map.insert(message_kind, Vec::new());
177 }
178 let list = channel_map.get_mut(&message_kind).unwrap();
179 list.push((global_response_id, request));
180
181 self.empty = false;
182 }
183
184 pub(crate) fn push_client_tick(&mut self, tick: Tick) {
185 self.client_ticks.push(tick);
186 self.empty = false;
187 }
188
189 pub(crate) fn push_server_tick(&mut self, tick: Tick) {
190 self.server_ticks.push(tick);
191 self.empty = false;
192 }
193
194 pub(crate) fn push_error(&mut self, error: NaiaClientError) {
195 self.errors.push(error);
196 self.empty = false;
197 }
198
199 pub(crate) fn push_spawn(&mut self, entity: E) {
200 self.spawns.push(entity);
201 self.empty = false;
202 }
203
204 pub(crate) fn push_despawn(&mut self, entity: E) {
205 self.despawns.push(entity);
206 self.empty = false;
207 }
208
209 pub(crate) fn push_publish(&mut self, entity: E) {
210 self.publishes.push(entity);
211 self.empty = false;
212 }
213
214 pub(crate) fn push_unpublish(&mut self, entity: E) {
215 self.unpublishes.push(entity);
216 self.empty = false;
217 }
218
219 pub(crate) fn push_auth_grant(&mut self, entity: E) {
220 self.auth_grants.push(entity);
221 self.empty = false;
222 }
223
224 pub(crate) fn push_auth_deny(&mut self, entity: E) {
225 self.auth_denies.push(entity);
226 self.empty = false;
227 }
228
229 pub(crate) fn push_auth_reset(&mut self, entity: E) {
230 self.auth_resets.push(entity);
231 self.empty = false;
232 }
233
234 pub(crate) fn push_insert(&mut self, entity: E, component_kind: ComponentKind) {
235 if !self.inserts.contains_key(&component_kind) {
236 self.inserts.insert(component_kind, Vec::new());
237 }
238 let list = self.inserts.get_mut(&component_kind).unwrap();
239 list.push(entity);
240 self.empty = false;
241 }
242
243 pub(crate) fn push_update(&mut self, tick: Tick, entity: E, component_kind: ComponentKind) {
244 if !self.updates.contains_key(&component_kind) {
245 self.updates.insert(component_kind, Vec::new());
246 }
247 let list = self.updates.get_mut(&component_kind).unwrap();
248 list.push((tick, entity));
249 self.empty = false;
250 }
251
252 pub(crate) fn push_remove(&mut self, entity: E, component: Box<dyn Replicate>) {
253 let component_kind: ComponentKind = component.kind();
254 if !self.removes.contains_key(&component_kind) {
255 self.removes.insert(component_kind, Vec::new());
256 }
257 let list = self.removes.get_mut(&component_kind).unwrap();
258 list.push((entity, component));
259 self.empty = false;
260 }
261
262 pub(crate) fn receive_world_events(
263 &mut self,
264 entity_events: Vec<EntityEvent<E>>,
265 ) -> Vec<EntityResponseEvent<E>> {
266 let mut response_events = Vec::new();
267 for event in entity_events {
268 match event {
269 EntityEvent::SpawnEntity(entity) => {
270 self.push_spawn(entity);
271 response_events.push(EntityResponseEvent::SpawnEntity(entity));
272 }
273 EntityEvent::DespawnEntity(entity) => {
274 self.push_despawn(entity);
275 response_events.push(EntityResponseEvent::DespawnEntity(entity));
276 }
277 EntityEvent::InsertComponent(entity, component_kind) => {
278 self.push_insert(entity, component_kind);
279 response_events
280 .push(EntityResponseEvent::InsertComponent(entity, component_kind));
281 }
282 EntityEvent::RemoveComponent(entity, component_box) => {
283 let kind = component_box.kind();
284 self.push_remove(entity, component_box);
285 response_events.push(EntityResponseEvent::RemoveComponent(entity, kind));
286 }
287 EntityEvent::UpdateComponent(tick, entity, component_kind) => {
288 self.push_update(tick, entity, component_kind);
289 }
290 }
291 }
292 response_events
293 }
294
295 pub(crate) fn clear(&mut self) {
296 self.connections.clear();
297 self.rejections.clear();
298 self.disconnections.clear();
299 self.client_ticks.clear();
300 self.server_ticks.clear();
301 self.errors.clear();
302 self.messages.clear();
303 self.requests.clear();
304 self.spawns.clear();
305 self.despawns.clear();
306 self.publishes.clear();
307 self.unpublishes.clear();
308 self.auth_grants.clear();
309 self.auth_denies.clear();
310 self.auth_resets.clear();
311 self.inserts.clear();
312 self.removes.clear();
313 self.updates.clear();
314 self.empty = true;
315 }
316}
317
318pub trait Event<E: Copy> {
320 type Iter;
321
322 fn iter(events: &mut Events<E>) -> Self::Iter;
323
324 fn has(events: &Events<E>) -> bool;
325}
326
327pub struct ConnectEvent;
329impl<E: Copy> Event<E> for ConnectEvent {
330 type Iter = IntoIter<SocketAddr>;
331
332 fn iter(events: &mut Events<E>) -> Self::Iter {
333 let list = std::mem::take(&mut events.connections);
334 return IntoIterator::into_iter(list);
335 }
336
337 fn has(events: &Events<E>) -> bool {
338 !events.connections.is_empty()
339 }
340}
341
342pub struct RejectEvent;
344impl<E: Copy> Event<E> for RejectEvent {
345 type Iter = IntoIter<SocketAddr>;
346
347 fn iter(events: &mut Events<E>) -> Self::Iter {
348 let list = std::mem::take(&mut events.rejections);
349 return IntoIterator::into_iter(list);
350 }
351
352 fn has(events: &Events<E>) -> bool {
353 !events.rejections.is_empty()
354 }
355}
356
357pub struct DisconnectEvent;
359impl<E: Copy> Event<E> for DisconnectEvent {
360 type Iter = IntoIter<SocketAddr>;
361
362 fn iter(events: &mut Events<E>) -> Self::Iter {
363 let list = std::mem::take(&mut events.disconnections);
364 return IntoIterator::into_iter(list);
365 }
366
367 fn has(events: &Events<E>) -> bool {
368 !events.disconnections.is_empty()
369 }
370}
371
372pub struct ClientTickEvent;
374impl<E: Copy> Event<E> for ClientTickEvent {
375 type Iter = IntoIter<Tick>;
376
377 fn iter(events: &mut Events<E>) -> Self::Iter {
378 let list = std::mem::take(&mut events.client_ticks);
379 return IntoIterator::into_iter(list);
380 }
381
382 fn has(events: &Events<E>) -> bool {
383 !events.client_ticks.is_empty()
384 }
385}
386
387pub struct ServerTickEvent;
389impl<E: Copy> Event<E> for ServerTickEvent {
390 type Iter = IntoIter<Tick>;
391
392 fn iter(events: &mut Events<E>) -> Self::Iter {
393 let list = std::mem::take(&mut events.server_ticks);
394 return IntoIterator::into_iter(list);
395 }
396
397 fn has(events: &Events<E>) -> bool {
398 !events.server_ticks.is_empty()
399 }
400}
401
402pub struct ErrorEvent;
404impl<E: Copy> Event<E> for ErrorEvent {
405 type Iter = IntoIter<NaiaClientError>;
406
407 fn iter(events: &mut Events<E>) -> Self::Iter {
408 let list = std::mem::take(&mut events.errors);
409 return IntoIterator::into_iter(list);
410 }
411
412 fn has(events: &Events<E>) -> bool {
413 !events.errors.is_empty()
414 }
415}
416
417pub struct MessageEvent<C: Channel, M: Message> {
419 phantom_c: PhantomData<C>,
420 phantom_m: PhantomData<M>,
421}
422impl<E: Copy, C: Channel, M: Message> Event<E> for MessageEvent<C, M> {
423 type Iter = IntoIter<M>;
424
425 fn iter(events: &mut Events<E>) -> Self::Iter {
426 let channel_kind: ChannelKind = ChannelKind::of::<C>();
427 if let Some(channel_map) = events.messages.get_mut(&channel_kind) {
428 let message_kind: MessageKind = MessageKind::of::<M>();
429 if let Some(boxed_list) = channel_map.remove(&message_kind) {
430 let mut output_list: Vec<M> = Vec::new();
431
432 for boxed_message in boxed_list {
433 let boxed_any = boxed_message.to_boxed_any();
434 let message = boxed_any.downcast::<M>().unwrap();
435 output_list.push(*message);
436 }
437
438 return IntoIterator::into_iter(output_list);
439 }
440 }
441 return IntoIterator::into_iter(Vec::new());
442 }
443
444 fn has(events: &Events<E>) -> bool {
445 let channel_kind: ChannelKind = ChannelKind::of::<C>();
446 if let Some(channel_map) = events.messages.get(&channel_kind) {
447 let message_kind: MessageKind = MessageKind::of::<M>();
448 return channel_map.contains_key(&message_kind);
449 }
450 return false;
451 }
452}
453
454pub struct RequestEvent<C: Channel, Q: Request> {
456 phantom_c: PhantomData<C>,
457 phantom_m: PhantomData<Q>,
458}
459impl<E: Copy, C: Channel, Q: Request> Event<E> for RequestEvent<C, Q> {
460 type Iter = IntoIter<(ResponseSendKey<Q::Response>, Q)>;
461
462 fn iter(events: &mut Events<E>) -> Self::Iter {
463 let channel_kind: ChannelKind = ChannelKind::of::<C>();
464 let Some(channel_map) = events.requests.get_mut(&channel_kind) else {
465 return IntoIterator::into_iter(Vec::new());
466 };
467 let message_kind: MessageKind = MessageKind::of::<Q>();
468 let Some(requests) = channel_map.remove(&message_kind) else {
469 return IntoIterator::into_iter(Vec::new());
470 };
471 let mut output_list = Vec::new();
472
473 for (global_response_id, boxed_request) in requests {
474 let boxed_any = boxed_request.to_boxed_any();
475 let request = boxed_any.downcast::<Q>().unwrap();
476 let response_send_key = ResponseSendKey::<Q::Response>::new(global_response_id);
477 output_list.push((response_send_key, *request));
478 }
479
480 return IntoIterator::into_iter(output_list);
481 }
482
483 fn has(events: &Events<E>) -> bool {
484 let channel_kind: ChannelKind = ChannelKind::of::<C>();
485 if let Some(channel_map) = events.requests.get(&channel_kind) {
486 let message_kind: MessageKind = MessageKind::of::<Q>();
487 return channel_map.contains_key(&message_kind);
488 }
489 return false;
490 }
491}
492
493pub struct SpawnEntityEvent;
495impl<E: Copy> Event<E> for SpawnEntityEvent {
496 type Iter = IntoIter<E>;
497
498 fn iter(events: &mut Events<E>) -> Self::Iter {
499 let list = std::mem::take(&mut events.spawns);
500 return IntoIterator::into_iter(list);
501 }
502
503 fn has(events: &Events<E>) -> bool {
504 !events.spawns.is_empty()
505 }
506}
507
508pub struct DespawnEntityEvent;
510impl<E: Copy> Event<E> for DespawnEntityEvent {
511 type Iter = IntoIter<E>;
512
513 fn iter(events: &mut Events<E>) -> Self::Iter {
514 let list = std::mem::take(&mut events.despawns);
515 return IntoIterator::into_iter(list);
516 }
517
518 fn has(events: &Events<E>) -> bool {
519 !events.despawns.is_empty()
520 }
521}
522
523pub struct PublishEntityEvent;
525impl<E: Copy> Event<E> for PublishEntityEvent {
526 type Iter = IntoIter<E>;
527
528 fn iter(events: &mut Events<E>) -> Self::Iter {
529 let list = std::mem::take(&mut events.publishes);
530 return IntoIterator::into_iter(list);
531 }
532
533 fn has(events: &Events<E>) -> bool {
534 !events.publishes.is_empty()
535 }
536}
537
538pub struct UnpublishEntityEvent;
540impl<E: Copy> Event<E> for UnpublishEntityEvent {
541 type Iter = IntoIter<E>;
542
543 fn iter(events: &mut Events<E>) -> Self::Iter {
544 let list = std::mem::take(&mut events.unpublishes);
545 return IntoIterator::into_iter(list);
546 }
547
548 fn has(events: &Events<E>) -> bool {
549 !events.unpublishes.is_empty()
550 }
551}
552
553pub struct EntityAuthGrantedEvent;
555impl<E: Copy> Event<E> for EntityAuthGrantedEvent {
556 type Iter = IntoIter<E>;
557
558 fn iter(events: &mut Events<E>) -> Self::Iter {
559 let list = std::mem::take(&mut events.auth_grants);
560 return IntoIterator::into_iter(list);
561 }
562
563 fn has(events: &Events<E>) -> bool {
564 !events.auth_grants.is_empty()
565 }
566}
567
568pub struct EntityAuthResetEvent;
570impl<E: Copy> Event<E> for EntityAuthResetEvent {
571 type Iter = IntoIter<E>;
572
573 fn iter(events: &mut Events<E>) -> Self::Iter {
574 let list = std::mem::take(&mut events.auth_resets);
575 return IntoIterator::into_iter(list);
576 }
577
578 fn has(events: &Events<E>) -> bool {
579 !events.auth_resets.is_empty()
580 }
581}
582
583pub struct EntityAuthDeniedEvent;
585impl<E: Copy> Event<E> for EntityAuthDeniedEvent {
586 type Iter = IntoIter<E>;
587
588 fn iter(events: &mut Events<E>) -> Self::Iter {
589 let list = std::mem::take(&mut events.auth_denies);
590 return IntoIterator::into_iter(list);
591 }
592
593 fn has(events: &Events<E>) -> bool {
594 !events.auth_denies.is_empty()
595 }
596}
597
598pub struct InsertComponentEvent<C: Replicate> {
600 phantom_c: PhantomData<C>,
601}
602impl<E: Copy, C: Replicate> Event<E> for InsertComponentEvent<C> {
603 type Iter = IntoIter<E>;
604
605 fn iter(events: &mut Events<E>) -> Self::Iter {
606 let component_kind: ComponentKind = ComponentKind::of::<C>();
607 if let Some(boxed_list) = events.inserts.remove(&component_kind) {
608 return IntoIterator::into_iter(boxed_list);
609 }
610
611 return IntoIterator::into_iter(Vec::new());
612 }
613
614 fn has(events: &Events<E>) -> bool {
615 let component_kind: ComponentKind = ComponentKind::of::<C>();
616 events.inserts.contains_key(&component_kind)
617 }
618}
619
620pub struct UpdateComponentEvent<C: Replicate> {
622 phantom_c: PhantomData<C>,
623}
624impl<E: Copy, C: Replicate> Event<E> for UpdateComponentEvent<C> {
625 type Iter = IntoIter<(Tick, E)>;
626
627 fn iter(events: &mut Events<E>) -> Self::Iter {
628 let component_kind: ComponentKind = ComponentKind::of::<C>();
629 if let Some(boxed_list) = events.updates.remove(&component_kind) {
630 return IntoIterator::into_iter(boxed_list);
631 }
632
633 return IntoIterator::into_iter(Vec::new());
634 }
635
636 fn has(events: &Events<E>) -> bool {
637 let component_kind: ComponentKind = ComponentKind::of::<C>();
638 events.updates.contains_key(&component_kind)
639 }
640}
641
642pub struct RemoveComponentEvent<C: Replicate> {
644 phantom_c: PhantomData<C>,
645}
646impl<E: Copy, C: Replicate> Event<E> for RemoveComponentEvent<C> {
647 type Iter = IntoIter<(E, C)>;
648
649 fn iter(events: &mut Events<E>) -> Self::Iter {
650 let component_kind: ComponentKind = ComponentKind::of::<C>();
651 if let Some(boxed_list) = events.removes.remove(&component_kind) {
652 let mut output_list: Vec<(E, C)> = Vec::new();
653
654 for (entity, boxed_component) in boxed_list {
655 let boxed_any = boxed_component.to_boxed_any();
656 let component = boxed_any.downcast::<C>().unwrap();
657 output_list.push((entity, *component));
658 }
659
660 return IntoIterator::into_iter(output_list);
661 }
662
663 return IntoIterator::into_iter(Vec::new());
664 }
665
666 fn has(events: &Events<E>) -> bool {
667 let component_kind: ComponentKind = ComponentKind::of::<C>();
668 events.removes.contains_key(&component_kind)
669 }
670}