tf_demo_parser/demo/packet/
usercmd.rs1use 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}