veloren_server/events/
event_types.rs

1pub use common::event::{
2    ArcingEvent, AuraEvent, BonkEvent, BuffEvent, ChangeAbilityEvent, ChangeBodyEvent,
3    ChangeStanceEvent, ChatEvent, ClientDisconnectEvent, ClientDisconnectWithoutPersistenceEvent,
4    ComboChangeEvent, CommandEvent, CreateAuraEntityEvent, CreateItemDropEvent, CreateNpcEvent,
5    CreateNpcGroupEvent, CreateObjectEvent, CreateShipEvent, CreateSpecialEntityEvent,
6    CreateSpriteEvent, DeleteCharacterEvent, DeleteEvent, DestroyEvent, DialogueEvent, DownedEvent,
7    EnergyChangeEvent, EntityAttackedHookEvent, EventBus, ExitIngameEvent, ExplosionEvent,
8    GroupManipEvent, HealthChangeEvent, HelpDownedEvent, InitializeCharacterEvent,
9    InitializeSpectatorEvent, InitiateInviteEvent, InventoryManipEvent, InviteResponseEvent,
10    KillEvent, KnockbackEvent, LandOnGroundEvent, MakeAdminEvent, MineBlockEvent, MountEvent,
11    NpcInteractEvent, ParryHookEvent, PoiseChangeEvent, PossessEvent, ProcessTradeActionEvent,
12    RegrowHeadEvent, RemoveLightEmitterEvent, RequestSiteInfoEvent, RespawnEvent,
13    SetBattleModeEvent, SetLanternEvent, SetPetStayEvent, ShockwaveEvent, ShootEvent, SoundEvent,
14    StartInteractionEvent, StartTeleportingEvent, SummonBeamPillarsEvent, TamePetEvent,
15    TeleportToEvent, TeleportToPositionEvent, ThrowEvent, ToggleSpriteLightEvent, TransformEvent,
16    UpdateCharacterDataEvent, UpdateMapMarkerEvent,
17};
18
19#[cfg(feature = "plugins")]
20pub use common::event::RequestPluginsEvent;
21
22/// X-macro that provides list of server events to the macro this is called
23/// with.
24macro_rules! server_events {
25    ($macro:ident) => {
26        $macro! {
27            ClientDisconnectEvent
28            ClientDisconnectWithoutPersistenceEvent
29            ChatEvent
30            CommandEvent
31            CreateSpecialEntityEvent
32            CreateNpcEvent
33            CreateNpcGroupEvent
34            CreateShipEvent
35            CreateItemDropEvent
36            CreateObjectEvent
37            ExplosionEvent
38            BonkEvent
39            HealthChangeEvent
40            KillEvent
41            HelpDownedEvent
42            DownedEvent
43            PoiseChangeEvent
44            DeleteEvent
45            DestroyEvent
46            InventoryManipEvent
47            GroupManipEvent
48            RespawnEvent
49            ShootEvent
50            ThrowEvent
51            ShockwaveEvent
52            KnockbackEvent
53            LandOnGroundEvent
54            SetLanternEvent
55            NpcInteractEvent
56            DialogueEvent
57            InviteResponseEvent
58            InitiateInviteEvent
59            ProcessTradeActionEvent
60            MountEvent
61            SetPetStayEvent
62            PossessEvent
63            InitializeCharacterEvent
64            InitializeSpectatorEvent
65            UpdateCharacterDataEvent
66            ExitIngameEvent
67            AuraEvent
68            BuffEvent
69            EnergyChangeEvent
70            ComboChangeEvent
71            ParryHookEvent
72            RequestSiteInfoEvent
73            MineBlockEvent
74            TeleportToEvent
75            SoundEvent
76            CreateSpriteEvent
77            TamePetEvent
78            EntityAttackedHookEvent
79            ChangeAbilityEvent
80            UpdateMapMarkerEvent
81            MakeAdminEvent
82            DeleteCharacterEvent
83            ChangeStanceEvent
84            ChangeBodyEvent
85            RemoveLightEmitterEvent
86            TeleportToPositionEvent
87            StartTeleportingEvent
88            ToggleSpriteLightEvent
89            TransformEvent
90            StartInteractionEvent
91            CreateAuraEntityEvent
92            RegrowHeadEvent
93            SetBattleModeEvent
94            SummonBeamPillarsEvent
95            ArcingEvent
96        }
97
98        #[cfg(feature = "plugins")]
99        $macro! {
100            RequestPluginsEvent
101        }
102    };
103}
104
105pub(crate) fn register_event_busses(ecs: &mut specs::World) {
106    macro_rules! register_events {
107        ($($event:ty)*) => {
108            $(
109                ecs.insert(EventBus::<$event>::default());
110            )*
111        };
112    }
113    server_events!(register_events);
114}
115
116/// Checks that every server event has been handled and that there aren't
117/// duplicate handlers.
118///
119/// Also asserts that the event busses have all been registered.
120///
121/// Needs to be called on the first tick after all event handlers have run.
122/// After the initial call this does nothing.
123#[cfg(debug_assertions)]
124pub(super) fn check_event_handlers(ecs: &mut specs::World) {
125    struct CheckedEventHandlers;
126    if ecs.get_mut::<CheckedEventHandlers>().is_some() {
127        return;
128    }
129    ecs.insert(CheckedEventHandlers);
130
131    fn not_consumed<T>() -> ! {
132        panic!("Server event not consumed: {}", core::any::type_name::<T>());
133    }
134    fn multiple_handlers<T>() -> ! {
135        panic!(
136            "Server event has multiple handlers, only the first will receive events: {}",
137            core::any::type_name::<T>()
138        );
139    }
140
141    macro_rules! check_events {
142        ($($event:ty)*) => {
143            $(
144                let recv_count = ecs.get_mut::<EventBus<$event>>().expect("event bus not registered").recv_count();
145                match recv_count {
146                    0 => not_consumed::<$event>(),
147                    1 => {},
148                    _ => multiple_handlers::<$event>(),
149                }
150            )*
151        };
152    }
153    server_events!(check_events);
154}