1
0
Fork 0
mirror of https://codeberg.org/demostf/parser.git synced 2026-06-03 18:24:05 +02:00

more state updates

This commit is contained in:
Robin Appelman 2019-03-02 22:29:02 +01:00
commit 8183ac5b65
4 changed files with 57 additions and 15 deletions

View file

@ -5,24 +5,24 @@ use crate::{Parse, ParseError, ParserState, Result, Stream};
#[derive(BitRead, Debug)] #[derive(BitRead, Debug)]
pub struct ServerClass { pub struct ServerClass {
id: u16, pub id: u16,
name: String, pub name: String,
data_table: String, pub data_table: String,
} }
#[derive(Debug)] #[derive(Debug)]
pub struct SendTable { pub struct SendTable {
name: String, pub name: String,
props: Vec<SendPropDefinition>, pub props: Vec<SendPropDefinition>,
needs_decoder: bool, pub needs_decoder: bool,
flattened_props: Option<Vec<SendPropDefinition>>, pub flattened_props: Option<Vec<SendPropDefinition>>,
} }
#[derive(Debug)] #[derive(Debug)]
pub struct DataTablePacket { pub struct DataTablePacket {
tick: u32, pub tick: u32,
tables: Vec<SendTable>, pub tables: Vec<SendTable>,
server_classes: Vec<ServerClass>, pub server_classes: Vec<ServerClass>,
} }
impl Parse for DataTablePacket { impl Parse for DataTablePacket {

View file

@ -87,8 +87,8 @@ impl fmt::Debug for StringTableEntry {
#[derive(Debug)] #[derive(Debug)]
pub struct StringTablePacket { pub struct StringTablePacket {
tick: u32, pub tick: u32,
tables: Vec<StringTable>, pub tables: Vec<StringTable>,
} }
impl Parse for StringTablePacket { impl Parse for StringTablePacket {

View file

@ -2,5 +2,5 @@ use bitstream_reader::BitRead;
#[derive(BitRead, Debug)] #[derive(BitRead, Debug)]
pub struct SyncTickPacket { pub struct SyncTickPacket {
tick: u32, pub tick: u32,
} }

View file

@ -6,13 +6,13 @@ use crate::demo::message::Message;
use crate::demo::message::packetentities::EntityId; use crate::demo::message::packetentities::EntityId;
use crate::demo::packet::datatable::{SendTable, ServerClass}; use crate::demo::packet::datatable::{SendTable, ServerClass};
use crate::demo::packet::Packet; use crate::demo::packet::Packet;
use crate::demo::packet::stringtable::StringTable; use crate::demo::packet::stringtable::{StringTable, StringTableEntry};
use crate::demo::sendprop::SendProp; use crate::demo::sendprop::SendProp;
use crate::Stream; use crate::Stream;
#[derive(Default, Debug)] #[derive(Default, Debug)]
pub struct ParserState { pub struct ParserState {
pub version: u32, pub version: u16,
pub static_baselines: HashMap<u32, StaticBaseline>, pub static_baselines: HashMap<u32, StaticBaseline>,
pub event_definitions: HashMap<GameEventType, GameEventDefinition>, pub event_definitions: HashMap<GameEventType, GameEventDefinition>,
pub string_tables: Vec<StringTable>, pub string_tables: Vec<StringTable>,
@ -21,6 +21,7 @@ pub struct ParserState {
pub server_classes: Vec<ServerClass>, pub server_classes: Vec<ServerClass>,
pub instance_baselines: [HashMap<EntityId, Vec<SendProp>>; 2], pub instance_baselines: [HashMap<EntityId, Vec<SendProp>>; 2],
pub tick: u32, pub tick: u32,
pub game: String,
} }
#[derive(Debug)] #[derive(Debug)]
@ -42,16 +43,57 @@ impl ParserState {
self.handle_message(message); self.handle_message(message);
} }
} }
Packet::DataTables(packet) => {
if self.send_tables.len() > 0 {
unreachable!("overwriting tables");
}
for table in packet.tables {
self.send_tables.insert(table.name.clone(), table);
}
self.server_classes = packet.server_classes;
}
Packet::StringTables(packet) => {
for table in packet.tables {
self.handle_table(table);
}
}
_ => {} _ => {}
} }
} }
fn handle_message(&mut self, message: Message) { fn handle_message(&mut self, message: Message) {
match message { match message {
Message::NetTick(message) => self.tick = message.tick,
Message::ServerInfo(message) => {
self.version = message.version;
self.game = message.game;
}
Message::GameEventList(message) => { Message::GameEventList(message) => {
self.event_definitions = message.event_list; self.event_definitions = message.event_list;
} }
Message::CreateStringTable(message) => {
self.handle_table(message.table);
}
Message::UpdateStringTable(message) => {
self.handle_table_update(message.table_id, message.entries);
}
_ => {} _ => {}
} }
} }
fn handle_table(&mut self, table: StringTable) {
self.string_tables.push(table);
}
fn handle_table_update(&mut self, table_id: u8, entries: HashMap<u16, StringTableEntry>) {
let mut table = self.string_tables.get_mut(table_id as usize);
match table {
Some(table) => {
for (index, entry) in entries {
table.entries.insert(index as usize, entry);
}
}
_ => unreachable!("trying to update non existing table"),
}
}
} }