airmash_protocol/v5/
types.rs

1use crate::types::*;
2use crate::v5::*;
3
4impl SerializeV5 for ServerKeyState {
5  fn serialize(&self, ser: &mut AirmashSerializerV5) -> Result {
6    let val = (self.up as u8)
7      | (self.down as u8) << 1
8      | (self.left as u8) << 2
9      | (self.right as u8) << 3
10      | (self.boost as u8) << 4
11      | (self.strafe as u8) << 5
12      | (self.stealth as u8) << 6
13      | (self.flagspeed as u8) << 7;
14    val.serialize(ser)
15  }
16}
17
18impl<'de> DeserializeV5<'de> for ServerKeyState {
19  fn deserialize(de: &mut AirmashDeserializerV5<'de>) -> Result<Self> {
20    let val = de.deserialize_u8()?;
21
22    Ok(ServerKeyState {
23      up: (val & 0b00000001) != 0,
24      down: (val & 0b00000010) != 0,
25      left: (val & 0b00000100) != 0,
26      right: (val & 0b00001000) != 0,
27      boost: (val & 0b00010000) != 0,
28      strafe: (val & 0b00100000) != 0,
29      stealth: (val & 0b01000000) != 0,
30      flagspeed: (val & 0b10000000) != 0,
31    })
32  }
33}
34
35impl SerializeV5 for Upgrades {
36  fn serialize(&self, ser: &mut AirmashSerializerV5) -> Result {
37    let val: u8 =
38      (self.speed & 7) | ((self.shield as u8 & 1) << 3) | ((self.inferno as u8 & 1) << 4);
39    val.serialize(ser)
40  }
41}
42
43impl<'de> DeserializeV5<'de> for Upgrades {
44  fn deserialize(de: &mut AirmashDeserializerV5<'de>) -> Result<Self> {
45    let val = u8::deserialize(de)?;
46
47    Ok(Upgrades {
48      speed: val & 7,
49      shield: (val & (1 << 3)) != 0,
50      inferno: (val & (1 << 4)) != 0,
51    })
52  }
53}