valence_advancement/
event.rs

1use bevy_ecs::prelude::*;
2use valence_server::event_loop::PacketEvent;
3use valence_server::protocol::packets::play::AdvancementTabC2s;
4use valence_server::Ident;
5
6/// This event sends when the client changes or closes advancement's tab.
7#[derive(Event, Clone, PartialEq, Eq, Debug)]
8pub struct AdvancementTabChangeEvent {
9    pub client: Entity,
10    /// If None then the client has closed advancement's tabs.
11    pub opened_tab: Option<Ident<String>>,
12}
13
14pub(crate) fn handle_advancement_tab_change(
15    mut packets: EventReader<PacketEvent>,
16    mut advancement_tab_change_events: EventWriter<AdvancementTabChangeEvent>,
17) {
18    for packet in packets.read() {
19        if let Some(pkt) = packet.decode::<AdvancementTabC2s>() {
20            advancement_tab_change_events.send(AdvancementTabChangeEvent {
21                client: packet.client,
22                opened_tab: match pkt {
23                    AdvancementTabC2s::ClosedScreen => None,
24                    AdvancementTabC2s::OpenedTab { tab_id } => Some(tab_id.into()),
25                },
26            });
27        }
28    }
29}