From 681edb7b2f6738a6f731774db7959596cec75c93 Mon Sep 17 00:00:00 2001 From: Lol3rrr Date: Mon, 30 Sep 2024 14:08:05 +0200 Subject: [PATCH] Tried to optimize game event parser --- examples/ancient-entity.rs | 2 ++ src/game_event.rs | 20 +++++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/examples/ancient-entity.rs b/examples/ancient-entity.rs index 8b0a76e..467fc8b 100644 --- a/examples/ancient-entity.rs +++ b/examples/ancient-entity.rs @@ -14,6 +14,7 @@ fn main() { println!("Events: {:?}", output.events.len()); println!("Entity-Ticks: {:?}", output.entity_states.ticks.len()); + /* for tick in output.entity_states.ticks.iter() { for state in tick.states.iter() { if state.class.as_str() != "CCSPlayerPawn" { @@ -25,4 +26,5 @@ fn main() { } } } + */ } diff --git a/src/game_event.rs b/src/game_event.rs index 5f58b64..923955e 100644 --- a/src/game_event.rs +++ b/src/game_event.rs @@ -12,15 +12,25 @@ macro_rules! define_event { impl $name { #[allow(unused_mut)] fn parse(keys: &[crate::csgo_proto::csvc_msg_game_event_list::KeyT], event: crate::csgo_proto::CMsgSource1LegacyGameEvent) -> Result { - let mut fields: ::std::collections::HashMap<_,_> = keys.iter().zip(event.keys.into_iter()).map(|(k, f)| { - (k.name().to_owned(), f) - }).collect(); + + $(let mut $field: Option = None;)* + let mut remaining = std::collections::HashMap::new(); - $(let $field: Option = fields.remove(stringify!($field)).map(|f| f.try_into().ok()).flatten();)* + for (k, f) in keys.iter().zip(event.keys.into_iter()) { + let name = k.name(); + $( + if name == stringify!($field) { + $field = Some(f.try_into().ok()).flatten(); + continue; + } + )* + + remaining.insert(name.to_owned(), f); + } let value = $name { $($field: $field.map(|f| f.try_into().ok()).flatten(),)* - remaining: fields, + remaining, }; Ok($target(value))