separate option for invalid deletes

This commit is contained in:
Robin Appelman 2025-05-18 18:55:26 +02:00
commit fabf773f72
8 changed files with 177 additions and 116 deletions

View file

@ -1,4 +1,3 @@
use crate::missing_preserve::RemoveInvalidPreserveEntity;
use crate::mutate::MutatorList;
use tf_demo_parser::demo::message::usermessage::UserMessageType;
use tf_demo_parser::demo::message::Message;
@ -12,5 +11,4 @@ pub fn clean_demo(mutators: &mut MutatorList) {
true
}
});
mutators.push_message_mutator(RemoveInvalidPreserveEntity::new());
}

View file

@ -1,6 +1,7 @@
use std::collections::{BTreeMap, BTreeSet};
use tf_demo_parser::demo::data::{DemoTick, ServerTick};
use tf_demo_parser::demo::message::BaselineIndex;
use tf_demo_parser::demo::message::packetentities::{
EntityId, PacketEntitiesMessage, PacketEntity, UpdateType,
};
@ -155,7 +156,7 @@ impl ActiveEntities {
entity_index: removed,
props: vec![],
in_pvs: false,
baseline_index: 0,
baseline_index: BaselineIndex::First,
update_type: if self.deleted_entities.contains(&removed) {
UpdateType::Delete
} else {
@ -173,7 +174,7 @@ impl ActiveEntities {
baselines[0].updated_base_line = true;
baselines[1].updated_base_line = true;
baselines[0].base_line = 1;
baselines[0].base_line = BaselineIndex::Second;
(
baselines.into_iter(),
@ -200,7 +201,7 @@ fn encode_entities(
removed_entities,
max_entries,
delta,
base_line: 0,
base_line: BaselineIndex::First,
updated_base_line: false,
}
}

View file

@ -13,6 +13,8 @@ struct Args {
from: Option<u32>,
#[arg(long)]
to: Option<u32>,
#[arg(long)]
remove_invalid_deletes: bool,
}
impl Args {
@ -27,6 +29,7 @@ impl Args {
} else {
None
},
remove_invalid_deletes: self.remove_invalid_deletes,
..EditOptions::default()
}
}

View file

@ -1,10 +1,9 @@
use crate::mutate::MessageMutator;
use log::{info, warn};
use crate::mutate::{MessageMutator, MutatorList};
use log::warn;
use std::cell::RefCell;
use std::collections::{BTreeMap, BTreeSet};
use tf_demo_parser::demo::message::packetentities::{EntityId, PacketEntity, UpdateType};
use std::collections::BTreeSet;
use tf_demo_parser::demo::message::packetentities::{EntityId, UpdateType};
use tf_demo_parser::demo::message::Message;
use tf_demo_parser::demo::packet::datatable::{ClassId, ServerClass};
use tf_demo_parser::ParserState;
#[derive(Default)]
@ -34,14 +33,16 @@ impl MessageMutator for RemoveInvalidPreserveEntity {
}
}
UpdateType::Delete => {
self.known_entities.borrow_mut().remove(&entity.entity_index);
},
self.known_entities
.borrow_mut()
.remove(&entity.entity_index);
}
_ => {}
};
}
ent_message.removed_entities.retain(|id| {
if self.known_entities.borrow().contains(&id) {
// just not deleting makes the demo play, but with some ERROR entities
// just not deleting makes the demo play but seems like it could cause further issues
// having a Delete or Leave makes it crash further in the demo
// warn!("inserting delete for {}", id);
@ -63,9 +64,15 @@ impl MessageMutator for RemoveInvalidPreserveEntity {
true
}
});
ent_message.entities.sort_by(|a, b| a.entity_index.cmp(&b.entity_index));
ent_message
.entities
.sort_by(|a, b| a.entity_index.cmp(&b.entity_index));
ent_message.removed_entities.extend(deferred_deletes);
ent_message.removed_entities.sort();
}
}
}
pub fn removed_invalid_deletes(mutators: &mut MutatorList) {
mutators.push_message_mutator(RemoveInvalidPreserveEntity::default())
}

View file

@ -1,3 +1,4 @@
use crate::missing_preserve::removed_invalid_deletes;
use crate::{clean_demo, strip_cond, unlock_pov, MutatorList};
use serde::{Deserialize, Serialize};
use tf_demo_parser::demo::data::DemoTick;
@ -5,12 +6,15 @@ use tf_demo_parser::demo::message::packetentities::EntityId;
use tf_demo_parser::demo::message::Message;
#[derive(Debug, Serialize, Deserialize, Default)]
#[non_exhaustive]
pub struct EditOptions {
pub unlock_pov: bool,
#[serde(default)]
pub remove_conditions: Vec<CondOptions>,
#[serde(default)]
pub cut: Option<TickRange>,
#[serde(default)]
pub remove_invalid_deletes: bool,
}
impl EditOptions {
@ -38,6 +42,10 @@ impl EditOptions {
unlock_pov(&mut mutators, spectator_id);
}
if self.remove_invalid_deletes {
removed_invalid_deletes(&mut mutators);
}
mutators
}
}

View file

@ -2,7 +2,7 @@ use crate::mutate::{MessageMutator, MutatorList};
use std::cell::Cell;
use tf_demo_parser::demo::message::packetentities::{EntityId, PacketEntity, UpdateType};
use tf_demo_parser::demo::message::usermessage::UserMessage;
use tf_demo_parser::demo::message::Message;
use tf_demo_parser::demo::message::{BaselineIndex, Message};
use tf_demo_parser::demo::packet::Packet;
use tf_demo_parser::ParserState;
@ -24,7 +24,7 @@ impl MessageMutator for AddStvEntity {
fn mutate_message(&self, message: &mut Message, _state: &ParserState) {
if !self.added.get() {
if let Message::PacketEntities(ent_message) = message {
if ent_message.base_line == 0 {
if ent_message.base_line == BaselineIndex::First {
let player_entity = ent_message
.entities
.iter()
@ -46,7 +46,7 @@ impl MessageMutator for AddStvEntity {
serial_number: 1234567,
delay: None,
delta: None,
baseline_index: 0,
baseline_index: BaselineIndex::First,
});
ent_message
.entities