mirror of
https://codeberg.org/demostf/parser.git
synced 2026-06-03 10:14:06 +02:00
Fix parsing of SayText2 messages starting with color codes other than \x01
SayText2 messages can use a simplified format where the body is just client, raw, and a single null-terminated colored text string, without the usual kind/from/text fields. The parser detected this by peeking the first byte after client and raw and checking if it was \x01 (color code for default color), but the text can also start with other color codes such as \x07 (6-char hex color). When this happened, the parser would consume the entire message text as the kind string (falling back to ChatAll), leaving the text and from fields empty.
This commit is contained in:
parent
b500fe772a
commit
a1b1db6f84
1 changed files with 10 additions and 7 deletions
|
|
@ -297,15 +297,17 @@ impl BitRead<'_, LittleEndian> for SayText2Message {
|
||||||
fn read(stream: &mut Stream) -> ReadResult<Self> {
|
fn read(stream: &mut Stream) -> ReadResult<Self> {
|
||||||
let client = EntityId::from(stream.read::<u8>()? as u32);
|
let client = EntityId::from(stream.read::<u8>()? as u32);
|
||||||
let raw = stream.read()?;
|
let raw = stream.read()?;
|
||||||
let (kind, from, text): (ChatMessageKind, Option<MaybeUtf8String>, MaybeUtf8String) =
|
let (kind, from, text): (ChatMessageKind, Option<MaybeUtf8String>, MaybeUtf8String) = {
|
||||||
if stream.read::<u8>()? == 1 {
|
let next_byte = stream.read::<u8>()?;
|
||||||
stream.set_pos(stream.pos() - 8)?;
|
stream.set_pos(stream.pos() - 8)?;
|
||||||
|
if next_byte > 0 && next_byte <= 8 {
|
||||||
|
// Starts with a color code (\x01-\x08) rather than a kind
|
||||||
|
// string like "TF_Chat_All", so this is the simplified format
|
||||||
|
// where the message body is just raw colored text without
|
||||||
|
// kind/from fields.
|
||||||
let text: MaybeUtf8String = stream.read()?;
|
let text: MaybeUtf8String = stream.read()?;
|
||||||
(ChatMessageKind::ChatAll, None, text)
|
(ChatMessageKind::ChatAll, None, text)
|
||||||
} else {
|
} else {
|
||||||
stream.set_pos(stream.pos() - 8)?;
|
|
||||||
|
|
||||||
let kind = stream.read()?;
|
let kind = stream.read()?;
|
||||||
let from = stream.read()?;
|
let from = stream.read()?;
|
||||||
let text = stream.read()?;
|
let text = stream.read()?;
|
||||||
|
|
@ -315,7 +317,8 @@ impl BitRead<'_, LittleEndian> for SayText2Message {
|
||||||
let _: u16 = stream.read()?;
|
let _: u16 = stream.read()?;
|
||||||
}
|
}
|
||||||
(kind, Some(from), text)
|
(kind, Some(from), text)
|
||||||
};
|
}
|
||||||
|
};
|
||||||
|
|
||||||
Ok(SayText2Message {
|
Ok(SayText2Message {
|
||||||
client,
|
client,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue