source2_demo/parser/
observer.rs

1use crate::parser::Context;
2use crate::proto::*;
3use crate::{Entity, EntityEvents, GameEvent, StringTable};
4
5#[cfg(feature = "dota")]
6use crate::event::CombatLogEntry;
7
8/// Result type for observers ([`anyhow::Result`])
9pub type ObserverResult = anyhow::Result<()>;
10
11
12bitflags::bitflags! {
13    #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
14    pub struct Interests: u64 {
15        const DEMO       = 1 << 0;  // EDemoCommands
16        const NET        = 1 << 1;  // NetMessages
17        const SVC        = 1 << 2;  // SvcMessages
18
19        const BASE_UM    = 1 << 3;  // EBaseUserMessages
20        const BASE_GE    = 1 << 4;  // EBaseGameEvents and game events
21
22        const TICK_START = 1 << 5;
23        const TICK_END   = 1 << 6;
24
25        const ENABLE_ENTITY     = 1 << 7;
26        const TRACK_ENTITY     = 1 << 8;
27        const ENABLE_STRINGTAB  = 1 << 9;
28        const TRACK_STRINGTAB  = 1 << 10;
29
30        const STOP       = 1 << 11;
31
32        #[cfg(feature = "dota")]
33        const DOTA_UM    = 1 << 12; // EDotaUserMessages
34
35        #[cfg(feature = "dota")]
36        const COMBAT_LOG = 1 << 13; // Combat Log
37
38
39        #[cfg(feature = "deadlock")]
40        const CITA_UM    = 1 << 14; // CitadelUserMessageIds
41
42        #[cfg(feature = "deadlock")]
43        const CITA_GE    = 1 << 15; // ECitadelGameEvents
44
45        #[cfg(feature = "cs2")]
46        const CS2_UM     = 1 << 16; // ECstrike15UserMessages
47
48        #[cfg(feature = "cs2")]
49        const CS2_GE     = 1 << 17; // ECsgoGameEvents
50    }
51}
52
53
54/// A trait defining methods for handling game event and protobuf messages. Can
55/// be attached to the [` crate::Parser `] instance with [`crate::Parser::register_observer`]
56/// method.
57#[allow(unused_variables)]
58pub trait Observer {
59    fn interests(&self) -> Interests {
60        Interests::empty()
61    }
62
63    #[cold]
64    #[inline(never)]
65    fn on_demo_command(
66        &mut self,
67        ctx: &Context,
68        msg_type: EDemoCommands,
69        msg: &[u8],
70    ) -> ObserverResult {
71        Ok(())
72    }
73
74    #[cold]
75    #[inline(never)]
76    fn on_net_message(
77        &mut self,
78        ctx: &Context,
79        msg_type: NetMessages,
80        msg: &[u8],
81    ) -> ObserverResult {
82        Ok(())
83    }
84
85    #[cold]
86    #[inline(never)]
87    fn on_svc_message(
88        &mut self,
89        ctx: &Context,
90        msg_type: SvcMessages,
91        msg: &[u8],
92    ) -> ObserverResult {
93        Ok(())
94    }
95
96    #[cold]
97    #[inline(never)]
98    fn on_base_user_message(
99        &mut self,
100        ctx: &Context,
101        msg_type: EBaseUserMessages,
102        msg: &[u8],
103    ) -> ObserverResult {
104        Ok(())
105    }
106
107    #[cold]
108    #[inline(never)]
109    fn on_base_game_event(
110        &mut self,
111        ctx: &Context,
112        msg_type: EBaseGameEvents,
113        msg: &[u8],
114    ) -> ObserverResult {
115        Ok(())
116    }
117
118    #[cold]
119    #[inline(never)]
120    fn on_tick_start(&mut self, ctx: &Context) -> ObserverResult {
121        Ok(())
122    }
123
124    #[cold]
125    #[inline(never)]
126    fn on_tick_end(&mut self, ctx: &Context) -> ObserverResult {
127        Ok(())
128    }
129
130    #[cold]
131    #[inline(never)]
132    fn on_entity(&mut self, ctx: &Context, event: EntityEvents, entity: &Entity) -> ObserverResult {
133        Ok(())
134    }
135
136    #[cold]
137    #[inline(never)]
138    fn on_game_event(&mut self, ctx: &Context, ge: &GameEvent) -> ObserverResult {
139        Ok(())
140    }
141
142    #[cold]
143    #[inline(never)]
144    fn on_string_table(
145        &mut self,
146        ctx: &Context,
147        st: &StringTable,
148        modified: &[i32],
149    ) -> ObserverResult {
150        Ok(())
151    }
152
153    #[cold]
154    #[inline(never)]
155    fn on_stop(&mut self, ctx: &Context) -> ObserverResult {
156        Ok(())
157    }
158
159    #[cold]
160    #[inline(never)]
161    #[cfg(feature = "dota")]
162    fn on_combat_log(&mut self, ctx: &Context, cle: &CombatLogEntry) -> ObserverResult {
163        Ok(())
164    }
165
166    #[cold]
167    #[inline(never)]
168    #[cfg(feature = "dota")]
169    fn on_dota_user_message(
170        &mut self,
171        ctx: &Context,
172        msg_type: EDotaUserMessages,
173        msg: &[u8],
174    ) -> ObserverResult {
175        Ok(())
176    }
177
178    #[cold]
179    #[inline(never)]
180    #[cfg(feature = "deadlock")]
181    fn on_citadel_game_event(
182        &mut self,
183        ctx: &Context,
184        msg_type: ECitadelGameEvents,
185        msg: &[u8],
186    ) -> ObserverResult {
187        Ok(())
188    }
189
190    #[cold]
191    #[inline(never)]
192    #[cfg(feature = "deadlock")]
193    fn on_citadel_user_message(
194        &mut self,
195        ctx: &Context,
196        msg_type: CitadelUserMessageIds,
197        msg: &[u8],
198    ) -> ObserverResult {
199        Ok(())
200    }
201
202    #[cold]
203    #[inline(never)]
204    #[cfg(feature = "cs2")]
205    fn on_cs2_user_message(
206        &mut self,
207        ctx: &Context,
208        msg_type: ECstrike15UserMessages,
209        msg: &[u8],
210    ) -> ObserverResult {
211        Ok(())
212    }
213
214    #[cold]
215    #[inline(never)]
216    #[cfg(feature = "cs2")]
217    fn on_cs2_game_event(
218        &mut self,
219        ctx: &Context,
220        msg_type: ECsgoGameEvents,
221        msg: &[u8],
222    ) -> ObserverResult {
223        Ok(())
224    }
225}