private float CalcAddedCritBuff() { // If the 5% crit debuff is not already being maintained by // somebody else (i.e. it's not selected in the buffs tab), we // may supply it via Improved Shadow Bolt. if (Talents.ShadowAndFlame == 0 || StatUtils.GetActiveBuff(Character.ActiveBuffs, "Spell Critical Strike Taken", s => s.SpellCritOnTarget) > 0) { return(0f); } float casts = 0f; if (CastSpells.ContainsKey("Shadow Bolt")) { casts += CastSpells["Shadow Bolt"].GetNumCasts(); } if (CastSpells.ContainsKey("Shadow Bolt (Instant)")) { casts += CastSpells["Shadow Bolt (Instant)"].GetNumCasts(); } if (casts == 0) { return(0f); } float uprate = Spell.CalcUprate( Talents.ShadowAndFlame * .33f, // proc rate 30f, // duration BossOpts.BerserkTimer / casts); // trigger period float benefit = .05f - Stats.SpellCritOnTarget; return(benefit * uprate); }
private float CalcRaidBuff() { float raidBuff = 0f; float perSP = CalcOpts.PerSP; if (perSP > 0 && Pet != null) { if (CalcOpts.ConvertTotem) { float curTotem = StatUtils.GetActiveBuff(Character.ActiveBuffs, "Spell Power", s => s.SpellPower); if (curTotem == 144f || curTotem == 165f) { raidBuff += CalcOpts.PerFlametongue; } } } if (CastSpells.ContainsKey("Curse Of The Elements")) { raidBuff += CalcOpts.PerMagicBuff; } raidBuff += CalcOpts.PerCritBuff * (CalcAddedCritBuff() / .05f); raidBuff += CalcOpts.PerHealth * CalculationsWarlock.CalcPetHealthBuff(CalcOpts.Pet, Talents, Character.ActiveBuffs, CalcOpts); return(raidBuff); }