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:
parent
8fba325db8
commit
8183ac5b65
4 changed files with 57 additions and 15 deletions
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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"),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue