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())
562 float mult = auraEff->GetSpellEffectInfo().BonusCoefficient;
563 if (G3D::fuzzyEq(mult, 0.0f))
566 auraEff->ChangeAmount(
int32(value * mult));
590 AddPct(value, auraEffect->GetAmount());
627 uint32 const classIdx = playerClass - 1;
630 float const c = capArray[classIdx];
632 float result = c * diminishValue / (diminishValue + c * k);
633 result += nonDiminishValue;
662 float nondiminishing = 5.0f;
698 float diminishing = 0.0f, nondiminishing = 0.0f;
736 if (effectiveCorruption < corruptionEffect->MinCorruption)
751 CastSpell(
this, corruptionEffect->Aura,
true);
787 return aurEff->
GetSpellInfo()->IsItemFitToSpellRequirements(weapon);
826 float base_regen = basemana / 100.f;
996 float variance = 1.0f;
1027 weaponMinDamage = 0.0f;
1028 weaponMaxDamage = 0.0f;
1039 minDamage = ((weaponMinDamage + baseValue) * dmgMultiplier * basePct + totalValue) * totalPct;
1040 maxDamage = ((weaponMaxDamage + baseValue) * dmgMultiplier * basePct + totalValue) * totalPct;
1049#define ENTRY_IMP 416
1050#define ENTRY_VOIDWALKER 1860
1051#define ENTRY_SUCCUBUS 1863
1052#define ENTRY_FELHUNTER 417
1053#define ENTRY_FELGUARD 17252
1054#define ENTRY_WATER_ELEMENTAL 510
1055#define ENTRY_TREANT 1964
1056#define ENTRY_FIRE_ELEMENTAL 15438
1057#define ENTRY_GHOUL 26125
1058#define ENTRY_BLOODWORM 28017
1065 float ownersBonus = 0.0f;
1077 ownersBonus = float(owner->
GetStat(stat)) * mod;
1078 value += ownersBonus;
1083 value += ownersBonus;
1091 value += ownersBonus;
1157 float baseValue = 0.0f;
1159 float bonus_armor = 0.0f;
1182 float multiplicator;
1185 case ENTRY_IMP: multiplicator = 8.4f;
break;
1191 default: multiplicator = 10.0f;
break;
1223 float bonusAP = 0.0f;
1247 float dmg_multiplier = 0.31f;
1256 int32 maximum = (fire > shadow) ? fire : shadow;
1260 bonusAP = maximum * 0.57f;
1290 float bonusDamage = 0.0f;
1298 bonusDamage = spellDmg * 0.09f;
1305 bonusDamage = spellDmg * 0.4f;
1321 float mindamage = ((base_value + weapon_mindamage) * base_pct + total_value) * total_pct;
1322 float maxdamage = ((base_value + weapon_maxdamage) * base_pct + total_value) * total_pct;
1332 playerOwner->SetPetSpellPower(damage);
DB2Storage< ChrClassesEntry > sChrClassesStore("ChrClasses.db2", &ChrClassesLoadInfo::Instance)
DB2Storage< SpellShapeshiftFormEntry > sSpellShapeshiftFormStore("SpellShapeshiftForm.db2", &SpellShapeshiftFormLoadInfo::Instance)
DB2Storage< CorruptionEffectsEntry > sCorruptionEffectsStore("CorruptionEffects.db2", &CorruptionEffectsLoadInfo::Instance)
DB2Storage< PlayerConditionEntry > sPlayerConditionStore("PlayerCondition.db2", &PlayerConditionLoadInfo::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, PlayerConditionEntry const *condition)
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)
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()
UF::UpdateField< UF::ActivePlayerData, 0, TYPEID_ACTIVE_PLAYER > m_activePlayerData
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
UF::UpdateField< UF::UnitData, 0, TYPEID_UNIT > m_unitData
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)
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
UpdateField< float, 32, 61 > ParryPercentage
UpdateFieldArray< int32, 32, 428, 429 > CombatRatings
UpdateField< float, 32, 63 > CritPercentage
UpdateField< float, 32, 64 > RangedCritPercentage
UpdateField< float, 32, 54 > MainhandExpertise
UpdateField< float, 32, 69 > Mastery
UpdateField< int32, 72, 78 > ModHealingDonePos
UpdateField< float, 32, 59 > DodgePercentage
UpdateField< int32, 72, 74 > Versatility
UpdateFieldArray< int32, 7, 367, 375 > ModDamageDoneNeg
UpdateFieldArray< float, 7, 367, 389 > ModHealingDonePercent
UpdateFieldArray< int32, 7, 367, 368 > ModDamageDonePos
UpdateField< float, 32, 55 > OffhandExpertise
UpdateField< float, 32, 66 > SpellCritPercentage
UpdateField< float, 32, 58 > BlockPercentage
UpdateField< float, 32, 65 > OffhandCritPercentage
UpdateFieldArray< float, 10, 130, 161 > PowerRegenInterruptedFlatModifier
UpdateField< float, 96, 102 > MinRangedDamage
UpdateField< float, 32, 60 > MinOffHandDamage
UpdateField< float, 32, 59 > MaxDamage
UpdateField< float, 32, 61 > MaxOffHandDamage
UpdateField< float, 32, 58 > MinDamage
UpdateField< float, 96, 103 > MaxRangedDamage
UpdateFieldArray< float, 10, 130, 151 > PowerRegenFlatModifier