veloren_server/events/
event_types.rs1pub use common::event::{
2 ArcingEvent, AuraEvent, BonkEvent, BuffEvent, ChangeAbilityEvent, ChangeBodyEvent,
3 ChangeStanceEvent, ChatEvent, ClientDisconnectEvent, ClientDisconnectWithoutPersistenceEvent,
4 ComboChangeEvent, CommandEvent, CreateAuraEntityEvent, CreateItemDropEvent, CreateNpcEvent,
5 CreateNpcGroupEvent, CreateObjectEvent, CreateShipEvent, CreateSpecialEntityEvent,
6 CreateSpriteEvent, DeleteCharacterEvent, DeleteEvent, DestroyEvent, DialogueEvent, DownedEvent,
7 EnergyChangeEvent, EntityAttackedHookEvent, EventBus, ExitIngameEvent, ExplosionEvent,
8 GroupManipEvent, HealthChangeEvent, HelpDownedEvent, InitializeCharacterEvent,
9 InitializeSpectatorEvent, InitiateInviteEvent, InventoryManipEvent, InviteResponseEvent,
10 KillEvent, KnockbackEvent, LandOnGroundEvent, MakeAdminEvent, MineBlockEvent, MountEvent,
11 NpcInteractEvent, ParryHookEvent, PoiseChangeEvent, PossessEvent, ProcessTradeActionEvent,
12 RegrowHeadEvent, RemoveLightEmitterEvent, RequestPluginsEvent, 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
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 ArcingEvent
94 }
95 };
96}
97
98pub(crate) fn register_event_busses(ecs: &mut specs::World) {
99 macro_rules! register_events {
100 ($($event:ty)*) => {
101 $(
102 ecs.insert(EventBus::<$event>::default());
103 )*
104 };
105 }
106 server_events!(register_events);
107}
108
109#[cfg(debug_assertions)]
117pub(super) fn check_event_handlers(ecs: &mut specs::World) {
118 struct CheckedEventHandlers;
119 if ecs.get_mut::<CheckedEventHandlers>().is_some() {
120 return;
121 }
122 ecs.insert(CheckedEventHandlers);
123
124 fn not_consumed<T>() -> ! {
125 panic!("Server event not consumed: {}", core::any::type_name::<T>());
126 }
127 fn multiple_handlers<T>() -> ! {
128 panic!(
129 "Server event has multiple handlers, only the first will receive events: {}",
130 core::any::type_name::<T>()
131 );
132 }
133
134 macro_rules! check_events {
135 ($($event:ty)*) => {
136 $(
137 let recv_count = ecs.get_mut::<EventBus<$event>>().expect("event bus not registered").recv_count();
138 match recv_count {
139 0 => not_consumed::<$event>(),
140 1 => {},
141 _ => multiple_handlers::<$event>(),
142 }
143 )*
144 };
145 }
146 server_events!(check_events);
147}