valence_server/
status.rs
1use bevy_app::prelude::*;
2use bevy_ecs::prelude::*;
3use valence_protocol::packets::play::ClientStatusC2s;
4
5use crate::event_loop::{EventLoopPreUpdate, PacketEvent};
6
7pub struct StatusPlugin;
8
9impl Plugin for StatusPlugin {
10 fn build(&self, app: &mut App) {
11 app.add_event::<RequestRespawnEvent>()
12 .add_event::<RequestStatsEvent>()
13 .add_systems(EventLoopPreUpdate, handle_status);
14 }
15}
16
17#[derive(Event, Copy, Clone, PartialEq, Eq, Debug)]
18pub struct RequestRespawnEvent {
19 pub client: Entity,
20}
21
22#[derive(Event, Copy, Clone, PartialEq, Eq, Debug)]
23pub struct RequestStatsEvent {
24 pub client: Entity,
25}
26
27fn handle_status(
28 mut packets: EventReader<PacketEvent>,
29 mut respawn_events: EventWriter<RequestRespawnEvent>,
30 mut request_stats_events: EventWriter<RequestStatsEvent>,
31) {
32 for packet in packets.read() {
33 if let Some(pkt) = packet.decode::<ClientStatusC2s>() {
34 match pkt {
35 ClientStatusC2s::PerformRespawn => {
36 respawn_events.send(RequestRespawnEvent {
37 client: packet.client,
38 });
39 }
40 ClientStatusC2s::RequestStats => {
41 request_stats_events.send(RequestStatsEvent {
42 client: packet.client,
43 });
44 }
45 }
46 }
47 }
48}