mirror of
https://github.com/demostf/cutter.git
synced 2026-06-03 11:54:08 +02:00
wip
This commit is contained in:
parent
df7394a816
commit
1be42764ad
9 changed files with 7252 additions and 44 deletions
70
src/entity.rs
Normal file
70
src/entity.rs
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
use std::collections::HashMap;
|
||||
use std::mem::replace;
|
||||
use tf_demo_parser::demo::message::packetentities::{
|
||||
EntityId, PacketEntitiesMessage, PacketEntity, PVS,
|
||||
};
|
||||
use tf_demo_parser::ParserState;
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct ActiveEntities {
|
||||
entities: HashMap<EntityId, PacketEntity>,
|
||||
}
|
||||
|
||||
impl ActiveEntities {
|
||||
pub fn handle_message(&mut self, msg: &PacketEntitiesMessage, state: &ParserState) {
|
||||
for entity in &msg.entities {
|
||||
if entity.pvs == PVS::Delete || entity.pvs == PVS::Leave {
|
||||
self.entities.remove(&entity.entity_index);
|
||||
} else {
|
||||
self.handle_entity(entity, state);
|
||||
}
|
||||
}
|
||||
for deleted in msg.removed_entities.iter() {
|
||||
self.entities.remove(deleted);
|
||||
}
|
||||
}
|
||||
|
||||
fn handle_entity(&mut self, entity: &PacketEntity, state: &ParserState) {
|
||||
if entity.pvs == PVS::Enter {
|
||||
self.entities.insert(entity.entity_index, entity.clone());
|
||||
} else {
|
||||
self.entities
|
||||
.entry(entity.entity_index)
|
||||
.and_modify(|existing| update_entity(existing, entity, state))
|
||||
.or_insert_with(|| entity.clone());
|
||||
}
|
||||
}
|
||||
|
||||
pub fn encode(self) -> PacketEntitiesMessage {
|
||||
let max_entries = self.entities.len() as u16;
|
||||
|
||||
let mut entities = self
|
||||
.entities
|
||||
.into_iter()
|
||||
.map(|(_k, v)| v)
|
||||
.collect::<Vec<_>>();
|
||||
entities.sort_by(|a, b| a.entity_index.cmp(&b.entity_index));
|
||||
|
||||
PacketEntitiesMessage {
|
||||
entities,
|
||||
removed_entities: vec![],
|
||||
max_entries,
|
||||
delta: None,
|
||||
base_line: 0,
|
||||
updated_base_line: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn update_entity(old: &mut PacketEntity, new: &PacketEntity, _state: &ParserState) {
|
||||
for prop in &new.props {
|
||||
match old
|
||||
.props
|
||||
.iter_mut()
|
||||
.find(|existing| existing.index == prop.index)
|
||||
{
|
||||
Some(existing) => existing.value = prop.value.clone(),
|
||||
None => old.props.push(prop.clone()),
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue