From ac8bc07db5fe3380efbbf76fe004321d4f7b5dcf Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 28 Jul 2021 23:17:36 +0200 Subject: [PATCH] delta ticks --- out.dem | Bin 9457832 -> 9458293 bytes src/lib.rs | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 63 insertions(+), 2 deletions(-) diff --git a/out.dem b/out.dem index 52f0bbb40bad7b8c3dfb09e7cdc9196d1407a9bd..20249db21ac07412ff637ccb55eb3ea3d9a79fed 100644 GIT binary patch delta 15330 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 delta 15208 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 diff --git a/src/lib.rs b/src/lib.rs index 5323a09..dd54678 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,7 +7,10 @@ use crate::entity::ActiveEntities; use crate::utils::set_panic_hook; use bitbuffer::{BitRead, BitWrite, BitWriteStream, LittleEndian}; use std::cmp::{max, min}; +use std::convert::TryInto; +use std::iter::once; use tf_demo_parser::demo::header::Header; +use tf_demo_parser::demo::message::packetentities::PacketEntitiesMessage; use tf_demo_parser::demo::message::{Message, NetTickMessage}; use tf_demo_parser::demo::packet::message::{MessagePacket, MessagePacketMeta}; use tf_demo_parser::demo::packet::stop::StopPacket; @@ -64,12 +67,27 @@ pub fn cut(input: &[u8], start_tick: u32, end_tick: u32) -> Vec { handler.handle_packet(packet).unwrap(); } + let mut next = packets.next(&start_handler.state_handler).unwrap().unwrap(); + let mut delta_tick = 0; + if let Packet::Message(MessagePacket { messages, .. }) = &next { + for msg in messages { + if let Message::PacketEntities(PacketEntitiesMessage { + delta: Some(delta), .. + }) = msg + { + delta_tick = delta.get(); + } + } + } else { + panic!("first packet is not a MessagePacket") + } + let msg = entities.encode(); let packet = Packet::Message(MessagePacket { tick: 0, messages: vec![ Message::NetTick(NetTickMessage { - tick: last_server_tick, + tick: delta_tick, frame_time: 1881, std_dev: 263, }), @@ -87,10 +105,53 @@ pub fn cut(input: &[u8], start_tick: u32, end_tick: u32) -> Vec { .unwrap(); handler.handle_packet(packet).unwrap(); + // create the net ticks needed for later deltas + let fill_ticks = ((delta_tick + 1)..=last_server_tick) + .into_iter() + .map(|tick| { + Message::NetTick(NetTickMessage { + tick, + frame_time: 1881, + std_dev: 263, + }) + }); + let fill_packets = fill_ticks.map(|msg| { + Packet::Message(MessagePacket { + tick: 0, + messages: vec![ + msg, + Message::PacketEntities(PacketEntitiesMessage { + entities: vec![], + removed_entities: vec![], + max_entries: 0, + delta: Some(delta_tick.try_into().unwrap()), + base_line: 0, + updated_base_line: false, + }), + ], + meta: MessagePacketMeta { + flags: 0, + view_angles: Default::default(), + sequence_in: 0, + sequence_out: 0, + }, + }) + }); + for packet in fill_packets { + packet + .encode(&mut out_stream, &handler.state_handler) + .unwrap(); + } + + next.set_tick(next.tick() - start_tick); + next.encode(&mut out_stream, &handler.state_handler) + .unwrap(); + handler.handle_packet(next).unwrap(); + while let Some(mut packet) = packets.next(&handler.state_handler).unwrap() { let ty = packet.packet_type(); let original_tick = packet.tick(); - packet.set_tick(max(original_tick, start_tick) - start_tick); + packet.set_tick(original_tick - start_tick); if ty != PacketType::ConsoleCmd { packet .encode(&mut out_stream, &handler.state_handler)