func main() { parser := yasha.ParserFromFile("/home/manveru/Dropbox/Public/d2rp_test_replays/813230338.dem") parser.OnFileInfo = func(fileinfo *dota.CDemoFileInfo) { spew.Dump(fileinfo) } parser.OnSayText2 = func(tick int, obj *dota.CUserMsg_SayText2) { spew.Dump(tick, obj) } parser.OnChatEvent = func(tick int, obj *dota.CDOTAUserMsg_ChatEvent) { spew.Dump(tick, obj) } parser.Parse() }
func main() { if len(os.Args) < 2 { fmt.Println("Expected a .dem file as argument") } for _, path := range os.Args[1:] { parser := yasha.ParserFromFile(path) parser.OnSayText2 = func(tick int, obj *dota.CUserMsg_SayText2) { fmt.Printf("%s - %07d | %s: %s\n", filepath.Base(path), tick, obj.GetPrefix(), obj.GetText()) } parser.Parse() } }
func main() { if len(os.Args) < 2 { spew.Println("Expected a .dem file as argument") } for _, path := range os.Args[1:] { parser := yasha.ParserFromFile(path) parser.OnFileInfo = func(fileinfo *dota.CDemoFileInfo) { data, err := json.MarshalIndent(fileinfo, "", " ") if err != nil { panic(err) } spew.Println(string(data)) } parser.Parse() } }
func main() { if len(os.Args) < 2 { fmt.Println("Expected a .dem file as argument") } for _, path := range os.Args[1:] { parser := yasha.ParserFromFile(path) parser.OnEntityPreserved = func(pe *yasha.PacketEntity) { if strings.HasPrefix(pe.Name, "DT_DOTA_Unit_Hero_") { if _, ok := pe.Delta["DT_DOTA_BaseNPC.m_vecOrigin"]; ok { coord := coordFromCell(pe) fmt.Printf("%30s | X: %5.0f Y: %5.0f\n", pe.Name[18:len(pe.Name)], coord.X, coord.Y) } } } parser.Parse() } }
func Parse(ids []string) { fmt.Printf("Match ids are: %v\n", ids) for _, id := range ids { path := DEMO_PATH + "/" + id + ".dem" fmt.Printf("parsing file %v\n", path) parser := yasha.ParserFromFile(DEMO_PATH + "/1458895412.dem") var now time.Duration var gameTime, preGameStarttime float64 var killsTotal int = 0 parser.OnEntityPreserved = func(pe *yasha.PacketEntity) { if pe.Name == "DT_DOTAGamerulesProxy" { gameTime = pe.Values["DT_DOTAGamerules.m_fGameTime"].(float64) preGameStarttime = pe.Values["DT_DOTAGamerules.m_flPreGameStartTime"].(float64) now = time.Duration(gameTime-preGameStarttime) * time.Second } } parser.OnCombatLog = func(entry yasha.CombatLogEntry) { switch log := entry.(type) { case *yasha.CombatLogDeath: if log.TargetIsHero { killsTotal++ } if bothAreHeroes(log) { fmt.Printf("%7s | %s just killed %s!\n", now, log.Source, log.Target) } } } parser.Parse() fmt.Printf("Looks like %d kills total!\n", killsTotal) } }
func main() { if len(os.Args) < 2 { fmt.Println("Expected a .dem file as argument") } for _, path := range os.Args[1:] { parser := yasha.ParserFromFile(path) var now time.Duration var gameTime, preGameStarttime float64 parser.OnEntityPreserved = func(pe *yasha.PacketEntity) { if pe.Name == "DT_DOTAGamerulesProxy" { gameTime = pe.Values["DT_DOTAGamerules.m_fGameTime"].(float64) preGameStarttime = pe.Values["DT_DOTAGamerules.m_flPreGameStartTime"].(float64) now = time.Duration(gameTime-preGameStarttime) * time.Second } } parser.OnCombatLog = func(entry yasha.CombatLogEntry) { switch log := entry.(type) { case *yasha.CombatLogPurchase: fmt.Printf("%7s | %s bought a %s\n", now, log.Buyer, log.Item) case *yasha.CombatLogAbility: if log.Target == "dota_unknown" { fmt.Printf("%7s | %s casted %s\n", now, log.Attacker, log.Ability) } else { fmt.Printf("%7s | %s casted %s on %s\n", now, log.Attacker, log.Ability, log.Target) } case *yasha.CombatLogHeal: fmt.Printf("%7s | %s heals %s for %dHP\n", now, log.Source, log.Target, log.Value) } } parser.Parse() } }