mirror of
https://codeberg.org/demostf/parser.git
synced 2026-06-03 18:24:05 +02:00
flatten sendtables in parserstate only when entities are handled
This commit is contained in:
parent
eb93434017
commit
df6374f219
4 changed files with 52 additions and 51 deletions
|
|
@ -65,7 +65,7 @@ impl From<String> for SendTableName {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct ParseSendTable {
|
pub struct ParseSendTable {
|
||||||
pub name: SendTableName,
|
pub name: SendTableName,
|
||||||
pub props: Vec<Rc<SendPropDefinition>>,
|
pub props: Vec<Rc<SendPropDefinition>>,
|
||||||
|
|
@ -207,7 +207,7 @@ pub struct SendTable {
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct DataTablePacket {
|
pub struct DataTablePacket {
|
||||||
pub tick: u32,
|
pub tick: u32,
|
||||||
pub tables: Vec<SendTable>,
|
pub tables: Vec<ParseSendTable>,
|
||||||
pub server_classes: Vec<ServerClass>,
|
pub server_classes: Vec<ServerClass>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -217,30 +217,14 @@ impl Parse for DataTablePacket {
|
||||||
let len = stream.read_int::<usize>(32)?;
|
let len = stream.read_int::<usize>(32)?;
|
||||||
let mut packet_data = stream.read_bits(len * 8)?;
|
let mut packet_data = stream.read_bits(len * 8)?;
|
||||||
|
|
||||||
let mut parse_tables = Vec::new();
|
let mut tables = Vec::new();
|
||||||
let mut table_index = 0;
|
let mut table_index = 0;
|
||||||
while packet_data.read_bool()? {
|
while packet_data.read_bool()? {
|
||||||
let table = ParseSendTable::parse(&mut packet_data, state, table_index)?;
|
let table = ParseSendTable::parse(&mut packet_data, state, table_index)?;
|
||||||
table_index += 1;
|
table_index += 1;
|
||||||
parse_tables.push(table);
|
tables.push(table);
|
||||||
}
|
}
|
||||||
|
|
||||||
let flat_props: Vec<_> = parse_tables
|
|
||||||
.iter()
|
|
||||||
.map(|table| table.flatten_props(&parse_tables))
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
let tables = parse_tables
|
|
||||||
.into_iter()
|
|
||||||
.zip(flat_props.into_iter())
|
|
||||||
.map(|(parse_table, flat)| SendTable {
|
|
||||||
name: parse_table.name,
|
|
||||||
props: parse_table.props,
|
|
||||||
needs_decoder: parse_table.needs_decoder,
|
|
||||||
flattened_props: flat,
|
|
||||||
})
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
let server_class_count = packet_data.read_int(16)?;
|
let server_class_count = packet_data.read_int(16)?;
|
||||||
let server_classes = packet_data.read_sized(server_class_count)?;
|
let server_classes = packet_data.read_sized(server_class_count)?;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
use crate::demo::message::{Message, MessageType};
|
use crate::demo::message::{Message, MessageType};
|
||||||
use crate::demo::packet::datatable::{SendTable, ServerClass};
|
use crate::demo::packet::datatable::{ParseSendTable, SendTable, ServerClass};
|
||||||
use crate::demo::packet::stringtable::{StringTable, StringTableEntry};
|
use crate::demo::packet::stringtable::{StringTable, StringTableEntry};
|
||||||
use crate::demo::packet::Packet;
|
use crate::demo::packet::Packet;
|
||||||
use crate::demo::parser::analyser::Analyser;
|
use crate::demo::parser::analyser::Analyser;
|
||||||
|
|
@ -15,7 +15,7 @@ pub trait MessageHandler {
|
||||||
|
|
||||||
fn handle_string_entry(&mut self, table: &String, index: usize, entries: &StringTableEntry) {}
|
fn handle_string_entry(&mut self, table: &String, index: usize, entries: &StringTableEntry) {}
|
||||||
|
|
||||||
fn handle_data_tables(&mut self, tables: &[SendTable]) {}
|
fn handle_data_tables(&mut self, tables: &[ParseSendTable]) {}
|
||||||
|
|
||||||
fn get_output(self, state: ParserState) -> Self::Output;
|
fn get_output(self, state: ParserState) -> Self::Output;
|
||||||
}
|
}
|
||||||
|
|
@ -99,7 +99,11 @@ impl<T: MessageHandler> DemoHandler<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_data_table(&mut self, send_tables: Vec<SendTable>, server_classes: Vec<ServerClass>) {
|
fn handle_data_table(
|
||||||
|
&mut self,
|
||||||
|
send_tables: Vec<ParseSendTable>,
|
||||||
|
server_classes: Vec<ServerClass>,
|
||||||
|
) {
|
||||||
self.analyser.handle_data_tables(&send_tables);
|
self.analyser.handle_data_tables(&send_tables);
|
||||||
self.state_handler
|
self.state_handler
|
||||||
.handle_data_table(send_tables, server_classes);
|
.handle_data_table(send_tables, server_classes);
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,9 @@ use crate::demo::message::gameevent::GameEventTypeId;
|
||||||
use crate::demo::message::packetentities::{EntityId, PacketEntitiesMessage, PVS};
|
use crate::demo::message::packetentities::{EntityId, PacketEntitiesMessage, PVS};
|
||||||
use crate::demo::message::stringtable::StringTableMeta;
|
use crate::demo::message::stringtable::StringTableMeta;
|
||||||
use crate::demo::message::{Message, MessageType};
|
use crate::demo::message::{Message, MessageType};
|
||||||
use crate::demo::packet::datatable::{ClassId, SendTable, SendTableName, ServerClass};
|
use crate::demo::packet::datatable::{
|
||||||
|
ClassId, ParseSendTable, SendTable, SendTableName, ServerClass,
|
||||||
|
};
|
||||||
use crate::demo::packet::stringtable::StringTableEntry;
|
use crate::demo::packet::stringtable::StringTableEntry;
|
||||||
use crate::demo::parser::analyser::Analyser;
|
use crate::demo::parser::analyser::Analyser;
|
||||||
use crate::demo::parser::handler::MessageHandler;
|
use crate::demo::parser::handler::MessageHandler;
|
||||||
|
|
@ -93,9 +95,26 @@ impl ParserState {
|
||||||
|
|
||||||
pub fn handle_data_table(
|
pub fn handle_data_table(
|
||||||
&mut self,
|
&mut self,
|
||||||
send_tables: Vec<SendTable>,
|
parse_tables: Vec<ParseSendTable>,
|
||||||
server_classes: Vec<ServerClass>,
|
server_classes: Vec<ServerClass>,
|
||||||
) {
|
) {
|
||||||
|
if self.handle_entities {
|
||||||
|
let flat_props: Vec<_> = parse_tables
|
||||||
|
.iter()
|
||||||
|
.map(|table| table.flatten_props(&parse_tables))
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let send_tables: Vec<_> = parse_tables
|
||||||
|
.into_iter()
|
||||||
|
.zip(flat_props.into_iter())
|
||||||
|
.map(|(parse_table, flat)| SendTable {
|
||||||
|
name: parse_table.name,
|
||||||
|
props: parse_table.props,
|
||||||
|
needs_decoder: parse_table.needs_decoder,
|
||||||
|
flattened_props: flat,
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
let mut send_tables: HashMap<SendTableName, SendTable> = send_tables
|
let mut send_tables: HashMap<SendTableName, SendTable> = send_tables
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|table| (table.name.clone(), table))
|
.map(|table| (table.name.clone(), table))
|
||||||
|
|
@ -116,6 +135,7 @@ impl ParserState {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn handle_string_table_meta(&mut self, table: StringTableMeta) {
|
pub fn handle_string_table_meta(&mut self, table: StringTableMeta) {
|
||||||
self.string_tables.push(table);
|
self.string_tables.push(table);
|
||||||
|
|
|
||||||
|
|
@ -30,15 +30,8 @@ impl MessageHandler for SendPropAnalyser {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_data_tables(&mut self, tables: &[SendTable]) {
|
fn handle_data_tables(&mut self, tables: &[ParseSendTable]) {
|
||||||
self.tables = tables
|
self.tables = tables.to_vec()
|
||||||
.iter()
|
|
||||||
.map(|v| ParseSendTable {
|
|
||||||
name: v.name.clone(),
|
|
||||||
props: v.props.clone(),
|
|
||||||
needs_decoder: v.needs_decoder,
|
|
||||||
})
|
|
||||||
.collect()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_output(self, state: ParserState) -> Self::Output {
|
fn get_output(self, state: ParserState) -> Self::Output {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue