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

fix tempentities for protocol version 23

This commit is contained in:
Robin Appelman 2021-07-23 17:20:04 +02:00
commit 3055242fd9
10 changed files with 85 additions and 65 deletions

View file

@ -108,7 +108,7 @@ fn test_game_event_roundtrip() {
}
impl ParseBitSkip<'_> for GameEventMessage {
fn parse_skip(stream: &mut Stream) -> Result<()> {
fn parse_skip(stream: &mut Stream, _state: &ParserState) -> Result<()> {
let length: u16 = stream.read_sized(11)?;
stream.skip_bits(length as usize).map_err(ParseError::from)
}

View file

@ -193,36 +193,40 @@ impl<'a> Message<'a> {
})
}
pub fn skip_type(message_type: MessageType, stream: &mut Stream) -> Result<()> {
pub fn skip_type(
message_type: MessageType,
stream: &mut Stream,
state: &ParserState,
) -> Result<()> {
match message_type {
MessageType::Empty => Ok(()),
MessageType::File => FileMessage::parse_skip(stream),
MessageType::NetTick => NetTickMessage::parse_skip(stream),
MessageType::StringCmd => StringCmdMessage::parse_skip(stream),
MessageType::SetConVar => SetConVarMessage::parse_skip(stream),
MessageType::SigOnState => SignOnStateMessage::parse_skip(stream),
MessageType::Print => PrintMessage::parse_skip(stream),
MessageType::ServerInfo => ServerInfoMessage::parse_skip(stream),
MessageType::ClassInfo => ClassInfoMessage::parse_skip(stream),
MessageType::SetPause => SetPauseMessage::parse_skip(stream),
MessageType::CreateStringTable => CreateStringTableMessage::parse_skip(stream),
MessageType::UpdateStringTable => UpdateStringTableMessage::parse_skip(stream),
MessageType::VoiceInit => VoiceInitMessage::parse_skip(stream),
MessageType::VoiceData => VoiceDataMessage::parse_skip(stream),
MessageType::ParseSounds => ParseSoundsMessage::parse_skip(stream),
MessageType::SetView => SetViewMessage::parse_skip(stream),
MessageType::FixAngle => FixAngleMessage::parse_skip(stream),
MessageType::BspDecal => BSPDecalMessage::parse_skip(stream),
MessageType::UserMessage => UserMessage::parse_skip(stream),
MessageType::EntityMessage => EntityMessage::parse_skip(stream),
MessageType::GameEvent => GameEventMessage::parse_skip(stream),
MessageType::PacketEntities => PacketEntitiesMessage::parse_skip(stream),
MessageType::TempEntities => TempEntitiesMessage::parse_skip(stream),
MessageType::PreFetch => PreFetchMessage::parse_skip(stream),
MessageType::Menu => MenuMessage::parse_skip(stream),
MessageType::GameEventList => GameEventListMessage::parse_skip(stream),
MessageType::GetCvarValue => GetCvarValueMessage::parse_skip(stream),
MessageType::CmdKeyValues => CmdKeyValuesMessage::parse_skip(stream),
MessageType::File => FileMessage::parse_skip(stream, state),
MessageType::NetTick => NetTickMessage::parse_skip(stream, state),
MessageType::StringCmd => StringCmdMessage::parse_skip(stream, state),
MessageType::SetConVar => SetConVarMessage::parse_skip(stream, state),
MessageType::SigOnState => SignOnStateMessage::parse_skip(stream, state),
MessageType::Print => PrintMessage::parse_skip(stream, state),
MessageType::ServerInfo => ServerInfoMessage::parse_skip(stream, state),
MessageType::ClassInfo => ClassInfoMessage::parse_skip(stream, state),
MessageType::SetPause => SetPauseMessage::parse_skip(stream, state),
MessageType::CreateStringTable => CreateStringTableMessage::parse_skip(stream, state),
MessageType::UpdateStringTable => UpdateStringTableMessage::parse_skip(stream, state),
MessageType::VoiceInit => VoiceInitMessage::parse_skip(stream, state),
MessageType::VoiceData => VoiceDataMessage::parse_skip(stream, state),
MessageType::ParseSounds => ParseSoundsMessage::parse_skip(stream, state),
MessageType::SetView => SetViewMessage::parse_skip(stream, state),
MessageType::FixAngle => FixAngleMessage::parse_skip(stream, state),
MessageType::BspDecal => BSPDecalMessage::parse_skip(stream, state),
MessageType::UserMessage => UserMessage::parse_skip(stream, state),
MessageType::EntityMessage => EntityMessage::parse_skip(stream, state),
MessageType::GameEvent => GameEventMessage::parse_skip(stream, state),
MessageType::PacketEntities => PacketEntitiesMessage::parse_skip(stream, state),
MessageType::TempEntities => TempEntitiesMessage::parse_skip(stream, state),
MessageType::PreFetch => PreFetchMessage::parse_skip(stream, state),
MessageType::Menu => MenuMessage::parse_skip(stream, state),
MessageType::GameEventList => GameEventListMessage::parse_skip(stream, state),
MessageType::GetCvarValue => GetCvarValueMessage::parse_skip(stream, state),
MessageType::CmdKeyValues => CmdKeyValuesMessage::parse_skip(stream, state),
}
}
}

View file

@ -439,7 +439,7 @@ impl PacketEntitiesMessage {
}
impl ParseBitSkip<'_> for PacketEntitiesMessage {
fn parse_skip(stream: &mut Stream) -> Result<()> {
fn parse_skip(stream: &mut Stream, _state: &ParserState) -> Result<()> {
stream.skip_bits(11)?;
if stream.read()? {
stream.skip_bits(32)?;

View file

@ -133,12 +133,16 @@ impl<'a> Parse<'a> for CreateStringTableMessage<'a> {
}
impl<'a> ParseBitSkip<'a> for CreateStringTableMessage<'a> {
fn parse_skip(stream: &mut Stream<'a>) -> Result<()> {
fn parse_skip(stream: &mut Stream<'a>, state: &ParserState) -> Result<()> {
let _: String = stream.read()?;
let max_entries: u16 = stream.read()?;
let encode_bits = log_base2(max_entries);
let _: u16 = stream.read_sized(encode_bits as usize + 1)?;
let length = read_var_int(stream)?;
let length = if state.protocol_version > 23 {
read_var_int(stream)?
} else {
stream.read_sized(20)?
};
let _: Option<FixedUserDataSize> = stream.read()?;
@ -263,7 +267,7 @@ impl<'a> Parse<'a> for UpdateStringTableMessage<'a> {
}
impl<'a> ParseBitSkip<'a> for UpdateStringTableMessage<'a> {
fn parse_skip(stream: &mut Stream<'a>) -> Result<()> {
fn parse_skip(stream: &mut Stream<'a>, _state: &ParserState) -> Result<()> {
let _: u8 = stream.read_sized(5)?;
let _: u16 = if stream.read()? { stream.read()? } else { 1 };

View file

@ -1,9 +1,11 @@
use crate::{ReadResult, Stream};
use crate::{Parse, ParserState, ReadResult, Stream};
use super::packetentities::PacketEntity;
use super::stringtable::read_var_int;
use crate::demo::message::stringtable::write_var_int;
use bitbuffer::{BitRead, BitWrite, BitWriteStream, LittleEndian};
use crate::demo::parser::ParseBitSkip;
use crate::Result;
use bitbuffer::{BitWrite, BitWriteStream, LittleEndian};
#[derive(Debug, PartialEq)]
pub struct TempEntitiesMessage<'a> {
@ -12,10 +14,14 @@ pub struct TempEntitiesMessage<'a> {
pub entities: Vec<PacketEntity>,
}
impl<'a> BitRead<'a, LittleEndian> for TempEntitiesMessage<'a> {
fn read(stream: &mut Stream<'a>) -> ReadResult<Self> {
impl<'a> Parse<'a> for TempEntitiesMessage<'a> {
fn parse(stream: &mut Stream<'a>, state: &ParserState) -> Result<Self> {
let count: u8 = stream.read()?;
let length = read_var_int(stream)?;
let length = if state.protocol_version > 23 {
read_var_int(stream)?
} else {
stream.read_sized(17)?
};
let data = stream.read_bits(length as usize)?;
Ok(TempEntitiesMessage {
@ -24,11 +30,18 @@ impl<'a> BitRead<'a, LittleEndian> for TempEntitiesMessage<'a> {
entities: Vec::new(),
})
}
}
fn skip(stream: &mut Stream) -> ReadResult<()> {
impl<'a> ParseBitSkip<'a> for TempEntitiesMessage<'a> {
fn parse_skip(stream: &mut Stream<'a>, state: &ParserState) -> Result<()> {
let _: u8 = stream.read()?;
let length = read_var_int(stream)?;
stream.skip_bits(length as usize)
let length = if state.protocol_version > 23 {
read_var_int(stream)?
} else {
stream.read_sized(17)?
};
stream.skip_bits(length as usize)?;
Ok(())
}
}

View file

@ -124,7 +124,7 @@ impl<'a> Parse<'a> for MessagePacket<'a> {
if state.should_parse_message(message_type) && message_type != MessageType::Empty {
messages.push(Message::from_type(message_type, &mut packet_data, state)?);
} else {
Message::skip_type(message_type, &mut packet_data)?;
Message::skip_type(message_type, &mut packet_data, state)?;
}
}

View file

@ -45,12 +45,12 @@ impl<T: BitWrite<LittleEndian>> Encode for T {
}
pub trait ParseBitSkip<'a> {
fn parse_skip(stream: &mut Stream<'a>) -> Result<()>;
fn parse_skip(stream: &mut Stream<'a>, state: &ParserState) -> Result<()>;
}
impl<'a, T: BitRead<'a, LittleEndian>> ParseBitSkip<'a> for T {
#[inline(always)]
fn parse_skip(stream: &mut Stream<'a>) -> Result<()> {
fn parse_skip(stream: &mut Stream<'a>, _state: &ParserState) -> Result<()> {
Self::skip(stream).map_err(ParseError::from)
}
}