30#include <G3D/g3dmath.h>
46 if (amount >
int32(baseValue))
67 float minDamage = 0.0f;
68 float maxDamage = 0.0f;
96 return powerType->MaxBasePower;
184 if (aurEff->GetAmount() < 0 && aurEff->GetMiscValue() & (1 << i))
185 negativeMod += aurEff->GetAmount();
270 float baseValue = value;
290 ratio = hpBase->Health;
294 return stamina * ratio;
302 return specialization->PrimaryStatPriority;
307 if (primaryStatPriority >= 4)
310 if (primaryStatPriority >= 2)
371 if (form && form->
Flags & 0x20)
374 val2 = strengthValue + agilityValue;
388 float baseAttackPower = val2;
453 float attackPowerMod = std::max(
GetAPMultiplier(attType, normalized), 0.25f);
463 float versaDmgMod = 1.0f;
470 weaponMinDamage = weaponMinDamage * shapeshift->
CombatRoundTime / 1000.0f / attackPowerMod;
471 weaponMaxDamage = weaponMaxDamage * shapeshift->
CombatRoundTime / 1000.0f / attackPowerMod;
486 minDamage = ((weaponMinDamage + baseValue) * basePct + totalValue) * totalPct * versaDmgMod;
487 maxDamage = ((weaponMaxDamage + baseValue) * basePct + totalValue) * totalPct * versaDmgMod;
511 auto applyCritLimit = [](
float value)
567 for (
AuraEffect* auraEff : aura->GetAuraEffects())
568 if (G3D::fuzzyNe(auraEff->GetSpellEffectInfo().BonusCoefficient, 0.0f))
569 auraEff->RecalculateAmount(
this);
590 AddPct(value, auraEffect->GetAmount());
628 uint32 const classIdx = playerClass - 1;
631 float const c = capArray[classIdx];
633 float result = c * diminishValue / (diminishValue + c * k);
634 result += nonDiminishValue;
664 float nondiminishing = 5.0f;
701 float diminishing = 0.0f, nondiminishing = 0.0f;
739 if (effectiveCorruption < corruptionEffect->MinCorruption)
751 CastSpell(
this, corruptionEffect->Aura,
true);
787 return aurEff->
GetSpellInfo()->IsItemFitToSpellRequirements(weapon);
859 float result_regen_interrupted = powerType->
RegenCombat;
860 float pct_modifier = 1.f;
861 float flat_modifier = 0.f;
864 [powerMask = 1 << power](
AuraEffect const* preventRegen) {
return (preventRegen->
GetMiscValue() & powerMask) != 0; }))
878 float base_regen = float(basemana) / 100.f;
882 result_regen += base_regen;
883 result_regen_interrupted += base_regen;
899 result_regen *= pct_modifier;
900 result_regen_interrupted *= pct_modifier;
902 result_regen += flat_modifier;
903 result_regen_interrupted += flat_modifier;
907 result_regen_interrupted -= powerType->
RegenCombat;
1098 float variance = 1.0f;
1129 weaponMinDamage = 0.0f;
1130 weaponMaxDamage = 0.0f;
1141 minDamage = ((weaponMinDamage + baseValue) * dmgMultiplier * basePct + totalValue) * totalPct;
1142 maxDamage = ((weaponMaxDamage + baseValue) * dmgMultiplier * basePct + totalValue) * totalPct;
1151#define ENTRY_IMP 416
1152#define ENTRY_VOIDWALKER 1860
1153#define ENTRY_SUCCUBUS 1863
1154#define ENTRY_FELHUNTER 417
1155#define ENTRY_FELGUARD 17252
1156#define ENTRY_WATER_ELEMENTAL 510
1157#define ENTRY_TREANT 1964
1158#define ENTRY_FIRE_ELEMENTAL 15438
1159#define ENTRY_GHOUL 26125
1160#define ENTRY_BLOODWORM 28017
1167 float ownersBonus = 0.0f;
1179 ownersBonus = float(owner->
GetStat(stat)) * mod;
1180 value += ownersBonus;
1185 value += ownersBonus;
1193 value += ownersBonus;
1259 float baseValue = 0.0f;
1261 float bonus_armor = 0.0f;
1284 float multiplicator;
1287 case ENTRY_IMP: multiplicator = 8.4f;
break;
1293 default: multiplicator = 10.0f;
break;
1325 float bonusAP = 0.0f;
1349 float dmg_multiplier = 0.31f;
1358 int32 maximum = (fire > shadow) ? fire : shadow;
1362 bonusAP = maximum * 0.57f;
1374 float base_attPower = val + bonusAP;
1393 float bonusDamage = 0.0f;
1401 bonusDamage = spellDmg * 0.09f;
1408 bonusDamage = spellDmg * 0.4f;
1424 float mindamage = ((base_value + weapon_mindamage) * base_pct + total_value) * total_pct;
1425 float maxdamage = ((base_value + weapon_maxdamage) * base_pct + total_value) * total_pct;
1435 playerOwner->SetPetSpellPower(damage);
DB2Storage< ChrClassesEntry > sChrClassesStore("ChrClasses.db2", &ChrClassesLoadInfo::Instance)
DB2Storage< SpellShapeshiftFormEntry > sSpellShapeshiftFormStore("SpellShapeshiftForm.db2", &SpellShapeshiftFormLoadInfo::Instance)
DB2Storage< CorruptionEffectsEntry > sCorruptionEffectsStore("CorruptionEffects.db2", &CorruptionEffectsLoadInfo::Instance)
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
@ ITEM_FLAG3_ALWAYS_ALLOW_DUAL_WIELD
#define MAX_POWERS_PER_CLASS
@ POWER_ALTERNATE_ENCOUNTER
@ SPELL_ATTR8_MASTERY_AFFECTS_POINTS
@ SPELL_AURA_OVERRIDE_ATTACK_POWER_BY_SP_PCT
@ SPELL_AURA_MOD_PARRY_PERCENT
@ SPELL_AURA_MOD_SPELL_HIT_CHANCE
@ SPELL_AURA_MOD_EXPERTISE
@ SPELL_AURA_INTERRUPT_REGEN
@ SPELL_AURA_MOD_POWER_REGEN
@ SPELL_AURA_MOD_HEALING_DONE_PERCENT
@ SPELL_AURA_MOD_ARMOR_PCT_FROM_STAT
@ SPELL_AURA_MOD_BONUS_ARMOR_PCT
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE
@ SPELL_AURA_MOD_MANA_REGEN_PCT
@ SPELL_AURA_MOD_DODGE_PERCENT
@ SPELL_AURA_MOD_CRIT_PCT
@ SPELL_AURA_MOD_VERSATILITY
@ SPELL_AURA_OVERRIDE_SPELL_POWER_BY_AP_PCT
@ SPELL_AURA_MOD_POWER_REGEN_PERCENT
@ SPELL_AURA_MOD_DAMAGE_DONE
@ SPELL_AURA_PREVENT_REGENERATE_POWER
@ SPELL_AURA_MOD_BLOCK_PERCENT
double SpellEffectValue
This is a double instead of float to be able to store full range of int32.
#define ENTRY_FIRE_ELEMENTAL
constexpr float dodge_cap[MAX_CLASSES]
float CalculateDiminishingReturns(float const (&capArray)[MAX_CLASSES], uint8 playerClass, float nonDiminishValue, float diminishValue)
static constexpr std::array< Optional< Rates >, MAX_POWERS > PowerRegenInfo
constexpr float 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
@ OFFHAND_CRIT_PERCENTAGE
@ CR_VERSATILITY_HEALING_DONE
@ CR_CORRUPTION_RESISTANCE
@ CR_VERSATILITY_DAMAGE_DONE
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
T CalculatePct(T base, U pct)
SpellInfo const * GetSpellInfo() const
int32 GetMiscValue() const
SpellEffectValue GetAmount() const
ObjectGuid const & GetGUID() const
void SetUpdateFieldValue(UF::UpdateFieldPrivateSetter< T > setter, typename UF::UpdateFieldPrivateSetter< T >::value_type value)
void SetUpdateFieldStatValue(UF::UpdateFieldPrivateSetter< T > setter, typename UF::UpdateFieldPrivateSetter< T >::value_type value)
UF::UpdateFieldHolder m_values
void ApplyModUpdateFieldValue(UF::UpdateFieldPrivateSetter< T > setter, typename UF::UpdateFieldPrivateSetter< T >::value_type mod, bool apply)
static bool IsPlayerMeetingCondition(Player const *player, uint32 conditionId)
bool UpdateAllStats() override
CreatureDifficulty const * GetCreatureDifficulty() const
bool UpdateStats(Stats stat) override
uint32 GetPowerIndex(Powers power) const override
int32 GetCreatePowerValue(Powers power) const override
void UpdateAttackPowerAndDamage(bool ranged=false) override
void UpdateArmor() override
CreatureTemplate const * GetCreatureTemplate() const
ClassPowerTypes GetPowerTypes() const override
void UpdateMaxPower(Powers power) override
uint32 m_baseRangedAttackPower
void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage) const override
void UpdateMaxHealth() override
static uint32 GetPowerIndexByClass(Powers power, uint32 classId)
static ClassPowerTypes GetPowerTypesByClass(uint32 classId)
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
void UpdateParryPercentage()
void UpdateArmorPenetration(int32 amount)
void UpdateDodgePercentage()
float GetPowerRegen(Powers power) const
void ApplyModTargetResistance(int32 mod, bool apply)
void UpdateMaxPower(Powers power) override
bool CanUseMastery() const
void UpdateCritPercentage(WeaponAttackType attType)
void UpdatePowerRegen(Powers power)
UF::UpdateField< UF::ActivePlayerData, int32(WowCS::EntityFragment::CGObject), TYPEID_ACTIVE_PLAYER > m_activePlayerData
uint32 GetPowerIndex(Powers power) const override
float GetRatingBonusValue(CombatRating cr) const
void UpdateVersatilityDamageDone()
void UpdateBlockPercentage()
void ApplyModDamageDonePos(SpellSchools school, int32 mod, bool apply)
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
void ApplyAllAzeriteItemMods(bool apply)
void UpdateHealingDonePercentMod()
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 CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage) const override
void UpdateSpellDamageAndHealingBonus()
void UpdateMaxHealth() override
void UpdateMeleeHitChances()
ClassPowerTypes GetPowerTypes() const override
TimePoint m_regenInterruptTimestamp
void UpdateRangedHitChances()
void ApplySpellPowerBonus(int32 amount, bool apply)
void UpdateAllCritPercentages()
bool UpdateAllStats() override
Item * GetWeaponForAttack(WeaponAttackType attackType, bool useable=false) const
void _RemoveAllStatBonuses()
int32 m_spellPenetrationItemMod
Stats GetPrimaryStat() const
void ApplyHealthRegenBonus(int32 amount, bool apply)
void UpdateSpellCritChance()
ChrSpecializationEntry const * GetPrimarySpecializationEntry() const
float GetHealthBonusFromStamina() const
void UpdateAttackPowerAndDamage(bool ranged=false) override
MutableFieldReference< T, false > ModifyValue(UpdateField< T, BlockBit, Bit >(Derived::*field))
float GetPctModifierValue(UnitMods unitMod, UnitModifierPctType modifierType) const
virtual void UpdateResistances(uint32 school)
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
void SetStat(Stats stat, int32 val)
float GetTotalAuraModValue(UnitMods unitMod) const
float GetTotalStatValue(Stats stat) const
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
virtual int32 GetCreatePowerValue(Powers power) const
void SetArmor(int32 val, int32 bonusVal)
bool CanUseAttackType(uint8 attacktype) const
virtual void UpdateAllResistances()
ShapeshiftForm GetShapeshiftForm() const
std::forward_list< AuraEffect * > AuraEffectList
void SetAttackPowerModNeg(int32 attackPowerMod)
bool haveOffhandWeapon() const
Powers GetPowerType() const
bool CanDualWield() const
uint32 GetBaseAttackTime(WeaponAttackType att) const
float m_modRangedHitChance
void SetBonusResistanceMod(SpellSchools school, int32 val)
void SetRangedAttackPowerModNeg(int32 attackPowerMod)
void SetRangedAttackPowerModPos(int32 attackPowerMod)
float GetTotalAuraMultiplier(AuraType auraType) const
virtual void UpdateDamagePhysical(WeaponAttackType attType)
void _ApplyAllAuraStatMods()
void SetRangedAttackPowerMultiplier(float attackPowerMult)
void SetResistance(SpellSchools school, int32 val)
float GetTotalAuraMultiplierByMiscValue(AuraType auraType, int32 misc_value) const
float GetWeaponDamageRange(WeaponAttackType attType, WeaponDamageRange type) const
uint32 GetCreateHealth() const
float GetTotalAuraModifier(AuraType auraType) const
bool HasAuraType(AuraType auraType) const
float m_modMeleeHitChance
void _RemoveAllAuraStatMods()
float GetAPMultiplier(WeaponAttackType attType, bool normalized) const
virtual void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage) const =0
void SetAttackPower(int32 attackPower)
void SetMaxHealth(uint64 val)
float GetTotalAuraModifierByMiscValue(AuraType auraType, int32 misc_value) const
UF::UpdateField< UF::UnitData, int32(WowCS::EntityFragment::CGObject), TYPEID_UNIT > m_unitData
int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask) const
float GetTotalAttackPowerValue(WeaponAttackType attType, bool includeWeapon=true) const
float GetCreateStat(Stats stat) const
int32 GetBonusResistanceMod(SpellSchools school) const
float GetAttackPowerModifierValue(AttackPowerModIndex index, AttackPowerModType modifierType) const
void SetCanModifyStats(bool modifyStats)
float GetFlatModifierValue(UnitMods unitMod, UnitModifierFlatType modifierType) const
float GetStat(Stats stat) const
void SetMaxPower(Powers power, int32 val)
uint32 GetCreateMana() const
void SetRangedAttackPower(int32 attackPower)
int32 GetResistance(SpellSchools school) const
float m_modSpellHitChance
Guardian * GetGuardianPet() const
void SetAttackPowerMultiplier(float attackPowerMult)
AuraMap & GetOwnedAuras()
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask) const
void SetAttackPowerModPos(int32 attackPowerMod)
void UpdateStatBuffMod(Stats stat)
@ RATE_POWER_RUNIC_POWER_LOSS
@ RATE_POWER_ARCANE_CHARGES
@ RATE_POWER_COMBO_POINTS_LOSS
@ CONFIG_STATS_LIMITS_DODGE
@ CONFIG_STATS_LIMITS_PARRY
@ CONFIG_STATS_LIMITS_CRIT
@ CONFIG_STATS_LIMITS_BLOCK
@ CONFIG_STATS_LIMITS_ENABLE
TimePoint Now()
Current chrono steady_clock time point.
uint8 AttackPowerPerAgility
uint8 RangedAttackPowerPerAgility
uint8 AttackPowerPerStrength
std::array< Powers, MAX_POWERS_PER_CLASS > PowerType
int32 RegenInterruptTimeMS
EnumFlag< PowerTypeFlags > GetFlags() const
UpdateField< float, 70, 80 > SpellCritPercentage
UpdateField< float, 70, 72 > BlockPercentage
UpdateField< int32, 70, 87 > Versatility
UpdateField< float, 32, 68 > OffhandExpertise
UpdateField< float, 70, 77 > CritPercentage
UpdateFieldArray< int32, 32, 333, 334 > CombatRatings
UpdateField< int32, 70, 92 > ModHealingDonePos
UpdateField< float, 70, 83 > Mastery
UpdateFieldArray< int32, 7, 272, 280 > ModDamageDoneNeg
UpdateField< float, 70, 73 > DodgePercentage
UpdateField< float, 70, 78 > RangedCritPercentage
UpdateField< float, 70, 79 > OffhandCritPercentage
UpdateFieldArray< int32, 7, 272, 273 > ModDamageDonePos
UpdateFieldArray< float, 7, 272, 294 > ModHealingDonePercent
UpdateField< float, 70, 75 > ParryPercentage
UpdateField< float, 32, 67 > MainhandExpertise
UpdateFieldArray< float, 10, 139, 170 > PowerRegenInterruptedFlatModifier
UpdateFieldArray< float, 10, 139, 160 > PowerRegenFlatModifier
UpdateField< float, 32, 63 > MinDamage
UpdateField< float, 96, 107 > MinRangedDamage
UpdateField< float, 64, 67 > MaxOffHandDamage
UpdateField< float, 64, 65 > MaxDamage
UpdateField< float, 96, 108 > MaxRangedDamage
UpdateField< float, 64, 66 > MinOffHandDamage