tf_demo_parser/demo/packet/
message.rs

1use bitbuffer::{BitRead, BitWrite, BitWriteStream, LittleEndian};
2use serde::{Deserialize, Serialize};
3
4use crate::demo::data::DemoTick;
5use crate::demo::message::{Message, MessageType};
6use crate::demo::parser::Encode;
7use crate::demo::vector::Vector;
8use crate::{Parse, ParserState, Result, Stream};
9#[cfg(feature = "trace")]
10use tracing::{event, span, Level};
11
12#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
13#[derive(Debug, BitRead, BitWrite, PartialEq, Serialize, Deserialize, Clone, Default)]
14pub struct MessagePacketMeta {
15    pub flags: u32, // TODO
16    pub view_angles: [ViewAngles; 2],
17    pub sequence_in: u32,
18    pub sequence_out: u32,
19}
20
21#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
22#[derive(Debug, PartialEq, Serialize, Deserialize, Clone, Default)]
23#[serde(bound(deserialize = "'a: 'static"))]
24pub struct MessagePacket<'a> {
25    pub tick: DemoTick,
26    pub messages: Vec<Message<'a>>,
27    pub meta: MessagePacketMeta,
28}
29
30#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
31#[derive(Clone, Debug, PartialEq, Default, Serialize, Deserialize, BitRead, BitWrite)]
32pub struct ViewAngles {
33    pub origin: Vector,
34    pub angles: Vector,
35    pub local_angles: Vector,
36}
37
38#[test]
39fn test_view_angles_roundtrip() {
40    crate::test_roundtrip_write(ViewAngles::default());
41    crate::test_roundtrip_write(ViewAngles {
42        origin: Vector {
43            x: 1.0,
44            y: 2.0,
45            z: 3.0,
46        },
47        angles: Vector {
48            x: 4.0,
49            y: 5.0,
50            z: 6.0,
51        },
52        local_angles: Vector {
53            x: 7.0,
54            y: 8.0,
55            z: 9.0,
56        },
57    });
58}
59
60impl<'a> Parse<'a> for MessagePacket<'a> {
61    fn parse(stream: &mut Stream<'a>, state: &ParserState) -> Result<Self> {
62        let tick = stream.read()?;
63
64        let meta = stream.read()?;
65
66        let length: u32 = stream.read()?;
67        let mut packet_data = stream.read_bits(length as usize * 8)?;
68
69        let mut messages = Vec::with_capacity(8);
70        while packet_data.bits_left() > 6 {
71            let message_type = MessageType::read(&mut packet_data)?;
72            #[cfg(feature = "trace")]
73            let _span =
74                span!(Level::DEBUG, "reading message", message_type = ?message_type, tick = ?tick)
75                    .entered();
76
77            if state.should_parse_message(message_type) && message_type != MessageType::Empty {
78                #[cfg(feature = "trace")]
79                event!(Level::TRACE, "parsing message");
80                messages.push(Message::from_type(message_type, &mut packet_data, state)?);
81            } else {
82                #[cfg(feature = "trace")]
83                event!(Level::TRACE, "skipping message");
84                Message::skip_type(message_type, &mut packet_data, state)?;
85            }
86        }
87
88        let packet = MessagePacket {
89            tick,
90            messages,
91            meta,
92        };
93        Ok(packet)
94    }
95}
96
97impl Encode for MessagePacket<'_> {
98    fn encode(&self, stream: &mut BitWriteStream<LittleEndian>, state: &ParserState) -> Result<()> {
99        self.tick.write(stream)?;
100        self.meta.write(stream)?;
101        stream.reserve_byte_length(32, |stream| {
102            for message in self.messages.iter() {
103                message.get_message_type().write(stream)?;
104                message.encode(stream, state)?;
105            }
106
107            Ok(())
108        })
109    }
110}