more mutate

This commit is contained in:
Robin Appelman 2022-04-21 20:13:18 +02:00
commit 4d83b57a02
2 changed files with 34 additions and 27 deletions

View file

@ -6,7 +6,7 @@ mod string_tables;
mod utils; mod utils;
use crate::entity::ActiveEntities; use crate::entity::ActiveEntities;
use crate::mutate::{MutatorList, PacketMutator}; use crate::mutate::{MessageMutator, MutatorList, PacketMutator};
use crate::string_tables::StringTablesUpdates; use crate::string_tables::StringTablesUpdates;
use crate::utils::set_panic_hook; use crate::utils::set_panic_hook;
use bitbuffer::{BitRead, BitWrite, BitWriteStream, LittleEndian}; use bitbuffer::{BitRead, BitWrite, BitWriteStream, LittleEndian};
@ -16,6 +16,7 @@ use std::convert::TryInto;
use std::iter::once; use std::iter::once;
use std::mem::take; use std::mem::take;
use tf_demo_parser::demo::header::Header; use tf_demo_parser::demo::header::Header;
use tf_demo_parser::demo::message::packetentities::UpdateType::Delete;
use tf_demo_parser::demo::message::packetentities::{EntityId, PacketEntitiesMessage, UpdateType}; use tf_demo_parser::demo::message::packetentities::{EntityId, PacketEntitiesMessage, UpdateType};
use tf_demo_parser::demo::message::usermessage::UserMessageType; use tf_demo_parser::demo::message::usermessage::UserMessageType;
use tf_demo_parser::demo::message::{Message, NetTickMessage}; use tf_demo_parser::demo::message::{Message, NetTickMessage};
@ -214,11 +215,11 @@ pub fn cut(input: &[u8], start_tick: u32, end_tick: u32) -> Vec<u8> {
true true
} }
}); });
mutators.push_message_mutator(DeleteFilter::new(start_entities, last_server_tick));
mutators.push_packet_mutator(move |packet: &mut Packet| { mutators.push_packet_mutator(move |packet: &mut Packet| {
packet.set_tick(packet.tick() - start_tick) packet.set_tick(packet.tick() - start_tick)
}); });
remove_already_deletes(&mut next, &start_entities, last_server_tick);
mutators.mutate_packet(&mut next); mutators.mutate_packet(&mut next);
next.encode(&mut out_stream, &handler.state_handler) next.encode(&mut out_stream, &handler.state_handler)
.unwrap(); .unwrap();
@ -228,8 +229,6 @@ pub fn cut(input: &[u8], start_tick: u32, end_tick: u32) -> Vec<u8> {
let ty = packet.packet_type(); let ty = packet.packet_type();
let original_tick = packet.tick(); let original_tick = packet.tick();
remove_already_deletes(&mut packet, &start_entities, last_server_tick);
mutators.mutate_packet(&mut packet); mutators.mutate_packet(&mut packet);
if ty != PacketType::ConsoleCmd { if ty != PacketType::ConsoleCmd {
@ -294,23 +293,31 @@ fn skip_start<'a>(
(entities, string_tables, start_packets, server_tick) (entities, string_tables, start_packets, server_tick)
} }
// filter out any ongoing deletes of entities that don't exist struct DeleteFilter {
fn remove_already_deletes( current_entities: BTreeSet<EntityId>,
packet: &mut Packet,
current_entities: &BTreeSet<EntityId>,
till_delta: u32, till_delta: u32,
) { }
if let Packet::Message(msg_packet) = packet {
for msg in &mut msg_packet.messages { impl DeleteFilter {
if let Message::PacketEntities(msg) = msg { pub fn new(current_entities: BTreeSet<EntityId>, till_delta: u32) -> Self {
if let Some(delta) = msg.delta { DeleteFilter {
if delta.get() < till_delta { current_entities,
let packet_entities = std::mem::take(&mut msg.entities); till_delta,
msg.entities = packet_entities }
}
}
impl MessageMutator for DeleteFilter {
fn mutate_message(&self, message: &mut Message) {
if let Message::PacketEntities(message) = message {
if let Some(delta) = message.delta {
if delta.get() < self.till_delta {
let packet_entities = take(&mut message.entities);
message.entities = packet_entities
.into_iter() .into_iter()
.filter(|ent| match ent.update_type { .filter(|ent| match ent.update_type {
UpdateType::Delete | UpdateType::Leave => { UpdateType::Delete | UpdateType::Leave => {
current_entities.contains(&ent.entity_index) self.current_entities.contains(&ent.entity_index)
} }
_ => true, _ => true,
}) })
@ -319,5 +326,4 @@ fn remove_already_deletes(
} }
} }
} }
}
} }

View file

@ -90,8 +90,9 @@ impl MutatorList {
self.mutators.push(Box::new(mutator)) self.mutators.push(Box::new(mutator))
} }
pub fn push_message_mutator<M: PacketMutator + 'static, T: Into<M>>(&mut self, mutator: T) { pub fn push_message_mutator<M: MessageMutator + 'static>(&mut self, mutator: M) {
self.mutators.push(Box::new(mutator.into())) self.mutators
.push(Box::new(PacketMessageMutator::from(mutator)))
} }
pub fn push_message_filter<M: MessageFilter + 'static>(&mut self, filter: M) { pub fn push_message_filter<M: MessageFilter + 'static>(&mut self, filter: M) {