veloren_server/events/
event_types.rs

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