29#include <G3D/g3dmath.h>
45 if (amount >
int32(baseValue))
66 float minDamage = 0.0f;
67 float maxDamage = 0.0f;
95 return powerType->MaxBasePower;
180 std::accumulate(modDamageAuras.begin(), modDamageAuras.end(), 0, [i](
int32 negativeMod,
AuraEffect const* aurEff)
182 if (aurEff->GetAmount() < 0 && aurEff->GetMiscValue() & (1 << i))
183 negativeMod += aurEff->GetAmount();
264 float baseValue = value;
284 ratio = hpBase->Health;
288 return stamina * ratio;
296 return specialization->PrimaryStatPriority;
301 if (primaryStatPriority >= 4)
304 if (primaryStatPriority >= 2)
360 if (form && form->
Flags & 0x20)
363 val2 = strengthValue + agilityValue;
441 float attackPowerMod = std::max(
GetAPMultiplier(attType, normalized), 0.25f);
451 float versaDmgMod = 1.0f;
458 weaponMinDamage = weaponMinDamage * shapeshift->
CombatRoundTime / 1000.0f / attackPowerMod;
459 weaponMaxDamage = weaponMaxDamage * shapeshift->
CombatRoundTime / 1000.0f / attackPowerMod;
474 minDamage = ((weaponMinDamage + baseValue) * basePct + totalValue) * totalPct * versaDmgMod;
475 maxDamage = ((weaponMaxDamage + baseValue) * basePct + totalValue) * totalPct * versaDmgMod;
499 auto applyCritLimit = [](
float value)
557 for (
AuraEffect* auraEff : aura->GetAuraEffects())
559 float mult = auraEff->GetSpellEffectInfo().BonusCoefficient;
560 if (G3D::fuzzyEq(mult, 0.0f))
563 auraEff->ChangeAmount(
int32(value * mult));
587 AddPct(value, auraEffect->GetAmount());
624 uint32 const classIdx = playerClass - 1;
627 float const c = capArray[classIdx];
629 float result = c * diminishValue / (diminishValue + c * k);
630 result += nonDiminishValue;
659 float nondiminishing = 5.0f;
695 float diminishing = 0.0f, nondiminishing = 0.0f;
733 if (effectiveCorruption < corruptionEffect->MinCorruption)
745 CastSpell(
this, corruptionEffect->Aura,
true);
781 return aurEff->
GetSpellInfo()->IsItemFitToSpellRequirements(weapon);
820 float base_regen = basemana / 100.f;
990 float variance = 1.0f;
1021 weaponMinDamage = 0.0f;
1022 weaponMaxDamage = 0.0f;
1033 minDamage = ((weaponMinDamage + baseValue) * dmgMultiplier * basePct + totalValue) * totalPct;
1034 maxDamage = ((weaponMaxDamage + baseValue) * dmgMultiplier * basePct + totalValue) * totalPct;
1043#define ENTRY_IMP 416
1044#define ENTRY_VOIDWALKER 1860
1045#define ENTRY_SUCCUBUS 1863
1046#define ENTRY_FELHUNTER 417
1047#define ENTRY_FELGUARD 17252
1048#define ENTRY_WATER_ELEMENTAL 510
1049#define ENTRY_TREANT 1964
1050#define ENTRY_FIRE_ELEMENTAL 15438
1051#define ENTRY_GHOUL 26125
1052#define ENTRY_BLOODWORM 28017
1059 float ownersBonus = 0.0f;
1071 ownersBonus = float(owner->
GetStat(stat)) * mod;
1072 value += ownersBonus;
1077 value += ownersBonus;
1085 value += ownersBonus;
1151 float baseValue = 0.0f;
1153 float bonus_armor = 0.0f;
1176 float multiplicator;
1179 case ENTRY_IMP: multiplicator = 8.4f;
break;
1185 default: multiplicator = 10.0f;
break;
1217 float bonusAP = 0.0f;
1241 float dmg_multiplier = 0.31f;
1250 int32 maximum = (fire > shadow) ? fire : shadow;
1254 bonusAP = maximum * 0.57f;
1284 float bonusDamage = 0.0f;
1292 bonusDamage = spellDmg * 0.09f;
1299 bonusDamage = spellDmg * 0.4f;
1315 float mindamage = ((base_value + weapon_mindamage) * base_pct + total_value) * total_pct;
1316 float maxdamage = ((base_value + weapon_maxdamage) * base_pct + total_value) * total_pct;
1326 playerOwner->SetPetSpellPower(damage);
DB2Storage< ChrClassesEntry > sChrClassesStore("ChrClasses.db2", &ChrClassesLoadInfo::Instance)
DB2Storage< SpellShapeshiftFormEntry > sSpellShapeshiftFormStore("SpellShapeshiftForm.db2", &SpellShapeshiftFormLoadInfo::Instance)
DB2Storage< CorruptionEffectsEntry > sCorruptionEffectsStore("CorruptionEffects.db2", &CorruptionEffectsLoadInfo::Instance)
@ ITEM_FLAG3_ALWAYS_ALLOW_DUAL_WIELD
#define MAX_POWERS_PER_CLASS
@ POWER_ALTERNATE_ENCOUNTER
@ 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_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_MOD_BLOCK_PERCENT
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]
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
@ 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
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
void UpdateMaxPower(Powers power) override
void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage) 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
void SetUpdateFieldValue(UF::UpdateFieldSetter< T > setter, typename UF::UpdateFieldSetter< T >::value_type value)
UF::UpdateFieldHolder m_values
void SetUpdateFieldStatValue(UF::UpdateFieldSetter< T > setter, typename UF::UpdateFieldSetter< T >::value_type value)
void ApplyModUpdateFieldValue(UF::UpdateFieldSetter< T > setter, typename UF::UpdateFieldSetter< T >::value_type mod, bool apply)
static Player * ToPlayer(Object *o)
void UpdateParryPercentage()
void UpdateArmorPenetration(int32 amount)
void UpdateDodgePercentage()
void ApplyModTargetResistance(int32 mod, bool apply)
void UpdateMaxPower(Powers power) override
bool CanUseMastery() const
void UpdateCritPercentage(WeaponAttackType attType)
UF::UpdateField< UF::ActivePlayerData, int32(WowCS::EntityFragment::CGObject), TYPEID_ACTIVE_PLAYER > m_activePlayerData
uint32 GetPowerIndex(Powers power) const override
float GetRatingBonusValue(CombatRating cr) const
uint32 GetRuneBaseCooldown() 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()
void UpdateAllRunesRegen()
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
bool haveOffhandWeapon() const
Powers GetPowerType() const
bool CanDualWield() const
uint32 GetBaseAttackTime(WeaponAttackType att) const
float m_modRangedHitChance
void SetBonusResistanceMod(SpellSchools school, int32 val)
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
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
uint32 GetCreateHealth() const
bool HasAuraType(AuraType auraType) const
float m_modMeleeHitChance
void _RemoveAllAuraStatMods()
int32 GetTotalAuraModifier(AuraType auraType) const
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)
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
void SetCanModifyStats(bool modifyStats)
float GetFlatModifierValue(UnitMods unitMod, UnitModifierFlatType modifierType) const
float GetStat(Stats stat) const
int32 GetTotalAuraModifierByMiscValue(AuraType auraType, int32 misc_value) 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)
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask) const
void SetStatFlatModifier(UnitMods unitMod, UnitModifierFlatType modifierType, float val)
void SetAttackPowerModPos(int32 attackPowerMod)
void UpdateStatBuffMod(Stats stat)
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
@ CONFIG_STATS_LIMITS_ENABLE
@ CONFIG_STATS_LIMITS_DODGE
@ CONFIG_STATS_LIMITS_PARRY
@ CONFIG_STATS_LIMITS_CRIT
@ CONFIG_STATS_LIMITS_BLOCK
uint8 AttackPowerPerAgility
uint8 RangedAttackPowerPerAgility
uint8 AttackPowerPerStrength
std::array< int32, MAX_MASTERY_SPELLS > MasterySpellID
UpdateFieldArray< float, 7, 381, 403 > ModHealingDonePercent
UpdateField< float, 32, 68 > OffhandCritPercentage
UpdateField< float, 32, 58 > OffhandExpertise
UpdateField< float, 32, 67 > RangedCritPercentage
UpdateField< float, 32, 62 > DodgePercentage
UpdateField< float, 32, 69 > SpellCritPercentage
UpdateField< float, 32, 64 > ParryPercentage
UpdateField< float, 70, 73 > Mastery
UpdateField< int32, 70, 77 > Versatility
UpdateField< float, 32, 61 > BlockPercentage
UpdateField< float, 32, 66 > CritPercentage
UpdateFieldArray< int32, 32, 442, 443 > CombatRatings
UpdateField< int32, 70, 82 > ModHealingDonePos
UpdateField< float, 32, 57 > MainhandExpertise
UpdateFieldArray< int32, 7, 381, 389 > ModDamageDoneNeg
UpdateFieldArray< int32, 7, 381, 382 > ModDamageDonePos
UpdateFieldArray< float, 10, 133, 164 > PowerRegenInterruptedFlatModifier
UpdateFieldArray< float, 10, 133, 154 > PowerRegenFlatModifier
UpdateField< float, 32, 62 > MaxOffHandDamage
UpdateField< float, 96, 104 > MaxRangedDamage
UpdateField< float, 96, 103 > MinRangedDamage
UpdateField< float, 32, 61 > MinOffHandDamage
UpdateField< float, 32, 59 > MinDamage
UpdateField< float, 32, 60 > MaxDamage