Add ancient test file and add store file information at the end of the game

This commit is contained in:
Lol3rrr
2024-09-15 15:27:47 +02:00
parent 52baa392fa
commit c479fb5b69
3 changed files with 50 additions and 7 deletions

View File

@@ -27,11 +27,18 @@ impl From<crate::game_event::ParseGameEventError> for FirstPassError {
} }
} }
#[derive(Debug)]
pub struct Player {
pub xuid: u64,
pub name: String,
}
#[derive(Debug)] #[derive(Debug)]
pub struct FirstPassOutput { pub struct FirstPassOutput {
pub header: crate::csgo_proto::CDemoFileHeader, pub header: crate::csgo_proto::CDemoFileHeader,
pub info: crate::csgo_proto::CDemoFileInfo, pub info: crate::csgo_proto::CDemoFileInfo,
pub events: Vec<DemoEvent>, pub events: Vec<DemoEvent>,
pub player_info: std::collections::HashMap<i32, Player>,
} }
#[derive(Debug)] #[derive(Debug)]
@@ -50,6 +57,7 @@ where
let mut event_mapping = GameEventMapping { let mut event_mapping = GameEventMapping {
mapping: std::collections::HashMap::new(), mapping: std::collections::HashMap::new(),
}; };
let mut player_info = std::collections::HashMap::new();
for mut frame in frames.into_iter() { for mut frame in frames.into_iter() {
frame frame
@@ -67,10 +75,10 @@ where
file_info = Some(raw); file_info = Some(raw);
} }
DemoCommand::SignonPacket | DemoCommand::Packet => { DemoCommand::SignonPacket | DemoCommand::Packet => {
parse_packet(data, &mut events, &mut event_mapping)?; parse_packet(data, &mut events, &mut event_mapping, &mut player_info)?;
} }
DemoCommand::FullPacket => { DemoCommand::FullPacket => {
parse_fullpacket(data, &mut events, &mut event_mapping)?; parse_fullpacket(data, &mut events, &mut event_mapping, &mut player_info)?;
} }
_ => {} _ => {}
} }
@@ -79,13 +87,14 @@ where
let header = header.ok_or(FirstPassError::MissingFileHeader)?; let header = header.ok_or(FirstPassError::MissingFileHeader)?;
let info = file_info.ok_or(FirstPassError::MissingFileInfo)?; let info = file_info.ok_or(FirstPassError::MissingFileInfo)?;
Ok(FirstPassOutput { header, info, events }) Ok(FirstPassOutput { header, info, events, player_info })
} }
fn parse_fullpacket( fn parse_fullpacket(
data: &[u8], data: &[u8],
events: &mut Vec<DemoEvent>, events: &mut Vec<DemoEvent>,
event_mapper: &mut GameEventMapping, event_mapper: &mut GameEventMapping,
player_info: &mut std::collections::HashMap<i32, Player>,
) -> Result<(), FirstPassError> { ) -> Result<(), FirstPassError> {
let raw: crate::csgo_proto::CDemoFullPacket = prost::Message::decode(data)?; let raw: crate::csgo_proto::CDemoFullPacket = prost::Message::decode(data)?;
@@ -94,7 +103,7 @@ fn parse_fullpacket(
match raw.packet { match raw.packet {
Some(packet) => { Some(packet) => {
inner_parse_packet(&packet, events, event_mapper)?; inner_parse_packet(&packet, events, event_mapper, player_info)?;
Ok(()) Ok(())
} }
@@ -106,10 +115,11 @@ fn parse_packet(
data: &[u8], data: &[u8],
events: &mut Vec<DemoEvent>, events: &mut Vec<DemoEvent>,
event_mapper: &mut GameEventMapping, event_mapper: &mut GameEventMapping,
player_info: &mut std::collections::HashMap<i32, Player>,
) -> Result<(), FirstPassError> { ) -> Result<(), FirstPassError> {
let raw: crate::csgo_proto::CDemoPacket = prost::Message::decode(data)?; let raw: crate::csgo_proto::CDemoPacket = prost::Message::decode(data)?;
inner_parse_packet(&raw, events, event_mapper)?; inner_parse_packet(&raw, events, event_mapper, player_info)?;
Ok(()) Ok(())
} }
@@ -118,6 +128,7 @@ fn inner_parse_packet(
raw: &crate::csgo_proto::CDemoPacket, raw: &crate::csgo_proto::CDemoPacket,
events: &mut Vec<DemoEvent>, events: &mut Vec<DemoEvent>,
event_mapper: &mut GameEventMapping, event_mapper: &mut GameEventMapping,
player_info: &mut std::collections::HashMap<i32, Player>,
) -> Result<(), FirstPassError> { ) -> Result<(), FirstPassError> {
let mut bitreader = crate::bitreader::Bitreader::new(raw.data()); let mut bitreader = crate::bitreader::Bitreader::new(raw.data());
@@ -155,7 +166,10 @@ fn inner_parse_packet(
events.push(DemoEvent::ServerInfo(raw)); events.push(DemoEvent::ServerInfo(raw));
} }
crate::netmessagetypes::NetmessageType::net_SignonState => {} crate::netmessagetypes::NetmessageType::net_SignonState => {
let raw: crate::csgo_proto::CnetMsgSignonState = prost::Message::decode(msg_bytes.as_slice())?;
dbg!(raw);
}
crate::netmessagetypes::NetmessageType::net_Tick => { crate::netmessagetypes::NetmessageType::net_Tick => {
let raw: crate::csgo_proto::CnetMsgTick = let raw: crate::csgo_proto::CnetMsgTick =
prost::Message::decode(msg_bytes.as_slice())?; prost::Message::decode(msg_bytes.as_slice())?;
@@ -181,6 +195,7 @@ fn inner_parse_packet(
match crate::game_event::EVENT_PARSERS.get(&name) { match crate::game_event::EVENT_PARSERS.get(&name) {
Some(parser) => { Some(parser) => {
let parsed = parser.parse(keys.as_slice(), raw.clone())?; let parsed = parser.parse(keys.as_slice(), raw.clone())?;
events.push(DemoEvent::GameEvent(parsed)); events.push(DemoEvent::GameEvent(parsed));
} }
None => { None => {
@@ -212,7 +227,16 @@ fn inner_parse_packet(
crate::netmessagetypes::NetmessageType::TE_WorldDecal => {} crate::netmessagetypes::NetmessageType::TE_WorldDecal => {}
crate::netmessagetypes::NetmessageType::TE_EffectDispatch => {} crate::netmessagetypes::NetmessageType::TE_EffectDispatch => {}
crate::netmessagetypes::NetmessageType::CS_UM_PlayerStatsUpdate => {} crate::netmessagetypes::NetmessageType::CS_UM_PlayerStatsUpdate => {}
crate::netmessagetypes::NetmessageType::CS_UM_EndOfMatchAllPlayersData => {} crate::netmessagetypes::NetmessageType::CS_UM_EndOfMatchAllPlayersData => {
let raw: crate::csgo_proto::CcsUsrMsgEndOfMatchAllPlayersData = prost::Message::decode(msg_bytes.as_slice())?;
for data in raw.allplayerdata {
player_info.insert(data.slot(), Player {
name: data.name.unwrap(),
xuid: data.xuid.unwrap(),
});
}
}
crate::netmessagetypes::NetmessageType::TE_PhysicsProp => {} crate::netmessagetypes::NetmessageType::TE_PhysicsProp => {}
crate::netmessagetypes::NetmessageType::UM_TextMsg => {} crate::netmessagetypes::NetmessageType::UM_TextMsg => {}
crate::netmessagetypes::NetmessageType::CS_UM_VoteFailed => {} crate::netmessagetypes::NetmessageType::CS_UM_VoteFailed => {}

BIN
testfiles/de_ancient.dem LFS Normal file

Binary file not shown.

View File

@@ -13,3 +13,19 @@ fn mirage_1() {
todo!() todo!()
} }
#[test]
fn ancient_1() {
let content = std::fs::read("testfiles/de_ancient.dem").unwrap();
let container = csdemo::Container::parse(&content).unwrap();
let frame_iter = csdemo::FrameIterator::parse(container.inner);
assert_eq!(116676, frame_iter.count());
let output = csdemo::parser::parse(csdemo::FrameIterator::parse(container.inner)).unwrap();
assert_eq!("de_ancient", output.header.map_name());
todo!()
}