コード例 #1
0
        public virtual void TrackFightMiss(FightMissEvent miss)
        {
            var f = AddFight(miss);

            if (f == null)
            {
                return;
            }

            var source = f.Participants.First(x => x.Name == miss.Source);

            source.AddMiss(miss);

            var target = f.Participants.First(x => x.Name == miss.Target);

            target.AddMiss(miss);

            // clear the critical in case a rune is present and the actual hit never lands
            LastCritical = null;

            // should runes count as hits? maybe this should be an option
            if (miss.Type == "rune")
            {
                //LastHit = new FightHitEvent { Timestamp = miss.Timestamp, Source = miss.Source, Target = miss.Target, Amount = 0, Type = "rune" };
            }
        }
コード例 #2
0
        public virtual void TrackFightCrit(FightCritEvent crit)
        {
            if (crit.Sequence == FightCritEventSequence.BeforeHit)
            {
                // crit update will be done in TrackFightHit() for before hit
                LastCritical = crit;
            }

            if (crit.Sequence == FightCritEventSequence.AfterHit && LastHit != null)
            {
                // crit notifications don't include a target so we need to use the target from the last hit
                var p = LastFight.Participants.FirstOrDefault(x => x.Name == crit.Source);
                if (p == null)
                {
                    return;
                }

                var ht = p.AttackTypes.FirstOrDefault(x => x.Type == LastHit.Type);
                if (ht == null)
                {
                    return;
                }

                ht.NormalHitCount -= 1;
                ht.NormalHitSum   -= LastHit.Amount;
                ht.CritHitCount   += 1;
                ht.CritHitSum     += LastHit.Amount;

                LastCritical = null;
            }
        }
コード例 #3
0
        public virtual void TrackFightHit(FightHitEvent hit)
        {
            var f = AddFight(hit);

            if (f == null)
            {
                return;
            }

            var source = f.Participants.First(x => x.Name == hit.Source);

            source.AddHit(hit);

            var target = f.Participants.First(x => x.Name == hit.Target);

            target.AddHit(hit);

            // there are no crit notifications for DoTs but we can guess when they occur by
            // treating everything that does 125% more damage than the minimum as a crit
            // todo: do DoTs have partial resists?
            if (hit.Type == "dot" && hit.Spell != null)
            {
                int min;
                if (!MinDoTDamage.TryGetValue(hit.Spell, out min) || min > hit.Amount)
                {
                    MinDoTDamage[hit.Spell] = min = hit.Amount;
                }
                if (hit.Amount >= min * 2.25)
                {
                    LastCritical = new FightCritEvent {
                        Timestamp = hit.Timestamp, Source = hit.Source, Amount = hit.Amount, Sequence = FightCritEventSequence.BeforeHit
                    }
                }
                ;
            }

            // update hit for crit notification that occured before hit
            if (LastCritical != null && LastCritical.Sequence == FightCritEventSequence.BeforeHit && LastCritical.Source == hit.Source)
            {
                var ht = source.AttackTypes.First(x => x.Type == hit.Type);
                ht.NormalHitCount -= 1;
                ht.NormalHitSum   -= hit.Amount;
                ht.CritHitCount   += 1;
                ht.CritHitSum     += hit.Amount;
            }

            LastFight    = f;
            LastHit      = hit;
            LastCritical = null;
        }
コード例 #4
0
ファイル: ParserTests.cs プロジェクト: bhyvex/eqlogparser
        public void FightCrit()
        {
            FightCritEvent crit   = null;
            var            parser = new LogParser(PLAYER);

            parser.OnFightCrit += (args) => crit = args;

            crit = null;
            parser.ParseLine("[Sun Nov 08 20:03:14 2015] Rumstil scores a critical hit! (208)");
            Assert.NotNull(crit);
            Assert.Equal("Rumstil", crit.Source);
            Assert.Equal(208, crit.Amount);
            Assert.Equal(FightCritEventSequence.BeforeHit, crit.Sequence);

            crit = null;
            parser.ParseLine("[Wed Aug 27 13:26:56 2003] Rumstil lands a Crippling Blow!(272)");
            Assert.NotNull(crit);
            Assert.Equal("Rumstil", crit.Source);
            Assert.Equal(272, crit.Amount);
            Assert.Equal(FightCritEventSequence.BeforeHit, crit.Sequence);

            crit = null;
            parser.ParseLine("[Wed Aug 27 13:26:56 2003] Rumstil scores a Deadly Strike!(172)");
            Assert.NotNull(crit);
            Assert.Equal("Rumstil", crit.Source);
            Assert.Equal(172, crit.Amount);
            Assert.Equal(FightCritEventSequence.BeforeHit, crit.Sequence);

            crit = null;
            parser.ParseLine("[Wed Jul 07 23:14:17 2004] Rumstil's holy blade cleanses his target!(2987)");
            Assert.NotNull(crit);
            Assert.Equal("Rumstil", crit.Source);
            Assert.Equal(2987, crit.Amount);
            Assert.Equal(FightCritEventSequence.BeforeHit, crit.Sequence);

            crit = null;
            parser.ParseLine("[Sun Nov 08 20:04:07 2015] You deliver a critical blast! (19589)");
            Assert.NotNull(crit);
            Assert.Equal(PLAYER, crit.Source);
            Assert.Equal(19589, crit.Amount);
            Assert.Equal(FightCritEventSequence.AfterHit, crit.Sequence);

            // ignore duplicate 3rd party version of own nuke critical
            crit = null;
            parser.ParseLine("[Sun Nov 08 20:04:07 2015] " + PLAYER + " delivers a critical blast! (19589)");
            Assert.Null(crit);
        }
コード例 #5
0
 private void TrackFightCrit(FightCritEvent crit)
 {
     // pretty sure NPCs never have critical hits
     Add(crit.Source);
 }