valence_server/
custom_payload.rs

1use bevy_app::prelude::*;
2use bevy_ecs::prelude::*;
3use valence_protocol::packets::play::{CustomPayloadC2s, CustomPayloadS2c};
4use valence_protocol::{Bounded, Ident, WritePacket};
5
6use crate::client::Client;
7use crate::event_loop::{EventLoopPreUpdate, PacketEvent};
8
9pub struct CustomPayloadPlugin;
10
11impl Plugin for CustomPayloadPlugin {
12    fn build(&self, app: &mut App) {
13        app.add_event::<CustomPayloadEvent>()
14            .add_systems(EventLoopPreUpdate, handle_custom_payload);
15    }
16}
17
18#[derive(Event, Clone, Debug)]
19pub struct CustomPayloadEvent {
20    pub client: Entity,
21    pub channel: Ident<String>,
22    pub data: Box<[u8]>,
23}
24
25impl Client {
26    pub fn send_custom_payload(&mut self, channel: Ident<&str>, data: &[u8]) {
27        self.write_packet(&CustomPayloadS2c {
28            channel: channel.into(),
29            data: Bounded(data.into()),
30        });
31    }
32}
33
34fn handle_custom_payload(
35    mut packets: EventReader<PacketEvent>,
36    mut events: EventWriter<CustomPayloadEvent>,
37) {
38    for packet in packets.read() {
39        if let Some(pkt) = packet.decode::<CustomPayloadC2s>() {
40            events.send(CustomPayloadEvent {
41                client: packet.client,
42                channel: pkt.channel.into(),
43                data: pkt.data.0 .0.into(),
44            });
45        }
46    }
47}