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    SetBattleModeEvent, SetLanternEvent, SetPetStayEvent, ShockwaveEvent, ShootEvent, SoundEvent,
14    StartInteractionEvent, StartTeleportingEvent, TamePetEvent, TeleportToEvent,
15    TeleportToPositionEvent, ThrowEvent, ToggleSpriteLightEvent, TransformEvent,
16    UpdateCharacterDataEvent, 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            ThrowEvent
47            ShockwaveEvent
48            KnockbackEvent
49            LandOnGroundEvent
50            SetLanternEvent
51            NpcInteractEvent
52            DialogueEvent
53            InviteResponseEvent
54            InitiateInviteEvent
55            ProcessTradeActionEvent
56            MountEvent
57            SetPetStayEvent
58            PossessEvent
59            InitializeCharacterEvent
60            InitializeSpectatorEvent
61            UpdateCharacterDataEvent
62            ExitIngameEvent
63            AuraEvent
64            BuffEvent
65            EnergyChangeEvent
66            ComboChangeEvent
67            ParryHookEvent
68            RequestSiteInfoEvent
69            MineBlockEvent
70            TeleportToEvent
71            SoundEvent
72            CreateSpriteEvent
73            TamePetEvent
74            EntityAttackedHookEvent
75            ChangeAbilityEvent
76            UpdateMapMarkerEvent
77            MakeAdminEvent
78            DeleteCharacterEvent
79            ChangeStanceEvent
80            ChangeBodyEvent
81            RemoveLightEmitterEvent
82            TeleportToPositionEvent
83            StartTeleportingEvent
84            ToggleSpriteLightEvent
85            TransformEvent
86            StartInteractionEvent
87            RequestPluginsEvent
88            CreateAuraEntityEvent
89            RegrowHeadEvent
90            SetBattleModeEvent
91        }
92    };
93}
94
95pub(crate) fn register_event_busses(ecs: &mut specs::World) {
96    macro_rules! register_events {
97        ($($event:ty)*) => {
98            $(
99                ecs.insert(EventBus::<$event>::default());
100            )*
101        };
102    }
103    server_events!(register_events);
104}
105
106/// Checks that every server event has been handled and that there aren't
107/// duplicate handlers.
108///
109/// Also asserts that the event busses have all been registered.
110///
111/// Needs to be called on the first tick after all event handlers have run.
112/// After the initial call this does nothing.
113#[cfg(debug_assertions)]
114pub(super) fn check_event_handlers(ecs: &mut specs::World) {
115    struct CheckedEventHandlers;
116    if ecs.get_mut::<CheckedEventHandlers>().is_some() {
117        return;
118    }
119    ecs.insert(CheckedEventHandlers);
120
121    fn not_consumed<T>() -> ! {
122        panic!("Server event not consumed: {}", core::any::type_name::<T>());
123    }
124    fn multiple_handlers<T>() -> ! {
125        panic!(
126            "Server event has multiple handlers, only the first will receive events: {}",
127            core::any::type_name::<T>()
128        );
129    }
130
131    macro_rules! check_events {
132        ($($event:ty)*) => {
133            $(
134                let recv_count = ecs.get_mut::<EventBus<$event>>().expect("event bus not registered").recv_count();
135                match recv_count {
136                    0 => not_consumed::<$event>(),
137                    1 => {},
138                    _ => multiple_handlers::<$event>(),
139                }
140            )*
141        };
142    }
143    server_events!(check_events);
144}