mirror of
https://codeberg.org/demostf/parser.git
synced 2026-06-03 18:24:05 +02:00
baseline stuff
This commit is contained in:
parent
c90a7a3371
commit
ec57a76101
3 changed files with 39 additions and 11 deletions
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue