nbt read write

This commit is contained in:
MeexReay 2025-05-03 20:59:48 +03:00
parent ced3cc0a2e
commit ed8524a4d5
2 changed files with 25 additions and 0 deletions

View File

@ -1,3 +1,6 @@
use std::io::Read;
use craftflow_nbt::DynNBT;
use rust_mc_proto::{DataReader, DataWriter, Packet}; use rust_mc_proto::{DataReader, DataWriter, Packet};
use super::ServerError; use super::ServerError;
@ -10,6 +13,26 @@ pub trait ReadWriteNBT<T>: DataReader + DataWriter {
fn write_nbt(&mut self, val: &T) -> Result<(), ServerError>; fn write_nbt(&mut self, val: &T) -> Result<(), ServerError>;
} }
impl ReadWriteNBT<DynNBT> for Packet {
fn read_nbt(&mut self) -> Result<DynNBT, ServerError> {
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 { pub trait ReadWritePosition: DataReader + DataWriter {
fn read_position(&mut self) -> Result<(i64, i64, i64), ServerError>; fn read_position(&mut self) -> Result<(i64, i64, i64), ServerError>;
fn write_position(&mut self, x: i64, y: i64, z: i64) -> Result<(), ServerError>; fn write_position(&mut self, x: i64, y: i64, z: i64) -> Result<(), ServerError>;

View File

@ -22,6 +22,8 @@ pub enum ServerError {
ConnectionClosed, // Соединение закрыто, единственная ошибка которая не логируется у handle_connection ConnectionClosed, // Соединение закрыто, единственная ошибка которая не логируется у handle_connection
SerTextComponent, // Ошибка при сериализации текст-компонента SerTextComponent, // Ошибка при сериализации текст-компонента
DeTextComponent, // Ошибка при десериализации текст-компонента DeTextComponent, // Ошибка при десериализации текст-компонента
SerNbt, // Ошибка при сериализации nbt
DeNbt, // Ошибка при десериализации nbt
UnexpectedState, // Указывает на то что этот пакет не может быть отправлен в данном режиме (в основном через ProtocolHelper) UnexpectedState, // Указывает на то что этот пакет не может быть отправлен в данном режиме (в основном через ProtocolHelper)
Other(String), // Другая ошибка, либо очень специфичная, либо хз, лучше не использовать и создавать новое поле ошибки Other(String), // Другая ошибка, либо очень специфичная, либо хз, лучше не использовать и создавать новое поле ошибки
} }