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}