Some minor updates to the heatmap stuff

This commit is contained in:
Lol3rrr
2024-09-30 15:47:45 +02:00
parent 16c5e41aed
commit de37b239aa
4 changed files with 89 additions and 50 deletions

55
Cargo.lock generated
View File

@@ -1,6 +1,6 @@
# This file is automatically @generated by Cargo. # This file is automatically @generated by Cargo.
# It is not intended for manual editing. # It is not intended for manual editing.
version = 3 version = 4
[[package]] [[package]]
name = "addr2line" name = "addr2line"
@@ -218,9 +218,9 @@ dependencies = [
[[package]] [[package]]
name = "axum" name = "axum"
version = "0.7.6" version = "0.7.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f43644eed690f5374f1af436ecd6aea01cd201f6fbdf0178adaf6907afb2cec" checksum = "504e3947307ac8326a5437504c517c4b56716c9d98fac0028c2acc7ca47d70ae"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"axum-core", "axum-core",
@@ -253,9 +253,9 @@ dependencies = [
[[package]] [[package]]
name = "axum-core" name = "axum-core"
version = "0.4.4" version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5e6b8ba012a258d63c9adfa28b9ddcf66149da6f986c5b5452e629d5ee64bf00" checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"bytes", "bytes",
@@ -666,7 +666,7 @@ dependencies = [
[[package]] [[package]]
name = "csdemo" name = "csdemo"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/Lol3rrr/csdemo.git#fa57cacae0de4267dd971209358be3c53ffdd9d0" source = "git+https://github.com/Lol3rrr/csdemo.git#777248ab3c597b36103a9e0fa05e606134a1503c"
dependencies = [ dependencies = [
"bitter", "bitter",
"phf", "phf",
@@ -2133,9 +2133,12 @@ dependencies = [
[[package]] [[package]]
name = "once_cell" name = "once_cell"
version = "1.19.0" version = "1.20.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1"
dependencies = [
"portable-atomic",
]
[[package]] [[package]]
name = "openssl" name = "openssl"
@@ -2337,6 +2340,12 @@ dependencies = [
"miniz_oxide 0.8.0", "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]] [[package]]
name = "postgres-protocol" name = "postgres-protocol"
version = "0.6.7" version = "0.6.7"
@@ -2708,23 +2717,23 @@ dependencies = [
[[package]] [[package]]
name = "redox_syscall" name = "redox_syscall"
version = "0.5.6" version = "0.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "355ae415ccd3a04315d3f8246e86d67689ea74d88d915576e1589a351062a13b" checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f"
dependencies = [ dependencies = [
"bitflags 2.6.0", "bitflags 2.6.0",
] ]
[[package]] [[package]]
name = "regex" name = "regex"
version = "1.10.6" version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8"
dependencies = [ dependencies = [
"aho-corasick", "aho-corasick",
"memchr", "memchr",
"regex-automata 0.4.7", "regex-automata 0.4.8",
"regex-syntax 0.8.4", "regex-syntax 0.8.5",
] ]
[[package]] [[package]]
@@ -2738,13 +2747,13 @@ dependencies = [
[[package]] [[package]]
name = "regex-automata" name = "regex-automata"
version = "0.4.7" version = "0.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3"
dependencies = [ dependencies = [
"aho-corasick", "aho-corasick",
"memchr", "memchr",
"regex-syntax 0.8.4", "regex-syntax 0.8.5",
] ]
[[package]] [[package]]
@@ -2755,9 +2764,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
[[package]] [[package]]
name = "regex-syntax" name = "regex-syntax"
version = "0.8.4" version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
[[package]] [[package]]
name = "reqwasm" name = "reqwasm"
@@ -3452,9 +3461,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
[[package]] [[package]]
name = "tempfile" name = "tempfile"
version = "3.12.0" version = "3.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"fastrand", "fastrand",
@@ -4130,9 +4139,9 @@ checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484"
[[package]] [[package]]
name = "wasm-streams" name = "wasm-streams"
version = "0.4.0" version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd"
dependencies = [ dependencies = [
"futures-util", "futures-util",
"js-sys", "js-sys",

View File

@@ -42,7 +42,13 @@ impl HeatMap {
} }
} }
pub fn parse(config: &Config, buf: &[u8]) -> Result<(std::collections::HashMap<csdemo::UserId, HeatMap>, std::collections::HashMap<csdemo::UserId, csdemo::parser::Player>), ()> { #[derive(Debug)]
pub struct HeatMapOutput {
pub player_heatmaps: std::collections::HashMap<csdemo::UserId, HeatMap>,
pub player_info: std::collections::HashMap<csdemo::UserId, csdemo::parser::Player>,
}
pub fn parse(config: &Config, buf: &[u8]) -> Result<HeatMapOutput, ()> {
let tmp = csdemo::Container::parse(buf).map_err(|e| ())?; let tmp = csdemo::Container::parse(buf).map_err(|e| ())?;
let output = csdemo::parser::parse( let output = csdemo::parser::parse(
csdemo::FrameIterator::parse(tmp.inner), csdemo::FrameIterator::parse(tmp.inner),
@@ -50,20 +56,35 @@ pub fn parse(config: &Config, buf: &[u8]) -> Result<(std::collections::HashMap<c
) )
.map_err(|e| ())?; .map_err(|e| ())?;
let pawn_ids: std::collections::HashMap<_, _> = output let pawn_ids = {
.events let mut tmp = std::collections::HashMap::new();
.iter()
.filter_map(|event| match event { for event in output.events.iter() {
let entry = match event {
csdemo::DemoEvent::GameEvent(ge) => match ge.as_ref() { csdemo::DemoEvent::GameEvent(ge) => match ge.as_ref() {
csdemo::game_event::GameEvent::PlayerSpawn(pspawn) => match pspawn.userid_pawn { csdemo::game_event::GameEvent::PlayerSpawn(pspawn) => match pspawn.userid_pawn.as_ref() {
Some(csdemo::RawValue::I32(v)) => Some((v, pspawn.userid.unwrap())), Some(csdemo::RawValue::I32(v)) => {
_ => None, Some((*v, pspawn.userid.unwrap()))
}
other => {
// tracing::info!("Unknown Pawn-ID: {:?}", other);
None
},
}, },
_ => 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); tracing::debug!("Pawn-IDs: {:?}", pawn_ids);
@@ -71,6 +92,7 @@ pub fn parse(config: &Config, buf: &[u8]) -> Result<(std::collections::HashMap<c
let mut player_lifestate = std::collections::HashMap::<csdemo::UserId, u32>::new(); let mut player_lifestate = std::collections::HashMap::<csdemo::UserId, u32>::new();
let mut player_position = std::collections::HashMap::<csdemo::UserId, (f32, f32, f32)>::new(); let mut player_position = std::collections::HashMap::<csdemo::UserId, (f32, f32, f32)>::new();
let mut player_cells = 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(); let mut heatmaps = std::collections::HashMap::new();
for tick_state in output.entity_states.ticks.iter() { for tick_state in output.entity_states.ticks.iter() {
@@ -84,11 +106,19 @@ pub fn parse(config: &Config, buf: &[u8]) -> Result<(std::collections::HashMap<c
&mut player_lifestate, &mut player_lifestate,
&mut player_position, &mut player_position,
&mut player_cells, &mut player_cells,
&mut heatmaps &mut heatmaps,
&mut unknown_player_entities,
); );
} }
Ok((heatmaps, output.player_info)) if !unknown_player_entities.is_empty() {
tracing::warn!("Unknown Player Entities: {:?}", unknown_player_entities);
}
Ok(HeatMapOutput {
player_heatmaps: heatmaps,
player_info: output.player_info,
})
} }
fn get_entityid(props: &[csdemo::parser::entities::EntityProp]) -> Option<i32> { fn get_entityid(props: &[csdemo::parser::entities::EntityProp]) -> Option<i32> {
@@ -115,6 +145,7 @@ fn process_tick(
player_position: &mut std::collections::HashMap<csdemo::UserId, (f32, f32, f32)>, player_position: &mut std::collections::HashMap<csdemo::UserId, (f32, f32, f32)>,
player_cells: &mut std::collections::HashMap<csdemo::UserId, (u32, u32, u32)>, player_cells: &mut std::collections::HashMap<csdemo::UserId, (u32, u32, u32)>,
heatmaps: &mut std::collections::HashMap<csdemo::UserId, HeatMap>, heatmaps: &mut std::collections::HashMap<csdemo::UserId, HeatMap>,
unknown_player_entities: &mut std::collections::HashSet<i32>,
) { ) {
for entity_state in tick_state for entity_state in tick_state
.states .states
@@ -131,7 +162,10 @@ fn process_tick(
None => { None => {
match entity_id_to_user.get(&entity_state.id).cloned() { match entity_id_to_user.get(&entity_state.id).cloned() {
Some(user) => user, Some(user) => user,
None => continue, None => {
unknown_player_entities.insert(entity_state.id);
continue;
}
} }
} }
}; };

View File

@@ -9,11 +9,9 @@ fn heatmap_nuke() {
let input_bytes = std::fs::read(path).unwrap(); let input_bytes = std::fs::read(path).unwrap();
let config = heatmap::Config { cell_size: 5.0 }; 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()); assert_eq!(result.player_heatmaps.len(), result.player_info.len());
todo!()
} }
#[test] #[test]
@@ -24,9 +22,7 @@ fn heatmap_inferno() {
let input_bytes = std::fs::read(path).unwrap(); let input_bytes = std::fs::read(path).unwrap();
let config = heatmap::Config { cell_size: 5.0 }; 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()); assert_eq!(result.player_heatmaps.len(), result.player_info.len(), "Players: {:?}", result.player_heatmaps.keys().collect::<Vec<_>>());
todo!()
} }

View File

@@ -131,11 +131,11 @@ pub fn analyse_heatmap(input: AnalysisInput) -> std::collections::HashMap<String
let config = analysis::heatmap::Config { let config = analysis::heatmap::Config {
cell_size: 5.0, cell_size: 5.0,
}; };
let (heatmaps, players) = analysis::heatmap::parse(&config, &mmap).unwrap(); let result = analysis::heatmap::parse(&config, &mmap).unwrap();
tracing::info!("Got {} Heatmaps", heatmaps.len()); tracing::info!("Got {} Heatmaps", result.player_heatmaps.len());
heatmaps.into_iter().filter_map(|(userid, heatmap)| { result.player_heatmaps.into_iter().filter_map(|(userid, heatmap)| {
let player = match players.get(&userid) { let player = match result.player_info.get(&userid) {
Some(p) => p, Some(p) => p,
None => { None => {
tracing::warn!("Could not find player: {:?}", userid); tracing::warn!("Could not find player: {:?}", userid);