1
0
Fork 0
mirror of https://codeberg.org/demostf/parser.git synced 2026-06-03 10:14:06 +02:00

Fix hardcoded server class IDs

In hindsight, these are obviously different between games and shouldn't be hardcoded

Also clean up main function a bit, since the analyzer already uses packets there's no need to switch between `all`
This commit is contained in:
Yep 2022-12-28 17:56:14 -05:00
commit 138343c251
3 changed files with 156 additions and 170 deletions

View file

@ -38,11 +38,7 @@ fn main() -> Result<(), MainError> {
let (_, state) = parser.parse()?;
println!("{}", serde_json::to_string(&state)?);
} else {
let parser = if all {
DemoParser::new_all_with_analyser(demo.get_stream(), PlayerSummaryAnalyzer::new())
} else {
DemoParser::new_with_analyser(demo.get_stream(), PlayerSummaryAnalyzer::new())
};
let parser = DemoParser::new_with_analyser(demo.get_stream(), PlayerSummaryAnalyzer::new());
let (header, state) = parser.parse()?;
println!("{:?}", header);

View file

@ -58,16 +58,6 @@ impl PartialEq<u16> for ClassId {
}
}
impl ClassId {
pub const fn new(val: u16) -> ClassId {
ClassId(val)
}
pub fn value(&self) -> u16 {
self.0
}
}
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[derive(BitRead, BitWrite, PartialEq, Eq, Hash, Debug, Serialize, Deserialize, Clone, Display)]
pub struct ServerClassName(String);

View file

@ -62,7 +62,6 @@ impl MessageHandler for PlayerSummaryAnalyzer {
fn handle_message(&mut self, message: &Message, tick: DemoTick, parser_state: &ParserState) {
match message {
// Message::GameEvent(message) => self.handle_event(&message.event, tick),
Message::PacketEntities(message) => {
for entity in message.entities.iter() {
self.handle_packet_entity(&entity, parser_state);
@ -127,14 +126,12 @@ impl PlayerSummaryAnalyzer {
fn handle_packet_entity(&mut self, packet: &PacketEntity, parser_state: &ParserState) {
use crate::demo::sendprop::SendPropValue;
/// Data for a particular player
const PLAYER_DATA_CLASS: ClassId = ClassId::new(247);
// println!("Known server classes: {:?}", parser_state.server_classes);
/// Metadata for all players (eg pings and user IDs)
const PLAYER_META_CLASS: ClassId = ClassId::new(249);
match packet.server_class {
PLAYER_DATA_CLASS => {
if let Some(class) = parser_state.server_classes.get(<ClassId as Into<usize>>::into(packet.server_class)) {
// println!("Got a {} data packet: {:?}", class.name, packet);
match class.name.as_str() {
"CTFPlayer" => {
match self.user_id_map.get(&packet.entity_index) {
Some(user_id) => {
let summaries = &mut self.state.player_summaries;
@ -264,7 +261,7 @@ impl PlayerSummaryAnalyzer {
},
}
},
PLAYER_META_CLASS => {
"CTFPlayerResource" => {
// Player summaries - including entity IDs!
// look for props like m_iUserID.<entity_id> = <user_id>
// for example, `m_iUserID.024 = 2523` means entity 24 is user 2523
@ -282,11 +279,14 @@ impl PlayerSummaryAnalyzer {
}
}
},
None => {} // ignore
None => {} // ignore, no property for this entity was included
}
}
},
_ => {} // ignore
_other => {
// Don't care
},
}
}
}