Fix formatting and minor restructuring

Fixed formatting using cargo fmt.
Change some parser structure to reduce code deduplication
This commit is contained in:
Lol3rrr
2024-09-22 20:31:38 +02:00
parent c1e85d77dc
commit 67d33f64c0
6 changed files with 53 additions and 90 deletions

View File

@@ -3,7 +3,11 @@ const DATA: &[u8] = include_bytes!("../testfiles/de_ancient.dem");
fn main() { fn main() {
let container = csdemo::Container::parse(DATA).unwrap(); let container = csdemo::Container::parse(DATA).unwrap();
let output = csdemo::parser::parse(csdemo::FrameIterator::parse(container.inner), csdemo::parser::EntityFilter::all()).unwrap(); let output = csdemo::parser::parse(
csdemo::FrameIterator::parse(container.inner),
csdemo::parser::EntityFilter::all(),
)
.unwrap();
println!("Header: {:?}", output.header); println!("Header: {:?}", output.header);
println!("Players: {:?}", output.player_info); println!("Players: {:?}", output.player_info);

View File

@@ -3,7 +3,11 @@ const DATA: &[u8] = include_bytes!("../testfiles/de_ancient.dem");
fn main() { fn main() {
let container = csdemo::Container::parse(DATA).unwrap(); let container = csdemo::Container::parse(DATA).unwrap();
let output = csdemo::parser::parse(csdemo::FrameIterator::parse(container.inner), csdemo::parser::EntityFilter::disabled()).unwrap(); let output = csdemo::parser::parse(
csdemo::FrameIterator::parse(container.inner),
csdemo::parser::EntityFilter::disabled(),
)
.unwrap();
println!("Header: {:?}", output.header); println!("Header: {:?}", output.header);
println!("Players: {:?}", output.player_info); println!("Players: {:?}", output.player_info);

View File

@@ -39,7 +39,10 @@ impl<'b> Frame<'b> {
Some(self.inner.as_ref()) Some(self.inner.as_ref())
} }
pub fn decompress_with_buf<'s, 'buf>(&'s self, buf: &'b mut Vec<u8>) -> Result<&'buf [u8], ()> where 's: 'buf { pub fn decompress_with_buf<'s, 'buf>(&'s self, buf: &'b mut Vec<u8>) -> Result<&'buf [u8], ()>
where
's: 'buf,
{
if !self.compressed { if !self.compressed {
return Ok(&self.inner); return Ok(&self.inner);
} }
@@ -50,10 +53,12 @@ impl<'b> Frame<'b> {
})?; })?;
buf.resize(uncompressed_len, 0); buf.resize(uncompressed_len, 0);
snap::raw::Decoder::new().decompress(&self.inner, buf.as_mut_slice()).map_err(|e| { snap::raw::Decoder::new()
println!("Decompressing"); .decompress(&self.inner, buf.as_mut_slice())
() .map_err(|e| {
})?; println!("Decompressing");
()
})?;
Ok(buf.as_slice()) Ok(buf.as_slice())
} }

View File

