aboutsummaryrefslogtreecommitdiff
path: root/azalea-protocol/src/mc_buf
diff options
context:
space:
mode:
Diffstat (limited to 'azalea-protocol/src/mc_buf')
-rwxr-xr-xazalea-protocol/src/mc_buf/mod.rs84
-rwxr-xr-xazalea-protocol/src/mc_buf/read.rs21
-rwxr-xr-xazalea-protocol/src/mc_buf/write.rs33
3 files changed, 125 insertions, 13 deletions
diff --git a/azalea-protocol/src/mc_buf/mod.rs b/azalea-protocol/src/mc_buf/mod.rs
index a924431e..4ecb65d1 100755
--- a/azalea-protocol/src/mc_buf/mod.rs
+++ b/azalea-protocol/src/mc_buf/mod.rs
@@ -20,20 +20,52 @@ mod tests {
#[test]
fn test_write_varint() {
let mut buf = Vec::new();
- buf.write_varint(123456).unwrap();
- assert_eq!(buf, vec![192, 196, 7]);
-
- let mut buf = Vec::new();
buf.write_varint(0).unwrap();
assert_eq!(buf, vec![0]);
+
+ let mut buf = Vec::new();
+ buf.write_varint(1).unwrap();
+ assert_eq!(buf, vec![1]);
+
+ let mut buf = Vec::new();
+ buf.write_varint(2).unwrap();
+ assert_eq!(buf, vec![2]);
+
+ let mut buf = Vec::new();
+ buf.write_varint(127).unwrap();
+ assert_eq!(buf, vec![127]);
+
+ let mut buf = Vec::new();
+ buf.write_varint(128).unwrap();
+ assert_eq!(buf, vec![128, 1]);
+
+ let mut buf = Vec::new();
+ buf.write_varint(255).unwrap();
+ assert_eq!(buf, vec![255, 1]);
+
+ let mut buf = Vec::new();
+ buf.write_varint(25565).unwrap();
+ assert_eq!(buf, vec![221, 199, 1]);
+
+ let mut buf = Vec::new();
+ buf.write_varint(2097151).unwrap();
+ assert_eq!(buf, vec![255, 255, 127]);
+
+ let mut buf = Vec::new();
+ buf.write_varint(2147483647).unwrap();
+ assert_eq!(buf, vec![255, 255, 255, 255, 7]);
+
+ let mut buf = Vec::new();
+ buf.write_varint(-1).unwrap();
+ assert_eq!(buf, vec![255, 255, 255, 255, 15]);
+
+ let mut buf = Vec::new();
+ buf.write_varint(-2147483648).unwrap();
+ assert_eq!(buf, vec![128, 128, 128, 128, 8]);
}
#[tokio::test]
async fn test_read_varint() {
- let mut buf = BufReader::new(Cursor::new(vec![192, 196, 7]));
- assert_eq!(buf.read_varint().await.unwrap(), 123456);
- assert_eq!(buf.get_varint_size(123456), 3);
-
let mut buf = BufReader::new(Cursor::new(vec![0]));
assert_eq!(buf.read_varint().await.unwrap(), 0);
assert_eq!(buf.get_varint_size(0), 1);
@@ -41,6 +73,42 @@ mod tests {
let mut buf = BufReader::new(Cursor::new(vec![1]));
assert_eq!(buf.read_varint().await.unwrap(), 1);
assert_eq!(buf.get_varint_size(1), 1);
+
+ let mut buf = BufReader::new(Cursor::new(vec![2]));
+ assert_eq!(buf.read_varint().await.unwrap(), 2);
+ assert_eq!(buf.get_varint_size(2), 1);
+
+ let mut buf = BufReader::new(Cursor::new(vec![127]));
+ assert_eq!(buf.read_varint().await.unwrap(), 127);
+ assert_eq!(buf.get_varint_size(127), 1);
+
+ let mut buf = BufReader::new(Cursor::new(vec![128, 1]));
+ assert_eq!(buf.read_varint().await.unwrap(), 128);
+ assert_eq!(buf.get_varint_size(128), 2);
+
+ let mut buf = BufReader::new(Cursor::new(vec![255, 1]));
+ assert_eq!(buf.read_varint().await.unwrap(), 255);
+ assert_eq!(buf.get_varint_size(255), 2);
+
+ let mut buf = BufReader::new(Cursor::new(vec![221, 199, 1]));
+ assert_eq!(buf.read_varint().await.unwrap(), 25565);
+ assert_eq!(buf.get_varint_size(25565), 3);
+
+ let mut buf = BufReader::new(Cursor::new(vec![255, 255, 127]));
+ assert_eq!(buf.read_varint().await.unwrap(), 2097151);
+ assert_eq!(buf.get_varint_size(2097151), 3);
+
+ let mut buf = BufReader::new(Cursor::new(vec![255, 255, 255, 255, 7]));
+ assert_eq!(buf.read_varint().await.unwrap(), 2147483647);
+ assert_eq!(buf.get_varint_size(2147483647), 5);
+
+ let mut buf = BufReader::new(Cursor::new(vec![255, 255, 255, 255, 15]));
+ assert_eq!(buf.read_varint().await.unwrap(), -1);
+ assert_eq!(buf.get_varint_size(-1), 5);
+
+ let mut buf = BufReader::new(Cursor::new(vec![128, 128, 128, 128, 8]));
+ assert_eq!(buf.read_varint().await.unwrap(), -2147483648);
+ assert_eq!(buf.get_varint_size(-2147483648), 5);
}
#[tokio::test]
diff --git a/azalea-protocol/src/mc_buf/read.rs b/azalea-protocol/src/mc_buf/read.rs
index e036643e..1e031916 100755
--- a/azalea-protocol/src/mc_buf/read.rs
+++ b/azalea-protocol/src/mc_buf/read.rs
@@ -1,7 +1,9 @@
use async_trait::async_trait;
+use azalea_chat::component::Component;
use azalea_core::{
difficulty::Difficulty, game_type::GameType, resource_location::ResourceLocation,
};
+use serde::Deserialize;
use tokio::io::{AsyncRead, AsyncReadExt};
use super::MAX_STRING_LENGTH;
@@ -41,12 +43,12 @@ where
Ok(list)
}
- // fast varints stolen from https://github.com/luojia65/mc-varint/blob/master/src/lib.rs#L67
+ // fast varints modified from https://github.com/luojia65/mc-varint/blob/master/src/lib.rs#L67
/// Read a single varint from the reader and return the value, along with the number of bytes read
async fn read_varint(&mut self) -> Result<i32, String> {
let mut buffer = [0];
let mut ans = 0;
- for i in 0..4 {
+ for i in 0..5 {
self.read_exact(&mut buffer)
.await
.map_err(|_| "Invalid VarInt".to_string())?;
@@ -440,3 +442,18 @@ impl McBufReadable for Difficulty {
Ok(Difficulty::by_id(u8::read_into(buf).await?))
}
}
+
+// Component
+#[async_trait]
+impl McBufReadable for Component {
+ async fn read_into<R>(buf: &mut R) -> Result<Self, String>
+ where
+ R: AsyncRead + std::marker::Unpin + std::marker::Send,
+ {
+ let string = buf.read_utf().await?;
+ let json: serde_json::Value = serde_json::from_str(string.as_str())
+ .map_err(|e| "Component isn't valid JSON".to_string())?;
+ let component = Component::deserialize(json).map_err(|e| e.to_string())?;
+ Ok(component)
+ }
+}
diff --git a/azalea-protocol/src/mc_buf/write.rs b/azalea-protocol/src/mc_buf/write.rs
index 9330dccb..05f613d8 100755
--- a/azalea-protocol/src/mc_buf/write.rs
+++ b/azalea-protocol/src/mc_buf/write.rs
@@ -1,4 +1,5 @@
use async_trait::async_trait;
+use azalea_chat::component::Component;
use azalea_core::{
difficulty::Difficulty, game_type::GameType, resource_location::ResourceLocation,
};
@@ -209,7 +210,7 @@ impl McBufWritable for ResourceLocation {
// u32
impl McBufWritable for u32 {
fn write_into(&self, buf: &mut Vec<u8>) -> Result<(), std::io::Error> {
- i32::varint_write_into(&(*self as i32), buf)
+ i16::write_into(&(*self as i16), buf)
}
}
@@ -223,7 +224,7 @@ impl McBufVarintWritable for u32 {
// u16
impl McBufWritable for u16 {
fn write_into(&self, buf: &mut Vec<u8>) -> Result<(), std::io::Error> {
- i32::varint_write_into(&(*self as i32), buf)
+ i16::write_into(&(*self as i16), buf)
}
}
@@ -241,6 +242,13 @@ impl McBufWritable for u8 {
}
}
+// i16
+impl McBufWritable for i16 {
+ fn write_into(&self, buf: &mut Vec<u8>) -> Result<(), std::io::Error> {
+ Writable::write_short(buf, *self)
+ }
+}
+
// i64
impl McBufWritable for i64 {
fn write_into(&self, buf: &mut Vec<u8>) -> Result<(), std::io::Error> {
@@ -269,7 +277,7 @@ impl McBufWritable for i8 {
}
}
-// i8
+// f32
impl McBufWritable for f32 {
fn write_into(&self, buf: &mut Vec<u8>) -> Result<(), std::io::Error> {
buf.write_float(*self)
@@ -312,3 +320,22 @@ impl McBufWritable for Difficulty {
u8::write_into(&self.id(), buf)
}
}
+
+// Component
+#[async_trait]
+impl McBufWritable for Component {
+ // async fn read_into<R>(buf: &mut R) -> Result<Self, String>
+ // where
+ // R: AsyncRead + std::marker::Unpin + std::marker::Send,
+ // {
+ // let string = buf.read_utf().await?;
+ // let json: serde_json::Value = serde_json::from_str(string.as_str())
+ // .map_err(|e| "Component isn't valid JSON".to_string())?;
+ // let component = Component::deserialize(json).map_err(|e| e.to_string())?;
+ // Ok(component)
+ // }
+ fn write_into(&self, buf: &mut Vec<u8>) -> Result<(), std::io::Error> {
+ // component doesn't have serialize implemented yet
+ todo!()
+ }
+}