aboutsummaryrefslogtreecommitdiff
path: root/azalea-buf/src/read.rs
diff options
context:
space:
mode:
authormat <27899617+mat-1@users.noreply.github.com>2024-11-27 19:31:40 -0600
committerGitHub <noreply@github.com>2024-11-27 19:31:40 -0600
commit08958c2278b15ebeac8a964f392ebb792e479b61 (patch)
tree4ae3664cea38d7fd1a8f1e95ed06fac04ffe519e /azalea-buf/src/read.rs
parent139d77d3c2b0922fba5e9d4fa2bd9819d78bd773 (diff)
downloadazalea-drasl-08958c2278b15ebeac8a964f392ebb792e479b61.tar.xz
Refactor azalea-protocol (#190)
* start updating to 1.21.4 * fix block codegen and stop using block data from burger * rename packet related modules and structs to be simpler * ItemSlot -> ItemStack for more consistency with mojmap * .get() -> .into_packet() * simplify declare_state_packets by removing packet ids * rename read_from and write_into to azalea_read and azalea_write * rename McBufReadable and McBufWritable to AzaleaRead and AzaleaWrite * McBuf -> AzBuf * remove most uses of into_variant * update codegen and use resourcelocation names for packets * implement #[limit(i)] attribute for AzBuf derive macro * fixes for 1.21.4 * fix examples * update some physics code and fix ChatType * remove unused imports in codegen * re-add some things to migrate.py and update +mc version numbers automatically * downgrade to 1.21.3 lol
Diffstat (limited to 'azalea-buf/src/read.rs')
-rwxr-xr-xazalea-buf/src/read.rs195
1 files changed, 104 insertions, 91 deletions
diff --git a/azalea-buf/src/read.rs b/azalea-buf/src/read.rs
index 8e406acb..4353539a 100755
--- a/azalea-buf/src/read.rs
+++ b/azalea-buf/src/read.rs
@@ -81,7 +81,7 @@ fn read_bytes<'a>(buf: &'a mut Cursor<&[u8]>, length: usize) -> Result<&'a [u8],
}
fn read_utf_with_len(buf: &mut Cursor<&[u8]>, max_length: u32) -> Result<String, BufReadError> {
- let length = u32::var_read_from(buf)?;
+ let length = u32::azalea_read_var(buf)?;
// i don't know why it's multiplied by 4 but it's like that in mojang's code so
if length > max_length * 4 {
return Err(BufReadError::StringLengthTooLong {
@@ -105,30 +105,40 @@ fn read_utf_with_len(buf: &mut Cursor<&[u8]>, max_length: u32) -> Result<String,
Ok(string)
}
-pub trait McBufReadable
+pub trait AzaleaRead
where
Self: Sized,
{
- fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError>;
+ fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError>;
}
-pub trait McBufVarReadable
+pub trait AzaleaReadVar
where
Self: Sized,
{
- fn var_read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError>;
+ fn azalea_read_var(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError>;
}
-impl McBufReadable for i32 {
- fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+// note that there's no Write equivalent for this trait since we don't really
+// care if we're writing over the limit (and maybe we already know that the
+// server implementation accepts it)
+pub trait AzaleaReadLimited
+where
+ Self: Sized,
+{
+ fn azalea_read_limited(buf: &mut Cursor<&[u8]>, limit: usize) -> Result<Self, BufReadError>;
+}
+
+impl AzaleaRead for i32 {
+ fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
Ok(buf.read_i32::<BE>()?)
}
}
-impl McBufVarReadable for i32 {
+impl AzaleaReadVar for i32 {
// 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
- fn var_read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+ fn azalea_read_var(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
let mut buffer = [0];
let mut ans = 0;
for i in 0..5 {
@@ -142,9 +152,9 @@ impl McBufVarReadable for i32 {
}
}
-impl McBufVarReadable for i64 {
+impl AzaleaReadVar for i64 {
// fast varints modified from https://github.com/luojia65/mc-varint/blob/master/src/lib.rs#L54
- fn var_read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+ fn azalea_read_var(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
let mut buffer = [0];
let mut ans = 0;
for i in 0..10 {
@@ -158,14 +168,14 @@ impl McBufVarReadable for i64 {
Ok(ans)
}
}
-impl McBufVarReadable for u64 {
- fn var_read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
- i64::var_read_from(buf).map(|i| i as u64)
+impl AzaleaReadVar for u64 {
+ fn azalea_read_var(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+ i64::azalea_read_var(buf).map(|i| i as u64)
}
}
-impl McBufReadable for UnsizedByteArray {
- fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl AzaleaRead for UnsizedByteArray {
+ fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
// read to end of the buffer
let data = buf.get_ref()[buf.position() as usize..].to_vec();
buf.set_position((buf.position()) + data.len() as u64);
@@ -173,111 +183,114 @@ impl McBufReadable for UnsizedByteArray {
}
}
-impl<T: McBufReadable + Send> McBufReadable for Vec<T> {
- default fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
- let length = u32::var_read_from(buf)? as usize;
+impl<T: AzaleaRead + Send> AzaleaRead for Vec<T> {
+ default fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+ let length = u32::azalea_read_var(buf)? as usize;
// we limit the capacity to not get exploited into allocating a bunch
let mut contents = Vec::with_capacity(usize::min(length, 65536));
for _ in 0..length {
- contents.push(T::read_from(buf)?);
+ contents.push(T::azalea_read(buf)?);
}
Ok(contents)
}
}
-impl<K: McBufReadable + Send + Eq + Hash, V: McBufReadable + Send> McBufReadable for HashMap<K, V> {
- fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
- let length = i32::var_read_from(buf)? as usize;
+impl<K: AzaleaRead + Send + Eq + Hash, V: AzaleaRead + Send> AzaleaRead for HashMap<K, V> {
+ fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+ let length = i32::azalea_read_var(buf)? as usize;
let mut contents = HashMap::with_capacity(usize::min(length, 65536));
for _ in 0..length {
- contents.insert(K::read_from(buf)?, V::read_from(buf)?);
+ contents.insert(K::azalea_read(buf)?, V::azalea_read(buf)?);
}
Ok(contents)
}
}
-impl<K: McBufReadable + Send + Eq + Hash, V: McBufVarReadable + Send> McBufVarReadable
- for HashMap<K, V>
-{
- fn var_read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
- let length = i32::var_read_from(buf)? as usize;
+impl<K: AzaleaRead + Send + Eq + Hash, V: AzaleaReadVar + Send> AzaleaReadVar for HashMap<K, V> {
+ fn azalea_read_var(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+ let length = i32::azalea_read_var(buf)? as usize;
let mut contents = HashMap::with_capacity(usize::min(length, 65536));
for _ in 0..length {
- contents.insert(K::read_from(buf)?, V::var_read_from(buf)?);
+ contents.insert(K::azalea_read(buf)?, V::azalea_read_var(buf)?);
}
Ok(contents)
}
}
-impl McBufReadable for Vec<u8> {
- fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
- let length = i32::var_read_from(buf)? as usize;
+impl AzaleaRead for Vec<u8> {
+ fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+ let length = i32::azalea_read_var(buf)? as usize;
read_bytes(buf, length).map(|b| b.to_vec())
}
}
-impl McBufReadable for String {
- fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl AzaleaRead for String {
+ fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
read_utf_with_len(buf, MAX_STRING_LENGTH.into())
}
}
+impl AzaleaReadLimited for String {
+ fn azalea_read_limited(buf: &mut Cursor<&[u8]>, limit: usize) -> Result<Self, BufReadError> {
+ read_utf_with_len(buf, limit as u32)
+ }
+}
-impl McBufReadable for u32 {
- fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
- Ok(i32::read_from(buf)? as u32)
+impl AzaleaRead for u32 {
+ fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+ Ok(i32::azalea_read(buf)? as u32)
}
}
-impl McBufVarReadable for u32 {
- fn var_read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
- Ok(i32::var_read_from(buf)? as u32)
+impl AzaleaReadVar for u32 {
+ fn azalea_read_var(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+ Ok(i32::azalea_read_var(buf)? as u32)
}
}
-impl McBufReadable for u16 {
- fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
- i16::read_from(buf).map(|i| i as u16)
+impl AzaleaRead for u16 {
+ fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+ i16::azalea_read(buf).map(|i| i as u16)
}
}
-impl McBufReadable for i16 {
- fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl AzaleaRead for i16 {
+ fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
Ok(buf.read_i16::<BE>()?)
}
}
-impl McBufVarReadable for u16 {
- fn var_read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
- Ok(i32::var_read_from(buf)? as u16)
+impl AzaleaReadVar for u16 {
+ fn azalea_read_var(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+ Ok(i32::azalea_read_var(buf)? as u16)
}
}
-impl<T: McBufVarReadable> McBufVarReadable for Vec<T> {
- fn var_read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
- let length = i32::var_read_from(buf)? as usize;
+impl<T: AzaleaReadVar> AzaleaReadVar for Vec<T> {
+ fn azalea_read_var(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+ let length = i32::azalea_read_var(buf)? as usize;
let mut contents = Vec::with_capacity(usize::min(length, 65536));
for _ in 0..length {
- contents.push(T::var_read_from(buf)?);
+ contents.push(T::azalea_read_var(buf)?);
}
Ok(contents)
}
}
-impl McBufReadable for i64 {
- fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl AzaleaRead for i64 {
+ fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
Ok(buf.read_i64::<BE>()?)
}
}
-impl McBufReadable for u64 {
- fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
- i64::read_from(buf).map(|i| i as u64)
+impl AzaleaRead for u64 {
+ fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+ i64::azalea_read(buf).map(|i| i as u64)
}
}
-impl McBufReadable for bool {
- fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
- let byte = u8::read_from(buf)?;
+impl AzaleaRead for bool {
+ fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+ let byte = u8::azalea_read(buf)?;
if byte > 1 {
warn!("Boolean value was not 0 or 1, but {}", byte);
}
@@ -285,46 +298,46 @@ impl McBufReadable for bool {
}
}
-impl McBufReadable for u8 {
- fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl AzaleaRead for u8 {
+ fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
Ok(buf.read_u8()?)
}
}
-impl McBufReadable for i8 {
- fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
- u8::read_from(buf).map(|i| i as i8)
+impl AzaleaRead for i8 {
+ fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+ u8::azalea_read(buf).map(|i| i as i8)
}
}
-impl McBufReadable for f32 {
- fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl AzaleaRead for f32 {
+ fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
Ok(buf.read_f32::<BE>()?)
}
}
-impl McBufReadable for f64 {
- fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl AzaleaRead for f64 {
+ fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
Ok(buf.read_f64::<BE>()?)
}
}
-impl<T: McBufReadable> McBufReadable for Option<T> {
- fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
- let present = bool::read_from(buf)?;
+impl<T: AzaleaRead> AzaleaRead for Option<T> {
+ fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+ let present = bool::azalea_read(buf)?;
Ok(if present {
- Some(T::read_from(buf)?)
+ Some(T::azalea_read(buf)?)
} else {
None
})
}
}
-impl<T: McBufVarReadable> McBufVarReadable for Option<T> {
- fn var_read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
- let present = bool::read_from(buf)?;
+impl<T: AzaleaReadVar> AzaleaReadVar for Option<T> {
+ fn azalea_read_var(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+ let present = bool::azalea_read(buf)?;
Ok(if present {
- Some(T::var_read_from(buf)?)
+ Some(T::azalea_read_var(buf)?)
} else {
None
})
@@ -332,11 +345,11 @@ impl<T: McBufVarReadable> McBufVarReadable for Option<T> {
}
// [String; 4]
-impl<T: McBufReadable, const N: usize> McBufReadable for [T; N] {
- fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl<T: AzaleaRead, const N: usize> AzaleaRead for [T; N] {
+ fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
let mut contents = Vec::with_capacity(N);
for _ in 0..N {
- contents.push(T::read_from(buf)?);
+ contents.push(T::azalea_read(buf)?);
}
contents.try_into().map_err(|_| {
unreachable!("Panic is not possible since the Vec is the same size as the array")
@@ -344,14 +357,14 @@ impl<T: McBufReadable, const N: usize> McBufReadable for [T; N] {
}
}
-impl McBufReadable for simdnbt::owned::NbtTag {
- fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl AzaleaRead for simdnbt::owned::NbtTag {
+ fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
Ok(simdnbt::owned::read_tag(buf).map_err(simdnbt::Error::from)?)
}
}
-impl McBufReadable for simdnbt::owned::NbtCompound {
- fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl AzaleaRead for simdnbt::owned::NbtCompound {
+ fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
match simdnbt::owned::read_tag(buf).map_err(simdnbt::Error::from)? {
simdnbt::owned::NbtTag::Compound(compound) => Ok(compound),
_ => Err(BufReadError::Custom("Expected compound tag".to_string())),
@@ -359,17 +372,17 @@ impl McBufReadable for simdnbt::owned::NbtCompound {
}
}
-impl McBufReadable for simdnbt::owned::Nbt {
- fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+impl AzaleaRead for simdnbt::owned::Nbt {
+ fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
Ok(simdnbt::owned::read_unnamed(buf)?)
}
}
-impl<T> McBufReadable for Box<T>
+impl<T> AzaleaRead for Box<T>
where
- T: McBufReadable,
+ T: AzaleaRead,
{
- fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
- Ok(Box::new(T::read_from(buf)?))
+ fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
+ Ok(Box::new(T::azalea_read(buf)?))
}
}