Struct.bossOpts.BerserkTimer,
#else
                    charStruct.calcOpts.Duration,
#endif
                    AdditiveStat.ArmorPenetrationRating);
                for (int i = 0; i < arPenWeights.Length; i++)
                {
                    tempArPenRatings.Add(arPenWeights[i].Value);
                    tempArPenRatingUptimes.Add(arPenWeights[i].Chance);
                }
            }
            // Get the average Armor Pen Rating across all procs
            if (tempArPenRatings.Count > 0f)
            {
                Stats originalStats = charStruct.combatFactors.StatS;
                int LevelDif =
#if RAWR3 || SILVERIGHT
                    charStruct.bossOpts.Level
#else
                    charStruct.calcOpts.TargetLevel
#endif
                    - charStruct.Char.Level;

                float arpenBuffs =
                                ((charStruct.combatFactors._c_mhItemType == ItemType.TwoHandMace)? charStruct.Char.WarriorTalents.MaceSpecialization * 0.03f : 0.00f) +
                                (!charStruct.combatFactors.FuryStance? (0.10f + originalStats.BonusWarrior_T9_2P_ArP) : 0.0f);

                float OriginalArmorReduction = StatConversion.GetArmorDamageReduction(charStruct.Char.Level, (int)StatConversion.NPC_ARMOR[LevelDif],
                    originalStats.ArmorPenetration, arpenBuffs, originalStats.ArmorPenetrationRating);
                float ProccedArmorReduction = 0f;
                for (int i = 0; i < tempArPenRatings.Count; i++)
                {
                    ProccedArmorReduction += tempArPenRatingUptimes[i] *
                                StatConversion.GetArmorDamageReduction(charStruct.Char.Level,
                                (int)StatConversion.NPC_ARMOR[LevelDif],
                                originalStats.ArmorPenetration, arpenBuffs,
                                originalStats.ArmorPenetrationRating + tempArPenRatings[i]);
                }
                Stats dummyStats = new Stats();
                
                float procArp = StatConversion.GetRatingFromArmorReduction(charStruct.Char.Level, (int)StatConversion.NPC_ARMOR[LevelDif],
                    originalStats.ArmorPenetration, arpenBuffs, ProccedArmorReduction);
                originalStats.ArmorPenetrationRating += (procArp - originalStats.ArmorPenetrationRating);                
            }

            IterativeSpecialEffectsStats(charStruct, firstPass, critEffects, triggerIntervals, triggerChances, 0f, true, new Stats(), charStruct.combatFactors.StatS);
            IterativeSpecialEffectsStats(charStruct, secondPass, critEffects, triggerIntervals, triggerChances, 0f, false, null, charStruct.combatFactors.StatS);
        }

        private static void CalculateTriggers(DPSWarrCharacter charStruct, Dictionary<Trigger, float> triggerIntervals, Dictionary<Trigger, float> triggerChances)
        {
            string addInfo = "No Additional Info";
            try
            {
                float fightDuration =
#if RAWR3 || SILVERIGHT
                    charStruct.bossOpts.BerserkTimer;
#else
                    charStruct.calcOpts.Duration;
#endif
                addInfo = "FightDur Passed";
                float fightDuration2Pass = charStruct.calcOpts.SE_UseDur? fightDuration : 0;

                float attemptedMH = charStruct.Rot.AttemptedAtksOverDurMH;
                float attemptedOH = charStruct.Rot.AttemptedAtksOverDurOH;
                float attempted = attemptedMH + attemptedOH;

                float landMH = charStruct.Rot.LandedAtksOverDurMH;
                float landOH = charStruct.Rot.LandedAtksOverDurOH;
                float land = landMH + landOH;

                float crit = charStruct.Rot.CriticalAtksOverDur;

                float avoidedAttacks = charStruct.combatFactors.StatS.Dodge + charStruct.combatFactors.StatS.Parry;

                float dwbleed = 0;
                addInfo += "\r\nbig if started";
                if (charStruct.Char.WarriorTalents.DeepWounds > 0 && crit!= 0f)
                {
                    float dwTicks = 1f;
                    foreach (Rotation.AbilWrapper aw in charStruct.Rot.GetDamagingAbilities())
                    {
                        if (aw.allNumActivates > 0f && aw.ability.CanCrit)
                        {
                            if (aw.ability.SwingsOffHand)
                            {

                                dwTicks *= (float)Math.Pow(1f - aw.ability.MHAtkTable.Crit * (1f - aw.ability.OHAtkTable.Crit), aw.allNumActivates / fightDuration);
                                dwTicks *= (float)Math.Pow(1f - aw.ability.OHAtkTable.Crit, aw.allNumActivates / fightDuration);
                            }
                            else
                            {
                                // to fix this breaking apart when you're close to yellow crit cap for these abilities, namely OP
                                if (aw.ability is Skills.OverPower || aw.ability is Skills.TasteForBlood)
                                    dwTicks *= (1f - aw.allNumActivates / fightDuration * aw.ability.MHAtkTable.Crit);
                                else dwTicks *= (float)Math.Pow(1f - aw.ability.MHAtkTable.Crit, aw.allNumActivates / fightDuration);
                            }
                        }
                    }
                    dwbleed = fightDuration * dwTicks;
                }
                addInfo += "\r\nBuncha Floats started";
                float bleed = dwbleed + fightDuration * (charStruct.combatFactors.FuryStance ||!charStruct.calcOpts.Maintenance[(int)Rawr.DPSWarr.CalculationOptionsDPSWarr.Maintenances.Rend_]? 0f : 1f / 3f);

                float bleedHitInterval = fightDuration / bleed;
                float dwbleedHitInterval = fightDuration / dwbleed;
                float attemptedAtkInterval = fightDuration / attempted;
                float attemptedAtksIntervalMH = fightDuration / attemptedMH;
                float attemptedAtksIntervalOH = fightDuration / attemptedOH;
                float landedAtksInterval = fightDuration / land;
                float dmgDoneInterval = fightDuration / (land + bleed);
                float dmgTakenInterval = fightDuration /
#if RAWR3 || SILVERIGHT
                    charStruct.bossOpts.AoETargsFreq;
#else
                    charStruct.calcOpts.AoETargetsFreq;
#endif
                addInfo += "\r\nAoETargsFreq Passed";
                float hitRate = 1, hitRateMH = 1, hitRateOH = 1, critRate = 1;
                if (attempted!= 0f)
                {
                    hitRate = land / attempted;
                    critRate = crit / attempted;
                }
                if (attemptedMH!= 0f)
                    hitRateMH = landMH / attemptedMH;
                if (attemptedOH!= 0f)
                    hitRateOH = landOH / attemptedOH;
                addInfo += "\r\nTriggers started";
                triggerIntervals[Trigger.Use] = 0f;
                triggerChances[Trigger.Use] = 1f;

                triggerIntervals[Trigger.MeleeHit] = triggerIntervals[Trigger.PhysicalHit] = attemptedAtkInterval;
                triggerChances[Trigger.MeleeHit] = triggerChances[Trigger.PhysicalHit] = hitRate;

                triggerIntervals[Trigger.PhysicalCrit] = triggerIntervals[Trigger.MeleeCrit] = attemptedAtkInterval;
                triggerChances[Trigger.PhysicalCrit] = triggerChances[Trigger.MeleeCrit] = critRate;

                triggerIntervals[Trigger.MainHandHit] = attemptedAtksIntervalMH;
                triggerChances[Trigger.MainHandHit] = hitRateMH;
                triggerIntervals[Trigger.OffHandHit] = attemptedAtksIntervalOH;
                triggerChances[Trigger.OffHandHit] = hitRateOH;

                triggerIntervals[Trigger.DoTTick] = bleedHitInterval;
                triggerChances[Trigger.DoTTick] = 1f;

                trigger