start state cleanup

This commit is contained in:
Robin Appelman 2022-04-23 13:50:19 +02:00
commit aec1c48cd5

View file

@ -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 {