From de37b239aabc1e75d0cc184056436033f2f06c75 Mon Sep 17 00:00:00 2001 From: Lol3rrr Date: Mon, 30 Sep 2024 15:47:45 +0200 Subject: [PATCH] Some minor updates to the heatmap stuff --- Cargo.lock | 55 +++++++++++++++++++-------------- analysis/src/heatmap.rs | 64 ++++++++++++++++++++++++++++++--------- analysis/tests/heatmap.rs | 12 +++----- backend/src/analysis.rs | 8 ++--- 4 files changed, 89 insertions(+), 50 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cb6ee8d..4b5743d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -218,9 +218,9 @@ dependencies = [ [[package]] name = "axum" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f43644eed690f5374f1af436ecd6aea01cd201f6fbdf0178adaf6907afb2cec" +checksum = "504e3947307ac8326a5437504c517c4b56716c9d98fac0028c2acc7ca47d70ae" dependencies = [ "async-trait", "axum-core", @@ -253,9 +253,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6b8ba012a258d63c9adfa28b9ddcf66149da6f986c5b5452e629d5ee64bf00" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" dependencies = [ "async-trait", "bytes", @@ -666,7 +666,7 @@ dependencies = [ [[package]] name = "csdemo" version = "0.1.0" -source = "git+https://github.com/Lol3rrr/csdemo.git#fa57cacae0de4267dd971209358be3c53ffdd9d0" +source = "git+https://github.com/Lol3rrr/csdemo.git#777248ab3c597b36103a9e0fa05e606134a1503c" dependencies = [ "bitter", "phf", @@ -2133,9 +2133,12 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1" +dependencies = [ + "portable-atomic", +] [[package]] name = "openssl" @@ -2337,6 +2340,12 @@ dependencies = [ "miniz_oxide 0.8.0", ] +[[package]] +name = "portable-atomic" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" + [[package]] name = "postgres-protocol" version = "0.6.7" @@ -2708,23 +2717,23 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "355ae415ccd3a04315d3f8246e86d67689ea74d88d915576e1589a351062a13b" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ "bitflags 2.6.0", ] [[package]] name = "regex" -version = "1.10.6" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.7", - "regex-syntax 0.8.4", + "regex-automata 0.4.8", + "regex-syntax 0.8.5", ] [[package]] @@ -2738,13 +2747,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", ] [[package]] @@ -2755,9 +2764,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwasm" @@ -3452,9 +3461,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tempfile" -version = "3.12.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" dependencies = [ "cfg-if", "fastrand", @@ -4130,9 +4139,9 @@ checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" [[package]] name = "wasm-streams" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" +checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd" dependencies = [ "futures-util", "js-sys", diff --git a/analysis/src/heatmap.rs b/analysis/src/heatmap.rs index 8a72f25..9497a68 100644 --- a/analysis/src/heatmap.rs +++ b/analysis/src/heatmap.rs @@ -42,7 +42,13 @@ impl HeatMap { } } -pub fn parse(config: &Config, buf: &[u8]) -> Result<(std::collections::HashMap, std::collections::HashMap), ()> { +#[derive(Debug)] +pub struct HeatMapOutput { + pub player_heatmaps: std::collections::HashMap, + pub player_info: std::collections::HashMap, +} + +pub fn parse(config: &Config, buf: &[u8]) -> Result { let tmp = csdemo::Container::parse(buf).map_err(|e| ())?; let output = csdemo::parser::parse( csdemo::FrameIterator::parse(tmp.inner), @@ -50,20 +56,35 @@ pub fn parse(config: &Config, buf: &[u8]) -> Result<(std::collections::HashMap = output - .events - .iter() - .filter_map(|event| match event { - csdemo::DemoEvent::GameEvent(ge) => match ge.as_ref() { - csdemo::game_event::GameEvent::PlayerSpawn(pspawn) => match pspawn.userid_pawn { - Some(csdemo::RawValue::I32(v)) => Some((v, pspawn.userid.unwrap())), + let pawn_ids = { + let mut tmp = std::collections::HashMap::new(); + + for event in output.events.iter() { + let entry = match event { + csdemo::DemoEvent::GameEvent(ge) => match ge.as_ref() { + csdemo::game_event::GameEvent::PlayerSpawn(pspawn) => match pspawn.userid_pawn.as_ref() { + Some(csdemo::RawValue::I32(v)) => { + Some((*v, pspawn.userid.unwrap())) + } + other => { + // tracing::info!("Unknown Pawn-ID: {:?}", other); + None + }, + }, _ => None, }, _ => None, - }, - _ => None, - }) - .collect(); + }; + + if let Some((pawn, userid)) = entry { + if let Some(previous) = tmp.insert(pawn, userid){ + assert_eq!(previous, userid); + } + } + } + + tmp + }; tracing::debug!("Pawn-IDs: {:?}", pawn_ids); @@ -71,6 +92,7 @@ pub fn parse(config: &Config, buf: &[u8]) -> Result<(std::collections::HashMap::new(); let mut player_position = std::collections::HashMap::::new(); let mut player_cells = std::collections::HashMap::new(); + let mut unknown_player_entities = std::collections::HashSet::new(); let mut heatmaps = std::collections::HashMap::new(); for tick_state in output.entity_states.ticks.iter() { @@ -84,11 +106,19 @@ pub fn parse(config: &Config, buf: &[u8]) -> Result<(std::collections::HashMap Option { @@ -115,6 +145,7 @@ fn process_tick( player_position: &mut std::collections::HashMap, player_cells: &mut std::collections::HashMap, heatmaps: &mut std::collections::HashMap, + unknown_player_entities: &mut std::collections::HashSet, ) { for entity_state in tick_state .states @@ -131,7 +162,10 @@ fn process_tick( None => { match entity_id_to_user.get(&entity_state.id).cloned() { Some(user) => user, - None => continue, + None => { + unknown_player_entities.insert(entity_state.id); + continue; + } } } }; diff --git a/analysis/tests/heatmap.rs b/analysis/tests/heatmap.rs index 223e7e9..a5a845b 100644 --- a/analysis/tests/heatmap.rs +++ b/analysis/tests/heatmap.rs @@ -9,11 +9,9 @@ fn heatmap_nuke() { let input_bytes = std::fs::read(path).unwrap(); let config = heatmap::Config { cell_size: 5.0 }; - let (result, players) = heatmap::parse(&config, &input_bytes).unwrap(); + let result = heatmap::parse(&config, &input_bytes).unwrap(); - assert_eq!(result.len(), players.len()); - - todo!() + assert_eq!(result.player_heatmaps.len(), result.player_info.len()); } #[test] @@ -24,9 +22,7 @@ fn heatmap_inferno() { let input_bytes = std::fs::read(path).unwrap(); let config = heatmap::Config { cell_size: 5.0 }; - let (result, players) = heatmap::parse(&config, &input_bytes).unwrap(); + let result = heatmap::parse(&config, &input_bytes).unwrap(); - assert_eq!(result.len(), players.len()); - - todo!() + assert_eq!(result.player_heatmaps.len(), result.player_info.len(), "Players: {:?}", result.player_heatmaps.keys().collect::>()); } diff --git a/backend/src/analysis.rs b/backend/src/analysis.rs index c188b5b..6c20f68 100644 --- a/backend/src/analysis.rs +++ b/backend/src/analysis.rs @@ -131,11 +131,11 @@ pub fn analyse_heatmap(input: AnalysisInput) -> std::collections::HashMap p, None => { tracing::warn!("Could not find player: {:?}", userid);