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
19macro_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#[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}