mirror of
https://github.com/demostf/cutter.git
synced 2026-06-03 20:04:07 +02:00
more mutate
This commit is contained in:
parent
4e8b89353e
commit
4d83b57a02
2 changed files with 34 additions and 27 deletions
42
src/lib.rs
42
src/lib.rs
|
|
@ -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(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue