nbt read write
This commit is contained in:
parent
ced3cc0a2e
commit
ed8524a4d5
@ -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<T>: DataReader + DataWriter {
|
||||
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 {
|
||||
fn read_position(&mut self) -> Result<(i64, i64, i64), ServerError>;
|
||||
fn write_position(&mut self, x: i64, y: i64, z: i64) -> Result<(), ServerError>;
|
||||
|
@ -22,6 +22,8 @@ pub enum ServerError {
|
||||
ConnectionClosed, // Соединение закрыто, единственная ошибка которая не логируется у handle_connection
|
||||
SerTextComponent, // Ошибка при сериализации текст-компонента
|
||||
DeTextComponent, // Ошибка при десериализации текст-компонента
|
||||
SerNbt, // Ошибка при сериализации nbt
|
||||
DeNbt, // Ошибка при десериализации nbt
|
||||
UnexpectedState, // Указывает на то что этот пакет не может быть отправлен в данном режиме (в основном через ProtocolHelper)
|
||||
Other(String), // Другая ошибка, либо очень специфичная, либо хз, лучше не использовать и создавать новое поле ошибки
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user