Пример #1
0
        internal override void ComputeDamageModifier(Dictionary <string, List <DamageModifierStat> > data, Dictionary <NPC, Dictionary <string, List <DamageModifierStat> > > dataTarget, Player p, ParsedEvtcLog log)
        {
            IReadOnlyList <PhaseData>          phases = log.FightData.GetPhases(log);
            Dictionary <long, BuffsGraphModel> bgmsP  = p.GetBuffGraphs(log);

            if (_trackerPlayer != null)
            {
                if (!_trackerPlayer.Has(bgmsP) && _gainComputerPlayer != ByAbsence)
                {
                    return;
                }
            }
            foreach (NPC target in log.FightData.Logic.Targets)
            {
                Dictionary <long, BuffsGraphModel> bgms = target.GetBuffGraphs(log);
                if (!Tracker.Has(bgms) && GainComputer != ByAbsence)
                {
                    continue;
                }
                if (!dataTarget.TryGetValue(target, out Dictionary <string, List <DamageModifierStat> > extra))
                {
                    dataTarget[target] = new Dictionary <string, List <DamageModifierStat> >();
                }
                Dictionary <string, List <DamageModifierStat> > dict = dataTarget[target];
                if (!dict.TryGetValue(Name, out List <DamageModifierStat> list))
                {
                    var extraDataList = new List <DamageModifierStat>();
                    foreach (PhaseData phase in phases)
                    {
                        int totalDamage = GetTotalDamage(p, log, target, phase.Start, phase.End);
                        IReadOnlyList <AbstractHealthDamageEvent> typedHits = GetHitDamageEvents(p, log, target, phase.Start, phase.End);
                        List <double> damages;
                        if (_trackerPlayer != null)
                        {
                            damages = typedHits.Select(x =>
                            {
                                if (ComputeGainPlayer(_trackerPlayer.GetStack(bgmsP, x.Time), x) < 0.0)
                                {
                                    return(-1.0);
                                }
                                return(ComputeGain(Tracker.GetStack(bgms, x.Time), x));
                            }).Where(x => x != -1.0).ToList();
                        }
                        else
                        {
                            damages = typedHits.Select(x =>
                            {
                                return(ComputeGain(Tracker.GetStack(bgms, x.Time), x));
                            }).Where(x => x != -1.0).ToList();
                        }
                        extraDataList.Add(new DamageModifierStat(damages.Count, typedHits.Count, damages.Sum(), totalDamage));
                    }
                    dict[Name] = extraDataList;
                }
            }
        }
Пример #2
0
        internal override List <DamageModifierEvent> ComputeDamageModifier(Player p, ParsedEvtcLog log)
        {
            Dictionary <long, BuffsGraphModel> bgmsP = p.GetBuffGraphs(log);

            if (_trackerPlayer != null)
            {
                if (!_trackerPlayer.Has(bgmsP) && _gainComputerPlayer != ByAbsence)
                {
                    return(new List <DamageModifierEvent>());
                }
            }
            var res = new List <DamageModifierEvent>();
            IReadOnlyList <AbstractHealthDamageEvent> typeHits = GetHitDamageEvents(p, log, null, log.FightData.FightStart, log.FightData.FightEnd);

            if (_trackerPlayer != null)
            {
                foreach (AbstractHealthDamageEvent evt in typeHits)
                {
                    AbstractSingleActor target = log.FindActor(evt.To);
                    Dictionary <long, BuffsGraphModel> bgms = target.GetBuffGraphs(log);
                    double gain = ComputeGainPlayer(_trackerPlayer.GetStack(bgmsP, evt.Time), evt, log) < 0.0 ? -1.0 : ComputeGain(Tracker.GetStack(bgms, evt.Time), evt, log);
                    res.Add(new DamageModifierEvent(evt, this, gain));
                }
            }
            else
            {
                foreach (AbstractHealthDamageEvent evt in typeHits)
                {
                    AbstractSingleActor target = log.FindActor(evt.To);
                    Dictionary <long, BuffsGraphModel> bgms = target.GetBuffGraphs(log);
                    res.Add(new DamageModifierEvent(evt, this, ComputeGain(Tracker.GetStack(bgms, evt.Time), evt, log)));
                }
            }
            res.RemoveAll(x => x.DamageGain == -1.0);
            return(res);
        }