Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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();
            }
        }
Exemplo n.º 4
0
        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);
        }