aboutsummaryrefslogtreecommitdiff
path: root/azalea-protocol/src/mc_buf/read.rs
diff options
context:
space:
mode:
authormat <github@matdoes.dev>2022-05-01 13:51:59 -0500
committermat <github@matdoes.dev>2022-05-01 13:51:59 -0500
commit9dacd90abcfaa62ade1e4f130ed53da2c9facdbc (patch)
tree68a4956399a6d509a5d8ae790235996a5a24024e /azalea-protocol/src/mc_buf/read.rs
parent4b1cfd1cf899fbbc3de8f72cbb160695c1e9ae70 (diff)
downloadazalea-drasl-9dacd90abcfaa62ade1e4f130ed53da2c9facdbc.tar.xz
clientbound_add_entity_packet & clientbound_set_entity_data_packet
Diffstat (limited to 'azalea-protocol/src/mc_buf/read.rs')
-rwxr-xr-xazalea-protocol/src/mc_buf/read.rs57
1 files changed, 38 insertions, 19 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()),
+ }
+ }
+}