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, 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 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 SummonBeamPillarsEvent
92 }
93 };
94}
95
96pub(crate) fn register_event_busses(ecs: &mut specs::World) {
97 macro_rules! register_events {
98 ($($event:ty)*) => {
99 $(
100 ecs.insert(EventBus::<$event>::default());
101 )*
102 };
103 }
104 server_events!(register_events);
105}
106
107#[cfg(debug_assertions)]
115pub(super) fn check_event_handlers(ecs: &mut specs::World) {
116 struct CheckedEventHandlers;
117 if ecs.get_mut::<CheckedEventHandlers>().is_some() {
118 return;
119 }
120 ecs.insert(CheckedEventHandlers);
121
122 fn not_consumed<T>() -> ! {
123 panic!("Server event not consumed: {}", core::any::type_name::<T>());
124 }
125 fn multiple_handlers<T>() -> ! {
126 panic!(
127 "Server event has multiple handlers, only the first will receive events: {}",
128 core::any::type_name::<T>()
129 );
130 }
131
132 macro_rules! check_events {
133 ($($event:ty)*) => {
134 $(
135 let recv_count = ecs.get_mut::<EventBus<$event>>().expect("event bus not registered").recv_count();
136 match recv_count {
137 0 => not_consumed::<$event>(),
138 1 => {},
139 _ => multiple_handlers::<$event>(),
140 }
141 )*
142 };
143 }
144 server_events!(check_events);
145}