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}