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.
# 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",

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 output = csdemo::parser::parse(
csdemo::FrameIterator::parse(tmp.inner),
@@ -50,20 +56,35 @@ pub fn parse(config: &Config, buf: &[u8]) -> Result<(std::collections::HashMap<c
)
.map_err(|e| ())?;
let pawn_ids: 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<c
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_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<c
&mut player_lifestate,
&mut player_position,
&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> {
@@ -115,6 +145,7 @@ fn process_tick(
player_position: &mut std::collections::HashMap<csdemo::UserId, (f32, f32, f32)>,
player_cells: &mut std::collections::HashMap<csdemo::UserId, (u32, u32, u32)>,
heatmaps: &mut std::collections::HashMap<csdemo::UserId, HeatMap>,
unknown_player_entities: &mut std::collections::HashSet<i32>,
) {
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;
}
}
}
};

View File

@@ -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::<Vec<_>>());
}

View File

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