@@ -109,7 +109,9 @@ where
let mut buffer = Vec::new(); let mut buffer = Vec::new();
for frame in frames.into_iter() { for frame in frames.into_iter() {
let data = frame.decompress_with_buf(&mut buffer).map_err(|e| FirstPassError::DecompressFrame)?; let data = frame
.decompress_with_buf(&mut buffer)
.map_err(|e| FirstPassError::DecompressFrame)?;
match frame.cmd { match frame.cmd {
DemoCommand::FileHeader => { DemoCommand::FileHeader => {
@@ -121,8 +123,10 @@ where
file_info = Some(raw); file_info = Some(raw);
} }
DemoCommand::SignonPacket | DemoCommand::Packet => { DemoCommand::SignonPacket | DemoCommand::Packet => {
parse_packet( let raw: crate::csgo_proto::CDemoPacket = prost::Message::decode(data)?;
data,
inner_parse_packet(
&raw,
&mut events, &mut events,
&mut event_mapping, &mut event_mapping,
&mut player_info, &mut player_info,
@@ -135,18 +139,22 @@ where
)?; )?;
} }
DemoCommand::FullPacket => { DemoCommand::FullPacket => {
parse_fullpacket( let packet = parse_fullpacket(data)?;
data,
&mut events, if let Some(packet) = packet {
&mut event_mapping, inner_parse_packet(
&mut player_info, &packet,
&mut entity_ctx, &mut events,
&mut paths, &mut event_mapping,
&mut qf_mapper, &mut player_info,
&mut baselines, &mut entity_ctx,
&prop_controller, &mut paths,
&mut entity_states, &mut qf_mapper,
)?; &mut baselines,
&prop_controller,
&mut entity_states,
)?;
}
} }
// TODO // TODO
DemoCommand::AnimationData => {} DemoCommand::AnimationData => {}
@@ -222,18 +230,7 @@ where
}) })
} }
fn parse_fullpacket( fn parse_fullpacket(data: &[u8]) -> Result<Option<crate::csgo_proto::CDemoPacket>, FirstPassError> {
data: &[u8],
events: &mut Vec<DemoEvent>,
event_mapper: &mut GameEventMapping,
player_info: &mut std::collections::HashMap<UserId, Player>,
entity_ctx: &mut entities::EntityContext,
paths: &mut Paths,
qf_mapper: &mut decoder::QfMapper,
baselines: &mut std::collections::HashMap<u32, Vec<u8>>,
prop_controller: &propcontroller::PropController,
entity_states: &mut Vec<entities::EntityState>,
) -> Result<(), FirstPassError> {
let raw: crate::csgo_proto::CDemoFullPacket = prost::Message::decode(data)?; let raw: crate::csgo_proto::CDemoFullPacket = prost::Message::decode(data)?;
// TODO // TODO
@@ -242,55 +239,7 @@ fn parse_fullpacket(
// dbg!(&item.table_name); // dbg!(&item.table_name);
} }
match raw.packet { Ok(raw.packet)
Some(packet) => {
inner_parse_packet(
&packet,
events,
event_mapper,
player_info,
entity_ctx,
paths,
qf_mapper,
baselines,
prop_controller,
entity_states,
)?;
Ok(())
}
None => Ok(()),
}
}
fn parse_packet(
data: &[u8],
events: &mut Vec<DemoEvent>,
event_mapper: &mut GameEventMapping,
player_info: &mut std::collections::HashMap<UserId, Player>,
entity_ctx: &mut entities::EntityContext,
paths: &mut Paths,
qf_mapper: &mut decoder::QfMapper,
baselines: &mut std::collections::HashMap<u32, Vec<u8>>,
prop_controller: &propcontroller::PropController,
entity_states: &mut Vec<entities::EntityState>,
) -> Result<(), FirstPassError> {
let raw: crate::csgo_proto::CDemoPacket = prost::Message::decode(data)?;
inner_parse_packet(
&raw,
events,
event_mapper,
player_info,
entity_ctx,
paths,
qf_mapper,
baselines,
prop_controller,
entity_states,
)?;
Ok(())
} }
fn inner_parse_packet( fn inner_parse_packet(

View File

@@ -83,9 +83,7 @@ impl EntityContext {
let result = decoder.decode(bitreader, qf_mapper)?; let result = decoder.decode(bitreader, qf_mapper)?;
if let Some(fi) = field_info { if let Some(fi) = field_info {
if let Some(prop_info) = prop_controller if let Some(prop_info) = prop_controller.prop_infos.get(&fi.prop_id) {
.prop_infos.get(&fi.prop_id)
{
fields.push(EntityProp { fields.push(EntityProp {
field_info: fi, field_info: fi,
prop_info: prop_info.clone(), prop_info: prop_info.clone(),

View File

@@ -271,10 +271,13 @@ impl PropController {
} }
fn insert_propinfo(&mut self, prop_name: &str, f: &mut ValueField) { fn insert_propinfo(&mut self, prop_name: &str, f: &mut ValueField) {
self.prop_infos.insert(f.prop_id, PropInfo { self.prop_infos.insert(
id: f.prop_id as u32, f.prop_id,
prop_name: prop_name.into(), PropInfo {
}); id: f.prop_id as u32,
prop_name: prop_name.into(),
},
);
} }
pub fn set_special_ids(&mut self, weap_prop: &str, is_grenade_or_weapon: bool, id: u32) { pub fn set_special_ids(&mut self, weap_prop: &str, is_grenade_or_weapon: bool, id: u32) {