mirror of
https://github.com/demostf/cutter.git
synced 2026-06-03 20:04:07 +02:00
start state cleanup
This commit is contained in:
parent
d4c4fd1b4f
commit
aec1c48cd5
1 changed files with 26 additions and 13 deletions
39
src/lib.rs
39
src/lib.rs
|
|
@ -66,10 +66,9 @@ pub fn cut(input: &[u8], start_tick: u32, end_tick: u32) -> Vec<u8> {
|
||||||
let mut handler = DemoHandler::default();
|
let mut handler = DemoHandler::default();
|
||||||
handler.handle_header(&header);
|
handler.handle_header(&header);
|
||||||
|
|
||||||
let (entities, string_tables, start_packets, last_server_tick) =
|
let start_state = skip_start(&mut start_handler, &mut packets, start_tick);
|
||||||
skip_start(&mut start_handler, &mut packets, start_tick);
|
|
||||||
|
|
||||||
for packet in start_packets {
|
for packet in start_state.start_packets {
|
||||||
packet
|
packet
|
||||||
.encode(&mut out_stream, &handler.state_handler)
|
.encode(&mut out_stream, &handler.state_handler)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
@ -98,14 +97,16 @@ pub fn cut(input: &[u8], start_tick: u32, end_tick: u32) -> Vec<u8> {
|
||||||
panic!("first packet is not a MessagePacket, pick a different start tick")
|
panic!("first packet is not a MessagePacket, pick a different start tick")
|
||||||
}
|
}
|
||||||
|
|
||||||
let start_entities = entities.entity_ids();
|
let start_entities = start_state.entities.entity_ids();
|
||||||
|
|
||||||
let string_table_updates = string_tables
|
let string_table_updates = start_state
|
||||||
|
.table_updates
|
||||||
.encode()
|
.encode()
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|msg| Message::UpdateStringTable(msg));
|
.map(|msg| Message::UpdateStringTable(msg));
|
||||||
let (baseline_updates, entity_update, removed_update) =
|
let (baseline_updates, entity_update, removed_update) = start_state
|
||||||
entities.encode(&start_handler.state_handler, delta_tick - 2);
|
.entities
|
||||||
|
.encode(&start_handler.state_handler, delta_tick - 2);
|
||||||
let baseline_updates = baseline_updates.into_iter().map(Message::PacketEntities);
|
let baseline_updates = baseline_updates.into_iter().map(Message::PacketEntities);
|
||||||
let start_packets = string_table_updates
|
let start_packets = string_table_updates
|
||||||
.chain(baseline_updates)
|
.chain(baseline_updates)
|
||||||
|
|
@ -129,7 +130,7 @@ pub fn cut(input: &[u8], start_tick: u32, end_tick: u32) -> Vec<u8> {
|
||||||
}
|
}
|
||||||
|
|
||||||
// create the net ticks needed for later deltas
|
// create the net ticks needed for later deltas
|
||||||
let fill_ticks = ((delta_tick + 1)..=last_server_tick)
|
let fill_ticks = ((delta_tick + 1)..=start_state.server_tick)
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|tick| net_tick(tick));
|
.map(|tick| net_tick(tick));
|
||||||
let fill_packets = fill_ticks.map(|msg| {
|
let fill_packets = fill_ticks.map(|msg| {
|
||||||
|
|
@ -160,7 +161,7 @@ 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_message_mutator(DeleteFilter::new(start_entities, start_state.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)
|
||||||
});
|
});
|
||||||
|
|
@ -196,13 +197,20 @@ pub fn cut(input: &[u8], start_tick: u32, end_tick: u32) -> Vec<u8> {
|
||||||
out_buffer
|
out_buffer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct StartState<'a> {
|
||||||
|
entities: ActiveEntities,
|
||||||
|
table_updates: StringTablesUpdates,
|
||||||
|
start_packets: Vec<Packet<'a>>,
|
||||||
|
server_tick: u32,
|
||||||
|
}
|
||||||
|
|
||||||
fn skip_start<'a>(
|
fn skip_start<'a>(
|
||||||
handler: &mut DemoHandler<'a, NullHandler>,
|
handler: &mut DemoHandler<'a, NullHandler>,
|
||||||
packets: &mut RawPacketStream<'a>,
|
packets: &mut RawPacketStream<'a>,
|
||||||
start_tick: u32,
|
start_tick: u32,
|
||||||
) -> (ActiveEntities, StringTablesUpdates, Vec<Packet<'a>>, u32) {
|
) -> StartState<'a> {
|
||||||
let mut entities = ActiveEntities::default();
|
let mut entities = ActiveEntities::default();
|
||||||
let mut string_tables = StringTablesUpdates::default();
|
let mut table_updates = StringTablesUpdates::default();
|
||||||
let mut start_packets = Vec::with_capacity(6);
|
let mut start_packets = Vec::with_capacity(6);
|
||||||
let mut server_tick = 0;
|
let mut server_tick = 0;
|
||||||
|
|
||||||
|
|
@ -213,7 +221,7 @@ fn skip_start<'a>(
|
||||||
} else {
|
} else {
|
||||||
if let Packet::Message(message_packet) = &packet {
|
if let Packet::Message(message_packet) = &packet {
|
||||||
for msg in &message_packet.messages {
|
for msg in &message_packet.messages {
|
||||||
string_tables.handle_message(&msg);
|
table_updates.handle_message(&msg);
|
||||||
match msg {
|
match msg {
|
||||||
Message::PacketEntities(msg) => {
|
Message::PacketEntities(msg) => {
|
||||||
entities.handle_message(msg, &handler.state_handler);
|
entities.handle_message(msg, &handler.state_handler);
|
||||||
|
|
@ -234,7 +242,12 @@ fn skip_start<'a>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
(entities, string_tables, start_packets, server_tick)
|
StartState {
|
||||||
|
entities,
|
||||||
|
table_updates,
|
||||||
|
start_packets,
|
||||||
|
server_tick,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct DeleteFilter {
|
struct DeleteFilter {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue