diff options
| author | mat <git@matdoes.dev> | 2024-12-19 02:31:08 +0000 |
|---|---|---|
| committer | mat <git@matdoes.dev> | 2024-12-19 02:52:41 +0000 |
| commit | e268c4929177e540baa9d2bb29bc171f49cc7a25 (patch) | |
| tree | 10146e529088ab823452a5971c0a37a8886b2a68 /azalea-protocol/src/common/movements.rs | |
| parent | 1f06a1540f46d8087907566d7c6c1ab397c517ec (diff) | |
| download | azalea-drasl-e268c4929177e540baa9d2bb29bc171f49cc7a25.tar.xz | |
fix incorrect packets
Diffstat (limited to 'azalea-protocol/src/common/movements.rs')
| -rw-r--r-- | azalea-protocol/src/common/movements.rs | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/azalea-protocol/src/common/movements.rs b/azalea-protocol/src/common/movements.rs new file mode 100644 index 00000000..7672703f --- /dev/null +++ b/azalea-protocol/src/common/movements.rs @@ -0,0 +1,71 @@ +use std::io::{self, Cursor, Write}; + +use azalea_buf::{AzBuf, AzaleaRead, AzaleaWrite, BufReadError}; +use azalea_core::{bitset::FixedBitSet, position::Vec3}; +use azalea_entity::LookDirection; + +/// The updated position, velocity, and rotations for an entity. +/// +/// Often, this field comes alongside a [`RelativeMovements`] field, which +/// specifies which parts of this struct should be treated as relative. +#[derive(AzBuf, Clone, Debug)] +pub struct PositionMoveRotation { + pub pos: Vec3, + /// The updated delta movement (velocity). + pub delta: Vec3, + pub look_direction: LookDirection, +} + +#[derive(Debug, Clone)] +pub struct RelativeMovements { + pub x: bool, + pub y: bool, + pub z: bool, + pub y_rot: bool, + pub x_rot: bool, + pub delta_x: bool, + pub delta_y: bool, + pub delta_z: bool, + pub rotate_delta: bool, +} + +impl AzaleaRead for RelativeMovements { + fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> { + // yes minecraft seriously wastes that many bits, smh + let set = FixedBitSet::<{ 32_usize.div_ceil(8) }>::azalea_read(buf)?; + Ok(RelativeMovements { + x: set.index(0), + y: set.index(1), + z: set.index(2), + y_rot: set.index(3), + x_rot: set.index(4), + delta_x: set.index(5), + delta_y: set.index(6), + delta_z: set.index(7), + rotate_delta: set.index(8), + }) + } +} + +impl AzaleaWrite for RelativeMovements { + fn azalea_write(&self, buf: &mut impl Write) -> Result<(), io::Error> { + let mut set = FixedBitSet::<{ 32_usize.div_ceil(8) }>::new(); + let mut set_bit = |index: usize, value: bool| { + if value { + set.set(index); + } + }; + + set_bit(0, self.x); + set_bit(1, self.y); + set_bit(2, self.z); + set_bit(3, self.y_rot); + set_bit(4, self.x_rot); + set_bit(5, self.delta_x); + set_bit(6, self.delta_y); + set_bit(7, self.delta_z); + set_bit(8, self.rotate_delta); + + set.azalea_write(buf) + } +} |
