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(),
|
delta.is_some(),
|
||||||
)?;
|
)?;
|
||||||
let send_table = get_send_table(state, entity.server_class)?;
|
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);
|
entities.push(entity);
|
||||||
} else if update_type == UpdateType::Preserve {
|
} else if update_type == UpdateType::Preserve {
|
||||||
let mut entity = get_entity_for_update(state, entity_index, update_type)?;
|
let mut entity = get_entity_for_update(state, entity_index, update_type)?;
|
||||||
let send_table = get_send_table(state, entity.server_class)?;
|
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);
|
entities.push(entity);
|
||||||
} else if state.entity_classes.contains_key(&entity_index) {
|
} else if state.entity_classes.contains_key(&entity_index) {
|
||||||
|
|
@ -402,6 +402,7 @@ impl PacketEntitiesMessage {
|
||||||
stream: &mut Stream,
|
stream: &mut Stream,
|
||||||
send_table: &SendTable,
|
send_table: &SendTable,
|
||||||
props: &mut Vec<SendProp>,
|
props: &mut Vec<SendProp>,
|
||||||
|
_entity_index: EntityId,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let mut index: i32 = -1;
|
let mut index: i32 = -1;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,7 @@ impl Parse<'_> for TempEntitiesMessage {
|
||||||
.ok_or(ParseError::UnknownServerClass(class_id))?;
|
.ok_or(ParseError::UnknownServerClass(class_id))?;
|
||||||
|
|
||||||
let mut props = Vec::new();
|
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 {
|
events.push(EventInfo {
|
||||||
class_id,
|
class_id,
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,9 @@ use std::collections::HashMap;
|
||||||
|
|
||||||
use crate::demo::gamevent::GameEventDefinition;
|
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::stringtable::StringTableMeta;
|
||||||
use crate::demo::message::{Message, MessageType};
|
use crate::demo::message::{Message, MessageType};
|
||||||
use crate::demo::packet::datatable::{
|
use crate::demo::packet::datatable::{
|
||||||
|
|
@ -54,7 +56,12 @@ impl StaticBaseline {
|
||||||
|
|
||||||
pub fn parse(&self, send_table: &SendTable) -> Result<Vec<SendProp>> {
|
pub fn parse(&self, send_table: &SendTable) -> Result<Vec<SendProp>> {
|
||||||
let mut props = Vec::with_capacity(8);
|
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)
|
Ok(props)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -201,15 +208,11 @@ impl<'a> ParserState {
|
||||||
Message::PacketEntities(ent_message) => {
|
Message::PacketEntities(ent_message) => {
|
||||||
for removed in ent_message.removed_entities.iter() {
|
for removed in ent_message.removed_entities.iter() {
|
||||||
self.entity_classes.remove(removed);
|
self.entity_classes.remove(removed);
|
||||||
self.instance_baselines[0].remove(removed);
|
|
||||||
self.instance_baselines[1].remove(removed);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for entity in ent_message.entities.iter() {
|
for entity in ent_message.entities.iter() {
|
||||||
if entity.update_type == UpdateType::Delete {
|
if entity.update_type == UpdateType::Delete {
|
||||||
self.entity_classes.remove(&entity.entity_index);
|
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
|
self.entity_classes
|
||||||
.insert(entity.entity_index, entity.server_class);
|
.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();
|
self.instance_baselines[new_index] = self.instance_baselines[old_index].clone();
|
||||||
|
|
||||||
for entity in ent_message.entities {
|
for entity in ent_message.entities {
|
||||||
|
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]
|
self.instance_baselines[new_index]
|
||||||
.insert(entity.entity_index, (entity.props, entity.server_class));
|
.insert(entity.entity_index, updated_baseline);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue