private static MercTeam AnalyzeTeam(Team team, MatchDetail match) { // get teammembers var teamMembers = match.Participants.Where(x => x.TeamId == team.TeamId).ToList(); var res = new MercTeam(); // safe data like baronkill res.BaronKills = team.BaronKills; // dragonkill res.DragonKills = team.DragonKills; // did they firstblood res.FirstBlood = team.FirstBlood; // when first baron res.FirstBaron = match.Timeline.Frames.Where(x => x.Events != null && x.Events.Any(y => y.MonsterType == "BARON_NASHOR" && teamMembers.Select(z => z.ParticipantId).Contains(y.KillerId))).Select(x => x.Timestamp / 1000).OrderBy(x => x).FirstOrDefault(); // when first dragon res.FirstDragon = match.Timeline.Frames.Where(x => x.Events != null && x.Events.Any(y => y.MonsterType == "DRAGON" && teamMembers.Select(z => z.ParticipantId).Contains(y.KillerId))).Select(x => x.Timestamp / 1000).OrderBy(x => x).FirstOrDefault(); // when first inhibitor res.FirstInhibitorTaken = match.Timeline.Frames.Where(x => x.Events != null && x.Events.Any(y => y.EventType == "BUILDING_KILL" && teamMembers.Select(z => z.ParticipantId).Contains(y.KillerId)) && x.Events.Any(y => y.BuildingType == "INHIBITOR_BUILDING")).Select(x => x.Timestamp / 1000).OrderBy(x => x).FirstOrDefault(); // when first tower res.FirstTowerTaken = match.Timeline.Frames.Where(x => x.Events != null && x.Events.Any(y => y.EventType == "BUILDING_KILL" && teamMembers.Select(z => z.ParticipantId).Contains(y.KillerId)) && x.Events.Any(y => y.BuildingType == "TOWER_BUILDING")).Select(x => x.Timestamp / 1000).OrderBy(x => x).FirstOrDefault(); // did they win? res.Winner = team.Winner; // find out wich mercaneries the members bouhgt res.MercsBought = new List<MercData>(); foreach (var m in teamMembers) { // find an ITEM_PURCHASED event with one of the item ids from metadata var mercId = match.Timeline.Frames.Where(x => x.Events != null && x.Events.Any(y => y.EventType == "ITEM_PURCHASED" && meta_data.Merc.Contains(y.ItemId) && y.ParticipantId == m.ParticipantId)).Select(x => x.Events.FirstOrDefault(y => y.EventType == "ITEM_PURCHASED" && meta_data.Merc.Contains(y.ItemId) && y.ParticipantId == m.ParticipantId)).FirstOrDefault(); if (mercId != null) { var merc = new MercData(); merc.Id = mercId.ItemId; merc.ParticipantId = m.ParticipantId; // look max defenslevel bought merc.DefenseLevel = match.Timeline .Frames.Where(x => x.Events != null && x.Events.Any(y => y.EventType == "ITEM_PURCHASED" && meta_data.Defense.Select(z => z.Id).Contains(y.ItemId) && y.ParticipantId == m.ParticipantId) ).Count(); // look max offenselevel bought merc.OffenseLevel = match.Timeline .Frames.Where(x => x.Events != null && x.Events.Any(y => y.EventType == "ITEM_PURCHASED" && meta_data.Offense.Select(z => z.Id).Contains(y.ItemId) && y.ParticipantId == m.ParticipantId) ).Count(); // look max upgradelevel bought merc.UpgradeLevel = match.Timeline .Frames.Where(x => x.Events != null && x.Events.Any(y => y.EventType == "ITEM_PURCHASED" && meta_data.Upgrade.Select(z => z.Id).Contains(y.ItemId) && y.ParticipantId == m.ParticipantId) ).Count(); res.MercsBought.Add(merc); } } // safe importent data from participant data trash the rest res.Participants = teamMembers.Select(x => new Lol.Api.Bilgewater.Participant { Id = x.ParticipantId, ChampionId = x.ChampionId, Assists = x.Stats.Assists, Deaths = x.Stats.Deaths, Kills = x.Stats.Kills, MinionsKilled = x.Stats.MinionsKilled, NeutralMinionsKilled = x.Stats.NeutralMinionsKilled, NeutralMinionsKilledEnemyJungle = x.Stats.NeutralMinionsKilledEnemyJungle, NeutralMinionsKilledTeamJungle = x.Stats.NeutralMinionsKilledTeamJungle, PentaKills = x.Stats.PentaKills, Item0 = x.Stats.Item0, Item1 = x.Stats.Item1, Item2 = x.Stats.Item2, Item3 = x.Stats.Item3, Item4 = x.Stats.Item4, Item5 = x.Stats.Item5, Item6 = x.Stats.Item6, Spell1Id = x.Spell1Id, Spell2Id = x.Spell2Id, }).ToList(); return res; }
private static MercStatistcs AnalyzeMatch(MatchDetail converted) { var res = new MercStatistcs(); // id is somewhat obligatory res.MatchId = converted.MatchId; // using linq we look in frames for the first event with "BARON_NASHOR" and extract the timetamp in seconds - is milliseconds in file res.FirstBaron = converted.Timeline.Frames.Where(x => x.Events != null && x.Events.Any(y => y.MonsterType == "BARON_NASHOR")).Select(x => x.Timestamp / 1000).OrderBy(x => x).FirstOrDefault(); // using linq we look in frames for the first event with "BARON_DRAGON" and extract the timetamp in seconds - is milliseconds in file res.FirstDragon = converted.Timeline.Frames.Where(x => x.Events != null && x.Events.Any(y => y.MonsterType == "DRAGON")).Select(x => x.Timestamp / 1000).OrderBy(x => x).FirstOrDefault(); // using linq we look in frames for the first event with "CHAMPION_KILL" and extract the timetamp in seconds - is milliseconds in file res.FirstBlood = converted.Timeline.Frames.Where(x => x.Events != null && x.Events.Any(y => y.EventType == "CHAMPION_KILL")).Select(x => x.Timestamp / 1000).OrderBy(x => x).FirstOrDefault(); // using linq we look in frames for the first event with "BUILDING_KILL" and buildingtype = "INHIBITOR_BUIDLING and extract the timetamp in seconds - is milliseconds in file res.FirstInhib = converted.Timeline.Frames.Where(x => x.Events != null && x.Events.Any(y => y.EventType == "BUILDING_KILL") && x.Events.Any(y => y.BuildingType == "INHIBITOR_BUILDING")).Select(x => x.Timestamp / 1000).OrderBy(x => x).FirstOrDefault(); // using linq we look in frames for the first event with "BUILDING_KILL" and buildingtype = "TOWER_BUILDING and extract the timetamp in seconds - is milliseconds in file res.FirstTower = converted.Timeline.Frames.Where(x => x.Events != null && x.Events.Any(y => y.EventType == "BUILDING_KILL") && x.Events.Any(y => y.BuildingType == "TOWER_BUILDING")).Select(x => x.Timestamp / 1000).OrderBy(x => x).FirstOrDefault(); // save matchduration res.MatchDuration = converted.MatchDuration; // get data from teams res.TeamBlue = AnalyzeTeam(converted.Teams[0], converted); res.TeamRed = AnalyzeTeam(converted.Teams[1], converted); return res; }