internal static SpellCountData GetSpellCounts(List <string> playerList, PlayerStats raidStats) { var result = new SpellCountData(); HashSet <TimedAction> castsDuring = new HashSet <TimedAction>(); HashSet <TimedAction> receivedDuring = new HashSet <TimedAction>(); QuerySpellBlocks(raidStats, castsDuring, receivedDuring); foreach (var action in castsDuring.AsParallel().Where(cast => playerList.Contains((cast as SpellCast).Caster))) { SpellCast cast = action as SpellCast; if (cast.SpellData != null) { UpdateMaps(cast.SpellData, cast.Caster, result.PlayerCastCounts, result.PlayerInterruptedCounts, result.MaxCastCounts, result.UniqueSpells, cast.Interrupted); } } foreach (var action in receivedDuring.AsParallel().Where(received => playerList.Contains((received as ReceivedSpell).Receiver))) { ReceivedSpell received = action as ReceivedSpell; // dont include detrimental received spells since they're mostly things like being nuked if (received.SpellData != null && received.SpellData.IsBeneficial) { UpdateMaps(received.SpellData, received.Receiver, result.PlayerReceivedCounts, null, result.MaxReceivedCounts, result.UniqueSpells); } } return(result); }
internal static SpellCountData GetSpellCounts(List <string> playerList, PlayerStats raidStats) { var result = new SpellCountData(); HashSet <IAction> castsDuring = new HashSet <IAction>(); HashSet <IAction> receivedDuring = new HashSet <IAction>(); double maxTime = -1; raidStats.Ranges.TimeSegments.ForEach(segment => { maxTime = maxTime == -1 ? segment.BeginTime + raidStats.TotalSeconds : maxTime; var blocks = DataManager.Instance.GetCastsDuring(segment.BeginTime - COUNT_OFFSET, segment.EndTime); blocks.ForEach(block => { if (raidStats.MaxTime == raidStats.TotalSeconds || block.BeginTime <= maxTime) { block.Actions.ForEach(action => castsDuring.Add(action)); } }); blocks = DataManager.Instance.GetReceivedSpellsDuring(segment.BeginTime - COUNT_OFFSET, segment.EndTime); blocks.ForEach(block => { if (raidStats.MaxTime == raidStats.TotalSeconds || block.BeginTime <= maxTime) { block.Actions.ForEach(action => receivedDuring.Add(action)); } }); }); foreach (var action in castsDuring.AsParallel().Where(cast => playerList.Contains((cast as SpellCast).Caster))) { SpellCast cast = action as SpellCast; var spellData = DataManager.Instance.GetSpellByAbbrv(DataManager.Instance.AbbreviateSpellName(cast.Spell)); if (spellData != null) { UpdateMaps(spellData, cast.Caster, result.PlayerCastCounts, result.MaxCastCounts, result.UniqueSpells); } } foreach (var action in receivedDuring.AsParallel().Where(received => playerList.Contains((received as ReceivedSpell).Receiver))) { ReceivedSpell received = action as ReceivedSpell; var spellData = received.SpellData; if (spellData == null && received.Ambiguity.Count > 0 && DataManager.ResolveSpellAmbiguity(received, out SpellData replaced)) { spellData = replaced; } // dont include detrimental received spells since they're mostly things like being nuked if (spellData != null && spellData.IsBeneficial) { UpdateMaps(spellData, received.Receiver, result.PlayerReceivedCounts, result.MaxReceivedCounts, result.UniqueSpells); } } return(result); }
internal void ShowSpells(List <PlayerStats> selectedStats, CombinedStats currentStats) { var raidStats = currentStats?.RaidStats; if (selectedStats != null && raidStats != null) { PlayerList = selectedStats.Select(stats => stats.OrigName).ToList(); TheSpellCounts = SpellCountBuilder.GetSpellCounts(PlayerList, raidStats); if (TheSpellCounts.PlayerCastCounts.Count > 0) { selectAll.IsEnabled = true; } Display(); } }
private const int SPELL_TIME_OFFSET = 10; // seconds back internal static SpellCountData GetSpellCounts(List <string> playerList, PlayerStats raidStats) { var result = new SpellCountData(); var offsets = GetOffsetTimes(raidStats); var begins = offsets.Item1; var lasts = offsets.Item2; List <IAction> castsDuring = new List <IAction>(); List <IAction> receivedDuring = new List <IAction>(); for (int i = 0; i < begins.Count; i++) { var blocks = DataManager.Instance.GetCastsDuring(begins[i], lasts[i]); blocks.ForEach(block => castsDuring.AddRange(block.Actions)); blocks = DataManager.Instance.GetReceivedSpellsDuring(begins[i], lasts[i]); blocks.ForEach(block => receivedDuring.AddRange(block.Actions)); } foreach (var action in castsDuring.AsParallel().Where(cast => playerList.Contains((cast as SpellCast).Caster))) { SpellCast cast = action as SpellCast; var spellData = DataManager.Instance.GetSpellByAbbrv(Helpers.AbbreviateSpellName(cast.Spell)); if (spellData != null) { UpdateMaps(spellData, cast.Caster, result.PlayerCastCounts, result.MaxCastCounts, result.UniqueSpells); } } foreach (var action in receivedDuring.AsParallel().Where(received => playerList.Contains((received as ReceivedSpell).Receiver))) { ReceivedSpell received = action as ReceivedSpell; var spellData = received.SpellData; var spellClass = PlayerManager.Instance.GetPlayerClassEnum(received.Receiver); if (DataManager.Instance.CheckForSpellAmbiguity(spellData, spellClass, out SpellData replaced)) { spellData = replaced; } UpdateMaps(spellData, received.Receiver, result.PlayerReceivedCounts, result.MaxReceivedCounts, result.UniqueSpells); } return(result); }