tf_demo_parser/demo/packet/
usercmd.rs

1use crate::demo::data::DemoTick;
2use bitbuffer::{BitRead, BitReadStream, BitWrite, BitWriteStream, LittleEndian};
3use serde::{Deserialize, Serialize};
4
5#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
6#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)]
7pub struct UserCmdPacket {
8    pub tick: DemoTick,
9    pub sequence_out: u32,
10    pub cmd: UserCmd,
11}
12
13impl<'a> BitRead<'a, LittleEndian> for UserCmdPacket {
14    fn read(stream: &mut BitReadStream<'a, LittleEndian>) -> bitbuffer::Result<Self> {
15        let tick = stream.read()?;
16        let sequence_out = stream.read()?;
17        let len: u32 = stream.read()?;
18        let mut data = stream.read_bits(len as usize * 8)?;
19        let cmd = data.read()?;
20        Ok(UserCmdPacket {
21            tick,
22            sequence_out,
23            cmd,
24        })
25    }
26}
27
28impl BitWrite<LittleEndian> for UserCmdPacket {
29    fn write(&self, stream: &mut BitWriteStream<LittleEndian>) -> bitbuffer::Result<()> {
30        self.tick.write(stream)?;
31        self.sequence_out.write(stream)?;
32        stream.reserve_byte_length(32, |stream| self.cmd.write(stream))
33    }
34}
35
36#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
37#[derive(Debug, PartialEq, BitRead, BitWrite, Serialize, Deserialize, Clone)]
38pub struct UserCmd {
39    pub command_number: Option<u32>,
40    pub tick_count: Option<u32>,
41    pub view_angles: [Option<f32>; 3],
42    pub movement: [Option<f32>; 3],
43    pub buttons: Option<u32>,
44    pub impulse: Option<u8>,
45    pub weapon_select: Option<WeaponSelect>,
46    pub mouse_dx: Option<u16>,
47    pub mouse_dy: Option<u16>,
48}
49
50#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
51#[derive(Debug, PartialEq, BitRead, BitWrite, Serialize, Deserialize, Clone)]
52pub struct WeaponSelect {
53    #[size = 11]
54    select: u16,
55    #[size = 6]
56    subtype: Option<u8>,
57}