43 if (amount >
int32(baseValue))
166 for (AuraEffectList::const_iterator i = modRatingFromStat.begin(); i != modRatingFromStat.end(); ++i)
167 if (
Stats((*i)->GetMiscValueB()) == stat)
168 mask |= (*i)->GetMiscValue();
172 if (mask & (1 << rating))
200 if (aurEff->GetAmount() < 0 && aurEff->GetMiscValue() & (1 << i))
201 negativeMod += aurEff->GetAmount();
274 for (AuraEffectList::const_iterator i = mResbyIntellect.begin(); i != mResbyIntellect.end(); ++i)
292 float baseStam = std::min(20.0f, stamina);
293 float moreStam = stamina - baseStam;
295 return baseStam + (moreStam * 10.0f);
302 float baseInt = std::min(20.0f, intellect);
303 float moreInt = intellect - baseInt;
305 return baseInt + (moreInt * 15.0f);
399 float levelBonus = 0.0f;
400 float weaponBonus = 0.0f;
413 ItemTemplate const* itemTemplate = weapon->GetTemplate();
415 weaponBonus =
CalculatePct(
static_cast<float>(bonusAP), weaponMod->GetAmount());
451 float baseAttackPower = val2;
457 auto accumulateMod = [&attackPowerModPos, &attackPowerModNeg](
float value)
460 attackPowerModPos += value;
462 attackPowerModNeg += value;
532 if (damageIndex != 0)
561 float const attackPowerMod = std::max(
GetAPMultiplier(attType, normalized), 0.25f);
580 weaponMinDamage = lvl * 0.85f * attackPowerMod;
581 weaponMaxDamage = lvl * 1.25f * attackPowerMod;
598 weaponMinDamage +=
GetAmmoDPS() * attackPowerMod;
599 weaponMaxDamage +=
GetAmmoDPS() * attackPowerMod;
602 minDamage = ((weaponMinDamage + baseValue) * basePct + totalValue) * totalPct;
603 maxDamage = ((weaponMaxDamage + baseValue) * basePct + totalValue) * totalPct;
631 value = value < 0.0f ? 0.0f : value;
671 value = std::max(0.0f, value);
716 uint32 const classIdx = playerClass - 1;
719 float const c = capArray[classIdx];
721 float result = c * diminishValue / (diminishValue + c * k);
722 result += nonDiminishValue;
743 float diminishing = 0.0f, nondiminishing = 0.0f;
774 float nondiminishing = 5.0f;
789 value = value < 0.0f ? 0.0f : value;
811 float diminishing = 0.0f, nondiminishing = 0.0f;
827 value = value < 0.0f ? 0.0f : value;
894 return aurEff->
GetSpellInfo()->IsItemFitToSpellRequirements(weapon);
928 { 0.f, std::nullopt },
930 { 0.f, std::nullopt },
931 { 0.f, std::nullopt },
940 float result_regen = 0.f;
941 float result_regen_interrupted = 0.f;
942 float modifier = 1.f;
967 for (AuraEffectList::const_iterator i = regenAura.begin(); i != regenAura.end(); ++i)
968 power_regen_mp5 +=
GetStat(
Stats((*i)->GetMiscValue())) * (*i)->GetAmount() / 500.0f;
972 if (modManaRegenInterrupt > 100)
973 modManaRegenInterrupt = 100;
975 result_regen = power_regen_mp5 + power_regen;
976 result_regen_interrupted = power_regen_mp5 +
CalculatePct(power_regen, modManaRegenInterrupt);
979 modifier *= 2.066f - (
GetLevel() * 0.066f);
987 result_regen_interrupted = 0.f;
993 result_regen += result_regen_interrupted;
1003 result_regen *= modifier;
1004 result_regen_interrupted *= modifier;
1011 result_regen_interrupted = result_regen;
1163 if (damageIndex != 0)
1170 float variance = 1.0f;
1201 weaponMinDamage = 0.0f;
1202 weaponMaxDamage = 0.0f;
1213 minDamage = ((weaponMinDamage + baseValue) * dmgMultiplier * basePct + totalValue) * totalPct;
1214 maxDamage = ((weaponMaxDamage + baseValue) * dmgMultiplier * basePct + totalValue) * totalPct;
1223#define ENTRY_IMP 416
1224#define ENTRY_VOIDWALKER 1860
1225#define ENTRY_SUCCUBUS 1863
1226#define ENTRY_FELHUNTER 417
1227#define ENTRY_FELGUARD 17252
1228#define ENTRY_WATER_ELEMENTAL 510
1229#define ENTRY_TREANT 1964
1230#define ENTRY_FIRE_ELEMENTAL 15438
1231#define ENTRY_GHOUL 26125
1232#define ENTRY_BLOODWORM 28017
1242 float ownersBonus = 0.0f;
1265 ownersBonus = float(owner->
GetStat(stat)) * mod;
1266 value += ownersBonus;
1273 value += ownersBonus;
1280 PetSpellMap::const_iterator itr = (
ToPet()->
m_spells.find(62758));
1290 ownersBonus = float(owner->
GetStat(stat)) * mod;
1291 value += ownersBonus;
1300 value += ownersBonus;
1363 float bonus_armor = 0.0f;
1384 float multiplicator;
1387 case ENTRY_IMP: multiplicator = 8.4f;
break;
1393 default: multiplicator = 10.0f;
break;
1409 float multiplicator = 15.0f;
1413 case ENTRY_IMP: multiplicator = 4.95f;
break;
1418 default: multiplicator = 15.0f;
break;
1435 float bonusAP = 0.0f;
1451 PetSpellMap::const_iterator itr =
ToPet()->
m_spells.find(62758);
1465 AddPct(bonusAP, aurEff->GetAmount());
1466 AddPct(val, aurEff->GetAmount());
1477 float dmg_multiplier = 0.31f;
1479 dmg_multiplier = 0.61f;
1488 int32 maximum = (fire > shadow) ? fire : shadow;
1492 bonusAP = maximum * 0.57f;
1504 float base_attPower = val + bonusAP;
1523 float bonusDamage = 0.0f;
1531 bonusDamage = spellDmg * 0.09f;
1538 bonusDamage = spellDmg * 0.4f;
1554 float mindamage = ((base_value + weapon_mindamage) * base_pct + total_value) * total_pct;
1555 float maxdamage = ((base_value + weapon_maxdamage) * base_pct + total_value) * total_pct;
1564 mindamage = mindamage * 1.25f;
1565 maxdamage = maxdamage * 1.25f;
1572 mindamage = mindamage * 0.75f;
1573 maxdamage = maxdamage * 0.75f;
1580 for (Unit::AuraEffectList::const_iterator itr = mDummy.begin(); itr != mDummy.end(); ++itr)
1582 switch ((*itr)->GetSpellInfo()->Id)
1586 AddPct(mindamage, -(*itr)->GetAmount());
1587 AddPct(maxdamage, -(*itr)->GetAmount());
#define MAX_ITEM_PROTO_DAMAGES
@ EQUIPMENT_SLOT_MAINHAND
#define CLASSMASK_WAND_USERS
@ SPELL_SCHOOL_MASK_NORMAL
@ SPELLFAMILY_DEATHKNIGHT
@ SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE
@ SPELL_AURA_MOD_ATTACKSPEED
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL
@ SPELL_AURA_MOD_PARRY_PERCENT
@ SPELL_AURA_MOD_RATING_FROM_STAT
@ SPELL_AURA_MOD_SPELL_HIT_CHANCE
@ SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT
@ SPELL_AURA_MOD_EXPERTISE
@ SPELL_AURA_INTERRUPT_REGEN
@ SPELL_AURA_MOD_POWER_REGEN
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE
@ SPELL_AURA_MOD_DODGE_PERCENT
@ SPELL_AURA_MOD_MANA_REGEN_INTERRUPT
@ SPELL_AURA_MOD_CRIT_PCT
@ SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT
@ SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR
@ SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT
@ SPELL_AURA_MOD_POWER_REGEN_PERCENT
@ SPELL_AURA_MOD_MANA_REGEN_FROM_STAT
@ SPELL_AURA_MOD_DAMAGE_DONE
@ SPELL_AURA_PREVENT_REGENERATE_POWER
@ SPELL_AURA_MOD_BLOCK_PERCENT
float const miss_cap[MAX_CLASSES]
float const dodge_cap[MAX_CLASSES]
#define ENTRY_FIRE_ELEMENTAL
float CalculateDiminishingReturns(float const (&capArray)[MAX_CLASSES], uint8 playerClass, float nonDiminishValue, float diminishValue)
float const parry_cap[MAX_CLASSES]
static constexpr std::array< std::pair< float, Optional< Rates > >, MAX_POWERS > PowerRegenInfo
bool _ModifyUInt32(bool apply, uint32 &baseValue, int32 &amount)
#define ENTRY_WATER_ELEMENTAL
float const m_diminishing_k[MAX_CLASSES]
@ UNIT_MOD_DAMAGE_OFFHAND
@ UNIT_MOD_RESISTANCE_START
@ UNIT_MOD_DAMAGE_MAINHAND
#define MAX_COMBAT_RATING
@ OFFHAND_CRIT_PERCENTAGE
@ PLAYER_FIELD_MOD_DAMAGE_DONE_POS
@ PLAYER_RANGED_CRIT_PERCENTAGE
@ PLAYER_SPELL_CRIT_PERCENTAGE1
@ PLAYER_FIELD_COMBAT_RATING_1
@ PLAYER_PARRY_PERCENTAGE
@ PLAYER_OFFHAND_CRIT_PERCENTAGE
@ PLAYER_FIELD_MOD_TARGET_RESISTANCE
@ PLAYER_BLOCK_PERCENTAGE
@ UNIT_FIELD_MAXOFFHANDDAMAGE
@ UNIT_FIELD_MAXRANGEDDAMAGE
@ PLAYER_DODGE_PERCENTAGE
@ PLAYER_OFFHAND_EXPERTISE
@ PLAYER_FIELD_MOD_HEALING_DONE_POS
@ UNIT_FIELD_MINRANGEDDAMAGE
@ UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER
@ PLAYER_FIELD_MOD_DAMAGE_DONE_NEG
@ UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER
@ UNIT_FIELD_MINOFFHANDDAMAGE
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
T CalculatePct(T base, U pct)
SpellInfo const * GetSpellInfo() const
bool UpdateAllStats() override
void UpdateResistances(uint32 school) override
uint32 m_spells[MAX_CREATURE_SPELLS]
bool UpdateStats(Stats stat) override
void UpdateAttackPowerAndDamage(bool ranged=false) override
void UpdateArmor() override
CreatureTemplate const * GetCreatureTemplate() const
void UpdateMaxPower(Powers power) override
void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex) const override
uint32 m_baseRangedAttackPower
void UpdateMaxHealth() override
void UpdateResistances(uint32 school) override
void UpdateMaxPower(Powers power) override
void UpdateMaxHealth() override
bool UpdateStats(Stats stat) override
void SetBonusDamage(int32 damage)
float m_statFromOwner[MAX_STATS]
void UpdateDamagePhysical(WeaponAttackType attType) override
void UpdateArmor() override
bool UpdateAllStats() override
void UpdateAttackPowerAndDamage(bool ranged=false) override
bool IsSpiritWolf() const
int32 GetInt32Value(uint16 index) const
void SetInt32Value(uint16 index, int32 value)
void ApplyModInt32Value(uint16 index, int32 val, bool apply)
void ApplyModUInt32Value(uint16 index, int32 val, bool apply)
float GetFloatValue(uint16 index) const
void SetFloatValue(uint16 index, float value)
void SetStatFloatValue(uint16 index, float value)
static ObjectGuid GetGUID(Object const *o)
void SetUInt32Value(uint16 index, uint32 value)
void SetStatInt32Value(uint16 index, int32 value)
HappinessState GetHappinessState()
void UpdateParryPercentage()
void UpdateAllSpellCritChances()
void UpdateArmorPenetration(int32 amount)
void UpdateRuneRegen(RuneType rune)
float GetHealthBonusFromStamina()
void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex) const override
void UpdateDodgePercentage()
float GetPowerRegen(Powers power) const
void UpdateShieldBlockValue()
void UpdateMaxPower(Powers power) override
void ApplyRatingMod(CombatRating cr, int32 value, bool apply)
void UpdateCritPercentage(WeaponAttackType attType)
uint16 GetSkillValue(uint32 skill) const
void UpdatePowerRegen(Powers power)
float GetRatingBonusValue(CombatRating cr) const
float GetManaBonusFromIntellect()
void UpdateBlockPercentage()
void ApplySpellPenetrationBonus(int32 amount, bool apply)
void UpdateArmor() override
void RecalculateRating(CombatRating cr)
bool UpdateStats(Stats stat) override
void _RemoveAllItemMods()
void UpdateSpellHitChances()
void UpdateExpertise(WeaponAttackType attType)
void _ApplyAllStatBonuses()
float GetBaseModValue(BaseModGroup modGroup, BaseModType modType) const
float GetSpellCritFromIntellect() const
void ApplyManaRegenBonus(int32 amount, bool apply)
void GetDodgeFromAgility(float &diminishing, float &nondiminishing) const
void SetBaseModPctValue(BaseModGroup modGroup, float val)
void UpdateResistances(uint32 school) override
void UpdateSpellDamageAndHealingBonus()
void UpdateMaxHealth() override
void UpdateMeleeHitChances()
Item * m_items[PLAYER_SLOTS_COUNT]
void UpdateRangedHitChances()
void ApplySpellPowerBonus(int32 amount, bool apply)
void UpdateAllCritPercentages()
float GetMeleeCritFromAgility() const
bool UpdateAllStats() override
Item * GetWeaponForAttack(WeaponAttackType attackType, bool useable=false) const
void _RemoveAllStatBonuses()
int32 m_spellPenetrationItemMod
uint32 GetShieldBlockValue() const override
void ApplyFeralAPBonus(int32 amount, bool apply)
void UpdateDefenseBonusesMod()
void ApplyHealthRegenBonus(int32 amount, bool apply)
float OCTRegenMPPerSpirit() const
void UpdateAttackPowerAndDamage(bool ranged=false) override
uint32 GetRuneTypeBaseCooldown(RuneType runeType) const
float GetMissPercentageFromDefense() const
void UpdateSpellCritChance(uint32 school)
int32 CalcValue(WorldObject const *caster=nullptr, int32 const *basePoints=nullptr) const
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
float GetPctModifierValue(UnitMods unitMod, UnitModifierPctType modifierType) const
bool IsUnderLastManaUseEffect() const
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
void SetStat(Stats stat, int32 val)
float GetTotalAuraModValue(UnitMods unitMod) const
float GetTotalStatValue(Stats stat) const
bool HasAuraTypeWithMiscvalue(AuraType auraType, int32 miscValue) const
bool CanUseAttackType(uint8 attacktype) const
uint32 GetClassMask() const
virtual void UpdateAllResistances()
ShapeshiftForm GetShapeshiftForm() const
float GetWeaponDamageRange(WeaponAttackType attType, WeaponDamageRange type, uint8 damageIndex=0) const
uint32 GetDefenseSkillValue(Unit const *target=nullptr) const
void SetAttackPowerModNeg(int32 attackPowerMod)
bool haveOffhandWeapon() const
bool CanDualWield() const
AuraEffect * GetAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
virtual void UpdateResistances(uint32 school)=0
float m_modRangedHitChance
void SetRangedAttackPowerModNeg(int32 attackPowerMod)
void SetMaxPower(Powers power, uint32 val)
void SetRangedAttackPowerModPos(int32 attackPowerMod)
int32 GetTotalAuraModifierByMiscMask(AuraType auraType, uint32 misc_mask) const
virtual void UpdateDamagePhysical(WeaponAttackType attType)
void _ApplyAllAuraStatMods()
void SetRangedAttackPowerMultiplier(float attackPowerMult)
uint32 GetWeaponSkillValue(WeaponAttackType attType, Unit const *target=nullptr) const
void SetResistance(SpellSchools school, int32 val)
float GetTotalAuraMultiplierByMiscValue(AuraType auraType, int32 misc_value) const
uint32 GetCreateHealth() const
AuraEffect * GetAuraEffectOfRankedSpell(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
bool HasAuraType(AuraType auraType) const
float m_modMeleeHitChance
void _RemoveAllAuraStatMods()
uint32 GetAttackTime(WeaponAttackType att) const
int32 GetTotalAuraModifier(AuraType auraType) const
float GetAPMultiplier(WeaponAttackType attType, bool normalized) const
void SetAttackPower(int32 attackPower)
int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask) const
float GetCreateStat(Stats stat) const
float GetAttackPowerModifierValue(AttackPowerModIndex index, AttackPowerModType modifierType) const
bool IsInFeralForm() const
void SetCanModifyStats(bool modifyStats)
float GetFlatModifierValue(UnitMods unitMod, UnitModifierFlatType modifierType) const
float GetStat(Stats stat) const
virtual void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex) const =0
int32 GetTotalAuraModifierByMiscValue(AuraType auraType, int32 misc_value) const
bool HasAuraTypeWithValue(AuraType auraType, int32 value) const
void SetMaxHealth(uint32 val)
std::list< AuraEffect * > AuraEffectList
void SetRangedAttackPower(int32 attackPower)
int32 GetResistance(SpellSchools school) const
float m_modSpellHitChance
Guardian * GetGuardianPet() const
void SetAttackPowerMultiplier(float attackPowerMult)
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask) const
uint32 GetCreatePowerValue(Powers power) const
void SetAttackPowerModPos(int32 attackPowerMod)
float GetTotalAttackPowerValue(WeaponAttackType attType) const
void UpdateStatBuffMod(Stats stat)
uint32 GetMaxSkillValueForLevel(Unit const *target=nullptr) const
@ RATE_POWER_RUNICPOWER_LOSS
@ CONFIG_STATS_LIMITS_DODGE
@ CONFIG_STATS_LIMITS_PARRY
@ CONFIG_STATS_LIMITS_CRIT
@ CONFIG_STATS_LIMITS_BLOCK
@ CONFIG_STATS_LIMITS_ENABLE
int32 GetTotalAPBonus() const