1
0
Fork 0
mirror of https://codeberg.org/demostf/parser.git synced 2026-06-03 18:24:05 +02:00

player count fix wip

This commit is contained in:
Robin Appelman 2023-09-08 16:46:49 +02:00
commit cfd514000e

View file

@ -13,16 +13,6 @@ use tf_demo_parser::demo::packet::{Packet, PacketType};
use tf_demo_parser::demo::parser::{DemoHandler, Encode, RawPacketStream}; use tf_demo_parser::demo::parser::{DemoHandler, Encode, RawPacketStream};
use tf_demo_parser::{Demo, ParseError}; use tf_demo_parser::{Demo, ParseError};
const COPY_TYPES: &[PacketType] = &[
// PacketType::Signon,
// PacketType::Message,
// PacketType::SyncTick, // bit perfect
// PacketType::ConsoleCmd, // bit perfect
// PacketType::DataTables, // bit perfect
// PacketType::StringTables, // close enough
// PacketType::UserCmd, // close enough
];
fn main() -> Result<(), MainError> { fn main() -> Result<(), MainError> {
#[cfg(feature = "trace")] #[cfg(feature = "trace")]
tracing_subscriber::fmt::init(); tracing_subscriber::fmt::init();
@ -56,43 +46,56 @@ fn main() -> Result<(), MainError> {
header.write(&mut out_stream)?; header.write(&mut out_stream)?;
let mut handler = DemoHandler::default(); let mut handler = DemoHandler::default();
let mut encode_handler = DemoHandler::default();
let mut packet_start = packets.pos();
let mut has_stop = false; let mut has_stop = false;
let mut last_tick = DemoTick::default(); let mut last_tick = DemoTick::default();
while let Some(mut packet) = packets.next(&handler.state_handler)? { while let Some(packet) = packets.next(&handler.state_handler)? {
let packet_end = packets.pos();
last_tick = packet.tick(); last_tick = packet.tick();
let packet_bits = stream.read_bits(packet_end - packet_start)?; if packet.packet_type() == PacketType::Stop {
if COPY_TYPES.contains(&packet.packet_type()) { has_stop = true;
packet_bits.write(&mut out_stream)?;
} else {
match &mut packet {
Packet::Signon(message_packet) | Packet::Message(message_packet)
if strip_pov =>
{
message_packet.meta.view_angles = Default::default();
message_packet.messages.iter_mut().for_each(|msg| {
if let Message::ServerInfo(info) = msg {
info.stv = true;
}
});
}
Packet::Stop(_) => {
has_stop = true;
}
_ => {}
}
if packet.packet_type() != PacketType::ConsoleCmd {
packet
.encode(&mut out_stream, &handler.state_handler)
.unwrap();
}
} }
let mut encode_packet = packet.clone();
match &mut encode_packet {
Packet::DataTables(tables_packet) => {
for table in tables_packet.tables.iter_mut() {
for prop in table.props.iter_mut() {
match (table.name.as_str(), prop.name.as_str()) {
("DT_ObjectDispenser", "\"healing_array\"") => {
prop.element_count = Some(101);
}
("DT_Team", "\"player_array\"") => {
prop.element_count = Some(101);
}
("DT_TFTeam", "\"team_object_array\"") => {
prop.element_count = Some(606);
}
_ => {}
}
}
}
}
Packet::Signon(message_packet) | Packet::Message(message_packet) if strip_pov => {
message_packet.meta.view_angles = Default::default();
message_packet.messages.iter_mut().for_each(|msg| {
if let Message::ServerInfo(info) = msg {
info.stv = true;
}
});
}
_ => {}
}
if encode_packet.packet_type() != PacketType::ConsoleCmd {
encode_packet
.encode(&mut out_stream, &encode_handler.state_handler)
.unwrap();
}
handler.handle_packet(packet).unwrap(); handler.handle_packet(packet).unwrap();
packet_start = packet_end; encode_handler.handle_packet(encode_packet).unwrap();
} }
if packets.incomplete { if packets.incomplete {
@ -101,7 +104,7 @@ fn main() -> Result<(), MainError> {
if !has_stop { if !has_stop {
Packet::Stop(StopPacket { tick: last_tick }) Packet::Stop(StopPacket { tick: last_tick })
.encode(&mut out_stream, &handler.state_handler) .encode(&mut out_stream, &encode_handler.state_handler)
.unwrap(); .unwrap();
} }
} }