예제 #1
0
        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}.");
                }
            }
        }
예제 #2
0
        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();
            });
        }