From 51af06e0bea4f22add272641323e961028b1591c Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 7 Sep 2026 21:41:11 +0100 Subject: [PATCH] reencode: use the handler's table names to find instancebaseline Drops the id tracking. userinfo entries are numeric too, so anything looser than matching the table name would decode one as a baseline. --- src/bin/reencode.rs | 30 +++++++++--------------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/src/bin/reencode.rs b/src/bin/reencode.rs index 053f27d..1b7819e 100644 --- a/src/bin/reencode.rs +++ b/src/bin/reencode.rs @@ -12,6 +12,7 @@ use tf_demo_parser::demo::packet::datatable::{DataTablePacket, SendTable}; use tf_demo_parser::demo::packet::stop::StopPacket; use tf_demo_parser::demo::packet::stringtable::{ExtraData, StringTable, StringTableEntry}; use tf_demo_parser::demo::parser::state::StaticBaseline; +use std::borrow::Cow; use std::collections::HashSet; use tf_demo_parser::demo::packet::{Packet, PacketType}; use tf_demo_parser::demo::parser::{DemoHandler, Encode, RawPacketStream}; @@ -93,7 +94,7 @@ fn main() -> Result<(), MainError> { } for msg in message_packet.messages.iter_mut() { if let Some(baselines) = baselines.as_mut() { - baselines.rewrite_message(msg); + baselines.rewrite_message(msg, &handler.string_table_names); } if strip_pov && let Message::ServerInfo(info) = msg { info.stv = true; @@ -176,10 +177,6 @@ struct Baselines { new: Vec, /// Classes whose props encode differently. The rest are left untouched. affected: HashSet, - /// Ids of the instancebaseline tables. UpdateStringTable names its table - /// by id, in creation order. - baseline_tables: HashSet, - created: u8, } impl Baselines { @@ -207,26 +204,17 @@ impl Baselines { .map(|(id, _)| id as u32) .collect(); - Ok(Some(Baselines { - old, - new, - affected, - baseline_tables: HashSet::new(), - created: 0, - })) + Ok(Some(Baselines { old, new, affected })) } - fn rewrite_message(&mut self, message: &mut Message) { + /// `table_names` is the handler's `string_table_names`, which maps the id + /// an UpdateStringTable carries back to the table it belongs to. + fn rewrite_message(&mut self, message: &mut Message, table_names: &[Cow]) { match message { - Message::CreateStringTable(create) => { - if create.table.name.as_ref() == "instancebaseline" { - self.baseline_tables.insert(self.created); - } - self.created = self.created.wrapping_add(1); - self.rewrite_table(&mut create.table); - } + Message::CreateStringTable(create) => self.rewrite_table(&mut create.table), Message::UpdateStringTable(update) => { - if self.baseline_tables.contains(&update.table_id) { + let name = table_names.get(update.table_id as usize); + if name.is_some_and(|name| name == "instancebaseline") { for (_, entry) in update.entries.iter_mut() { self.rewrite_entry(entry); }