diff --git a/src/server/data/mod.rs b/src/server/data/mod.rs index a57ef54..3fccec6 100644 --- a/src/server/data/mod.rs +++ b/src/server/data/mod.rs @@ -1,3 +1,6 @@ +use std::io::Read; + +use craftflow_nbt::DynNBT; use rust_mc_proto::{DataReader, DataWriter, Packet}; use super::ServerError; @@ -10,6 +13,26 @@ pub trait ReadWriteNBT: DataReader + DataWriter { fn write_nbt(&mut self, val: &T) -> Result<(), ServerError>; } +impl ReadWriteNBT for Packet { + fn read_nbt(&mut self) -> Result { + let mut data = Vec::new(); + let pos = self.get_ref().position(); + self.get_mut() + .read_to_end(&mut data) + .map_err(|_| ServerError::DeNbt)?; + let (remaining, value) = + craftflow_nbt::from_slice(&data).map_err(|_| ServerError::DeNbt)?; + self.get_mut() + .set_position(pos + (data.len() - remaining.len()) as u64); + Ok(value) + } + + fn write_nbt(&mut self, val: &DynNBT) -> Result<(), ServerError> { + craftflow_nbt::to_writer(self.get_mut(), val).map_err(|_| ServerError::SerNbt)?; + Ok(()) + } +} + pub trait ReadWritePosition: DataReader + DataWriter { fn read_position(&mut self) -> Result<(i64, i64, i64), ServerError>; fn write_position(&mut self, x: i64, y: i64, z: i64) -> Result<(), ServerError>; diff --git a/src/server/mod.rs b/src/server/mod.rs index 8a27de6..4fd5170 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -22,6 +22,8 @@ pub enum ServerError { ConnectionClosed, // Соединение закрыто, единственная ошибка которая не логируется у handle_connection SerTextComponent, // Ошибка при сериализации текст-компонента DeTextComponent, // Ошибка при десериализации текст-компонента + SerNbt, // Ошибка при сериализации nbt + DeNbt, // Ошибка при десериализации nbt UnexpectedState, // Указывает на то что этот пакет не может быть отправлен в данном режиме (в основном через ProtocolHelper) Other(String), // Другая ошибка, либо очень специфичная, либо хз, лучше не использовать и создавать новое поле ошибки }