static void Main() { string filename = "example.zevtc"; var parser = new EVTCParser(); // Used to read a log file and get raw data out of it var processor = new LogProcessor(); // Used to process the raw data // The parsed log contains raw data from the EVTC file ParsedLog parsedLog = parser.ParseLog(filename); // The log after processing the raw data into structured events and agents. Log log = processor.ProcessLog(parsedLog); // At this point, we can do anything with the processed data, and use the LogAnalyzer // for easy access to most common results with caching. var analyzer = new LogAnalyzer(log); Encounter encounter = analyzer.GetEncounter(); // Encounter names are available for some languages, we use the target name if it's not. if (EncounterNames.TryGetEncounterNameForLanguage(GameLanguage.English, encounter, out string name)) { Console.WriteLine($"Encounter: {name}"); } else { Console.WriteLine($"Encounter: {log.MainTarget?.Name ?? "unknown target"}"); } Console.WriteLine($"Result: {analyzer.GetResult()}"); Console.WriteLine($"Mode: {analyzer.GetMode()}"); Console.WriteLine($"Duration: {analyzer.GetEncounterDuration()}"); // The processed log allows easy access to data about agents foreach (var player in log.Agents.OfType <Player>()) { Console.WriteLine($"{player.Name} - {player.AccountName} - {player.Profession} - {player.EliteSpecialization}"); } // Events may be accessed as well foreach (var deadEvent in log.Events.OfType <AgentDeadEvent>()) { if (deadEvent.Agent is Player player) { Console.WriteLine($"{player.Name} died at {deadEvent.Time}."); } } }
public void SelectLog(string logFilename) { var statusStringBuilder = new StringBuilder(); var parser = new EVTCParser(); var processor = new LogProcessor() { IgnoreUnknownEvents = false }; // Parsing var sw = Stopwatch.StartNew(); ParsedLog parsedLog = null; try { parsedLog = parser.ParseLog(logFilename); var parseTime = sw.Elapsed; statusStringBuilder.AppendLine($"Parsed in {parseTime}"); Application.Instance.Invoke(() => { parsedAgents.Clear(); parsedAgents.AddRange(parsedLog.ParsedAgents); parsedAgents.Refresh(); parsedSkills.Clear(); parsedSkills.AddRange(parsedLog.ParsedSkills); parsedSkills.Refresh(); parsedCombatItems.Clear(); parsedCombatItems.AddRange(parsedLog.ParsedCombatItems); parsedCombatItems.Refresh(); }); } catch (Exception ex) { statusStringBuilder.AppendLine($"Parsing failed: {ex.Message}\n{ex.StackTrace}"); } // Processing Log processedLog = null; try { sw.Restart(); processedLog = processor.ProcessLog(parsedLog); var processTime = sw.Elapsed; statusStringBuilder.AppendLine($"Processed in {processTime}"); Application.Instance.Invoke(() => { eventList.Clear(); eventList.AddRange(processedLog.Events); eventListControl.Events = eventList; eventListControl.Agents = processedLog.Agents.ToArray(); agents.Clear(); agents.AddRange(new FilterCollection <Agent>(processedLog.Agents)); agents.Refresh(); agentControl.Events = processedLog.Events.ToArray(); }); } catch (Exception ex) { statusStringBuilder.AppendLine($"Processing failed: {ex.Message}\n{ex.StackTrace}"); } // Statistics Statistics stats = null; sw.Restart(); try { var analyzer = new LogAnalyzer(processedLog); stats = new Statistics(processedLog.StartTime.LocalTime, processedLog.PointOfView, analyzer.GetResult(), analyzer.GetMode(), analyzer.GetEncounter(), processedLog.EvtcVersion, analyzer.GetEncounterDuration()); var statsTime = sw.Elapsed; statusStringBuilder.AppendLine($"Statistics generated in {statsTime}"); Application.Instance.Invoke(() => { statisticsJsonControl.Object = stats; }); } catch (Exception ex) { statusStringBuilder.AppendLine($"Statistics generation failed: {ex.Message}\n{ex.StackTrace}"); } Application.Instance.Invoke(() => { statusStringBuilder.AppendLine( $"Build version: {parsedLog?.LogVersion?.BuildVersion}, revision {parsedLog?.LogVersion?.Revision}"); statusStringBuilder.AppendLine( $"Parsed: {parsedLog?.ParsedAgents?.Count} agents, {parsedLog?.ParsedSkills?.Count} skills, {parsedLog?.ParsedCombatItems?.Count} combat items."); statusStringBuilder.AppendLine( $"Processed: {processedLog?.Events?.Count} events, {processedLog?.Agents?.Count} agents."); parsedStateLabel.Text = statusStringBuilder.ToString(); }); }