veloren_server/events/
event_types.rs1pub 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
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 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#[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}