source2_demo/event/
mod.rs

1#[cfg(feature = "dota")]
2mod combat_log;
3mod definition;
4mod list;
5mod value;
6
7#[cfg(feature = "dota")]
8pub use combat_log::*;
9use definition::*;
10pub use list::*;
11pub use value::*;
12
13use crate::error::GameEventError;
14use crate::proto::CSvcMsgGameEvent;
15
16pub struct GameEvent<'a> {
17    id: i32,
18    list: &'a GameEventList,
19    keys: Vec<EventValue>,
20}
21
22impl<'a> GameEvent<'a> {
23    pub(crate) fn new(list: &'a GameEventList, ge: CSvcMsgGameEvent) -> Self {
24        let id = ge.eventid();
25        let keys = ge
26            .keys
27            .iter()
28            .map(|key| match key.r#type() {
29                1 => EventValue::String(key.val_string().into()),
30                2 => EventValue::Float(key.val_float()),
31                3 => EventValue::Int(key.val_long()),
32                4 => EventValue::Int(key.val_short()),
33                5 => EventValue::Byte(key.val_byte() as u8),
34                6 => EventValue::Bool(key.val_bool()),
35                7 => EventValue::U64(key.val_uint64()),
36                8 => EventValue::Int(key.val_long()),
37                9 => EventValue::Int(key.val_short()),
38                _ => unreachable!("Unknown event type: {}", key.r#type()),
39            })
40            .collect::<Vec<_>>();
41
42        Self { id, list, keys }
43    }
44
45    pub fn id(&self) -> i32 {
46        self.id
47    }
48
49    pub fn name(&self) -> &str {
50        &self.list.list[&self.id].name
51    }
52
53    pub fn iter(&self) -> impl Iterator<Item = (&str, &EventValue)> {
54        self.keys
55            .iter()
56            .zip(self.list.list[&self.id].keys.iter())
57            .map(|(value, key)| (key.name.as_str(), value))
58    }
59
60    pub fn get_value(&self, key: &str) -> Result<&EventValue, GameEventError> {
61        let key = self.list.list[&self.id]
62            .name_to_key
63            .get(key)
64            .ok_or_else(|| GameEventError::UnknownKey(key.to_string()))?;
65        Ok(&self.keys[key.id as usize])
66    }
67}