internal void BuildTotalStats(GenerateStatsOptions options) { lock (DamageGroups) { Selected = options.Npcs; Title = options.Name; try { FireNewStatsEvent(options); RaidTotals = StatsUtil.CreatePlayerStats(Labels.RAID); DamageGroups.Clear(); DamageGroupIds.Clear(); PlayerHasPet.Clear(); PetToPlayer.Clear(); Resists.Clear(); var damageBlocks = new List <ActionBlock>(); Selected.ForEach(fight => { StatsUtil.UpdateTimeDiffs(RaidTotals, fight); damageBlocks.AddRange(fight.DamageBlocks); if (fight.GroupId > -1) { DamageGroupIds[fight.GroupId] = 1; } }); damageBlocks.Sort((a, b) => a.BeginTime.CompareTo(b.BeginTime)); if (damageBlocks.Count > 0) { RaidTotals.TotalSeconds = RaidTotals.TimeDiffs.Sum(); var newBlock = new List <ActionBlock>(); var timeIndex = 0; damageBlocks.ForEach(block => { if (block.BeginTime > RaidTotals.LastTimes[timeIndex]) { timeIndex++; if (newBlock.Count > 0) { DamageGroups.Add(newBlock); } newBlock = new List <ActionBlock>(); } newBlock.Add(block); block.Actions.ForEach(action => { DamageRecord damage = action as DamageRecord; // see if there's a pet mapping, check this first string pname = PlayerManager.Instance.GetPlayerFromPet(damage.Attacker); if (!string.IsNullOrEmpty(pname) || !string.IsNullOrEmpty(pname = damage.AttackerOwner)) { PlayerHasPet[pname] = 1; PetToPlayer[damage.Attacker] = pname; } }); }); DamageGroups.Add(newBlock); for (int i = 0; i < RaidTotals.BeginTimes.Count && i < RaidTotals.LastTimes.Count; i++) { var group = DataManager.Instance.GetResistsDuring(RaidTotals.BeginTimes[i], RaidTotals.LastTimes[i]); group.ForEach(block => Resists.AddRange(block.Actions)); } ComputeDamageStats(options); } else if (Selected == null || Selected.Count == 0) { FireNoDataEvent(options, "NONPC"); } else { FireNoDataEvent(options, "NODATA"); } } catch (ArgumentNullException ne) { LOG.Error(ne); } catch (NullReferenceException nr) { LOG.Error(nr); } catch (ArgumentOutOfRangeException aor) { LOG.Error(aor); } catch (ArgumentException ae) { LOG.Error(ae); } catch (OutOfMemoryException oem) { LOG.Error(oem); } } }
internal void BuildTotalStats(GenerateStatsOptions options) { lock (HealingGroups) { Selected = options.Npcs; Title = options.Name; try { FireNewStatsEvent(options); RaidTotals = StatsUtil.CreatePlayerStats(Labels.RAID); HealingGroups.Clear(); Selected.ForEach(npc => StatsUtil.UpdateTimeDiffs(RaidTotals, npc, HEAL_OFFSET)); RaidTotals.TotalSeconds = RaidTotals.TimeDiffs.Sum(); if (RaidTotals.BeginTimes.Count > 0 && RaidTotals.BeginTimes.Count == RaidTotals.LastTimes.Count) { for (int i = 0; i < RaidTotals.BeginTimes.Count; i++) { var updatedHeals = new List <ActionBlock>(); var heals = DataManager.Instance.GetHealsDuring(RaidTotals.BeginTimes[i], RaidTotals.LastTimes[i]); heals.ForEach(heal => { var updatedHeal = new ActionBlock() { BeginTime = heal.BeginTime }; updatedHeal.Actions.AddRange(heal.Actions.Where(item => item is HealRecord record && IsValidHeal(record))); if (updatedHeal.Actions.Count > 0) { updatedHeals.Add(updatedHeal); } }); if (updatedHeals.Count > 0) { HealingGroups.Add(updatedHeals); } } ComputeHealingStats(options); } else if (Selected == null || Selected.Count == 0) { FireNoDataEvent(options, "NONPC"); } else { FireNoDataEvent(options, "NODATA"); } } catch (ArgumentNullException ne) { LOG.Error(ne); } catch (NullReferenceException nr) { LOG.Error(nr); } catch (ArgumentOutOfRangeException aor) { LOG.Error(aor); } catch (ArgumentException ae) { LOG.Error(ae); } catch (OutOfMemoryException oem) { LOG.Error(oem); } } }
internal void BuildTotalStats(GenerateStatsOptions options) { lock (TankingGroups) { Selected = options.Npcs; Title = options.Name; try { FireNewStatsEvent(options); RaidTotals = StatsUtil.CreatePlayerStats(Labels.RAID); TankingGroups.Clear(); var damageBlocks = new List <ActionBlock>(); Selected.ForEach(fight => { StatsUtil.UpdateTimeDiffs(RaidTotals, fight); damageBlocks.AddRange(fight.TankingBlocks); }); damageBlocks.Sort((a, b) => a.BeginTime.CompareTo(b.BeginTime)); if (damageBlocks.Count > 0) { RaidTotals.TotalSeconds = RaidTotals.TimeDiffs.Sum(); var newBlock = new List <ActionBlock>(); var timeIndex = 0; damageBlocks.ForEach(block => { if (block.BeginTime > RaidTotals.LastTimes[timeIndex]) { timeIndex++; if (newBlock.Count > 0) { TankingGroups.Add(newBlock); } newBlock = new List <ActionBlock>(); } newBlock.Add(block); }); TankingGroups.Add(newBlock); ComputeTankingStats(options); } else if (Selected == null || Selected.Count == 0) { FireNoDataEvent(options, "NONPC"); } else { FireNoDataEvent(options, "NODATA"); } } catch (ArgumentNullException ne) { LOG.Error(ne); } catch (NullReferenceException nr) { LOG.Error(nr); } catch (ArgumentOutOfRangeException aor) { LOG.Error(aor); } catch (ArgumentException ae) { LOG.Error(ae); } catch (OutOfMemoryException oem) { LOG.Error(oem); } } }