1
0
Fork 0
mirror of https://codeberg.org/demostf/parser.git synced 2026-10-01 08:44:05 +02:00

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.
This commit is contained in:
Peter 2026-09-07 21:41:11 +01:00
commit 51af06e0be

View file

@ -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<SendTable>,
/// Classes whose props encode differently. The rest are left untouched.
affected: HashSet<u32>,
/// Ids of the instancebaseline tables. UpdateStringTable names its table
/// by id, in creation order.
baseline_tables: HashSet<u8>,
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<str>]) {
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);
}