source2_demo/event/list.rs
1use crate::event::*;
2use crate::HashMap;
3use source2_demo_protobufs::CSvcMsgGameEventList;
4use std::rc::Rc;
5
6/// Container for all game event definitions in a replay.
7///
8/// This stores the complete definitions for all game events that can occur
9/// during replay parsing. Each event definition specifies:
10/// - Event ID: Unique identifier
11/// - Event name: Human-readable name
12/// - Key definitions: Names and types of fields in the event
13///
14/// # Examples
15///
16/// ```no_run
17/// use source2_demo::prelude::*;
18///
19/// # fn example(ctx: &Context) {
20/// // Game events are automatically parsed from the event definitions
21/// // You access them through the observer callbacks or game event iteration
22/// # }
23/// ```
24#[derive(Default)]
25pub struct GameEventList {
26 pub(crate) list: HashMap<i32, Rc<GameEventDefinition>>,
27}
28
29impl GameEventList {
30 pub(crate) fn new(list: CSvcMsgGameEventList) -> Self {
31 let list = list
32 .descriptors
33 .into_iter()
34 .map(|descriptor| {
35 let keys = descriptor
36 .keys
37 .clone()
38 .into_iter()
39 .enumerate()
40 .map(|(i, key)| {
41 Rc::new(GameEventKey {
42 id: i as i32,
43 name: key.name().into(),
44 type_id: key.r#type(),
45 })
46 })
47 .collect::<Vec<_>>();
48 let definition = Rc::new(GameEventDefinition {
49 name: descriptor.name().into(),
50 keys: keys.clone(),
51 name_to_key: keys
52 .into_iter()
53 .map(|key| (key.name.clone(), key))
54 .collect(),
55 });
56 (descriptor.eventid(), definition)
57 })
58 .collect::<HashMap<_, _>>();
59
60 Self { list }
61 }
62
63 /// Returns an iterator over all game event definitions by event ID.
64 pub fn iter(&self) -> impl Iterator<Item = (i32, &GameEventDefinition)> {
65 self.list
66 .iter()
67 .map(|(event_id, definition)| (*event_id, definition.as_ref()))
68 }
69}