mirror of
https://github.com/demostf/cutter.git
synced 2026-06-03 11:54:08 +02:00
mutators wip
This commit is contained in:
parent
1cc9856597
commit
d62f4be2aa
2 changed files with 120 additions and 13 deletions
25
src/lib.rs
25
src/lib.rs
|
|
@ -1,10 +1,12 @@
|
|||
#![allow(unused_imports)]
|
||||
|
||||
mod entity;
|
||||
mod mutate;
|
||||
mod string_tables;
|
||||
mod utils;
|
||||
|
||||
use crate::entity::ActiveEntities;
|
||||
use crate::mutate::{MutatorList, PacketMutator};
|
||||
use crate::string_tables::StringTablesUpdates;
|
||||
use crate::utils::set_panic_hook;
|
||||
use bitbuffer::{BitRead, BitWrite, BitWriteStream, LittleEndian};
|
||||
|
|
@ -204,6 +206,15 @@ pub fn cut(input: &[u8], start_tick: u32, end_tick: u32) -> Vec<u8> {
|
|||
.unwrap();
|
||||
}
|
||||
|
||||
let mut mutators = MutatorList::new();
|
||||
mutators.push_message_filter(|message: &Message| {
|
||||
if let Message::UserMessage(usr_message) = message {
|
||||
UserMessageType::CloseCaption != usr_message.message_type()
|
||||
} else {
|
||||
true
|
||||
}
|
||||
});
|
||||
|
||||
remove_already_deletes(&mut next, &start_entities, last_server_tick);
|
||||
next.set_tick(next.tick() - start_tick);
|
||||
next.encode(&mut out_stream, &handler.state_handler)
|
||||
|
|
@ -217,19 +228,7 @@ pub fn cut(input: &[u8], start_tick: u32, end_tick: u32) -> Vec<u8> {
|
|||
|
||||
remove_already_deletes(&mut packet, &start_entities, last_server_tick);
|
||||
|
||||
if let Packet::Message(msg_packet) = &mut packet {
|
||||
let messages = take(&mut msg_packet.messages);
|
||||
msg_packet.messages = messages
|
||||
.into_iter()
|
||||
.filter(|msg| {
|
||||
if let Message::UserMessage(usr_msg) = msg {
|
||||
UserMessageType::CloseCaption != usr_msg.message_type()
|
||||
} else {
|
||||
true
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
}
|
||||
mutators.mutate_packet(&mut packet);
|
||||
|
||||
if ty != PacketType::ConsoleCmd {
|
||||
packet
|
||||
|
|
|
|||
108
src/mutate.rs
Normal file
108
src/mutate.rs
Normal file
|
|
@ -0,0 +1,108 @@
|
|||
use std::mem::take;
|
||||
use tf_demo_parser::demo::message::packetentities::PacketEntity;
|
||||
use tf_demo_parser::demo::message::Message;
|
||||
use tf_demo_parser::demo::packet::Packet;
|
||||
|
||||
pub trait PacketMutator {
|
||||
fn mutate_packet(&self, packet: &mut Packet);
|
||||
}
|
||||
|
||||
pub trait MessageMutator {
|
||||
fn mutate_message(&self, message: &mut Message);
|
||||
}
|
||||
|
||||
pub trait MessageFilter {
|
||||
fn filter(&self, message: &Message) -> bool;
|
||||
}
|
||||
|
||||
pub trait EntityMutator {
|
||||
fn mutate_entity(&self, entity: &mut PacketEntity);
|
||||
}
|
||||
|
||||
struct PacketMessageMutator<T: MessageMutator> {
|
||||
mutator: T,
|
||||
}
|
||||
|
||||
impl<T: MessageMutator> PacketMutator for PacketMessageMutator<T> {
|
||||
fn mutate_packet(&self, packet: &mut Packet) {
|
||||
if let Packet::Message(msg_packet) = packet {
|
||||
msg_packet
|
||||
.messages
|
||||
.iter_mut()
|
||||
.for_each(|msg| self.mutator.mutate_message(msg));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: MessageMutator> From<T> for PacketMessageMutator<T> {
|
||||
fn from(mutator: T) -> Self {
|
||||
PacketMessageMutator { mutator }
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: EntityMutator> MessageMutator for T {
|
||||
fn mutate_message(&self, message: &mut Message) {
|
||||
if let Message::PacketEntities(entity_message) = message {
|
||||
entity_message
|
||||
.entities
|
||||
.iter_mut()
|
||||
.for_each(|ent| self.mutate_entity(ent))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct PacketMessageFilter<T: MessageFilter> {
|
||||
filter: T,
|
||||
}
|
||||
|
||||
impl<T: MessageFilter> PacketMutator for PacketMessageFilter<T> {
|
||||
fn mutate_packet(&self, packet: &mut Packet) {
|
||||
if let Packet::Message(msg_packet) = packet {
|
||||
let messages = take(&mut msg_packet.messages);
|
||||
msg_packet.messages = messages
|
||||
.into_iter()
|
||||
.filter(|msg| self.filter.filter(msg))
|
||||
.collect();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: MessageFilter> From<T> for PacketMessageFilter<T> {
|
||||
fn from(filter: T) -> Self {
|
||||
PacketMessageFilter { filter }
|
||||
}
|
||||
}
|
||||
|
||||
impl<F: Fn(&Message) -> bool> MessageFilter for F {
|
||||
fn filter(&self, message: &Message) -> bool {
|
||||
self(message)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct MutatorList {
|
||||
mutators: Vec<Box<dyn PacketMutator>>,
|
||||
}
|
||||
|
||||
impl MutatorList {
|
||||
pub fn new() -> Self {
|
||||
Self::default()
|
||||
}
|
||||
|
||||
pub fn push_mutator<M: PacketMutator + 'static, T: Into<M>>(&mut self, mutator: T) {
|
||||
self.mutators.push(Box::new(mutator.into()))
|
||||
}
|
||||
|
||||
pub fn push_message_filter<M: MessageFilter + 'static>(&mut self, filter: M) {
|
||||
self.mutators
|
||||
.push(Box::new(PacketMessageFilter::from(filter)))
|
||||
}
|
||||
}
|
||||
|
||||
impl PacketMutator for MutatorList {
|
||||
fn mutate_packet(&self, packet: &mut Packet) {
|
||||
for mutator in self.mutators.iter() {
|
||||
mutator.mutate_packet(packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue