1
0
Fork 0
mirror of https://codeberg.org/demostf/parser.git synced 2026-10-01 08:44:05 +02:00

remove the need for full reserve

This commit is contained in:
Robin Appelman 2021-07-24 16:05:23 +02:00
commit 522b282962
5 changed files with 80 additions and 66 deletions

View file

@ -1,14 +1,12 @@
use super::stringtable::read_var_int;
use crate::demo::message::packetentities::PacketEntitiesMessage;
use crate::demo::message::stringtable::{log_base2, write_var_int};
use crate::demo::message::stringtable::{encode_var_int_fixed, log_base2};
use crate::demo::packet::datatable::ClassId;
use crate::demo::parser::{Encode, ParseBitSkip};
use crate::demo::sendprop::SendProp;
use crate::Result;
use crate::{Parse, ParseError, ParserState, Stream};
use bitbuffer::{
BitReadBuffer, BitReadStream, BitWrite, BitWriteSized, BitWriteStream, LittleEndian,
};
use bitbuffer::{BitWrite, BitWriteSized, BitWriteStream, LittleEndian};
#[derive(Debug, PartialEq)]
pub struct TempEntitiesMessage {
@ -107,26 +105,25 @@ impl Encode for TempEntitiesMessage {
};
count.write(stream)?;
let mut out = Vec::with_capacity(self.events.len() * 16);
let bits = {
let mut write = BitWriteStream::new(&mut out, LittleEndian);
stream.reserve_int::<ParseError, _>(40, |stream| {
let start = stream.bit_len();
let mut last_class_id = u16::MAX.into();
for event in self.events.iter() {
if event.fire_delay > 0.0 {
true.write(&mut write)?;
((event.fire_delay * 100.0) as u8).write(&mut write)?;
true.write(stream)?;
((event.fire_delay * 100.0) as u8).write(stream)?;
} else {
false.write(&mut write)?;
false.write(stream)?;
}
if event.class_id != last_class_id {
true.write(&mut write)?;
true.write(stream)?;
let bits = log_base2(state.server_classes.len()) + 1;
let id: u16 = event.class_id.into();
(id + 1).write_sized(&mut write, bits as usize)?;
(id + 1).write_sized(stream, bits as usize)?;
} else {
false.write(&mut write)?;
false.write(stream)?;
}
last_class_id = event.class_id;
@ -134,14 +131,11 @@ impl Encode for TempEntitiesMessage {
.send_tables
.get(usize::from(event.class_id))
.ok_or(ParseError::UnknownServerClass(event.class_id))?;
PacketEntitiesMessage::write_update(&event.props, &mut write, send_table)?;
PacketEntitiesMessage::write_update(&event.props, stream, send_table)?;
}
write.bit_len()
};
let mut data = BitReadStream::new(BitReadBuffer::new(&out, LittleEndian));
write_var_int(bits as u32, stream)?;
data.read_bits(bits)?.write(stream)?;
let end = stream.bit_len();
Ok(encode_var_int_fixed((end - start) as u32))
})?;
Ok(())
}
}