source2_demo/event/
mod.rs1#[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}