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