1
0
Fork 0
mirror of https://codeberg.org/demostf/parser.git synced 2026-06-03 10:14:06 +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 bitstream_reader::{BitRead, BitReadSized, LittleEndian};
use crate::{ReadResult, Stream}; use crate::{ReadResult, Stream};
use crate::demo::message::stringtable::log_base2;
#[derive(BitReadSized, Debug)] #[derive(BitReadSized, Debug)]
pub struct ClassInfoEntry { pub struct ClassInfoEntry {
@ -20,12 +21,17 @@ pub struct ClassInfoMessage {
impl BitRead<LittleEndian> for ClassInfoMessage { impl BitRead<LittleEndian> for ClassInfoMessage {
fn read(stream: &mut Stream) -> ReadResult<Self> { fn read(stream: &mut Stream) -> ReadResult<Self> {
let count: u16 = stream.read()?; let count: u16 = stream.read()?;
let create = stream.read()?; let create: bool = stream.read()?;
let mut entries = Vec::with_capacity(count as usize); let entries = if !create {
let bits = 16 - count.leading_zeros(); let mut entries = Vec::with_capacity(count as usize);
for _ in 0..count { let bits = log_base2(count);
entries.push(stream.read_sized(bits as usize)?); for _ in 0..count {
} entries.push(stream.read_sized(bits as usize)?);
}
entries
} else {
Vec::new()
};
Ok(ClassInfoMessage { Ok(ClassInfoMessage {
count, count,

View file

@ -27,6 +27,7 @@ pub mod tempentities;
#[derive(Primitive, Debug)] #[derive(Primitive, Debug)]
pub enum MessageType { pub enum MessageType {
Empty = 0,
File = 2, File = 2,
NetTick = 3, NetTick = 3,
StringCmd = 4, StringCmd = 4,
@ -66,6 +67,7 @@ impl Parse for MessageType {
#[derive(Debug)] #[derive(Debug)]
pub enum Message { pub enum Message {
Empty,
File(FileMessage), File(FileMessage),
NetTick(NetTickMessage), NetTick(NetTickMessage),
StringCmd(StringCmdMessage), StringCmd(StringCmdMessage),
@ -98,7 +100,9 @@ pub enum Message {
impl Parse for Message { impl Parse for Message {
fn parse(stream: &mut Stream, state: &ParserState) -> Result<Self> { fn parse(stream: &mut Stream, state: &ParserState) -> Result<Self> {
let message_type = MessageType::parse(stream, state)?; let message_type = MessageType::parse(stream, state)?;
dbg!(&message_type);
Ok(match message_type { Ok(match message_type {
MessageType::Empty => Message::Empty,
MessageType::File => Message::File(FileMessage::parse(stream, state)?), MessageType::File => Message::File(FileMessage::parse(stream, state)?),
MessageType::NetTick => Message::NetTick(NetTickMessage::parse(stream, state)?), MessageType::NetTick => Message::NetTick(NetTickMessage::parse(stream, state)?),
MessageType::StringCmd => Message::StringCmd(StringCmdMessage::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(); let mut messages: Vec<Message> = Vec::new();
while packet_data.bits_left() > 6 { while packet_data.bits_left() > 6 {
let message = Message::parse(&mut packet_data, state)?; let message = Message::parse(&mut packet_data, state)?;
messages.push(message); match message {
Message::Empty => {}
_ => messages.push(message)
}
} }
let packet = MessagePacket { let packet = MessagePacket {

View file

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