diff options
Diffstat (limited to 'azalea-protocol/src/mc_buf')
| -rwxr-xr-x | azalea-protocol/src/mc_buf/read.rs | 57 | ||||
| -rwxr-xr-x | azalea-protocol/src/mc_buf/write.rs | 37 |
2 files changed, 59 insertions, 35 deletions
diff --git a/azalea-protocol/src/mc_buf/read.rs b/azalea-protocol/src/mc_buf/read.rs index b345aac9..53c137b3 100755 --- a/azalea-protocol/src/mc_buf/read.rs +++ b/azalea-protocol/src/mc_buf/read.rs @@ -2,7 +2,7 @@ use async_trait::async_trait; use azalea_chat::component::Component; use azalea_core::{ difficulty::Difficulty, game_type::GameType, resource_location::ResourceLocation, - serializable_uuid::SerializableUuid, Slot, SlotData, + serializable_uuid::SerializableUuid, BlockPos, Direction, Slot, SlotData, }; use serde::Deserialize; use tokio::io::{AsyncRead, AsyncReadExt}; @@ -473,29 +473,14 @@ impl McBufReadable for Option<GameType> { // Option<String> #[async_trait] -impl McBufReadable for Option<String> { - async fn read_into<R>(buf: &mut R) -> Result<Self, String> - where - R: AsyncRead + std::marker::Unpin + std::marker::Send, - { - let present = buf.read_boolean().await?; - Ok(if present { - Some(buf.read_utf().await?) - } else { - None - }) - } -} -// Option<Component> -#[async_trait] -impl McBufReadable for Option<Component> { - async fn read_into<R>(buf: &mut R) -> Result<Self, String> +impl<T: McBufReadable> McBufReadable for Option<T> { + default async fn read_into<R>(buf: &mut R) -> Result<Self, String> where R: AsyncRead + std::marker::Unpin + std::marker::Send, { let present = buf.read_boolean().await?; Ok(if present { - Some(Component::read_into(buf).await?) + Some(T::read_into(buf).await?) } else { None }) @@ -567,3 +552,37 @@ impl McBufReadable for Uuid { buf.read_uuid().await } } + +// BlockPos +#[async_trait] +impl McBufReadable for BlockPos { + async fn read_into<R>(buf: &mut R) -> Result<Self, String> + where + R: AsyncRead + std::marker::Unpin + std::marker::Send, + { + let val = u64::read_into(buf).await?; + let x = (val >> 38) as i32; + let y = (val & 0xFFF) as i32; + let z = ((val >> 12) & 0x3FFFFFF) as i32; + Ok(BlockPos { x, y, z }) + } +} + +// Direction +#[async_trait] +impl McBufReadable for Direction { + async fn read_into<R>(buf: &mut R) -> Result<Self, String> + where + R: AsyncRead + std::marker::Unpin + std::marker::Send, + { + match buf.read_varint().await? { + 0 => Ok(Self::Down), + 1 => Ok(Self::Up), + 2 => Ok(Self::North), + 3 => Ok(Self::South), + 4 => Ok(Self::West), + 5 => Ok(Self::East), + _ => Err("Invalid direction".to_string()), + } + } +} diff --git a/azalea-protocol/src/mc_buf/write.rs b/azalea-protocol/src/mc_buf/write.rs index 4c7ac60c..e5437ae8 100755 --- a/azalea-protocol/src/mc_buf/write.rs +++ b/azalea-protocol/src/mc_buf/write.rs @@ -3,7 +3,7 @@ use async_trait::async_trait; use azalea_chat::component::Component; use azalea_core::{ difficulty::Difficulty, game_type::GameType, resource_location::ResourceLocation, - serializable_uuid::SerializableUuid, Slot, + serializable_uuid::SerializableUuid, BlockPos, Direction, Slot, }; use byteorder::{BigEndian, WriteBytesExt}; use std::io::Write; @@ -336,21 +336,8 @@ impl McBufWritable for Option<GameType> { } // Option<String> -impl McBufWritable for Option<String> { - fn write_into(&self, buf: &mut Vec<u8>) -> Result<(), std::io::Error> { - if let Some(s) = self { - buf.write_boolean(true)?; - buf.write_utf(s)?; - } else { - buf.write_boolean(false)?; - }; - Ok(()) - } -} - -// Option<Component> -impl McBufWritable for Option<Component> { - fn write_into(&self, buf: &mut Vec<u8>) -> Result<(), std::io::Error> { +impl<T: McBufWritable> McBufWritable for Option<T> { + default fn write_into(&self, buf: &mut Vec<u8>) -> Result<(), std::io::Error> { if let Some(s) = self { buf.write_boolean(true)?; s.write_into(buf)?; @@ -418,3 +405,21 @@ impl McBufWritable for Uuid { Ok(()) } } + +// BlockPos +impl McBufWritable for BlockPos { + fn write_into(&self, buf: &mut Vec<u8>) -> Result<(), std::io::Error> { + buf.write_long( + (((self.x & 0x3FFFFFF) as i64) << 38) + | (((self.z & 0x3FFFFFF) as i64) << 12) + | ((self.y & 0xFFF) as i64), + ) + } +} + +// Direction +impl McBufWritable for Direction { + fn write_into(&self, buf: &mut Vec<u8>) -> Result<(), std::io::Error> { + buf.write_varint(*self as i32) + } +} |
