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}