Exemplo n.º 1
0
        public Stats GetCharacterStats(Character character, Item additionalItem, bool computeAverageStats, CharacterCalculationsHealadin calc)
        {
            PaladinTalents talents = character.PaladinTalents;

            CalculationOptionsHealadin calcOpts = character.CalculationOptions as CalculationOptionsHealadin;

            if (calcOpts == null)
            {
                calcOpts = new CalculationOptionsHealadin();
            }

#if (RAWR3)
            BossOptions bossOpts = character.BossOptions;
            if (bossOpts == null)
            {
                bossOpts = new BossOptions();
            }
#endif

#if (RAWR3)
            float fightLength = bossOpts.BerserkTimer * 60f;
#else
            float fightLength = calcOpts.Length * 60f;
#endif

            Stats statsRace     = BaseStats.GetBaseStats(character.Level, CharacterClass.Paladin, character.Race);
            Stats statsBaseGear = GetItemStats(character, additionalItem);
            Stats statsBuffs    = GetBuffsStats(character, calcOpts);
            Stats stats         = statsBaseGear + statsBuffs + statsRace;

            ConvertRatings(stats, talents, calcOpts);
            if (computeAverageStats)
            {
                Stats statsAverage = new Stats();

                foreach (SpecialEffect effect in stats.SpecialEffects())
                {
                    float trigger = 0f;
                    if (calc == null)
                    {
                        trigger = 1.5f / calcOpts.Activity / (1f + stats.SpellHaste);
                        if (effect.Trigger == Trigger.HealingSpellCrit || effect.Trigger == Trigger.SpellCrit)
                        {
                            trigger *= stats.SpellCrit;
                        }
                        else if (effect.Trigger == Trigger.HolyShockCast)
                        {
                            trigger = 6f / calcOpts.HolyShock;
                        }
                    }
                    else
                    {
                        if (effect.Trigger == Trigger.HealingSpellCast || effect.Trigger == Trigger.HealingSpellHit)
                        {
                            trigger = 1f / Rotation.GetHealingCastsPerSec(calc);
                        }
                        else if (effect.Trigger == Trigger.HealingSpellCrit || effect.Trigger == Trigger.SpellCrit)
                        {
                            trigger = 1f / Rotation.GetHealingCritsPerSec(calc);
                        }
                        else if (effect.Trigger == Trigger.SpellCast || effect.Trigger == Trigger.SpellHit)
                        {
                            trigger = 1f / Rotation.GetSpellCastsPerSec(calc);
                        }
                        else if (effect.Trigger == Trigger.DamageOrHealingDone)
                        {
                            trigger = 1f / Rotation.GetHealingCastsPerSec(calc);
                        }
                        else if (effect.Trigger == Trigger.HolyShockCast)
                        {
                            trigger = 6f / calcOpts.HolyShock;
                        }
                        else if (effect.Trigger == Trigger.Use)
                        {
                            trigger = 0f;
                            foreach (SpecialEffect childEffect in effect.Stats.SpecialEffects())
                            {
                                float childTrigger = 0f;

                                if (effect.Trigger == Trigger.HealingSpellCast || effect.Trigger == Trigger.HealingSpellHit)
                                {
                                    childTrigger = 1f / Rotation.GetHealingCastsPerSec(calc);
                                }
                                else if (effect.Trigger == Trigger.HealingSpellCrit || effect.Trigger == Trigger.SpellCrit)
                                {
                                    childTrigger = 1f / Rotation.GetHealingCritsPerSec(calc);
                                }
                                else if (effect.Trigger == Trigger.SpellCast || effect.Trigger == Trigger.SpellHit)
                                {
                                    childTrigger = 1f / Rotation.GetSpellCastsPerSec(calc);
                                }

                                statsAverage.Accumulate(childEffect.Stats,
                                                        effect.GetAverageUptime(0.0f, 1.0f)
                                                        * childEffect.GetAverageStackSize(childTrigger, 1f, 1.5f, effect.Duration));
                            }
                        }
                        else if (effect.Trigger == Trigger.HolyLightCast)
                        {
                            trigger = 1f / Rotation.GetHolyLightCastsPerSec(calc);
                        }
                        else
                        {
                            continue;
                        }
                    }
                    statsAverage.Accumulate(effect.GetAverageStats(trigger, 1f, 1.5f, fightLength));
                }
                statsAverage.ManaRestore *= fightLength;
                statsAverage.Healed      *= fightLength;

                stats = statsBaseGear + statsBuffs + statsRace + statsAverage;
                ConvertRatings(stats, talents, calcOpts);
            }

            return(stats);
        }
