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

fix classinfo

This commit is contained in:
Robin Appelman 2019-03-02 19:00:08 +01:00
commit 21a2e09030
4 changed files with 22 additions and 9 deletions

View file

@ -1,6 +1,7 @@
use bitstream_reader::{BitRead, BitReadSized, LittleEndian};
use crate::{ReadResult, Stream};
use crate::demo::message::stringtable::log_base2;
#[derive(BitReadSized, Debug)]
pub struct ClassInfoEntry {
@ -20,12 +21,17 @@ pub struct ClassInfoMessage {
impl BitRead<LittleEndian> for ClassInfoMessage {
fn read(stream: &mut Stream) -> ReadResult<Self> {
let count: u16 = stream.read()?;
let create = stream.read()?;
let mut entries = Vec::with_capacity(count as usize);
let bits = 16 - count.leading_zeros();
for _ in 0..count {
entries.push(stream.read_sized(bits as usize)?);
}
let create: bool = stream.read()?;
let entries = if !create {
let mut entries = Vec::with_capacity(count as usize);
let bits = log_base2(count);
for _ in 0..count {
entries.push(stream.read_sized(bits as usize)?);
}
entries
} else {
Vec::new()
};
Ok(ClassInfoMessage {
count,

View file

@ -27,6 +27,7 @@ pub mod tempentities;
#[derive(Primitive, Debug)]
pub enum MessageType {
Empty = 0,
File = 2,
NetTick = 3,
StringCmd = 4,
@ -66,6 +67,7 @@ impl Parse for MessageType {
#[derive(Debug)]
pub enum Message {
Empty,
File(FileMessage),
NetTick(NetTickMessage),
StringCmd(StringCmdMessage),
@ -98,7 +100,9 @@ pub enum Message {
impl Parse for Message {
fn parse(stream: &mut Stream, state: &ParserState) -> Result<Self> {
let message_type = MessageType::parse(stream, state)?;
dbg!(&message_type);
Ok(match message_type {
MessageType::Empty => Message::Empty,
MessageType::File => Message::File(FileMessage::parse(stream, state)?),
MessageType::NetTick => Message::NetTick(NetTickMessage::parse(stream, state)?),
MessageType::StringCmd => Message::StringCmd(StringCmdMessage::parse(stream, state)?),

View file

@ -34,7 +34,10 @@ impl Parse for MessagePacket {
let mut messages: Vec<Message> = Vec::new();
while packet_data.bits_left() > 6 {
let message = Message::parse(&mut packet_data, state)?;
messages.push(message);
match message {
Message::Empty => {}
_ => messages.push(message)
}
}
let packet = MessagePacket {

View file

@ -75,10 +75,10 @@ pub struct StringTableEntry {
impl fmt::Debug for StringTableEntry {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match &self.extra_data {
None => write!(f, "StringTableEntry {{ text: {} }}", self.text),
None => write!(f, "StringTableEntry {{ text: \"{}\" }}", self.text),
Some(extra_data) => write!(
f,
"StringTableEntry{{ text: {} extra_data: {} bits }}",
"StringTableEntry{{ text: \"{}\" extra_data: {} bits }}",
self.text, extra_data.len
),
}