naia_bevy_shared/
plugin.rs1use std::marker::PhantomData;
2
3use bevy_app::{App, Plugin as PluginType, Update};
4use bevy_ecs::schedule::{IntoSystemConfigs, IntoSystemSetConfigs};
5
6use log::info;
7
8use crate::{
9 change_detection::{on_despawn, on_host_owned_added, HostSyncEvent},
10 system_set::{BeforeHostSyncChangeTracking, HostSyncChangeTracking},
11 BeforeReceiveEvents, HostOwnedMap, ReceiveEvents,
12};
13
14pub struct SharedPlugin<T: Send + Sync + 'static> {
15 phantom_t: PhantomData<T>,
16}
17
18impl<T: Send + Sync + 'static> SharedPlugin<T> {
19 pub fn new() -> Self {
20 Self {
21 phantom_t: PhantomData,
22 }
23 }
24}
25
26impl<T: Send + Sync + 'static> PluginType for SharedPlugin<T> {
27 fn build(&self, app: &mut App) {
28 if app.is_plugin_added::<Self>() {
29 info!("attempted to add SharedPlugin twice to App");
30 return;
31 }
32 app
33 .init_resource::<HostOwnedMap>()
35 .add_event::<HostSyncEvent>()
37 .configure_sets(
39 Update,
40 BeforeHostSyncChangeTracking.before(HostSyncChangeTracking),
41 )
42 .configure_sets(Update, HostSyncChangeTracking.before(BeforeReceiveEvents))
43 .configure_sets(Update, BeforeReceiveEvents.before(ReceiveEvents))
44 .add_systems(
46 Update,
47 on_host_owned_added.in_set(BeforeHostSyncChangeTracking),
48 )
49 .add_systems(Update, on_despawn.in_set(HostSyncChangeTracking));
50 }
51}