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 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>;
|
||||||
|
@ -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), // Другая ошибка, либо очень специфичная, либо хз, лучше не использовать и создавать новое поле ошибки
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user