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