1#![allow(async_fn_in_trait)]
3use crate::{command::CommandRegistry, event::EventContext, types, EventSubscriptions, Server};
4pub trait EventHandler: EventSubscriptions + Send + Sync {
5 async fn on_player_join(
7 &self,
8 _server: &Server,
9 _event: &mut EventContext<'_, types::PlayerJoinEvent>,
10 ) {
11 }
12 async fn on_player_quit(
14 &self,
15 _server: &Server,
16 _event: &mut EventContext<'_, types::PlayerQuitEvent>,
17 ) {
18 }
19 async fn on_player_move(
21 &self,
22 _server: &Server,
23 _event: &mut EventContext<'_, types::PlayerMoveEvent>,
24 ) {
25 }
26 async fn on_player_jump(
28 &self,
29 _server: &Server,
30 _event: &mut EventContext<'_, types::PlayerJumpEvent>,
31 ) {
32 }
33 async fn on_player_teleport(
35 &self,
36 _server: &Server,
37 _event: &mut EventContext<'_, types::PlayerTeleportEvent>,
38 ) {
39 }
40 async fn on_player_change_world(
42 &self,
43 _server: &Server,
44 _event: &mut EventContext<'_, types::PlayerChangeWorldEvent>,
45 ) {
46 }
47 async fn on_player_toggle_sprint(
49 &self,
50 _server: &Server,
51 _event: &mut EventContext<'_, types::PlayerToggleSprintEvent>,
52 ) {
53 }
54 async fn on_player_toggle_sneak(
56 &self,
57 _server: &Server,
58 _event: &mut EventContext<'_, types::PlayerToggleSneakEvent>,
59 ) {
60 }
61 async fn on_chat(&self, _server: &Server, _event: &mut EventContext<'_, types::ChatEvent>) {}
63 async fn on_player_food_loss(
65 &self,
66 _server: &Server,
67 _event: &mut EventContext<'_, types::PlayerFoodLossEvent>,
68 ) {
69 }
70 async fn on_player_heal(
72 &self,
73 _server: &Server,
74 _event: &mut EventContext<'_, types::PlayerHealEvent>,
75 ) {
76 }
77 async fn on_player_hurt(
79 &self,
80 _server: &Server,
81 _event: &mut EventContext<'_, types::PlayerHurtEvent>,
82 ) {
83 }
84 async fn on_player_death(
86 &self,
87 _server: &Server,
88 _event: &mut EventContext<'_, types::PlayerDeathEvent>,
89 ) {
90 }
91 async fn on_player_respawn(
93 &self,
94 _server: &Server,
95 _event: &mut EventContext<'_, types::PlayerRespawnEvent>,
96 ) {
97 }
98 async fn on_player_skin_change(
100 &self,
101 _server: &Server,
102 _event: &mut EventContext<'_, types::PlayerSkinChangeEvent>,
103 ) {
104 }
105 async fn on_player_fire_extinguish(
107 &self,
108 _server: &Server,
109 _event: &mut EventContext<'_, types::PlayerFireExtinguishEvent>,
110 ) {
111 }
112 async fn on_player_start_break(
114 &self,
115 _server: &Server,
116 _event: &mut EventContext<'_, types::PlayerStartBreakEvent>,
117 ) {
118 }
119 async fn on_block_break(
121 &self,
122 _server: &Server,
123 _event: &mut EventContext<'_, types::BlockBreakEvent>,
124 ) {
125 }
126 async fn on_player_block_place(
128 &self,
129 _server: &Server,
130 _event: &mut EventContext<'_, types::PlayerBlockPlaceEvent>,
131 ) {
132 }
133 async fn on_player_block_pick(
135 &self,
136 _server: &Server,
137 _event: &mut EventContext<'_, types::PlayerBlockPickEvent>,
138 ) {
139 }
140 async fn on_player_item_use(
142 &self,
143 _server: &Server,
144 _event: &mut EventContext<'_, types::PlayerItemUseEvent>,
145 ) {
146 }
147 async fn on_player_item_use_on_block(
149 &self,
150 _server: &Server,
151 _event: &mut EventContext<'_, types::PlayerItemUseOnBlockEvent>,
152 ) {
153 }
154 async fn on_player_item_use_on_entity(
156 &self,
157 _server: &Server,
158 _event: &mut EventContext<'_, types::PlayerItemUseOnEntityEvent>,
159 ) {
160 }
161 async fn on_player_item_release(
163 &self,
164 _server: &Server,
165 _event: &mut EventContext<'_, types::PlayerItemReleaseEvent>,
166 ) {
167 }
168 async fn on_player_item_consume(
170 &self,
171 _server: &Server,
172 _event: &mut EventContext<'_, types::PlayerItemConsumeEvent>,
173 ) {
174 }
175 async fn on_player_attack_entity(
177 &self,
178 _server: &Server,
179 _event: &mut EventContext<'_, types::PlayerAttackEntityEvent>,
180 ) {
181 }
182 async fn on_player_experience_gain(
184 &self,
185 _server: &Server,
186 _event: &mut EventContext<'_, types::PlayerExperienceGainEvent>,
187 ) {
188 }
189 async fn on_player_punch_air(
191 &self,
192 _server: &Server,
193 _event: &mut EventContext<'_, types::PlayerPunchAirEvent>,
194 ) {
195 }
196 async fn on_player_sign_edit(
198 &self,
199 _server: &Server,
200 _event: &mut EventContext<'_, types::PlayerSignEditEvent>,
201 ) {
202 }
203 async fn on_player_lectern_page_turn(
205 &self,
206 _server: &Server,
207 _event: &mut EventContext<'_, types::PlayerLecternPageTurnEvent>,
208 ) {
209 }
210 async fn on_player_item_damage(
212 &self,
213 _server: &Server,
214 _event: &mut EventContext<'_, types::PlayerItemDamageEvent>,
215 ) {
216 }
217 async fn on_player_item_pickup(
219 &self,
220 _server: &Server,
221 _event: &mut EventContext<'_, types::PlayerItemPickupEvent>,
222 ) {
223 }
224 async fn on_player_held_slot_change(
226 &self,
227 _server: &Server,
228 _event: &mut EventContext<'_, types::PlayerHeldSlotChangeEvent>,
229 ) {
230 }
231 async fn on_player_item_drop(
233 &self,
234 _server: &Server,
235 _event: &mut EventContext<'_, types::PlayerItemDropEvent>,
236 ) {
237 }
238 async fn on_player_transfer(
240 &self,
241 _server: &Server,
242 _event: &mut EventContext<'_, types::PlayerTransferEvent>,
243 ) {
244 }
245 async fn on_command(
247 &self,
248 _server: &Server,
249 _event: &mut EventContext<'_, types::CommandEvent>,
250 ) {
251 }
252 async fn on_player_diagnostics(
254 &self,
255 _server: &Server,
256 _event: &mut EventContext<'_, types::PlayerDiagnosticsEvent>,
257 ) {
258 }
259 async fn on_world_liquid_flow(
261 &self,
262 _server: &Server,
263 _event: &mut EventContext<'_, types::WorldLiquidFlowEvent>,
264 ) {
265 }
266 async fn on_world_liquid_decay(
268 &self,
269 _server: &Server,
270 _event: &mut EventContext<'_, types::WorldLiquidDecayEvent>,
271 ) {
272 }
273 async fn on_world_liquid_harden(
275 &self,
276 _server: &Server,
277 _event: &mut EventContext<'_, types::WorldLiquidHardenEvent>,
278 ) {
279 }
280 async fn on_world_sound(
282 &self,
283 _server: &Server,
284 _event: &mut EventContext<'_, types::WorldSoundEvent>,
285 ) {
286 }
287 async fn on_world_fire_spread(
289 &self,
290 _server: &Server,
291 _event: &mut EventContext<'_, types::WorldFireSpreadEvent>,
292 ) {
293 }
294 async fn on_world_block_burn(
296 &self,
297 _server: &Server,
298 _event: &mut EventContext<'_, types::WorldBlockBurnEvent>,
299 ) {
300 }
301 async fn on_world_crop_trample(
303 &self,
304 _server: &Server,
305 _event: &mut EventContext<'_, types::WorldCropTrampleEvent>,
306 ) {
307 }
308 async fn on_world_leaves_decay(
310 &self,
311 _server: &Server,
312 _event: &mut EventContext<'_, types::WorldLeavesDecayEvent>,
313 ) {
314 }
315 async fn on_world_entity_spawn(
317 &self,
318 _server: &Server,
319 _event: &mut EventContext<'_, types::WorldEntitySpawnEvent>,
320 ) {
321 }
322 async fn on_world_entity_despawn(
324 &self,
325 _server: &Server,
326 _event: &mut EventContext<'_, types::WorldEntityDespawnEvent>,
327 ) {
328 }
329 async fn on_world_explosion(
331 &self,
332 _server: &Server,
333 _event: &mut EventContext<'_, types::WorldExplosionEvent>,
334 ) {
335 }
336 async fn on_world_close(
338 &self,
339 _server: &Server,
340 _event: &mut EventContext<'_, types::WorldCloseEvent>,
341 ) {
342 }
343}
344#[doc(hidden)]
345pub async fn dispatch_event(
346 server: &Server,
347 handler: &(impl EventHandler + CommandRegistry),
348 envelope: &types::EventEnvelope,
349) {
350 let Some(payload) = &envelope.payload else {
351 return;
352 };
353 match payload {
354 types::event_envelope::Payload::PlayerJoin(e) => {
355 let mut context = EventContext::new(
356 &envelope.event_id,
357 e,
358 server.sender.clone(),
359 server.plugin_id.clone(),
360 );
361 handler.on_player_join(server, &mut context).await;
362 context.send_ack_if_needed().await;
363 }
364 types::event_envelope::Payload::PlayerQuit(e) => {
365 let mut context = EventContext::new(
366 &envelope.event_id,
367 e,
368 server.sender.clone(),
369 server.plugin_id.clone(),
370 );
371 handler.on_player_quit(server, &mut context).await;
372 context.send_ack_if_needed().await;
373 }
374 types::event_envelope::Payload::PlayerMove(e) => {
375 let mut context = EventContext::new(
376 &envelope.event_id,
377 e,
378 server.sender.clone(),
379 server.plugin_id.clone(),
380 );
381 handler.on_player_move(server, &mut context).await;
382 context.send_ack_if_needed().await;
383 }
384 types::event_envelope::Payload::PlayerJump(e) => {
385 let mut context = EventContext::new(
386 &envelope.event_id,
387 e,
388 server.sender.clone(),
389 server.plugin_id.clone(),
390 );
391 handler.on_player_jump(server, &mut context).await;
392 context.send_ack_if_needed().await;
393 }
394 types::event_envelope::Payload::PlayerTeleport(e) => {
395 let mut context = EventContext::new(
396 &envelope.event_id,
397 e,
398 server.sender.clone(),
399 server.plugin_id.clone(),
400 );
401 handler.on_player_teleport(server, &mut context).await;
402 context.send_ack_if_needed().await;
403 }
404 types::event_envelope::Payload::PlayerChangeWorld(e) => {
405 let mut context = EventContext::new(
406 &envelope.event_id,
407 e,
408 server.sender.clone(),
409 server.plugin_id.clone(),
410 );
411 handler.on_player_change_world(server, &mut context).await;
412 context.send_ack_if_needed().await;
413 }
414 types::event_envelope::Payload::PlayerToggleSprint(e) => {
415 let mut context = EventContext::new(
416 &envelope.event_id,
417 e,
418 server.sender.clone(),
419 server.plugin_id.clone(),
420 );
421 handler.on_player_toggle_sprint(server, &mut context).await;
422 context.send_ack_if_needed().await;
423 }
424 types::event_envelope::Payload::PlayerToggleSneak(e) => {
425 let mut context = EventContext::new(
426 &envelope.event_id,
427 e,
428 server.sender.clone(),
429 server.plugin_id.clone(),
430 );
431 handler.on_player_toggle_sneak(server, &mut context).await;
432 context.send_ack_if_needed().await;
433 }
434 types::event_envelope::Payload::Chat(e) => {
435 let mut context = EventContext::new(
436 &envelope.event_id,
437 e,
438 server.sender.clone(),
439 server.plugin_id.clone(),
440 );
441 handler.on_chat(server, &mut context).await;
442 context.send_ack_if_needed().await;
443 }
444 types::event_envelope::Payload::PlayerFoodLoss(e) => {
445 let mut context = EventContext::new(
446 &envelope.event_id,
447 e,
448 server.sender.clone(),
449 server.plugin_id.clone(),
450 );
451 handler.on_player_food_loss(server, &mut context).await;
452 context.send_ack_if_needed().await;
453 }
454 types::event_envelope::Payload::PlayerHeal(e) => {
455 let mut context = EventContext::new(
456 &envelope.event_id,
457 e,
458 server.sender.clone(),
459 server.plugin_id.clone(),
460 );
461 handler.on_player_heal(server, &mut context).await;
462 context.send_ack_if_needed().await;
463 }
464 types::event_envelope::Payload::PlayerHurt(e) => {
465 let mut context = EventContext::new(
466 &envelope.event_id,
467 e,
468 server.sender.clone(),
469 server.plugin_id.clone(),
470 );
471 handler.on_player_hurt(server, &mut context).await;
472 context.send_ack_if_needed().await;
473 }
474 types::event_envelope::Payload::PlayerDeath(e) => {
475 let mut context = EventContext::new(
476 &envelope.event_id,
477 e,
478 server.sender.clone(),
479 server.plugin_id.clone(),
480 );
481 handler.on_player_death(server, &mut context).await;
482 context.send_ack_if_needed().await;
483 }
484 types::event_envelope::Payload::PlayerRespawn(e) => {
485 let mut context = EventContext::new(
486 &envelope.event_id,
487 e,
488 server.sender.clone(),
489 server.plugin_id.clone(),
490 );
491 handler.on_player_respawn(server, &mut context).await;
492 context.send_ack_if_needed().await;
493 }
494 types::event_envelope::Payload::PlayerSkinChange(e) => {
495 let mut context = EventContext::new(
496 &envelope.event_id,
497 e,
498 server.sender.clone(),
499 server.plugin_id.clone(),
500 );
501 handler.on_player_skin_change(server, &mut context).await;
502 context.send_ack_if_needed().await;
503 }
504 types::event_envelope::Payload::PlayerFireExtinguish(e) => {
505 let mut context = EventContext::new(
506 &envelope.event_id,
507 e,
508 server.sender.clone(),
509 server.plugin_id.clone(),
510 );
511 handler
512 .on_player_fire_extinguish(server, &mut context)
513 .await;
514 context.send_ack_if_needed().await;
515 }
516 types::event_envelope::Payload::PlayerStartBreak(e) => {
517 let mut context = EventContext::new(
518 &envelope.event_id,
519 e,
520 server.sender.clone(),
521 server.plugin_id.clone(),
522 );
523 handler.on_player_start_break(server, &mut context).await;
524 context.send_ack_if_needed().await;
525 }
526 types::event_envelope::Payload::BlockBreak(e) => {
527 let mut context = EventContext::new(
528 &envelope.event_id,
529 e,
530 server.sender.clone(),
531 server.plugin_id.clone(),
532 );
533 handler.on_block_break(server, &mut context).await;
534 context.send_ack_if_needed().await;
535 }
536 types::event_envelope::Payload::PlayerBlockPlace(e) => {
537 let mut context = EventContext::new(
538 &envelope.event_id,
539 e,
540 server.sender.clone(),
541 server.plugin_id.clone(),
542 );
543 handler.on_player_block_place(server, &mut context).await;
544 context.send_ack_if_needed().await;
545 }
546 types::event_envelope::Payload::PlayerBlockPick(e) => {
547 let mut context = EventContext::new(
548 &envelope.event_id,
549 e,
550 server.sender.clone(),
551 server.plugin_id.clone(),
552 );
553 handler.on_player_block_pick(server, &mut context).await;
554 context.send_ack_if_needed().await;
555 }
556 types::event_envelope::Payload::PlayerItemUse(e) => {
557 let mut context = EventContext::new(
558 &envelope.event_id,
559 e,
560 server.sender.clone(),
561 server.plugin_id.clone(),
562 );
563 handler.on_player_item_use(server, &mut context).await;
564 context.send_ack_if_needed().await;
565 }
566 types::event_envelope::Payload::PlayerItemUseOnBlock(e) => {
567 let mut context = EventContext::new(
568 &envelope.event_id,
569 e,
570 server.sender.clone(),
571 server.plugin_id.clone(),
572 );
573 handler
574 .on_player_item_use_on_block(server, &mut context)
575 .await;
576 context.send_ack_if_needed().await;
577 }
578 types::event_envelope::Payload::PlayerItemUseOnEntity(e) => {
579 let mut context = EventContext::new(
580 &envelope.event_id,
581 e,
582 server.sender.clone(),
583 server.plugin_id.clone(),
584 );
585 handler
586 .on_player_item_use_on_entity(server, &mut context)
587 .await;
588 context.send_ack_if_needed().await;
589 }
590 types::event_envelope::Payload::PlayerItemRelease(e) => {
591 let mut context = EventContext::new(
592 &envelope.event_id,
593 e,
594 server.sender.clone(),
595 server.plugin_id.clone(),
596 );
597 handler.on_player_item_release(server, &mut context).await;
598 context.send_ack_if_needed().await;
599 }
600 types::event_envelope::Payload::PlayerItemConsume(e) => {
601 let mut context = EventContext::new(
602 &envelope.event_id,
603 e,
604 server.sender.clone(),
605 server.plugin_id.clone(),
606 );
607 handler.on_player_item_consume(server, &mut context).await;
608 context.send_ack_if_needed().await;
609 }
610 types::event_envelope::Payload::PlayerAttackEntity(e) => {
611 let mut context = EventContext::new(
612 &envelope.event_id,
613 e,
614 server.sender.clone(),
615 server.plugin_id.clone(),
616 );
617 handler.on_player_attack_entity(server, &mut context).await;
618 context.send_ack_if_needed().await;
619 }
620 types::event_envelope::Payload::PlayerExperienceGain(e) => {
621 let mut context = EventContext::new(
622 &envelope.event_id,
623 e,
624 server.sender.clone(),
625 server.plugin_id.clone(),
626 );
627 handler
628 .on_player_experience_gain(server, &mut context)
629 .await;
630 context.send_ack_if_needed().await;
631 }
632 types::event_envelope::Payload::PlayerPunchAir(e) => {
633 let mut context = EventContext::new(
634 &envelope.event_id,
635 e,
636 server.sender.clone(),
637 server.plugin_id.clone(),
638 );
639 handler.on_player_punch_air(server, &mut context).await;
640 context.send_ack_if_needed().await;
641 }
642 types::event_envelope::Payload::PlayerSignEdit(e) => {
643 let mut context = EventContext::new(
644 &envelope.event_id,
645 e,
646 server.sender.clone(),
647 server.plugin_id.clone(),
648 );
649 handler.on_player_sign_edit(server, &mut context).await;
650 context.send_ack_if_needed().await;
651 }
652 types::event_envelope::Payload::PlayerLecternPageTurn(e) => {
653 let mut context = EventContext::new(
654 &envelope.event_id,
655 e,
656 server.sender.clone(),
657 server.plugin_id.clone(),
658 );
659 handler
660 .on_player_lectern_page_turn(server, &mut context)
661 .await;
662 context.send_ack_if_needed().await;
663 }
664 types::event_envelope::Payload::PlayerItemDamage(e) => {
665 let mut context = EventContext::new(
666 &envelope.event_id,
667 e,
668 server.sender.clone(),
669 server.plugin_id.clone(),
670 );
671 handler.on_player_item_damage(server, &mut context).await;
672 context.send_ack_if_needed().await;
673 }
674 types::event_envelope::Payload::PlayerItemPickup(e) => {
675 let mut context = EventContext::new(
676 &envelope.event_id,
677 e,
678 server.sender.clone(),
679 server.plugin_id.clone(),
680 );
681 handler.on_player_item_pickup(server, &mut context).await;
682 context.send_ack_if_needed().await;
683 }
684 types::event_envelope::Payload::PlayerHeldSlotChange(e) => {
685 let mut context = EventContext::new(
686 &envelope.event_id,
687 e,
688 server.sender.clone(),
689 server.plugin_id.clone(),
690 );
691 handler
692 .on_player_held_slot_change(server, &mut context)
693 .await;
694 context.send_ack_if_needed().await;
695 }
696 types::event_envelope::Payload::PlayerItemDrop(e) => {
697 let mut context = EventContext::new(
698 &envelope.event_id,
699 e,
700 server.sender.clone(),
701 server.plugin_id.clone(),
702 );
703 handler.on_player_item_drop(server, &mut context).await;
704 context.send_ack_if_needed().await;
705 }
706 types::event_envelope::Payload::PlayerTransfer(e) => {
707 let mut context = EventContext::new(
708 &envelope.event_id,
709 e,
710 server.sender.clone(),
711 server.plugin_id.clone(),
712 );
713 handler.on_player_transfer(server, &mut context).await;
714 context.send_ack_if_needed().await;
715 }
716 types::event_envelope::Payload::Command(e) => {
717 let mut context = EventContext::new(
718 &envelope.event_id,
719 e,
720 server.sender.clone(),
721 server.plugin_id.clone(),
722 );
723 context.send_ack_if_needed().await;
724 let handled = handler.dispatch_commands(server, &mut context).await;
725 if !handled {
726 handler.on_command(server, &mut context).await;
727 }
728 }
729 types::event_envelope::Payload::PlayerDiagnostics(e) => {
730 let mut context = EventContext::new(
731 &envelope.event_id,
732 e,
733 server.sender.clone(),
734 server.plugin_id.clone(),
735 );
736 handler.on_player_diagnostics(server, &mut context).await;
737 context.send_ack_if_needed().await;
738 }
739 types::event_envelope::Payload::WorldLiquidFlow(e) => {
740 let mut context = EventContext::new(
741 &envelope.event_id,
742 e,
743 server.sender.clone(),
744 server.plugin_id.clone(),
745 );
746 handler.on_world_liquid_flow(server, &mut context).await;
747 context.send_ack_if_needed().await;
748 }
749 types::event_envelope::Payload::WorldLiquidDecay(e) => {
750 let mut context = EventContext::new(
751 &envelope.event_id,
752 e,
753 server.sender.clone(),
754 server.plugin_id.clone(),
755 );
756 handler.on_world_liquid_decay(server, &mut context).await;
757 context.send_ack_if_needed().await;
758 }
759 types::event_envelope::Payload::WorldLiquidHarden(e) => {
760 let mut context = EventContext::new(
761 &envelope.event_id,
762 e,
763 server.sender.clone(),
764 server.plugin_id.clone(),
765 );
766 handler.on_world_liquid_harden(server, &mut context).await;
767 context.send_ack_if_needed().await;
768 }
769 types::event_envelope::Payload::WorldSound(e) => {
770 let mut context = EventContext::new(
771 &envelope.event_id,
772 e,
773 server.sender.clone(),
774 server.plugin_id.clone(),
775 );
776 handler.on_world_sound(server, &mut context).await;
777 context.send_ack_if_needed().await;
778 }
779 types::event_envelope::Payload::WorldFireSpread(e) => {
780 let mut context = EventContext::new(
781 &envelope.event_id,
782 e,
783 server.sender.clone(),
784 server.plugin_id.clone(),
785 );
786 handler.on_world_fire_spread(server, &mut context).await;
787 context.send_ack_if_needed().await;
788 }
789 types::event_envelope::Payload::WorldBlockBurn(e) => {
790 let mut context = EventContext::new(
791 &envelope.event_id,
792 e,
793 server.sender.clone(),
794 server.plugin_id.clone(),
795 );
796 handler.on_world_block_burn(server, &mut context).await;
797 context.send_ack_if_needed().await;
798 }
799 types::event_envelope::Payload::WorldCropTrample(e) => {
800 let mut context = EventContext::new(
801 &envelope.event_id,
802 e,
803 server.sender.clone(),
804 server.plugin_id.clone(),
805 );
806 handler.on_world_crop_trample(server, &mut context).await;
807 context.send_ack_if_needed().await;
808 }
809 types::event_envelope::Payload::WorldLeavesDecay(e) => {
810 let mut context = EventContext::new(
811 &envelope.event_id,
812 e,
813 server.sender.clone(),
814 server.plugin_id.clone(),
815 );
816 handler.on_world_leaves_decay(server, &mut context).await;
817 context.send_ack_if_needed().await;
818 }
819 types::event_envelope::Payload::WorldEntitySpawn(e) => {
820 let mut context = EventContext::new(
821 &envelope.event_id,
822 e,
823 server.sender.clone(),
824 server.plugin_id.clone(),
825 );
826 handler.on_world_entity_spawn(server, &mut context).await;
827 context.send_ack_if_needed().await;
828 }
829 types::event_envelope::Payload::WorldEntityDespawn(e) => {
830 let mut context = EventContext::new(
831 &envelope.event_id,
832 e,
833 server.sender.clone(),
834 server.plugin_id.clone(),
835 );
836 handler.on_world_entity_despawn(server, &mut context).await;
837 context.send_ack_if_needed().await;
838 }
839 types::event_envelope::Payload::WorldExplosion(e) => {
840 let mut context = EventContext::new(
841 &envelope.event_id,
842 e,
843 server.sender.clone(),
844 server.plugin_id.clone(),
845 );
846 handler.on_world_explosion(server, &mut context).await;
847 context.send_ack_if_needed().await;
848 }
849 types::event_envelope::Payload::WorldClose(e) => {
850 let mut context = EventContext::new(
851 &envelope.event_id,
852 e,
853 server.sender.clone(),
854 server.plugin_id.clone(),
855 );
856 handler.on_world_close(server, &mut context).await;
857 context.send_ack_if_needed().await;
858 }
859 }
860}