1
0
Fork 0
mirror of https://codeberg.org/demostf/parser.git synced 2026-06-03 10:14:06 +02:00
Parsing of tf2 demo files
  • Rust 99.8%
  • Nix 0.2%
Find a file
2024-04-07 16:48:19 +02:00
.github/workflows workflow updates 2024-02-01 00:31:46 +01:00
benches strictly distinguish between server and demo ticks 2022-09-17 15:32:18 +02:00
examples strictly distinguish between server and demo ticks 2022-09-17 15:32:18 +02:00
fuzz bumb dependencies 2023-01-07 13:51:48 +01:00
smoker smoker fixes 2020-01-29 22:53:04 +01:00
src remove some slice indexing 2024-04-07 16:48:19 +02:00
test_data newer demo for codegen 2024-02-01 00:31:46 +01:00
tests clippy fixes 2024-04-07 14:56:43 +02:00
.envrc flake 2022-08-05 23:36:56 +02:00
.gitignore newer demo for codegen 2024-02-01 00:31:46 +01:00
Cargo.lock bumb dependencies 2024-04-07 14:46:45 +02:00
Cargo.toml bumb dependencies 2024-04-07 14:46:45 +02:00
codegen.nix newer demo for codegen 2024-02-01 00:31:46 +01:00
flake.lock flake updates 2023-12-23 22:41:37 +01:00
flake.nix fix hydra job 2024-04-05 13:09:56 +02:00
overlay.nix newer demo for codegen 2024-02-01 00:31:46 +01:00
parser.nix don't run tests on aarch64 hydra 2024-04-05 16:40:12 +02:00
pgo_build.sh first prop flattening version 2019-08-10 19:38:42 +02:00
README.md Add analyzer to extract player scoreboard information 2022-12-28 13:54:34 -05:00
rustig.toml check for panicing code in ci 2019-08-11 13:57:20 +02:00
schema.json fix schema for SendPropIdentifier 2024-02-02 19:39:56 +01:00

TF Demo Parser

Build Status

Parsing of tf2 demo files

Building

This project is build using rust and requires cargo and friends, see the rust website for how to get started.

Once rust is setup building is as simple as

cargo build --release

which will place the binary at target/release/parse_demo

Usage

Basic usage is as simple as parse_demo demofile.dem which will output a "summary" of the demo file in JSON format.

Passing the detailed_summary argument to the end of parse_demo will output a table with scoreboard information for all players who were ever on the server while the demo was being recorded. The player who created the demo will be highlighted in the output.

Advanced usage

Loop through every packet

use bitbuffer::BitRead;
use main_error::MainError;
use std::fs;
use tf_demo_parser::demo::header::Header;
use tf_demo_parser::demo::parser::{DemoHandler, RawPacketStream};
use tf_demo_parser::Demo;

fn main() -> Result<(), MainError> {
    let file = fs::read("demofile.dem")?;

    let demo = Demo::new(&file);
    let mut handler = DemoHandler::default();

    let mut stream = demo.get_stream();
    let header = Header::read(&mut stream)?;
    handler.handle_header(&header);

    let mut packets = RawPacketStream::new(stream);

    while let Some(packet) = packets.next(&handler.state_handler)? {
        handler.handle_packet(packet).unwrap();
    }
    assert_eq!(false, packets.incomplete);

    Ok(())
}

Handle demo data with a custom analyser

Sometimes it's easier to create a custom Analyser to handle the demo data as it comes along.

See src/demo/parser/analyser.rs for an example.
Once you have a custom analyser you can use it with:

DemoParser::new_all_with_analyser(demo.get_stream(), CustomAnalyser::new());
let (header, state) = parser.parse()?;