diff --git a/pumpkin-protocol/src/client/play/entity_metadata.rs b/pumpkin-protocol/src/client/play/entity_metadata.rs index e77ca516a..aac619260 100644 --- a/pumpkin-protocol/src/client/play/entity_metadata.rs +++ b/pumpkin-protocol/src/client/play/entity_metadata.rs @@ -6,23 +6,21 @@ use crate::VarInt; #[derive(Serialize)] #[packet(PLAY_SET_ENTITY_DATA)] -pub struct CSetEntityMetadata { +pub struct CSetEntityMetadata { entity_id: VarInt, - metadata: Metadata, - end: u8, + metadata: Vec, } -impl CSetEntityMetadata { - pub fn new(entity_id: VarInt, metadata: Metadata) -> Self { +impl CSetEntityMetadata { + pub fn new(entity_id: VarInt, metadata: Vec) -> Self { Self { entity_id, metadata, - end: 255, } } } -#[derive(Serialize)] +#[derive(Serialize, Clone)] pub struct Metadata { index: u8, typ: VarInt, diff --git a/pumpkin/src/entity/item.rs b/pumpkin/src/entity/item.rs index 47ffefcf1..e4751726f 100644 --- a/pumpkin/src/entity/item.rs +++ b/pumpkin/src/entity/item.rs @@ -33,7 +33,7 @@ impl ItemEntity { pub async fn send_meta_packet(&self) { let slot = Slot::from(&self.item); self.entity - .send_meta_data(Metadata::new(8, MetaDataType::ItemStack, &slot)) + .send_meta_data(&[Metadata::new(8, MetaDataType::ItemStack, &slot)]) .await; } } diff --git a/pumpkin/src/entity/living.rs b/pumpkin/src/entity/living.rs index 1f19e2959..c02b91456 100644 --- a/pumpkin/src/entity/living.rs +++ b/pumpkin/src/entity/living.rs @@ -90,7 +90,7 @@ impl LivingEntity { self.health.store(health); // tell everyone entities health changed self.entity - .send_meta_data(Metadata::new(9, MetaDataType::Float, health)) + .send_meta_data(&[Metadata::new(9, MetaDataType::Float, health)]) .await; } diff --git a/pumpkin/src/entity/mod.rs b/pumpkin/src/entity/mod.rs index 559eb37de..8d1b8ee4f 100644 --- a/pumpkin/src/entity/mod.rs +++ b/pumpkin/src/entity/mod.rs @@ -1,5 +1,6 @@ use crate::server::Server; use async_trait::async_trait; +use bytes::{BufMut, BytesMut}; use core::f32; use crossbeam::atomic::AtomicCell; use living::LivingEntity; @@ -11,6 +12,7 @@ use pumpkin_data::{ }; use pumpkin_nbt::{compound::NbtCompound, tag::NbtTag}; use pumpkin_protocol::{ + bytebuf::serializer::Serializer, client::play::{ CEntityVelocity, CHeadRot, CSetEntityMetadata, CSpawnEntity, CTeleportEntity, CUpdateEntityRot, MetaDataType, Metadata, @@ -355,7 +357,7 @@ impl Entity { } else { b &= !(1 << index); } - self.send_meta_data(Metadata::new(0, MetaDataType::Byte, b)) + self.send_meta_data(&[Metadata::new(0, MetaDataType::Byte, b)]) .await; } @@ -368,21 +370,29 @@ impl Entity { .await; } - pub async fn send_meta_data(&self, meta: Metadata) + pub async fn send_meta_data(&self, meta: &[Metadata]) where T: Serialize, { + let mut buf = Vec::new(); + for meta in meta { + let serializer_buf = BytesMut::new(); + let mut serializer = Serializer::new(serializer_buf); + meta.serialize(&mut serializer).unwrap(); + buf.put(serializer.output); + } + buf.put_u8(255); self.world .read() .await - .broadcast_packet_all(&CSetEntityMetadata::new(self.entity_id.into(), meta)) + .broadcast_packet_all(&CSetEntityMetadata::new(self.entity_id.into(), buf)) .await; } pub async fn set_pose(&self, pose: EntityPose) { self.pose.store(pose); let pose = pose as i32; - self.send_meta_data(Metadata::new(6, MetaDataType::EntityPose, VarInt(pose))) + self.send_meta_data(&[Metadata::new(6, MetaDataType::EntityPose, VarInt(pose))]) .await; } diff --git a/pumpkin/src/entity/player.rs b/pumpkin/src/entity/player.rs index a2d4ff023..92357885e 100644 --- a/pumpkin/src/entity/player.rs +++ b/pumpkin/src/entity/player.rs @@ -931,15 +931,10 @@ impl Player { let config = self.config.lock().await; self.living_entity .entity - .send_meta_data(Metadata::new(17, MetaDataType::Byte, config.skin_parts)) - .await; - self.living_entity - .entity - .send_meta_data(Metadata::new( - 18, - MetaDataType::Byte, - config.main_hand as u8, - )) + .send_meta_data(&[ + Metadata::new(17, MetaDataType::Byte, config.skin_parts), + Metadata::new(18, MetaDataType::Byte, config.main_hand as u8), + ]) .await; } diff --git a/pumpkin/src/entity/tnt.rs b/pumpkin/src/entity/tnt.rs index 88e77e5a1..09a7eeab0 100644 --- a/pumpkin/src/entity/tnt.rs +++ b/pumpkin/src/entity/tnt.rs @@ -32,18 +32,18 @@ impl TNTEntity { .await; // We can merge multiple data into one meta packet self.entity - .send_meta_data(Metadata::new( - 8, - MetaDataType::Integer, - VarInt(self.fuse.load(std::sync::atomic::Ordering::Relaxed) as i32), - )) - .await; - self.entity - .send_meta_data(Metadata::new( - 9, - MetaDataType::BlockState, - VarInt(i32::from(block_state!("tnt").state_id)), - )) + .send_meta_data(&[ + Metadata::new( + 8, + MetaDataType::Integer, + VarInt(self.fuse.load(std::sync::atomic::Ordering::Relaxed) as i32), + ), + Metadata::new( + 9, + MetaDataType::BlockState, + VarInt(i32::from(block_state!("tnt").state_id)), + ), + ]) .await; } }