valence_server/
interact_item.rs

1use bevy_app::prelude::*;
2use bevy_ecs::prelude::*;
3use valence_protocol::packets::play::PlayerInteractItemC2s;
4use valence_protocol::Hand;
5
6use crate::action::ActionSequence;
7use crate::event_loop::{EventLoopPreUpdate, PacketEvent};
8
9pub struct InteractItemPlugin;
10
11impl Plugin for InteractItemPlugin {
12    fn build(&self, app: &mut App) {
13        app.add_event::<InteractItemEvent>()
14            .add_systems(EventLoopPreUpdate, handle_player_interact_item);
15    }
16}
17
18#[derive(Event, Copy, Clone, Debug)]
19pub struct InteractItemEvent {
20    pub client: Entity,
21    pub hand: Hand,
22    pub sequence: i32,
23}
24
25fn handle_player_interact_item(
26    mut packets: EventReader<PacketEvent>,
27    mut clients: Query<&mut ActionSequence>,
28    mut events: EventWriter<InteractItemEvent>,
29) {
30    for packet in packets.read() {
31        if let Some(pkt) = packet.decode::<PlayerInteractItemC2s>() {
32            if let Ok(mut action_seq) = clients.get_mut(packet.client) {
33                action_seq.update(pkt.sequence.0);
34            }
35
36            events.send(InteractItemEvent {
37                client: packet.client,
38                hand: pkt.hand,
39                sequence: pkt.sequence.0,
40            });
41        }
42    }
43}