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" }; } }
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; } }
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; }
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); }
private void TrackFightCrit(FightCritEvent crit) { // pretty sure NPCs never have critical hits Add(crit.Source); }