Exemplo n.º 2
0
        public Stats GetCharacterStats(Character character, Item additionalItem, bool computeAverageStats, CharacterCalculationsHealadin calc)
        {
            CalculationOptionsHealadin calcOpts = character.CalculationOptions as CalculationOptionsHealadin;
            BossOptions    bossOpts             = character.BossOptions;
            PaladinTalents talents = character.PaladinTalents;

            float fightLength = bossOpts.BerserkTimer;

            Stats statsRace     = BaseStats.GetBaseStats(character.Level, CharacterClass.Paladin, character.Race);
            Stats statsBaseGear = GetItemStats(character, additionalItem);
            Stats statsBuffs    = GetBuffsStats(character, calcOpts);
            Stats stats         = statsBaseGear + statsBuffs + statsRace;

            ConvertRatings(stats, talents, calcOpts);
            if (computeAverageStats)
            {
                Stats statsAverage = new Stats();

                foreach (SpecialEffect effect in stats.SpecialEffects())
                {
                    float trigger = 0f;
                    if (calc == null)
                    {
                        trigger = 1.5f / calcOpts.Activity / (1f + stats.SpellHaste);
                        if (effect.Trigger == Trigger.HealingSpellCrit || effect.Trigger == Trigger.SpellCrit)
                        {
                            trigger *= stats.SpellCrit;
                        }
                    }
                    else
                    {
                        if (effect.Trigger == Trigger.HealingSpellCast || effect.Trigger == Trigger.HealingSpellHit)
                        {
                            trigger = 1f / Rotation.GetHealingCastsPerSec(calc);
                        }
                        else if (effect.Trigger == Trigger.HealingSpellCrit || effect.Trigger == Trigger.SpellCrit)
                        {
                            trigger = 1f / Rotation.GetHealingCritsPerSec(calc);
                        }
                        else if (effect.Trigger == Trigger.SpellCast || effect.Trigger == Trigger.SpellHit)
                        {
                            trigger = 1f / Rotation.GetSpellCastsPerSec(calc);
                        }
                        else if (effect.Trigger == Trigger.DamageOrHealingDone)
                        {
                            trigger = 1f / Rotation.GetHealingCastsPerSec(calc);
                        }
                        else if (effect.Trigger == Trigger.Use)
                        {
                            trigger = 0f;
                            foreach (SpecialEffect childEffect in effect.Stats.SpecialEffects())
                            {
                                float childTrigger = 0f;

                                if (effect.Trigger == Trigger.HealingSpellCast || effect.Trigger == Trigger.HealingSpellHit)
                                {
                                    childTrigger = 1f / Rotation.GetHealingCastsPerSec(calc);
                                }
                                else if (effect.Trigger == Trigger.HealingSpellCrit || effect.Trigger == Trigger.SpellCrit)
                                {
                                    childTrigger = 1f / Rotation.GetHealingCritsPerSec(calc);
                                }
                                else if (effect.Trigger == Trigger.SpellCast || effect.Trigger == Trigger.SpellHit)
                                {
                                    childTrigger = 1f / Rotation.GetSpellCastsPerSec(calc);
                                }

                                statsAverage.Accumulate(childEffect.Stats,
                                                        effect.GetAverageUptime(0.0f, 1.0f)
                                                        * childEffect.GetAverageStackSize(childTrigger, 1f, 1.5f, effect.Duration));
                            }
                        }
                        else
                        {
                            continue;
                        }
                    }
                    statsAverage.Accumulate(effect.GetAverageStats(trigger, 1f, 1.5f, fightLength));
                }
                statsAverage.ManaRestore *= fightLength;
                statsAverage.Healed      *= fightLength;
                statsAverage.HealedPerSP *= fightLength;

                stats = statsBaseGear + statsBuffs + statsRace + statsAverage;
                ConvertRatings(stats, talents, calcOpts);
            }

            #region Set Bonuses
            int T11Count;
            character.SetBonusCount.TryGetValue("Reinforced Sapphirium Regalia", out T11Count);
            stats.BonusCritChanceDeathCoil   = 0; // using this for Holy Light crit bonus, for now
            stats.BonusCritChanceFrostStrike = 0; // yes, I'm pure evil, using this to track 4T11
            if (T11Count >= 2)
            {
                // T11 Pally 2 piece bonus: add 5% crit to HL
                stats.BonusCritChanceDeathCoil = 0.05f;
            }
            if (T11Count >= 4)
            {
                // T11 Pally 4 piece bonus: 540 spirit buff for 6 secs after HS cast
                stats.BonusCritChanceFrostStrike = 1;
            }
            #endregion Set Bonuses

            return(stats);
        }