48 lines
1.3 KiB
Rust
48 lines
1.3 KiB
Rust
use bytes::BufMut;
|
|
use pumpkin_data::packet::clientbound::CONFIG_REGISTRY_DATA;
|
|
use pumpkin_macros::client_packet;
|
|
use serde::Serialize;
|
|
|
|
use crate::{ClientPacket, bytebuf::ByteBufMut, codec::identifier::Identifier};
|
|
|
|
#[client_packet(CONFIG_REGISTRY_DATA)]
|
|
pub struct CRegistryData<'a> {
|
|
registry_id: &'a Identifier,
|
|
entries: &'a [RegistryEntry],
|
|
}
|
|
|
|
impl<'a> CRegistryData<'a> {
|
|
pub fn new(registry_id: &'a Identifier, entries: &'a [RegistryEntry]) -> Self {
|
|
Self {
|
|
registry_id,
|
|
entries,
|
|
}
|
|
}
|
|
}
|
|
|
|
pub struct RegistryEntry {
|
|
pub entry_id: Identifier,
|
|
pub data: Option<Box<[u8]>>,
|
|
}
|
|
|
|
impl RegistryEntry {
|
|
pub fn from_nbt(name: &str, nbt: &impl Serialize) -> Self {
|
|
let mut data_buf = Vec::new();
|
|
pumpkin_nbt::serializer::to_bytes_unnamed(nbt, &mut data_buf).unwrap();
|
|
RegistryEntry {
|
|
entry_id: Identifier::vanilla(name),
|
|
data: Some(data_buf.into_boxed_slice()),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl ClientPacket for CRegistryData<'_> {
|
|
fn write(&self, bytebuf: &mut impl BufMut) {
|
|
bytebuf.put_identifier(self.registry_id);
|
|
bytebuf.put_list::<RegistryEntry>(self.entries, |p, v| {
|
|
p.put_identifier(&v.entry_id);
|
|
p.put_option(&v.data, |p, v| p.put_slice(v));
|
|
});
|
|
}
|
|
}
|