diff options
| author | mat <github@matdoes.dev> | 2022-05-07 11:58:00 -0500 |
|---|---|---|
| committer | mat <github@matdoes.dev> | 2022-05-07 11:58:00 -0500 |
| commit | b9c31efc0161457771861e6858a4a4da0b6a2727 (patch) | |
| tree | 5ce24cf6e79f8fb640b4213bc60597f89b2f0bae /azalea-protocol/src/mc_buf | |
| parent | 79bf5771303c70115cba09ac55c7b7a2d3e32091 (diff) | |
| download | azalea-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-x | azalea-protocol/src/mc_buf/mod.rs | 4 | ||||
| -rwxr-xr-x | azalea-protocol/src/mc_buf/read.rs | 38 | ||||
| -rwxr-xr-x | azalea-protocol/src/mc_buf/write.rs | 43 |
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) } } |
