29#include <G3D/g3dmath.h>
45 if (amount >
int32(baseValue))
66 float minDamage = 0.0f;
67 float maxDamage = 0.0f;
95 return powerType->MaxBasePower;
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)
555 for (
AuraEffect* auraEff : aura->GetAuraEffects())
556 if (G3D::fuzzyNe(auraEff->GetSpellEffectInfo().BonusCoefficient, 0.0f))
557 auraEff->RecalculateAmount(
this);
578 AddPct(value, auraEffect->GetAmount());
616 uint32 const classIdx = playerClass - 1;
619 float const c = capArray[classIdx];
621 float result = c * diminishValue / (diminishValue + c * k);
622 result += nonDiminishValue;
652 float nondiminishing = 5.0f;
689 float diminishing = 0.0f, nondiminishing = 0.0f;
727 if (effectiveCorruption < corruptionEffect->MinCorruption)
739 CastSpell(
this, corruptionEffect->Aura,
true);
775 return aurEff->
GetSpellInfo()->IsItemFitToSpellRequirements(weapon);
814 float base_regen = basemana / 100.f;
984 float variance = 1.0f;
1015 weaponMinDamage = 0.0f;
1016 weaponMaxDamage = 0.0f;
1027 minDamage = ((weaponMinDamage + baseValue) * dmgMultiplier * basePct + totalValue) * totalPct;
1028 maxDamage = ((weaponMaxDamage + baseValue) * dmgMultiplier * basePct + totalValue) * totalPct;
1037#define ENTRY_IMP 416
1038#define ENTRY_VOIDWALKER 1860
1039#define ENTRY_SUCCUBUS 1863
1040#define ENTRY_FELHUNTER 417
1041#define ENTRY_FELGUARD 17252
1042#define ENTRY_WATER_ELEMENTAL 510
1043#define ENTRY_TREANT 1964
1044#define ENTRY_FIRE_ELEMENTAL 15438
1045#define ENTRY_GHOUL 26125
1046#define ENTRY_BLOODWORM 28017
1053 float ownersBonus = 0.0f;
1065 ownersBonus = float(owner->
GetStat(stat)) * mod;
1066 value += ownersBonus;
1071 value += ownersBonus;
1079 value += ownersBonus;
1145 float baseValue = 0.0f;
1147 float bonus_armor = 0.0f;
1170 float multiplicator;
1173 case ENTRY_IMP: multiplicator = 8.4f;
break;
1179 default: multiplicator = 10.0f;
break;
1211 float bonusAP = 0.0f;
1235 float dmg_multiplier = 0.31f;
1244 int32 maximum = (fire > shadow) ? fire : shadow;
1248 bonusAP = maximum * 0.57f;
1278 float bonusDamage = 0.0f;
1286 bonusDamage = spellDmg * 0.09f;
1293 bonusDamage = spellDmg * 0.4f;
1309 float mindamage = ((base_value + weapon_mindamage) * base_pct + total_value) * total_pct;
1310 float maxdamage = ((base_value + weapon_maxdamage) * base_pct + total_value) * total_pct;
1320 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_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_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
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)
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
@ 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
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
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 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
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
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 SetStatFlatModifier(UnitMods unitMod, UnitModifierFlatType modifierType, float val)
void SetAttackPowerModPos(int32 attackPowerMod)
void UpdateStatBuffMod(Stats stat)
@ CONFIG_STATS_LIMITS_DODGE
@ CONFIG_STATS_LIMITS_PARRY
@ CONFIG_STATS_LIMITS_CRIT
@ CONFIG_STATS_LIMITS_BLOCK
@ CONFIG_STATS_LIMITS_ENABLE
uint8 AttackPowerPerAgility
uint8 RangedAttackPowerPerAgility
uint8 AttackPowerPerStrength
UpdateField< float, 70, 80 > SpellCritPercentage
UpdateFieldArray< int32, 32, 332, 333 > CombatRatings
UpdateField< float, 70, 72 > BlockPercentage
UpdateField< int32, 70, 87 > Versatility
UpdateField< float, 32, 68 > OffhandExpertise
UpdateFieldArray< int32, 7, 271, 279 > ModDamageDoneNeg
UpdateFieldArray< int32, 7, 271, 272 > ModDamageDonePos
UpdateField< float, 70, 77 > CritPercentage
UpdateField< int32, 70, 92 > ModHealingDonePos
UpdateField< float, 70, 83 > Mastery
UpdateField< float, 70, 73 > DodgePercentage
UpdateField< float, 70, 78 > RangedCritPercentage
UpdateField< float, 70, 79 > OffhandCritPercentage
UpdateFieldArray< float, 7, 271, 293 > ModHealingDonePercent
UpdateField< float, 70, 75 > ParryPercentage
UpdateField< float, 32, 67 > MainhandExpertise
UpdateField< float, 32, 62 > MaxDamage
UpdateField< float, 32, 63 > MinOffHandDamage
UpdateField< float, 32, 61 > MinDamage
UpdateField< float, 96, 105 > MinRangedDamage
UpdateField< float, 64, 65 > MaxOffHandDamage
UpdateFieldArray< float, 10, 137, 158 > PowerRegenFlatModifier
UpdateField< float, 96, 106 > MaxRangedDamage
UpdateFieldArray< float, 10, 137, 168 > PowerRegenInterruptedFlatModifier