diff --git a/src/demo/message/stringtable.rs b/src/demo/message/stringtable.rs index 7673cd3..ad53dce 100644 --- a/src/demo/message/stringtable.rs +++ b/src/demo/message/stringtable.rs @@ -164,7 +164,7 @@ impl Encode for CreateStringTableMessage<'_> { fn encode( &self, stream: &mut BitWriteStream, - _state: &ParserState, + state: &ParserState, ) -> Result<()> { let table = &self.table; table.name.write(stream)?; @@ -172,7 +172,14 @@ impl Encode for CreateStringTableMessage<'_> { let encode_bits = log_base2(table.max_entries) as usize; (table.entries.len() as u16).write_sized(stream, encode_bits + 1)?; - stream.reserve_int::(40, |stream| { + // threshold and both widths are the ones used by the read side above + let (length_bits, encode_length): (usize, fn(u32) -> u64) = + if state.protocol_version > 23 { + (40, encode_var_int_fixed) + } else { + (20, |length| length as u64) + }; + stream.reserve_int::(length_bits, |stream| { table.fixed_user_data_size.is_some().write(stream)?; if let Some(fixed_size) = table.fixed_user_data_size { fixed_size.write(stream)?; @@ -188,7 +195,7 @@ impl Encode for CreateStringTableMessage<'_> { write_string_table_update(&table.entries, stream, &table_meta)?; let end = stream.bit_len(); - Ok(encode_var_int_fixed((end - start) as u32)) + Ok(encode_length((end - start) as u32)) })?; Ok(()) diff --git a/src/demo/message/tempentities.rs b/src/demo/message/tempentities.rs index d9e66aa..4778770 100644 --- a/src/demo/message/tempentities.rs +++ b/src/demo/message/tempentities.rs @@ -109,7 +109,14 @@ impl Encode for TempEntitiesMessage { }; count.write(stream)?; - stream.reserve_int::(40, |stream| { + // threshold and both widths are the ones used by the read side above + let (length_bits, encode_length): (usize, fn(u32) -> u64) = + if state.protocol_version > 23 { + (40, encode_var_int_fixed) + } else { + (17, |length| length as u64) + }; + stream.reserve_int::(length_bits, |stream| { let start = stream.bit_len(); let mut last_class_id = u16::MAX.into(); @@ -138,7 +145,7 @@ impl Encode for TempEntitiesMessage { PacketEntitiesMessage::write_update(&event.props, stream, send_table, 0u32.into())?; } let end = stream.bit_len(); - Ok(encode_var_int_fixed((end - start) as u32)) + Ok(encode_length((end - start) as u32)) })?; Ok(()) } diff --git a/tests/reencode.rs b/tests/reencode.rs index 2930856..6fa731d 100644 --- a/tests/reencode.rs +++ b/tests/reencode.rs @@ -32,6 +32,7 @@ use tf_demo_parser::{Demo, Parse}; #[test_case("test_data/decal.dem"; "decal.dem")] #[test_case("test_data/saytext2.dem"; "saytext2.dem")] #[test_case("test_data/emptysaytext.dem"; "emptysaytext.dem")] +#[test_case("test_data/protocol23.dem"; "protocol23.dem")] fn re_encode_test(input_file: &str) { let file = fs::read(input_file).expect("Unable to read file"); let demo = Demo::new(&file);