1
0
Fork 0
mirror of https://codeberg.org/demostf/parser.git synced 2026-06-03 18:24:05 +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()?; let (_, state) = parser.parse()?;
println!("{}", serde_json::to_string(&state)?); println!("{}", serde_json::to_string(&state)?);
} else { } else {
let parser = if all { let parser = DemoParser::new_with_analyser(demo.get_stream(), PlayerSummaryAnalyzer::new());
DemoParser::new_all_with_analyser(demo.get_stream(), PlayerSummaryAnalyzer::new())
} else {
DemoParser::new_with_analyser(demo.get_stream(), PlayerSummaryAnalyzer::new())
};
let (header, state) = parser.parse()?; let (header, state) = parser.parse()?;
println!("{:?}", header); 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))] #[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[derive(BitRead, BitWrite, PartialEq, Eq, Hash, Debug, Serialize, Deserialize, Clone, Display)] #[derive(BitRead, BitWrite, PartialEq, Eq, Hash, Debug, Serialize, Deserialize, Clone, Display)]
pub struct ServerClassName(String); 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) { fn handle_message(&mut self, message: &Message, tick: DemoTick, parser_state: &ParserState) {
match message { match message {
// Message::GameEvent(message) => self.handle_event(&message.event, tick),
Message::PacketEntities(message) => { Message::PacketEntities(message) => {
for entity in message.entities.iter() { for entity in message.entities.iter() {
self.handle_packet_entity(&entity, parser_state); self.handle_packet_entity(&entity, parser_state);
@ -127,14 +126,12 @@ impl PlayerSummaryAnalyzer {
fn handle_packet_entity(&mut self, packet: &PacketEntity, parser_state: &ParserState) { fn handle_packet_entity(&mut self, packet: &PacketEntity, parser_state: &ParserState) {
use crate::demo::sendprop::SendPropValue; use crate::demo::sendprop::SendPropValue;
/// Data for a particular player // println!("Known server classes: {:?}", parser_state.server_classes);
const PLAYER_DATA_CLASS: ClassId = ClassId::new(247);
/// Metadata for all players (eg pings and user IDs) if let Some(class) = parser_state.server_classes.get(<ClassId as Into<usize>>::into(packet.server_class)) {
const PLAYER_META_CLASS: ClassId = ClassId::new(249); // println!("Got a {} data packet: {:?}", class.name, packet);
match class.name.as_str() {
match packet.server_class { "CTFPlayer" => {
PLAYER_DATA_CLASS => {
match self.user_id_map.get(&packet.entity_index) { match self.user_id_map.get(&packet.entity_index) {
Some(user_id) => { Some(user_id) => {
let summaries = &mut self.state.player_summaries; let summaries = &mut self.state.player_summaries;
@ -264,7 +261,7 @@ impl PlayerSummaryAnalyzer {
}, },
} }
}, },
PLAYER_META_CLASS => { "CTFPlayerResource" => {
// Player summaries - including entity IDs! // Player summaries - including entity IDs!
// look for props like m_iUserID.<entity_id> = <user_id> // look for props like m_iUserID.<entity_id> = <user_id>
// for example, `m_iUserID.024 = 2523` means entity 24 is user 2523 // 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
},
}
} }
} }