diff --git a/analysis/src/heatmap.rs b/analysis/src/heatmap.rs index 9497a68..bac0607 100644 --- a/analysis/src/heatmap.rs +++ b/analysis/src/heatmap.rs @@ -44,7 +44,8 @@ impl HeatMap { #[derive(Debug)] pub struct HeatMapOutput { - pub player_heatmaps: std::collections::HashMap, + pub player_heatmaps: std::collections::HashMap, + pub entity_to_player: std::collections::HashMap, pub player_info: std::collections::HashMap, } @@ -89,10 +90,9 @@ pub fn parse(config: &Config, buf: &[u8]) -> Result { tracing::debug!("Pawn-IDs: {:?}", pawn_ids); let mut entity_id_to_user = std::collections::HashMap::::new(); - let mut player_lifestate = std::collections::HashMap::::new(); - let mut player_position = std::collections::HashMap::::new(); + let mut player_lifestate = 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() { @@ -107,16 +107,13 @@ pub fn parse(config: &Config, buf: &[u8]) -> Result { &mut player_position, &mut player_cells, &mut heatmaps, - &mut unknown_player_entities, ); } - if !unknown_player_entities.is_empty() { - tracing::warn!("Unknown Player Entities: {:?}", unknown_player_entities); - } Ok(HeatMapOutput { player_heatmaps: heatmaps, + entity_to_player: entity_id_to_user, player_info: output.player_info, }) } @@ -141,37 +138,25 @@ fn process_tick( tick_state: &csdemo::parser::EntityTickStates, entity_id_to_user: &mut std::collections::HashMap, pawn_ids: &std::collections::HashMap, - player_lifestate: &mut std::collections::HashMap, - player_position: &mut std::collections::HashMap, - player_cells: &mut std::collections::HashMap, - heatmaps: &mut std::collections::HashMap, - unknown_player_entities: &mut std::collections::HashSet, + player_lifestate: &mut std::collections::HashMap, + player_position: &mut std::collections::HashMap, + player_cells: &mut std::collections::HashMap, + heatmaps: &mut std::collections::HashMap, ) { for entity_state in tick_state .states .iter() .filter(|s| s.class == "CCSPlayerPawn") { - let user_id = match get_entityid(&entity_state.props) { - Some(pawn_id) => { - let user_id = pawn_ids.get(&pawn_id).cloned().unwrap(); + if let Some(pawn_id) = get_entityid(&entity_state.props) { + let user_id = pawn_ids.get(&pawn_id).cloned().unwrap(); + entity_id_to_user.insert(entity_state.id, user_id.clone()); + } - entity_id_to_user.insert(entity_state.id, user_id.clone()); - user_id.clone() - } - None => { - match entity_id_to_user.get(&entity_state.id).cloned() { - Some(user) => user, - None => { - unknown_player_entities.insert(entity_state.id); - continue; - } - } - } - }; + let user_id = entity_state.id; let _inner_guard = - tracing::trace_span!("Entity", ?user_id, entity_id=?entity_state.id).entered(); + tracing::trace_span!("Entity", entity_id=?entity_state.id).entered(); let x_cell = match entity_state.get_prop("CCSPlayerPawn.CBodyComponentBaseAnimGraph.m_cellX").map(|prop| prop.value.as_u32()).flatten() { Some(c) => c, diff --git a/analysis/tests/heatmap.rs b/analysis/tests/heatmap.rs index a5a845b..7448e5e 100644 --- a/analysis/tests/heatmap.rs +++ b/analysis/tests/heatmap.rs @@ -26,3 +26,29 @@ fn heatmap_inferno() { assert_eq!(result.player_heatmaps.len(), result.player_info.len(), "Players: {:?}", result.player_heatmaps.keys().collect::>()); } + +#[test] +#[traced_test] +fn heatmap_dust2() { + let path = concat!(env!("CARGO_MANIFEST_DIR"), "/../testfiles/dust2.dem"); + dbg!(path); + let input_bytes = std::fs::read(path).unwrap(); + + let config = heatmap::Config { cell_size: 5.0 }; + let result = heatmap::parse(&config, &input_bytes).unwrap(); + + assert_eq!(result.player_heatmaps.len(), result.player_info.len(), "Players: {:?}", result.player_heatmaps.keys().collect::>()); + assert_eq!( + result.player_info.len(), + result.entity_to_player.len(), + "Missing Entity-to-Player: {:?} - Missing Player-Info: {:?}", + result.player_heatmaps.keys().filter(|entity| !result.entity_to_player.contains_key(*entity)).collect::>(), + result.player_info.iter().filter_map(|(user_id, info)| { + if result.entity_to_player.values().any(|p| p == user_id) { + return None; + } + + Some(info) + }).collect::>(), + ); +} diff --git a/backend/src/analysis.rs b/backend/src/analysis.rs index 6c20f68..ef7db23 100644 --- a/backend/src/analysis.rs +++ b/backend/src/analysis.rs @@ -133,9 +133,17 @@ pub fn analyse_heatmap(input: AnalysisInput) -> std::collections::HashMap u, + None => { + tracing::warn!("Could not find User for Entity: {:?}", entity_id); + return None; + } + }; + + let player = match result.player_info.get(userid) { Some(p) => p, None => { tracing::warn!("Could not find player: {:?}", userid); diff --git a/frontend/src/demo/heatmap.rs b/frontend/src/demo/heatmap.rs index a1f7334..bd6163f 100644 --- a/frontend/src/demo/heatmap.rs +++ b/frontend/src/demo/heatmap.rs @@ -72,7 +72,7 @@ fn heatmap_view(heatmaps: Vec) -> impl lep move || { match value.get() { Some(heatmap) => view! { - + }.into_any(), None => view! {

ERROR

}.into_any(), } diff --git a/frontend/src/main.rs b/frontend/src/main.rs index 1b77a88..89983a0 100644 --- a/frontend/src/main.rs +++ b/frontend/src/main.rs @@ -14,8 +14,6 @@ async fn load_demos() -> Vec { } fn main() { - let async_data = create_resource(|| (), |_| async move { load_demos().await }); - let (upload_demo_read, upload_demo_write) = create_signal(frontend::DemoUploadStatus::Hidden); mount_to_body(move || {