aboutsummaryrefslogtreecommitdiff
path: root/azalea-protocol/src/mc_buf
diff options
context:
space:
mode:
authormat <github@matdoes.dev>2022-05-07 11:58:00 -0500
committermat <github@matdoes.dev>2022-05-07 11:58:00 -0500
commitb9c31efc0161457771861e6858a4a4da0b6a2727 (patch)
tree5ce24cf6e79f8fb640b4213bc60597f89b2f0bae /azalea-protocol/src/mc_buf
parent79bf5771303c70115cba09ac55c7b7a2d3e32091 (diff)
downloadazalea-drasl-b9c31efc0161457771861e6858a4a4da0b6a2727.tar.xz
Initialize worldborder packet
Also add varlong and replace #[varint] with #[var]
Diffstat (limited to 'azalea-protocol/src/mc_buf')
-rwxr-xr-xazalea-protocol/src/mc_buf/mod.rs4
-rwxr-xr-xazalea-protocol/src/mc_buf/read.rs38
-rwxr-xr-xazalea-protocol/src/mc_buf/write.rs43
3 files changed, 65 insertions, 20 deletions
diff --git a/azalea-protocol/src/mc_buf/mod.rs b/azalea-protocol/src/mc_buf/mod.rs
index a82334fb..1626d163 100755
--- a/azalea-protocol/src/mc_buf/mod.rs
+++ b/azalea-protocol/src/mc_buf/mod.rs
@@ -4,9 +4,9 @@ mod read;
mod write;
use packet_macros::{McBufReadable, McBufWritable};
-pub use read::{read_varint_async, McBufReadable, McBufVarintReadable, Readable};
+pub use read::{read_varint_async, McBufReadable, McBufVarReadable, Readable};
use std::ops::Deref;
-pub use write::{McBufVarintWritable, McBufWritable, Writable};
+pub use write::{McBufVarWritable, McBufWritable, Writable};
// const DEFAULT_NBT_QUOTA: u32 = 2097152;
const MAX_STRING_LENGTH: u16 = 32767;
diff --git a/azalea-protocol/src/mc_buf/read.rs b/azalea-protocol/src/mc_buf/read.rs
index 68c9cb3f..72b99222 100755
--- a/azalea-protocol/src/mc_buf/read.rs
+++ b/azalea-protocol/src/mc_buf/read.rs
@@ -236,11 +236,11 @@ where
fn read_into(buf: &mut impl Read) -> Result<Self, String>;
}
-pub trait McBufVarintReadable
+pub trait McBufVarReadable
where
Self: Sized,
{
- fn varint_read_into(buf: &mut impl Read) -> Result<Self, String>;
+ fn var_read_into(buf: &mut impl Read) -> Result<Self, String>;
}
impl McBufReadable for i32 {
@@ -249,12 +249,34 @@ impl McBufReadable for i32 {
}
}
-impl McBufVarintReadable for i32 {
- fn varint_read_into(buf: &mut impl Read) -> Result<Self, String> {
+impl McBufVarReadable for i32 {
+ fn var_read_into(buf: &mut impl Read) -> Result<Self, String> {
buf.read_varint()
}
}
+impl McBufVarReadable for i64 {
+ // fast varints modified from https://github.com/luojia65/mc-varint/blob/master/src/lib.rs#L54
+ fn var_read_into(buf: &mut impl Read) -> Result<Self, String> {
+ let mut buffer = [0];
+ let mut ans = 0;
+ for i in 0..8 {
+ buf.read_exact(&mut buffer)
+ .map_err(|_| "Invalid VarLong".to_string())?;
+ ans |= ((buffer[0] & 0b0111_1111) as i64) << 7 * i;
+ if buffer[0] & 0b1000_0000 == 0 {
+ break;
+ }
+ }
+ Ok(ans)
+ }
+}
+impl McBufVarReadable for u64 {
+ fn var_read_into(buf: &mut impl Read) -> Result<Self, String> {
+ i64::var_read_into(buf).map(|i| i as u64)
+ }
+}
+
impl McBufReadable for UnsizedByteArray {
fn read_into(buf: &mut impl Read) -> Result<Self, String> {
Ok(UnsizedByteArray(buf.read_bytes()?))
@@ -300,8 +322,8 @@ impl McBufReadable for u32 {
}
// u32 varint
-impl McBufVarintReadable for u32 {
- fn varint_read_into(buf: &mut impl Read) -> Result<Self, String> {
+impl McBufVarReadable for u32 {
+ fn var_read_into(buf: &mut impl Read) -> Result<Self, String> {
buf.read_varint().map(|i| i as u32)
}
}
@@ -321,8 +343,8 @@ impl McBufReadable for i16 {
}
// u16 varint
-impl McBufVarintReadable for u16 {
- fn varint_read_into(buf: &mut impl Read) -> Result<Self, String> {
+impl McBufVarReadable for u16 {
+ fn var_read_into(buf: &mut impl Read) -> Result<Self, String> {
buf.read_varint().map(|i| i as u16)
}
}
diff --git a/azalea-protocol/src/mc_buf/write.rs b/azalea-protocol/src/mc_buf/write.rs
index c125bf0b..10271bf8 100755
--- a/azalea-protocol/src/mc_buf/write.rs
+++ b/azalea-protocol/src/mc_buf/write.rs
@@ -146,8 +146,8 @@ pub trait McBufWritable {
fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error>;
}
-pub trait McBufVarintWritable {
- fn varint_write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error>;
+pub trait McBufVarWritable {
+ fn var_write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error>;
}
impl McBufWritable for i32 {
@@ -156,8 +156,8 @@ impl McBufWritable for i32 {
}
}
-impl McBufVarintWritable for i32 {
- fn varint_write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+impl McBufVarWritable for i32 {
+ fn var_write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
buf.write_varint(*self)
}
}
@@ -202,9 +202,32 @@ impl McBufWritable for u32 {
}
// u32 varint
-impl McBufVarintWritable for u32 {
- fn varint_write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
- i32::varint_write_into(&(*self as i32), buf)
+impl McBufVarWritable for u32 {
+ fn var_write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+ i32::var_write_into(&(*self as i32), buf)
+ }
+}
+
+impl McBufVarWritable for i64 {
+ fn var_write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+ let mut buffer = [0];
+ let mut cnt = 0;
+ let mut value = *self;
+ while value != 0 {
+ buffer[0] = (value & 0b0111_1111) as u8;
+ value = (value >> 7) & (i64::max_value() >> 6);
+ if value != 0 {
+ buffer[0] |= 0b1000_0000;
+ }
+ cnt += buf.write(&mut buffer)?;
+ }
+ Ok(())
+ }
+}
+
+impl McBufVarWritable for u64 {
+ fn var_write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+ i64::var_write_into(&(*self as i64), buf)
}
}
@@ -216,9 +239,9 @@ impl McBufWritable for u16 {
}
// u16 varint
-impl McBufVarintWritable for u16 {
- fn varint_write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
- i32::varint_write_into(&(*self as i32), buf)
+impl McBufVarWritable for u16 {
+ fn var_write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
+ i32::var_write_into(&(*self as i32), buf)
}
}