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

baseline stuff

This commit is contained in:
Robin Appelman 2022-04-16 14:30:59 +02:00
commit ec57a76101
3 changed files with 39 additions and 11 deletions

View file

@ -253,14 +253,14 @@ impl Parse<'_> for PacketEntitiesMessage {
delta.is_some(),
)?;
let send_table = get_send_table(state, entity.server_class)?;
Self::read_update(&mut data, send_table, &mut entity.props)?;
Self::read_update(&mut data, send_table, &mut entity.props, entity_index)?;
entities.push(entity);
} else if update_type == UpdateType::Preserve {
let mut entity = get_entity_for_update(state, entity_index, update_type)?;
let send_table = get_send_table(state, entity.server_class)?;
Self::read_update(&mut data, send_table, &mut entity.props)?;
Self::read_update(&mut data, send_table, &mut entity.props, entity_index)?;
entities.push(entity);
} else if state.entity_classes.contains_key(&entity_index) {
@ -402,6 +402,7 @@ impl PacketEntitiesMessage {
stream: &mut Stream,
send_table: &SendTable,
props: &mut Vec<SendProp>,
_entity_index: EntityId,
) -> Result<()> {
let mut index: i32 = -1;

View file

@ -68,7 +68,7 @@ impl Parse<'_> for TempEntitiesMessage {
.ok_or(ParseError::UnknownServerClass(class_id))?;
let mut props = Vec::new();
PacketEntitiesMessage::read_update(stream, send_table, &mut props)?;
PacketEntitiesMessage::read_update(stream, send_table, &mut props, 0.into())?;
events.push(EventInfo {
class_id,

View file

@ -3,7 +3,9 @@ use std::collections::HashMap;
use crate::demo::gamevent::GameEventDefinition;
use crate::demo::message::packetentities::{EntityId, PacketEntitiesMessage, UpdateType};
use crate::demo::message::packetentities::{
EntityId, PacketEntitiesMessage, PacketEntity, UpdateType,
};
use crate::demo::message::stringtable::StringTableMeta;
use crate::demo::message::{Message, MessageType};
use crate::demo::packet::datatable::{
@ -54,7 +56,12 @@ impl StaticBaseline {
pub fn parse(&self, send_table: &SendTable) -> Result<Vec<SendProp>> {
let mut props = Vec::with_capacity(8);
PacketEntitiesMessage::read_update(&mut self.raw.clone(), send_table, &mut props)?;
PacketEntitiesMessage::read_update(
&mut self.raw.clone(),
send_table,
&mut props,
0.into(),
)?;
Ok(props)
}
}
@ -201,15 +208,11 @@ impl<'a> ParserState {
Message::PacketEntities(ent_message) => {
for removed in ent_message.removed_entities.iter() {
self.entity_classes.remove(removed);
self.instance_baselines[0].remove(removed);
self.instance_baselines[1].remove(removed);
}
for entity in ent_message.entities.iter() {
if entity.update_type == UpdateType::Delete {
self.entity_classes.remove(&entity.entity_index);
self.instance_baselines[0].remove(&entity.entity_index);
self.instance_baselines[1].remove(&entity.entity_index);
}
self.entity_classes
.insert(entity.entity_index, entity.server_class);
@ -221,8 +224,32 @@ impl<'a> ParserState {
self.instance_baselines[new_index] = self.instance_baselines[old_index].clone();
for entity in ent_message.entities {
self.instance_baselines[new_index]
.insert(entity.entity_index, (entity.props, entity.server_class));
if entity.update_type == UpdateType::Enter {
let updated_baseline = match self.instance_baselines[old_index]
.get(&entity.entity_index)
{
Some((baseline_props, baseline_class))
if *baseline_class == entity.server_class
&& ent_message.delta.is_some() =>
{
let mut entity = PacketEntity {
server_class: entity.server_class,
entity_index: entity.entity_index,
baseline_props: vec![],
props: vec![],
in_pvs: false,
update_type: UpdateType::Preserve,
serial_number: 0,
delay: None,
};
entity.apply_update(baseline_props);
(entity.props, entity.server_class)
}
_ => (entity.props, entity.server_class),
};
self.instance_baselines[new_index]
.insert(entity.entity_index, updated_baseline);
}
}
}
}