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:
parent
582e8b9b3c
commit
51af06e0be
1 changed files with 9 additions and 21 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue