azalea_protocol/packets/game/
c_player_abilities.rs1use std::io::{Cursor, Write};
2
3use azalea_buf::{AzBuf, BufReadError};
4use azalea_buf::{AzaleaRead, AzaleaWrite};
5use azalea_core::bitset::FixedBitSet;
6use azalea_protocol_macros::ClientboundGamePacket;
7
8#[derive(Clone, Debug, AzBuf, ClientboundGamePacket)]
9pub struct ClientboundPlayerAbilities {
10 pub flags: PlayerAbilitiesFlags,
11 pub flying_speed: f32,
12 pub walking_speed: f32,
14}
15
16#[derive(Clone, Debug)]
17pub struct PlayerAbilitiesFlags {
18 pub invulnerable: bool,
19 pub flying: bool,
20 pub can_fly: bool,
21 pub instant_break: bool,
22}
23
24impl AzaleaRead for PlayerAbilitiesFlags {
25 fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
26 let set = FixedBitSet::<{ 4_usize.div_ceil(8) }>::azalea_read(buf)?;
27 Ok(PlayerAbilitiesFlags {
28 invulnerable: set.index(0),
29 flying: set.index(1),
30 can_fly: set.index(2),
31 instant_break: set.index(3),
32 })
33 }
34}
35
36impl AzaleaWrite for PlayerAbilitiesFlags {
37 fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
38 let mut set = FixedBitSet::<{ 4_usize.div_ceil(8) }>::new();
39 if self.invulnerable {
40 set.set(0);
41 }
42 if self.flying {
43 set.set(1);
44 }
45 if self.can_fly {
46 set.set(2);
47 }
48 if self.instant_break {
49 set.set(3);
50 }
51 set.azalea_write(buf)
52 }
53}