#回放 #解析器 #dota #演示 #dota2

d2-stampede

用 Rust 编写的 Dota 2 回放解析器

8 个版本

0.2.2 2024 年 7 月 18 日
0.2.1 2024 年 7 月 18 日
0.1.4 2024 年 7 月 14 日

#645解析器实现

Download history 363/week @ 2024-07-08 391/week @ 2024-07-15 21/week @ 2024-07-22 2/week @ 2024-07-29

777 每月下载次数
d2-stampede-observers 中使用

MIT/Apache

475KB
12K SLoC

D2-Stampede

用 Rust 编写的 Dota 2 回放解析器。

快速开始

use d2_stampede::prelude::*;
use d2_stampede::proto::*;

// Create struct that implements Default trait
#[derive(Default)]
struct Chat;

// Mark impl block with observer attribute
#[observer]
impl Chat {
    #[on_message] // Use on_message attribute to mark protobuf message handler
    fn handle_chat_msg(
        &mut self,
        ctx: &Context,
        chat_msg: CDotaUserMsgChatMessage, // Use any protobuf message as an argument
    ) -> ObserverResult {
        if let Ok(pr) = ctx.entities().get_by_class_name("CDOTA_PlayerResource") {
            let name: String = property!(
                pr,
                "m_vecPlayerData.{:04}.m_iszPlayerName",
                chat_msg.source_player_id()
            );
            println!("{}: {}", name, chat_msg.message_text());
        }
        Ok(())
    }
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Read replay file
    let replay = unsafe { memmap2::Mmap::map(&std::fs::File::open("replay.dem")?)? };

    // Create parser 
    let mut parser = Parser::new(&replay)?;

    // Register observers
    parser.register_observer::<Chat>();

    // Parse replay from start to end
    parser.run_to_end()?;

    // Or parse only parts of replay
    parser.jump_to_tick(10000)?;
    parser.run_to_tick(11000)?;

    Ok(())
}

示例

d2-stampede-examples

下载和构建

git clone https://github.com/Rupas1k/d2-stampede.git
cd d2-stampede
cargo build --release

odota-rust - OpenDota 解析器的 Rust 版本复制
d2wm-parser - 具有Python绑定的 ward 解析器

依赖

~4–13MB
~131K SLoC