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, CreatePoolEvent, CreateShipEvent,
6    CreateSpecialEntityEvent, CreateSpriteEvent, DeleteCharacterEvent, DeleteEvent, DestroyEvent,
7    DialogueEvent, DownedEvent, EnergyChangeEvent, EntityAttackedHookEvent, EventBus,
8    ExitIngameEvent, ExplosionEvent, GroupManipEvent, HealthChangeEvent, HelpDownedEvent,
9    InitializeCharacterEvent, InitializeSpectatorEvent, InitiateInviteEvent, InventoryManipEvent,
10    InviteResponseEvent, KillEvent, KnockbackEvent, LandOnGroundEvent, MakeAdminEvent,
11    MineBlockEvent, MountEvent, NpcInteractEvent, ParryHookEvent, PoiseChangeEvent, PossessEvent,
12    ProcessTradeActionEvent, RegrowHeadEvent, RemoveLightEmitterEvent, RequestSiteInfoEvent,
13    RespawnEvent, SetBattleModeEvent, SetLanternEvent, SetPetStayEvent, ShockwaveEvent, ShootEvent,
14    SoundEvent, 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            CreatePoolEvent
97        }
98
99        #[cfg(feature = "plugins")]
100        $macro! {
101            RequestPluginsEvent
102        }
103    };
104}
105
106pub(crate) fn register_event_busses(ecs: &mut specs::World) {
107    macro_rules! register_events {
108        ($($event:ty)*) => {
109            $(
110                ecs.insert(EventBus::<$event>::default());
111            )*
112        };
113    }
114    server_events!(register_events);
115}
116
117/// Checks that every server event has been handled and that there aren't
118/// duplicate handlers.
119///
120/// Also asserts that the event busses have all been registered.
121///
122/// Needs to be called on the first tick after all event handlers have run.
123/// After the initial call this does nothing.
124#[cfg(debug_assertions)]
125pub(super) fn check_event_handlers(ecs: &mut specs::World) {
126    struct CheckedEventHandlers;
127    if ecs.get_mut::<CheckedEventHandlers>().is_some() {
128        return;
129    }
130    ecs.insert(CheckedEventHandlers);
131
132    fn not_consumed<T>() -> ! {
133        panic!("Server event not consumed: {}", core::any::type_name::<T>());
134    }
135    fn multiple_handlers<T>() -> ! {
136        panic!(
137            "Server event has multiple handlers, only the first will receive events: {}",
138            core::any::type_name::<T>()
139        );
140    }
141
142    macro_rules! check_events {
143        ($($event:ty)*) => {
144            $(
145                let recv_count = ecs.get_mut::<EventBus<$event>>().expect("event bus not registered").recv_count();
146                match recv_count {
147                    0 => not_consumed::<$event>(),
148                    1 => {},
149                    _ => multiple_handlers::<$event>(),
150                }
151            )*
152        };
153    }
154    server_events!(check_events);
155}