mirror of
https://github.com/demostf/cutter.git
synced 2026-06-03 20:04:07 +02:00
delta ticks
This commit is contained in:
parent
1be42764ad
commit
ac8bc07db5
2 changed files with 63 additions and 2 deletions
BIN
out.dem
BIN
out.dem
Binary file not shown.
65
src/lib.rs
65
src/lib.rs
|
|
@ -7,7 +7,10 @@ use crate::entity::ActiveEntities;
|
||||||
use crate::utils::set_panic_hook;
|
use crate::utils::set_panic_hook;
|
||||||
use bitbuffer::{BitRead, BitWrite, BitWriteStream, LittleEndian};
|
use bitbuffer::{BitRead, BitWrite, BitWriteStream, LittleEndian};
|
||||||
use std::cmp::{max, min};
|
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::header::Header;
|
||||||
|
use tf_demo_parser::demo::message::packetentities::PacketEntitiesMessage;
|
||||||
use tf_demo_parser::demo::message::{Message, NetTickMessage};
|
use tf_demo_parser::demo::message::{Message, NetTickMessage};
|
||||||
use tf_demo_parser::demo::packet::message::{MessagePacket, MessagePacketMeta};
|
use tf_demo_parser::demo::packet::message::{MessagePacket, MessagePacketMeta};
|
||||||
use tf_demo_parser::demo::packet::stop::StopPacket;
|
use tf_demo_parser::demo::packet::stop::StopPacket;
|
||||||
|
|
@ -64,12 +67,27 @@ pub fn cut(input: &[u8], start_tick: u32, end_tick: u32) -> Vec<u8> {
|
||||||
handler.handle_packet(packet).unwrap();
|
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 msg = entities.encode();
|
||||||
let packet = Packet::Message(MessagePacket {
|
let packet = Packet::Message(MessagePacket {
|
||||||
tick: 0,
|
tick: 0,
|
||||||
messages: vec![
|
messages: vec![
|
||||||
Message::NetTick(NetTickMessage {
|
Message::NetTick(NetTickMessage {
|
||||||
tick: last_server_tick,
|
tick: delta_tick,
|
||||||
frame_time: 1881,
|
frame_time: 1881,
|
||||||
std_dev: 263,
|
std_dev: 263,
|
||||||
}),
|
}),
|
||||||
|
|
@ -87,10 +105,53 @@ pub fn cut(input: &[u8], start_tick: u32, end_tick: u32) -> Vec<u8> {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
handler.handle_packet(packet).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() {
|
while let Some(mut packet) = packets.next(&handler.state_handler).unwrap() {
|
||||||
let ty = packet.packet_type();
|
let ty = packet.packet_type();
|
||||||
let original_tick = packet.tick();
|
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 {
|
if ty != PacketType::ConsoleCmd {
|
||||||
packet
|
packet
|
||||||
.encode(&mut out_stream, &handler.state_handler)
|
.encode(&mut out_stream, &handler.state_handler)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue