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::stop::StopPacket;
use tf_demo_parser::demo::packet::stringtable::{ExtraData, StringTable, StringTableEntry}; use tf_demo_parser::demo::packet::stringtable::{ExtraData, StringTable, StringTableEntry};
use tf_demo_parser::demo::parser::state::StaticBaseline; use tf_demo_parser::demo::parser::state::StaticBaseline;
use std::borrow::Cow;
use std::collections::HashSet; use std::collections::HashSet;
use tf_demo_parser::demo::packet::{Packet, PacketType}; use tf_demo_parser::demo::packet::{Packet, PacketType};
use tf_demo_parser::demo::parser::{DemoHandler, Encode, RawPacketStream}; 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() { for msg in message_packet.messages.iter_mut() {
if let Some(baselines) = baselines.as_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 { if strip_pov && let Message::ServerInfo(info) = msg {
info.stv = true; info.stv = true;
@ -176,10 +177,6 @@ struct Baselines {
new: Vec<SendTable>, new: Vec<SendTable>,
/// Classes whose props encode differently. The rest are left untouched. /// Classes whose props encode differently. The rest are left untouched.
affected: HashSet<u32>, 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 { impl Baselines {
@ -207,26 +204,17 @@ impl Baselines {
.map(|(id, _)| id as u32) .map(|(id, _)| id as u32)
.collect(); .collect();
Ok(Some(Baselines { Ok(Some(Baselines { old, new, affected }))
old,
new,
affected,
baseline_tables: HashSet::new(),
created: 0,
}))
} }
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 { match message {
Message::CreateStringTable(create) => { Message::CreateStringTable(create) => self.rewrite_table(&mut create.table),
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::UpdateStringTable(update) => { 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() { for (_, entry) in update.entries.iter_mut() {
self.rewrite_entry(entry); self.rewrite_entry(entry);
} }