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

236
wasm/Cargo.lock generated
View file

@ -69,27 +69,28 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
[[package]] [[package]]
name = "bitbuffer" name = "bitbuffer"
version = "0.10.9" version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "525586993a118417512a49bada2d143319310891f48b0b116c8f64fbb6486c87" checksum = "391aa23e6223e2e80c036de304747055e9966647f2cf42c703b036ab93a297fc"
dependencies = [ dependencies = [
"bitbuffer_derive", "bitbuffer_derive",
"err-derive",
"memchr", "memchr",
"num-traits 0.2.19", "num-traits 0.2.19",
"serde", "serde",
"thiserror 2.0.12",
] ]
[[package]] [[package]]
name = "bitbuffer_derive" name = "bitbuffer_derive"
version = "0.10.1" version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "052a5a614540ae9bb7de25c2c86a94b6de7374cb7e3230f3128955bdaea62c3f" checksum = "012c668c57f28ed1341c602656194ed441fb87013c4bbe3c72fe5339f3eb43ef"
dependencies = [ dependencies = [
"merge",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 1.0.109", "structmeta 0.3.0",
"syn_util", "syn 2.0.101",
] ]
[[package]] [[package]]
@ -100,9 +101,9 @@ checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.2.21" version = "1.2.23"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8691782945451c1c383942c4874dbe63814f61cb57ef773cda2972682b7bb3c0" checksum = "5f4ac86a9e5bc1e2b3449ab9d7d3a6a405e3d1bb28d7b9be8614f55846ae3766"
dependencies = [ dependencies = [
"shlex", "shlex",
] ]
@ -121,9 +122,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]] [[package]]
name = "clap" name = "clap"
version = "4.5.37" version = "4.5.38"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eccb054f56cbd38340b380d4a8e69ef1f02f1af43db2f0cc817a4774d80ae071" checksum = "ed93b9805f8ba930df42c2590f05453d5ec36cbb85d018868a5b24d31f6ac000"
dependencies = [ dependencies = [
"clap_builder", "clap_builder",
"clap_derive", "clap_derive",
@ -131,9 +132,9 @@ dependencies = [
[[package]] [[package]]
name = "clap_builder" name = "clap_builder"
version = "4.5.37" version = "4.5.38"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "efd9466fac8543255d3b1fcad4762c5e116ffe808c8a3043d4263cd4fd4862a2" checksum = "379026ff283facf611b0ea629334361c4211d1b12ee01024eec1591133b04120"
dependencies = [ dependencies = [
"anstream", "anstream",
"anstyle", "anstyle",
@ -184,7 +185,7 @@ dependencies = [
"console_error_panic_hook", "console_error_panic_hook",
"env_logger", "env_logger",
"log", "log",
"num_enum", "num_enum 0.5.11",
"parse-display 0.5.5", "parse-display 0.5.5",
"serde", "serde",
"serde-wasm-bindgen", "serde-wasm-bindgen",
@ -260,20 +261,6 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
[[package]]
name = "err-derive"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c34a887c8df3ed90498c1c437ce21f211c8e27672921a8ffa293cb8d6d4caa9e"
dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
"rustversion",
"syn 1.0.109",
"synstructure",
]
[[package]] [[package]]
name = "fnv" name = "fnv"
version = "1.0.7" version = "1.0.7"
@ -310,9 +297,9 @@ checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
[[package]] [[package]]
name = "itertools" name = "itertools"
version = "0.10.5" version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
dependencies = [ dependencies = [
"either", "either",
] ]
@ -325,9 +312,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
[[package]] [[package]]
name = "jiff" name = "jiff"
version = "0.2.11" version = "0.2.13"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "27e77966151130221b079bcec80f1f34a9e414fa489d99152a201c07fd2182bc" checksum = "f02000660d30638906021176af16b17498bd0d12813dbfe7b276d8bc7f3c0806"
dependencies = [ dependencies = [
"jiff-static", "jiff-static",
"log", "log",
@ -338,9 +325,9 @@ dependencies = [
[[package]] [[package]]
name = "jiff-static" name = "jiff-static"
version = "0.2.11" version = "0.2.13"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97265751f8a9a4228476f2fc17874a9e7e70e96b893368e42619880fe143b48a" checksum = "f3c30758ddd7188629c6713fc45d1188af4f44c90582311d0c8d8c9907f60c48"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -393,6 +380,28 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3" checksum = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3"
[[package]]
name = "merge"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "10bbef93abb1da61525bbc45eeaff6473a41907d19f8f9aa5168d214e10693e9"
dependencies = [
"merge_derive",
"num-traits 0.2.19",
]
[[package]]
name = "merge_derive"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "209d075476da2e63b4b29e72a2ef627b840589588e71400a25e3565c4f849d07"
dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
"syn 1.0.109",
]
[[package]] [[package]]
name = "minicov" name = "minicov"
version = "0.3.7" version = "0.3.7"
@ -493,7 +502,16 @@ version = "0.5.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9"
dependencies = [ dependencies = [
"num_enum_derive", "num_enum_derive 0.5.11",
]
[[package]]
name = "num_enum"
version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179"
dependencies = [
"num_enum_derive 0.7.3",
] ]
[[package]] [[package]]
@ -502,12 +520,24 @@ version = "0.5.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799"
dependencies = [ dependencies = [
"proc-macro-crate", "proc-macro-crate 1.3.1",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 1.0.109", "syn 1.0.109",
] ]
[[package]]
name = "num_enum_derive"
version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56"
dependencies = [
"proc-macro-crate 3.3.0",
"proc-macro2",
"quote",
"syn 2.0.101",
]
[[package]] [[package]]
name = "once_cell" name = "once_cell"
version = "1.21.3" version = "1.21.3"
@ -527,13 +557,13 @@ dependencies = [
[[package]] [[package]]
name = "parse-display" name = "parse-display"
version = "0.8.2" version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c6509d08722b53e8dafe97f2027b22ccbe3a5db83cb352931e9716b0aa44bc5c" checksum = "914a1c2265c98e2446911282c6ac86d8524f495792c38c5bd884f80499c7538a"
dependencies = [ dependencies = [
"once_cell", "parse-display-derive 0.9.1",
"parse-display-derive 0.8.2",
"regex", "regex",
"regex-syntax 0.8.5",
] ]
[[package]] [[package]]
@ -553,16 +583,15 @@ dependencies = [
[[package]] [[package]]
name = "parse-display-derive" name = "parse-display-derive"
version = "0.8.2" version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68517892c8daf78da08c0db777fcc17e07f2f63ef70041718f8a7630ad84f341" checksum = "2ae7800a4c974efd12df917266338e79a7a74415173caf7e70aa0a0707345281"
dependencies = [ dependencies = [
"once_cell",
"proc-macro2", "proc-macro2",
"quote", "quote",
"regex", "regex",
"regex-syntax 0.7.5", "regex-syntax 0.8.5",
"structmeta 0.2.0", "structmeta 0.3.0",
"syn 2.0.101", "syn 2.0.101",
] ]
@ -588,7 +617,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919"
dependencies = [ dependencies = [
"once_cell", "once_cell",
"toml_edit", "toml_edit 0.19.15",
]
[[package]]
name = "proc-macro-crate"
version = "3.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35"
dependencies = [
"toml_edit 0.22.26",
] ]
[[package]] [[package]]
@ -662,12 +700,6 @@ version = "0.6.29"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
[[package]]
name = "regex-syntax"
version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da"
[[package]] [[package]]
name = "regex-syntax" name = "regex-syntax"
version = "0.8.5" version = "0.8.5"
@ -706,9 +738,9 @@ dependencies = [
[[package]] [[package]]
name = "serde-wasm-bindgen" name = "serde-wasm-bindgen"
version = "0.4.5" version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf" checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b"
dependencies = [ dependencies = [
"js-sys", "js-sys",
"serde", "serde",
@ -773,7 +805,7 @@ dependencies = [
"regex", "regex",
"serde", "serde",
"serde_derive", "serde_derive",
"thiserror", "thiserror 1.0.69",
] ]
[[package]] [[package]]
@ -796,13 +828,13 @@ dependencies = [
[[package]] [[package]]
name = "structmeta" name = "structmeta"
version = "0.2.0" version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ad9e09554f0456d67a69c1584c9798ba733a5b50349a6c0d0948710523922d" checksum = "2e1575d8d40908d70f6fd05537266b90ae71b15dbbe7a8b7dffa2b759306d329"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"structmeta-derive 0.2.0", "structmeta-derive 0.3.0",
"syn 2.0.101", "syn 2.0.101",
] ]
@ -819,9 +851,9 @@ dependencies = [
[[package]] [[package]]
name = "structmeta-derive" name = "structmeta-derive"
version = "0.2.0" version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a60bcaff7397072dca0017d1db428e30d5002e00b6847703e2e42005c95fbe00" checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -850,49 +882,27 @@ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]]
name = "syn_util"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6754c4559b79657554e9d8a0d56e65e490c76d382b9c23108364ec4125dea23c"
dependencies = [
"proc-macro2",
"quote",
"syn 1.0.109",
]
[[package]]
name = "synstructure"
version = "0.12.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
dependencies = [
"proc-macro2",
"quote",
"syn 1.0.109",
"unicode-xid",
]
[[package]] [[package]]
name = "tf-demo-parser" name = "tf-demo-parser"
version = "0.5.1" version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c77f64e1dac5137a201d92afaf441fbe4018595bb8ec770fe6e02f6cad4410ef" checksum = "13d7eeb78b6586440173a74de0847b1595412b80d8cdf683f2f2527cd3c73a37"
dependencies = [ dependencies = [
"bitbuffer", "bitbuffer",
"enumflags2", "enumflags2",
"err-derive",
"fnv", "fnv",
"itertools", "itertools",
"log",
"main_error", "main_error",
"num-traits 0.2.19", "num-traits 0.2.19",
"num_enum", "num_enum 0.7.3",
"parse-display 0.8.2", "parse-display 0.9.1",
"serde", "serde",
"serde_json", "serde_json",
"serde_repr", "serde_repr",
"snap", "snap",
"steamid-ng", "steamid-ng",
"thiserror 2.0.12",
] ]
[[package]] [[package]]
@ -901,7 +911,16 @@ version = "1.0.69"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
dependencies = [ dependencies = [
"thiserror-impl", "thiserror-impl 1.0.69",
]
[[package]]
name = "thiserror"
version = "2.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708"
dependencies = [
"thiserror-impl 2.0.12",
] ]
[[package]] [[package]]
@ -915,6 +934,17 @@ dependencies = [
"syn 2.0.101", "syn 2.0.101",
] ]
[[package]]
name = "thiserror-impl"
version = "2.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.101",
]
[[package]] [[package]]
name = "toml_datetime" name = "toml_datetime"
version = "0.6.9" version = "0.6.9"
@ -929,7 +959,18 @@ checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
dependencies = [ dependencies = [
"indexmap", "indexmap",
"toml_datetime", "toml_datetime",
"winnow", "winnow 0.5.40",
]
[[package]]
name = "toml_edit"
version = "0.22.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e"
dependencies = [
"indexmap",
"toml_datetime",
"winnow 0.7.10",
] ]
[[package]] [[package]]
@ -938,12 +979,6 @@ version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
[[package]]
name = "unicode-xid"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
[[package]] [[package]]
name = "utf8parse" name = "utf8parse"
version = "0.2.2" version = "0.2.2"
@ -1195,3 +1230,12 @@ checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876"
dependencies = [ dependencies = [
"memchr", "memchr",
] ]
[[package]]
name = "winnow"
version = "0.7.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec"
dependencies = [
"memchr",
]

View file

@ -17,11 +17,11 @@ default = ["console_error_panic_hook"]
cli = ["clap", "env_logger"] cli = ["clap", "env_logger"]
[dependencies] [dependencies]
bitbuffer = "0.10.5" bitbuffer = "0.11.1"
tf-demo-parser = { version = "0.5" } tf-demo-parser = { version = "0.6" }
#tf-demo-parser = { version = "0.4", path = "../tf-demo-parser" } #tf-demo-parser = { version = "0.4", path = "../tf-demo-parser" }
wasm-bindgen = { version = "0.2.45" } wasm-bindgen = { version = "0.2.45" }
serde-wasm-bindgen = "0.4" serde-wasm-bindgen = "0.6.5"
web-sys = { version = "0.3", features = ["console"] } web-sys = { version = "0.3", features = ["console"] }
# The `console_error_panic_hook` crate provides better debugging of panics by # The `console_error_panic_hook` crate provides better debugging of panics by

View file

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

View file

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

View file

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

View file

@ -1,10 +1,9 @@
use crate::mutate::MessageMutator; use crate::mutate::{MessageMutator, MutatorList};
use log::{info, warn}; use log::warn;
use std::cell::RefCell; use std::cell::RefCell;
use std::collections::{BTreeMap, BTreeSet}; use std::collections::BTreeSet;
use tf_demo_parser::demo::message::packetentities::{EntityId, PacketEntity, UpdateType}; use tf_demo_parser::demo::message::packetentities::{EntityId, UpdateType};
use tf_demo_parser::demo::message::Message; use tf_demo_parser::demo::message::Message;
use tf_demo_parser::demo::packet::datatable::{ClassId, ServerClass};
use tf_demo_parser::ParserState; use tf_demo_parser::ParserState;
#[derive(Default)] #[derive(Default)]
@ -34,14 +33,16 @@ impl MessageMutator for RemoveInvalidPreserveEntity {
} }
} }
UpdateType::Delete => { 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| { ent_message.removed_entities.retain(|id| {
if self.known_entities.borrow().contains(&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 // having a Delete or Leave makes it crash further in the demo
// warn!("inserting delete for {}", id); // warn!("inserting delete for {}", id);
@ -63,9 +64,15 @@ impl MessageMutator for RemoveInvalidPreserveEntity {
true 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.extend(deferred_deletes);
ent_message.removed_entities.sort(); 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 crate::{clean_demo, strip_cond, unlock_pov, MutatorList};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use tf_demo_parser::demo::data::DemoTick; 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; use tf_demo_parser::demo::message::Message;
#[derive(Debug, Serialize, Deserialize, Default)] #[derive(Debug, Serialize, Deserialize, Default)]
#[non_exhaustive]
pub struct EditOptions { pub struct EditOptions {
pub unlock_pov: bool, pub unlock_pov: bool,
#[serde(default)] #[serde(default)]
pub remove_conditions: Vec<CondOptions>, pub remove_conditions: Vec<CondOptions>,
#[serde(default)] #[serde(default)]
pub cut: Option<TickRange>, pub cut: Option<TickRange>,
#[serde(default)]
pub remove_invalid_deletes: bool,
} }
impl EditOptions { impl EditOptions {
@ -38,6 +42,10 @@ impl EditOptions {
unlock_pov(&mut mutators, spectator_id); unlock_pov(&mut mutators, spectator_id);
} }
if self.remove_invalid_deletes {
removed_invalid_deletes(&mut mutators);
}
mutators mutators
} }
} }

View file

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