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());
481 if (attPowerMod >= 0)
483 if (attPowerMod <= 0)
490 if (attPowerMod >= 0)
492 if (attPowerMod <= 0)
530 if (damageIndex != 0)
559 float const attackPowerMod = std::max(
GetAPMultiplier(attType, normalized), 0.25f);
578 weaponMinDamage = lvl * 0.85f * attackPowerMod;
579 weaponMaxDamage = lvl * 1.25f * attackPowerMod;
596 weaponMinDamage +=
GetAmmoDPS() * attackPowerMod;
597 weaponMaxDamage +=
GetAmmoDPS() * attackPowerMod;
600 minDamage = ((weaponMinDamage + baseValue) * basePct + totalValue) * totalPct;
601 maxDamage = ((weaponMaxDamage + baseValue) * basePct + totalValue) * totalPct;
629 value = value < 0.0f ? 0.0f : value;
669 value = std::max(0.0f, value);
714 uint32 const classIdx = playerClass - 1;
717 float const c = capArray[classIdx];
719 float result = c * diminishValue / (diminishValue + c * k);
720 result += nonDiminishValue;
741 float diminishing = 0.0f, nondiminishing = 0.0f;
772 float nondiminishing = 5.0f;
787 value = value < 0.0f ? 0.0f : value;
809 float diminishing = 0.0f, nondiminishing = 0.0f;
825 value = value < 0.0f ? 0.0f : value;
892 return aurEff->
GetSpellInfo()->IsItemFitToSpellRequirements(weapon);
926 { 0.f, std::nullopt },
928 { 0.f, std::nullopt },
929 { 0.f, std::nullopt },
938 float result_regen = 0.f;
939 float result_regen_interrupted = 0.f;
940 float modifier = 1.f;
965 for (AuraEffectList::const_iterator i = regenAura.begin(); i != regenAura.end(); ++i)
966 power_regen_mp5 +=
GetStat(
Stats((*i)->GetMiscValue())) * (*i)->GetAmount() / 500.0f;
970 if (modManaRegenInterrupt > 100)
971 modManaRegenInterrupt = 100;
973 result_regen = power_regen_mp5 + power_regen;
974 result_regen_interrupted = power_regen_mp5 +
CalculatePct(power_regen, modManaRegenInterrupt);
977 modifier *= 2.066f - (
GetLevel() * 0.066f);
985 result_regen_interrupted = 0.f;
991 result_regen += result_regen_interrupted;
1001 result_regen *= modifier;
1002 result_regen_interrupted *= modifier;
1009 result_regen_interrupted = result_regen;
1135 if (attackPowerMod >= 0)
1137 if (attackPowerMod <= 0)
1144 if (attackPowerMod >= 0)
1146 if (attackPowerMod <= 0)
1164 if (damageIndex != 0)
1171 float variance = 1.0f;
1202 weaponMinDamage = 0.0f;
1203 weaponMaxDamage = 0.0f;
1214 minDamage = ((weaponMinDamage + baseValue) * dmgMultiplier * basePct + totalValue) * totalPct;
1215 maxDamage = ((weaponMaxDamage + baseValue) * dmgMultiplier * basePct + totalValue) * totalPct;
1224#define ENTRY_IMP 416
1225#define ENTRY_VOIDWALKER 1860
1226#define ENTRY_SUCCUBUS 1863
1227#define ENTRY_FELHUNTER 417
1228#define ENTRY_FELGUARD 17252
1229#define ENTRY_WATER_ELEMENTAL 510
1230#define ENTRY_TREANT 1964
1231#define ENTRY_FIRE_ELEMENTAL 15438
1232#define ENTRY_GHOUL 26125
1233#define ENTRY_BLOODWORM 28017
1243 float ownersBonus = 0.0f;
1266 ownersBonus = float(owner->
GetStat(stat)) * mod;
1267 value += ownersBonus;
1274 value += ownersBonus;
1281 PetSpellMap::const_iterator itr = (
ToPet()->
m_spells.find(62758));
1291 ownersBonus = float(owner->
GetStat(stat)) * mod;
1292 value += ownersBonus;
1301 value += ownersBonus;
1364 float bonus_armor = 0.0f;
1385 float multiplicator;
1388 case ENTRY_IMP: multiplicator = 8.4f;
break;
1394 default: multiplicator = 10.0f;
break;
1410 float multiplicator = 15.0f;
1414 case ENTRY_IMP: multiplicator = 4.95f;
break;
1419 default: multiplicator = 15.0f;
break;
1436 float bonusAP = 0.0f;
1452 PetSpellMap::const_iterator itr =
ToPet()->
m_spells.find(62758);
1466 AddPct(bonusAP, aurEff->GetAmount());
1467 AddPct(val, aurEff->GetAmount());
1478 float dmg_multiplier = 0.31f;
1480 dmg_multiplier = 0.61f;
1489 int32 maximum = (fire > shadow) ? fire : shadow;
1493 bonusAP = maximum * 0.57f;
1525 float bonusDamage = 0.0f;
1533 bonusDamage = spellDmg * 0.09f;
1540 bonusDamage = spellDmg * 0.4f;
1556 float mindamage = ((base_value + weapon_mindamage) * base_pct + total_value) * total_pct;
1557 float maxdamage = ((base_value + weapon_maxdamage) * base_pct + total_value) * total_pct;
1566 mindamage = mindamage * 1.25f;
1567 maxdamage = maxdamage * 1.25f;
1574 mindamage = mindamage * 0.75f;
1575 maxdamage = maxdamage * 0.75f;
1582 for (Unit::AuraEffectList::const_iterator itr = mDummy.begin(); itr != mDummy.end(); ++itr)
1584 switch ((*itr)->GetSpellInfo()->Id)
1588 AddPct(mindamage, -(*itr)->GetAmount());
1589 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
static std::pair< float, Optional< Rates > > const powerRegenInfo[MAX_POWERS]
float CalculateDiminishingReturns(float const (&capArray)[MAX_CLASSES], uint8 playerClass, float nonDiminishValue, float diminishValue)
float const parry_cap[MAX_CLASSES]
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
@ UNIT_MOD_ATTACK_POWER_RANGED
#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
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
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
void SetStatFlatModifier(UnitMods unitMod, UnitModifierFlatType modifierType, float val)
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