Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
StatSystem.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6#include "Creature.h"
7#include "Pet.h"
8#include "Player.h"
9#include "SharedDefines.h"
10#include "SpellAuraEffects.h"
11#include "SpellAuras.h"
12#include "SpellMgr.h"
13#include "Unit.h"
14#include "World.h"
15#include <numeric>
16
17inline bool _ModifyUInt32(bool apply, uint32& baseValue, int32& amount)
18{
19 // If amount is negative, change sign and value of apply.
20 if (amount < 0)
21 {
22 apply = !apply;
23 amount = -amount;
24 }
25 if (apply)
26 baseValue += amount;
27 else
28 {
29 // Make sure we do not get uint32 overflow.
30 if (amount > int32(baseValue))
31 amount = baseValue;
32 baseValue -= amount;
33 }
34 return apply;
35}
36
37/*#######################################
38######## ########
39######## PLAYERS STAT SYSTEM ########
40######## ########
41#######################################*/
42
44{
45 if (stat > STAT_SPIRIT)
46 return false;
47
48 // value = ((base_value * base_pct) + total_value) * total_pct
49 float value = GetTotalStatValue(stat);
50
51 SetStat(stat, int32(value));
52
53 if (stat == STAT_STAMINA || stat == STAT_INTELLECT || stat == STAT_STRENGTH)
54 {
55 Pet* pet = GetPet();
56 if (pet)
57 pet->UpdateStats(stat);
58 }
59
60 switch (stat)
61 {
62 case STAT_AGILITY:
66 break;
67 case STAT_STAMINA:
69 break;
70 case STAT_INTELLECT:
72 UpdateArmor(); //SPELL_AURA_MOD_RESISTANCE_OF_INTELLECT_PERCENT, only armor currently
73 break;
74 case STAT_SPIRIT:
75 break;
76 default:
77 break;
78 }
79
80 if (stat == STAT_STRENGTH)
82 else if (stat == STAT_AGILITY)
83 {
86 }
87
90
91 // Update ratings in exist SPELL_AURA_MOD_RATING_FROM_STAT and only depends from stat
92 uint32 mask = 0;
94 for (AuraEffectList::const_iterator i = modRatingFromStat.begin(); i != modRatingFromStat.end(); ++i)
95 if (Stats((*i)->GetMiscValueB()) == stat)
96 mask |= (*i)->GetMiscValue();
97 if (mask)
98 {
99 for (uint32 rating = 0; rating < MAX_COMBAT_RATING; ++rating)
100 if (mask & (1 << rating))
101 ApplyRatingMod(CombatRating(rating), 0, true);
102 }
103 return true;
104}
105
107{
108 float precision = 100.0f;
111
112 float pvpHealing = value / precision;
113 float pvpDamage = value / precision;
114
117}
118
119void Player::ApplySpellPowerBonus(int32 amount, bool apply)
120{
122 return;
123
124 apply = _ModifyUInt32(apply, m_baseSpellPower, amount);
125
126 // For speed just update for client
128 for (int i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i)
130
132 {
135 }
136}
137
139{
140 // Magic damage modifiers implemented in Unit::SpellDamageBonusDone
141 // This information for client side use only
142 // Get healing bonus for all schools
144 // Get damage bonus for all schools
146 for (int i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i)
147 {
148 SetStatInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG + i, std::accumulate(modDamageAuras.begin(), modDamageAuras.end(), 0, [i](int32 negativeMod, AuraEffect const* aurEff)
149 {
150 if (aurEff->GetAmount() < 0 && aurEff->GetMiscValue() & (1 << i))
151 negativeMod += aurEff->GetAmount();
152 return negativeMod;
153 }));
155 }
157 {
160 }
161}
162
164{
165 for (int8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
166 {
167 float value = GetTotalStatValue(Stats(i));
168 SetStat(Stats(i), int32(value));
169 }
170
171 UpdateArmor();
172 // calls UpdateAttackPowerAndDamage() in UpdateArmor for SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR
175
176 for (uint8 i = POWER_MANA; i < MAX_POWERS; ++i)
178
190 for (int i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i)
192
195
196 return true;
197}
198
200{
202 m_spellPenetrationItemMod += apply ? amount : -amount;
203}
204
206{
207 if (school > SPELL_SCHOOL_NORMAL)
208 {
210 SetResistance(SpellSchools(school), int32(value));
211
212 Pet* pet = GetPet();
213 if (pet)
214 pet->UpdateResistances(school);
215 }
216 else
217 UpdateArmor();
218}
219
221{
222 UnitMods unitMod = UNIT_MOD_ARMOR;
223
224 float value = GetModifierValue(unitMod, BASE_VALUE); // base armor (from items)
225 value *= GetModifierValue(unitMod, BASE_PCT); // armor percent from items
226 value += GetModifierValue(unitMod, TOTAL_VALUE);
227 value *= GetModifierValue(unitMod, TOTAL_PCT);
228
229 SetArmor(int32(value));
230
231 Pet* pet = GetPet();
232 if (pet)
233 pet->UpdateArmor();
234
235 UpdateAttackPowerAndDamage(); // armor dependent auras update for SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR
236}
237
239{
240 // Taken from PaperDollFrame.lua - 4.3.4.15595
241 float ratio = 10.0f;
242 if (gtOCTHpPerStaminaEntry const* hpBase = sGtOCTHpPerStaminaStore.LookupEntry(getLevel()))
243 ratio = hpBase->ratio;
244
245 float stamina = GetStat(STAT_STAMINA);
246 float baseStam = std::min(20.0f, stamina);
247 float moreStam = stamina - baseStam;
248
249 return baseStam + moreStam * ratio;
250}
252{
253 if (getPowerType() == POWER_MANA)
254 {
255 UpdateMaxPower(POWER_MANA); // Update max Mana (to add/reset bonus from specialization)
256 }
257}
258
260{
262 {
268 return 5.0f;
269 break;
270 }
271 return 0.0f;
272}
273
275{
276 UnitMods unitMod = UNIT_MOD_HEALTH;
277
278 float value = GetModifierValue(unitMod, BASE_VALUE) + GetCreateHealth();
279 value *= GetModifierValue(unitMod, BASE_PCT);
281 value *= GetModifierValue(unitMod, TOTAL_PCT);
282
283 SetMaxHealth((uint32)value);
284}
285
287{
289
290 float bonusPower = (power == POWER_MANA && GetCreatePowers(power) > 0) ? GetManaSpecializationMultiplier() : 0;
291
292 float value = GetModifierValue(unitMod, BASE_VALUE) + (GetCreatePowers(power) * (bonusPower > 0 ? bonusPower : 1));
293 value *= GetModifierValue(unitMod, BASE_PCT);
294 value += GetModifierValue(unitMod, TOTAL_VALUE);
295 value *= GetModifierValue(unitMod, TOTAL_PCT);
296
297 SetMaxPower(power, uint32(value));
298}
299
301{
302 float val2 = 0.0f;
303 float level = float(getLevel());
304
305 ChrClassesEntry const* entry = sChrClassesStore.LookupEntry(getClass());
307
311
312 if (ranged)
313 {
317 }
319 {
320 if (!ranged)
321 {
322 float strengthValue = std::max((GetStat(STAT_STRENGTH) - 10.0f) * entry->APPerStrenth, 0.0f);
323 float agilityValue = std::max((GetStat(STAT_AGILITY) - 10.0f) * entry->APPerAgility, 0.0f);
324
326 // Directly taken from client, SHAPESHIFT_FLAG_AP_FROM_STRENGTH ?
327 if (form && form->flags1 & 0x20)
328 agilityValue += std::max((GetStat(STAT_AGILITY) - 10.0f) * entry->APPerStrenth, 0.0f);
329
330 val2 = strengthValue + agilityValue;
331 }
332 else
333 val2 = (level + std::max(GetStat(STAT_AGILITY) - 10.0f, 0.0f)) * entry->RAPPerAgility;
334 }
335 else
336 {
338 for (int i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i)
339 minSpellPower = std::min(minSpellPower, GetInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + i));
340
342 }
343
344 SetModifierValue(unitMod, BASE_VALUE, val2);
345
346 float base_attPower = GetModifierValue(unitMod, BASE_VALUE) * GetModifierValue(unitMod, BASE_PCT);
347 float attPowerMod = GetModifierValue(unitMod, TOTAL_VALUE);
348 float attPowerMultiplier = GetModifierValue(unitMod, TOTAL_PCT) - 1.0f;
349
350 SetInt32Value(index, (uint32)base_attPower); //UNIT_FIELD_(RANGED)_ATTACK_POWER field
351 SetInt32Value(index_mod, (uint32)attPowerMod); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MOD_POS field
352 SetFloatValue(index_mult, attPowerMultiplier); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field
353
354 Pet* pet = GetPet(); //update pet's AP
355 Guardian* guardian = GetGuardianPet();
356 //automatically update weapon damage after attack power modification
357 if (ranged)
358 {
360 if (pet && pet->IsHunterPet()) // At ranged attack change for hunter pet
362 }
363 else
364 {
366 if (CanDualWield() && haveOffhandWeapon()) //allow update offhand damage only if player knows DualWield Spec and has equipped offhand weapon
368
371
372 if (pet && pet->IsPetGhoul()) // At melee attack power change for DK pet
374
375 if (guardian && guardian->IsSpiritWolf()) // At melee attack power change for Shaman feral spirit
376 guardian->UpdateAttackPowerAndDamage();
377 }
378}
379
380void Player::CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float& min_damage, float& max_damage)
381{
382 UnitMods unitMod;
383
384 switch (attType)
385 {
387 default:
388 unitMod = UNIT_MOD_DAMAGE_MAINHAND;
389 break;
391 unitMod = UNIT_MOD_DAMAGE_OFFHAND;
392 break;
394 unitMod = UNIT_MOD_DAMAGE_RANGED;
395 break;
396 }
397
398 float att_speed = GetAPMultiplier(attType, normalized);
399
400 float base_value = GetModifierValue(unitMod, BASE_VALUE) + GetTotalAttackPowerValue(attType) / 14.0f * att_speed;
401 float base_pct = GetModifierValue(unitMod, BASE_PCT);
402 float total_value = GetModifierValue(unitMod, TOTAL_VALUE);
403 float total_pct = addTotalPct ? GetModifierValue(unitMod, TOTAL_PCT) : 1.0f;
404
405 float weapon_mindamage = GetWeaponDamageRange(attType, WeaponDamageRange::MINDAMAGE);
406 float weapon_maxdamage = GetWeaponDamageRange(attType, WeaponDamageRange::MAXDAMAGE);
407
408 if (IsInFeralForm()) //check if player is druid and in cat or bear forms
409 {
410 float weaponSpeed = BASE_ATTACK_TIME / 1000.f;
412 weaponSpeed = weapon->GetTemplate()->Delay / 1000;
413
415 {
416 weapon_mindamage = weapon_mindamage / weaponSpeed;
417 weapon_maxdamage = weapon_maxdamage / weaponSpeed;
418 }
419 else if (GetShapeshiftForm() == FORM_BEAR)
420 {
421 weapon_mindamage = weapon_mindamage / weaponSpeed + weapon_mindamage / 2.5;
422 weapon_maxdamage = weapon_mindamage / weaponSpeed + weapon_maxdamage / 2.5;
423 }
424 }
425 else if (!CanUseAttackType(attType)) //check if player not in form but still can't use (disarm case)
426 {
427 //cannot use ranged/off attack, set values to 0
428 if (attType != WeaponAttackType::BASE_ATTACK)
429 {
430 min_damage = 0;
431 max_damage = 0;
432 return;
433 }
434 weapon_mindamage = BASE_MINDAMAGE;
435 weapon_maxdamage = BASE_MAXDAMAGE;
436 }
437 /*
438 TODO: Is this still needed after ammo has been removed?
439 else if (attType == RANGED_ATTACK) //add ammo DPS to ranged damage
440 {
441 weapon_mindamage += ammo * att_speed;
442 weapon_maxdamage += ammo * att_speed;
443 }*/
444
445 min_damage = ((base_value + weapon_mindamage) * base_pct + total_value) * total_pct;
446 max_damage = ((base_value + weapon_maxdamage) * base_pct + total_value) * total_pct;
447}
448
450{
451 float mindamage;
452 float maxdamage;
453
454 CalculateMinMaxDamage(attType, false, true, mindamage, maxdamage);
455
456 switch (attType)
457 {
459 default:
462 break;
466 break;
470 break;
471 }
472}
473
475{
476 // No block
477 float value = 0.0f;
478 if (CanBlock())
479 {
480 // Base value
481 value = 5.0f;
482 // Increase from SPELL_AURA_MOD_BLOCK_PERCENT aura
484 // Increase from rating
486
488 value = value > sWorld->GetFloatConfig(WorldFloatConfigs::CONFIG_STATS_LIMITS_BLOCK) ? sWorld->GetFloatConfig(WorldFloatConfigs::CONFIG_STATS_LIMITS_BLOCK) : value;
489
490 value = value < 0.0f ? 0.0f : value;
491 }
493}
494
496{
497 BaseModGroup modGroup;
498 uint16 index;
499 CombatRating cr;
500
501 switch (attType)
502 {
504 modGroup = OFFHAND_CRIT_PERCENTAGE;
507 break;
509 modGroup = RANGED_CRIT_PERCENTAGE;
512 break;
514 default:
515 modGroup = CRIT_PERCENTAGE;
518 break;
519 }
520
521 float value = GetTotalPercentageModValue(modGroup) + GetRatingBonusValue(cr);
522 // Modify crit from weapon skill and maximized defense skill of same level victim difference
524
526 value = value > sWorld->GetFloatConfig(WorldFloatConfigs::CONFIG_STATS_LIMITS_CRIT) ? sWorld->GetFloatConfig(WorldFloatConfigs::CONFIG_STATS_LIMITS_CRIT) : value;
527
528 value = value < 0.0f ? 0.0f : value;
529 SetStatFloatValue(index, value);
530}
531
544
552
553
555{
556 0.9560f, // Warrior
557 0.9560f, // Paladin
558 0.9880f, // Hunter
559 0.9880f, // Rogue
560 0.9830f, // Priest
561 0.9560f, // DK
562 0.9880f, // Shaman
563 0.9830f, // Mage
564 0.9830f, // Warlock
565 0.9880f, // Monk
566 0.9720f // Druid
567};
568
570{
571 const float parry_cap[MAX_CLASSES] =
572 {
573 65.631440f, // Warrior
574 65.631440f, // Paladin
575 145.560408f, // Hunter
576 145.560408f, // Rogue
577 0.0f, // Priest
578 65.631440f, // DK
579 145.560408f, // Shaman
580 0.0f, // Mage
581 0.0f, // Warlock
582 0.0f, // Monk
583 0.0f // Druid
584 };
585
586 // No parry
587 float value = 0.0f;
588 uint32 pclass = getClass() - 1;
589 if (CanParry() && parry_cap[pclass] > 0.0f)
590 {
591 float nondiminishing = 5.0f;
592 // Parry from rating
593 float diminishing = GetRatingBonusValue(CombatRating::CR_PARRY);
594 // Parry from SPELL_AURA_MOD_PARRY_PERCENT aura
596 // apply diminishing formula to diminishing parry chance
597 value = nondiminishing + diminishing * parry_cap[pclass] / (diminishing + parry_cap[pclass] * m_diminishing_k[pclass]);
598
600 value = value > sWorld->GetFloatConfig(WorldFloatConfigs::CONFIG_STATS_LIMITS_PARRY) ? sWorld->GetFloatConfig(WorldFloatConfigs::CONFIG_STATS_LIMITS_PARRY) : value;
601
602 value = value < 0.0f ? 0.0f : value;
603 }
605}
606
608{
609 const float dodge_cap[MAX_CLASSES] =
610 {
611 65.631440f, // Warrior
612 65.631440f, // Paladin
613 145.560408f, // Hunter
614 145.560408f, // Rogue
615 150.375940f, // Priest
616 65.631440f, // DK
617 145.560408f, // Shaman
618 150.375940f, // Mage
619 150.375940f, // Warlock
620 145.560408f, // Monk
621 116.890707f // Druid
622 };
623
624 float diminishing = 0.0f, nondiminishing = 0.0f;
625 GetDodgeFromAgility(diminishing, nondiminishing);
626 // Dodge from SPELL_AURA_MOD_DODGE_PERCENT aura
628 // Dodge from rating
630 // apply diminishing formula to diminishing dodge chance
631 uint32 pclass = getClass() - 1;
632 float value = nondiminishing + (diminishing * dodge_cap[pclass] / (diminishing + dodge_cap[pclass] * m_diminishing_k[pclass]));
633
635 value = value > sWorld->GetFloatConfig(WorldFloatConfigs::CONFIG_STATS_LIMITS_DODGE) ? sWorld->GetFloatConfig(WorldFloatConfigs::CONFIG_STATS_LIMITS_DODGE) : value;
636
637 value = value < 0.0f ? 0.0f : value;
639}
640
642{
643 // For normal school set zero crit chance
644 if (school == SPELL_SCHOOL_NORMAL)
645 {
647 return;
648 }
649 // For others recalculate it from:
650 float crit = 0.0f;
651 // Crit from Intellect
653 // Increase crit from SPELL_AURA_MOD_SPELL_CRIT_CHANCE
655 // Increase crit from SPELL_AURA_MOD_CRIT_PCT
657 // Increase crit from spell crit ratings
659
660 // Store crit value
662}
663
669
675
681
687
693
695{
697
698 Item* weapon = GetWeaponForAttack(attack, true);
699
701 for (AuraEffectList::const_iterator itr = expAuras.begin(); itr != expAuras.end(); ++itr)
702 {
703 // item neutral spell
704 if ((*itr)->GetSpellInfo()->EquippedItemClass == -1)
705 expertise += (*itr)->GetAmount();
706 // item dependent spell
707 else if (weapon && weapon->IsFitToSpellRequirements((*itr)->GetSpellInfo()))
708 expertise += (*itr)->GetAmount();
709 }
710
711 if (expertise < 0)
712 expertise = 0;
713
714 switch (attack)
715 {
719 default: break;
720 }
721}
722
723void Player::ApplyManaRegenBonus(int32 amount, bool apply)
724{
725 _ModifyUInt32(apply, m_baseManaRegen, amount);
727}
728
729void Player::ApplyHealthRegenBonus(int32 amount, bool apply)
730{
731 _ModifyUInt32(apply, m_baseHealthRegen, amount);
732}
733
735{
736 /* -- 5.4.8 PAPERDOLL
737 local base, casting = GetManaRegen();
738 --All mana regen stats are displayed as mana / 5 sec.
739 base = floor(base * 5.0);
740 casting = BreakUpLargeNumbers(floor(casting * 5.0));
741 text:SetText(casting);
742 statFrame.tooltip = HIGHLIGHT_FONT_COLOR_CODE ..MANA_REGEN_COMBAT ..FONT_COLOR_CODE_CLOSE;
743 statFrame.tooltip2 = format(MANA_COMBAT_REGEN_TOOLTIP, casting);
744 statFrame:Show();
745 */
746 // base regen since pandaria is 2% aka 6000 MP @90.
747 float base_regen = GetMaxPower(POWER_MANA) * 0.02f;
748 // Mana regen from spirit
749 float spirit_regen = OCTRegenMPPerSpirit();
750 // Apply PCT bonus from SPELL_AURA_MOD_POWER_REGEN_PERCENT aura on spirit base regen
752
753 //Apply FLAT bonus from SPELL_AURA_MOD_POWER_REGEN
755
756 // mp5
757 spirit_regen /= 5.0f;
758 base_regen /= 5.0f;
759
760 // Set regen rate in cast state apply only on spirit based regen
762
763
764 SetStatFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER, base_regen + CalculatePct(spirit_regen, modManaRegenInterrupt));
766}
767
769{
770 if (rune >= RuneType::NUM_RUNE_TYPES)
771 return;
772
773 uint32 cooldown = 0;
774
775 for (uint32 i = 0; i < MAX_RUNES; ++i)
776 if (GetBaseRune(i) == rune)
777 {
778 cooldown = GetRuneBaseCooldown(i);
779 break;
780 }
781
782 if (cooldown <= 0)
783 return;
784
785 float regen = float(1 * IN_MILLISECONDS) / float(cooldown);
787}
788
790{
791 for (uint8 i = 0; i < uint8(RuneType::NUM_RUNE_TYPES); ++i)
792 if (uint32 cooldown = GetRuneTypeBaseCooldown(RuneType(i)))
793 SetFloatValue(PLAYER_FIELD_RUNE_REGEN + i, float(1 * IN_MILLISECONDS) / float(cooldown));
794}
795
797{
798 SetCanModifyStats(false);
799
802
803 SetCanModifyStats(true);
804
806}
807
819
820/*#######################################
821######## ########
822######## MOBS STAT SYSTEM ########
823######## ########
824#######################################*/
825
827{
828 return true;
829}
830
832{
836
837 for (uint8 i = POWER_MANA; i < MAX_POWERS; ++i)
839
840 for (int8 i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i)
842
843 return true;
844}
845
847{
848 if (school > SPELL_SCHOOL_NORMAL)
849 {
851 SetResistance(SpellSchools(school), int32(value));
852 }
853 else
854 UpdateArmor();
855}
856
858{
860 SetArmor(int32(value));
861}
862
864{
866 SetMaxHealth((uint32)value);
867}
868
870{
872
873 float value = GetTotalAuraModValue(unitMod);
874 SetMaxPower(power, uint32(value));
875}
876
878{
880
883
884 if (ranged)
885 {
888 }
889
890 float base_attPower = GetModifierValue(unitMod, BASE_VALUE) * GetModifierValue(unitMod, BASE_PCT);
891 float attPowerMultiplier = GetModifierValue(unitMod, TOTAL_PCT) - 1.0f;
892
893 SetInt32Value(index, (uint32)base_attPower); //UNIT_FIELD_(RANGED)_ATTACK_POWER field
894 SetFloatValue(index_mult, attPowerMultiplier); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field
895
896 //automatically update weapon damage after attack power modification
897 if (ranged)
899 else
900 {
903 }
904}
905
907{
908 UnitMods unitMod;
909 switch (attType)
910 {
912 default:
913 unitMod = UNIT_MOD_DAMAGE_MAINHAND;
914 break;
916 unitMod = UNIT_MOD_DAMAGE_OFFHAND;
917 break;
919 unitMod = UNIT_MOD_DAMAGE_RANGED;
920 break;
921 }
922
923 //float att_speed = float(GetAttackTime(attType))/1000.0f;
924
925 float weapon_mindamage = GetWeaponDamageRange(attType, WeaponDamageRange::MINDAMAGE);
926 float weapon_maxdamage = GetWeaponDamageRange(attType, WeaponDamageRange::MAXDAMAGE);
927
928 /* difference in AP between current attack power and base value from DB */
929 float att_pwr_change = GetTotalAttackPowerValue(attType) - GetCreatureTemplate()->attackpower;
930 float base_value = GetModifierValue(unitMod, BASE_VALUE) + (att_pwr_change * GetAPMultiplier(attType, false) / 14.0f);
931 float base_pct = GetModifierValue(unitMod, BASE_PCT);
932 float total_value = GetModifierValue(unitMod, TOTAL_VALUE);
933 float total_pct = GetModifierValue(unitMod, TOTAL_PCT);
934 float dmg_multiplier = GetCreatureTemplate()->dmg_multiplier;
935
936 if (!CanUseAttackType(attType))
937 {
938 weapon_mindamage = 0;
939 weapon_maxdamage = 0;
940 }
941
942 float mindamage = ((base_value + weapon_mindamage) * dmg_multiplier * base_pct + total_value) * total_pct;
943 float maxdamage = ((base_value + weapon_maxdamage) * dmg_multiplier * base_pct + total_value) * total_pct;
944
945 switch (attType)
946 {
948 default:
951 break;
955 break;
959 break;
960 }
961}
962
963/*#######################################
964######## ########
965######## PETS STAT SYSTEM ########
966######## ########
967#######################################*/
968
969#define ENTRY_IMP 416
970#define ENTRY_VOIDWALKER 1860
971#define ENTRY_SUCCUBUS 1863
972#define ENTRY_FELHUNTER 417
973#define ENTRY_FELGUARD 17252
974#define ENTRY_WATER_ELEMENTAL 510
975#define ENTRY_TREANT 1964
976#define ENTRY_FIRE_ELEMENTAL 15438
977#define ENTRY_GHOUL 26125
978#define ENTRY_BLOODWORM 28017
979
981{
982 if (stat >= MAX_STATS)
983 return false;
984
985 // value = ((base_value * base_pct) + total_value) * total_pct
986 float value = GetTotalStatValue(stat);
987 ApplyStatBuffMod(stat, m_statFromOwner[stat], false);
988 float ownersBonus = 0.0f;
989
990 Unit* owner = GetOwner();
991
992 // Handle Death Knight Ghoul
993 if (IsPetGhoul() && (stat == STAT_STAMINA || stat == STAT_STRENGTH))
994 {
995 float mod = 0.75f;
996 if (stat == STAT_STAMINA)
997 mod = 0.3f; // Default Owner's Stamina scale
998 else
999 mod = 0.7f; // Default Owner's Strength scale
1000
1001 ownersBonus = float(owner->GetStat(stat)) * mod;
1002 value += ownersBonus;
1003 }
1004 else if (stat == STAT_STAMINA)
1005 {
1006 ownersBonus = CalculatePct(owner->GetStat(STAT_STAMINA), 30);
1007 value += ownersBonus;
1008 }
1009 else if (stat == STAT_INTELLECT) // warlock's and mage's pets gain 30% of owner's intellect
1010 {
1011 if (owner->getClass() == CLASS_WARLOCK || owner->getClass() == CLASS_MAGE)
1012 {
1013 ownersBonus = CalculatePct(owner->GetStat(stat), 30);
1014 value += ownersBonus;
1015 }
1016 }
1017
1018 /*
1019 else if (stat == STAT_STRENGTH)
1020 {
1021 if (IsPetGhoul())
1022 value += float(owner->GetStat(stat)) * 0.3f;
1023 }
1024 */
1025
1026 SetStat(stat, int32(value));
1027 m_statFromOwner[stat] = ownersBonus;
1028 ApplyStatBuffMod(stat, m_statFromOwner[stat], true);
1029
1030 switch (stat)
1031 {
1033 case STAT_AGILITY: UpdateArmor(); break;
1034 case STAT_STAMINA: UpdateMaxHealth(); break;
1036 case STAT_SPIRIT:
1037 default:
1038 break;
1039 }
1040
1041 return true;
1042}
1043
1045{
1046 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
1047 UpdateStats(Stats(i));
1048
1049 for (uint8 i = POWER_MANA; i < MAX_POWERS; ++i)
1051
1052 for (uint8 i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i)
1054
1055 return true;
1056}
1057
1059{
1060 if (school > SPELL_SCHOOL_NORMAL)
1061 {
1063
1064 // hunter and warlock pets gain 40% of owner's resistance
1065 if (IsPet())
1066 value += float(CalculatePct(m_owner->GetResistance(SpellSchools(school)), 40));
1067
1068 SetResistance(SpellSchools(school), int32(value));
1069 }
1070 else
1071 UpdateArmor();
1072}
1073
1075{
1076 float value = 0.0f;
1077 float bonus_armor = 0.0f;
1078 UnitMods unitMod = UNIT_MOD_ARMOR;
1079
1080 // hunter pets gain 35% of owner's armor value, warlock pets gain 100% of owner's armor
1081 if (IsHunterPet())
1082 bonus_armor = float(CalculatePct(m_owner->GetArmor(), 70));
1083 else if (IsPet())
1084 bonus_armor = m_owner->GetArmor();
1085
1086 value = GetModifierValue(unitMod, BASE_VALUE);
1087 value *= GetModifierValue(unitMod, BASE_PCT);
1088 value += GetModifierValue(unitMod, TOTAL_VALUE) + bonus_armor;
1089 value *= GetModifierValue(unitMod, TOTAL_PCT);
1090
1091 SetArmor(int32(value));
1092}
1093
1095{
1096 UnitMods unitMod = UNIT_MOD_HEALTH;
1097 float stamina = GetStat(STAT_STAMINA) - GetCreateStat(STAT_STAMINA);
1098
1099 float multiplicator;
1100 switch (GetEntry())
1101 {
1102 case ENTRY_IMP: multiplicator = 8.4f; break;
1103 case ENTRY_VOIDWALKER: multiplicator = 11.0f; break;
1104 case ENTRY_SUCCUBUS: multiplicator = 9.1f; break;
1105 case ENTRY_FELHUNTER: multiplicator = 9.5f; break;
1106 case ENTRY_FELGUARD: multiplicator = 11.0f; break;
1107 case ENTRY_BLOODWORM: multiplicator = 1.0f; break;
1108 default: multiplicator = 10.0f; break;
1109 }
1110
1111 float value = GetModifierValue(unitMod, BASE_VALUE) + GetCreateHealth();
1112 value *= GetModifierValue(unitMod, BASE_PCT);
1113 value += GetModifierValue(unitMod, TOTAL_VALUE) + stamina * multiplicator;
1114 value *= GetModifierValue(unitMod, TOTAL_PCT);
1115
1116 SetMaxHealth((uint32)value);
1117}
1118
1120{
1121 UnitMods unitMod = UnitMods(UNIT_MOD_POWER_START + UnitMods(power));
1122
1123 float addValue = (power == POWER_MANA) ? GetStat(STAT_INTELLECT) - GetCreateStat(STAT_INTELLECT) : 0.0f;
1124 float multiplicator = 15.0f;
1125
1126 switch (GetEntry())
1127 {
1128 case ENTRY_IMP: multiplicator = 4.95f; break;
1129 case ENTRY_VOIDWALKER:
1130 case ENTRY_SUCCUBUS:
1131 case ENTRY_FELHUNTER:
1132 case ENTRY_FELGUARD: multiplicator = 11.5f; break;
1133 default: multiplicator = 15.0f; break;
1134 }
1135
1136 float value = GetModifierValue(unitMod, BASE_VALUE) + GetCreatePowers(power);
1137 value *= GetModifierValue(unitMod, BASE_PCT);
1138 value += GetModifierValue(unitMod, TOTAL_VALUE) + addValue * multiplicator;
1139 value *= GetModifierValue(unitMod, TOTAL_PCT);
1140
1141 SetMaxPower(power, uint32(value));
1142}
1143
1145{
1146 if (ranged)
1147 return;
1148
1149 float val = 0.0f;
1150 float bonusAP = 0.0f;
1152
1153 if (GetEntry() == ENTRY_IMP) // imp's attack power
1154 val = GetStat(STAT_STRENGTH) - 10.0f;
1155 else
1156 val = 2 * GetStat(STAT_STRENGTH) - 20.0f;
1157
1158 Unit* owner = GetOwner();
1159 if (owner && owner->GetTypeId() == TypeID::TYPEID_PLAYER)
1160 {
1161 if (IsHunterPet()) //hunter pets benefit from owner's attack power
1162 {
1163 float mod = 1.0f; //Hunter contribution modifier
1164 bonusAP = owner->GetTotalAttackPowerValue(WeaponAttackType::RANGED_ATTACK) * 0.22f * mod;
1166 }
1167 else if (IsPetGhoul()) //ghouls benefit from deathknight's attack power (may be summon pet or not)
1168 {
1171 }
1172 else if (IsSpiritWolf()) //wolf benefit from shaman's attack power
1173 {
1174 float dmg_multiplier = 0.31f;
1175 if (m_owner->GetAuraEffect(63271, 0)) // Glyph of Feral Spirit
1176 dmg_multiplier = 0.61f;
1177 bonusAP = owner->GetTotalAttackPowerValue(WeaponAttackType::BASE_ATTACK) * dmg_multiplier;
1179 }
1180 else if (IsWhiteTiger())
1181 {
1184 }
1185 //demons benefit from warlocks shadow or fire damage
1186 else if (IsPet())
1187 {
1190 int32 maximum = (fire > shadow) ? fire : shadow;
1191 if (maximum < 0)
1192 maximum = 0;
1193 SetBonusDamage(int32(maximum * 0.15f));
1194 bonusAP = maximum * 0.57f;
1195 }
1196 //water elementals benefit from mage's frost damage
1197 else if (GetEntry() == ENTRY_WATER_ELEMENTAL)
1198 {
1200 if (frost < 0)
1201 frost = 0;
1202 SetBonusDamage(int32(frost * 0.4f));
1203 }
1204 }
1205
1207
1208 //in BASE_VALUE of UNIT_MOD_ATTACK_POWER for creatures we store data of meleeattackpower field in DB
1209 float base_attPower = GetModifierValue(unitMod, BASE_VALUE) * GetModifierValue(unitMod, BASE_PCT);
1210 float attPowerMultiplier = GetModifierValue(unitMod, TOTAL_PCT) - 1.0f;
1211
1212 //UNIT_FIELD_(RANGED)_ATTACK_POWER field
1214 //UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field
1216
1217 //automatically update weapon damage after attack power modification
1219}
1220
1222{
1223 if (attType > WeaponAttackType::BASE_ATTACK)
1224 return;
1225
1226 float bonusDamage = 0.0f;
1227 if (m_owner->GetTypeId() == TypeID::TYPEID_PLAYER)
1228 {
1229 //force of nature
1230 if (GetEntry() == ENTRY_TREANT)
1231 {
1233 if (spellDmg > 0)
1234 bonusDamage = spellDmg * 0.09f;
1235 }
1236 //greater fire elemental
1237 else if (GetEntry() == ENTRY_FIRE_ELEMENTAL)
1238 {
1240 if (spellDmg > 0)
1241 bonusDamage = spellDmg * 0.4f;
1242 }
1243 }
1244
1246
1247 float att_speed = float(GetAttackTime(WeaponAttackType::BASE_ATTACK)) / 1000.0f;
1248
1249 float base_value = GetModifierValue(unitMod, BASE_VALUE) + GetTotalAttackPowerValue(attType) / 14.0f * att_speed + bonusDamage;
1250 float base_pct = GetModifierValue(unitMod, BASE_PCT);
1251 float total_value = GetModifierValue(unitMod, TOTAL_VALUE);
1252 float total_pct = GetModifierValue(unitMod, TOTAL_PCT);
1253
1256
1257 float mindamage = ((base_value + weapon_mindamage) * base_pct + total_value) * total_pct;
1258 float maxdamage = ((base_value + weapon_maxdamage) * base_pct + total_value) * total_pct;
1259
1261 for (Unit::AuraEffectList::const_iterator itr = mDummy.begin(); itr != mDummy.end(); ++itr)
1262 {
1263 switch ((*itr)->GetSpellInfo()->Id)
1264 {
1265 case 61682:
1266 case 61683:
1267 AddPct(mindamage, -(*itr)->GetAmount());
1268 AddPct(maxdamage, -(*itr)->GetAmount());
1269 break;
1270 default:
1271 break;
1272 }
1273 }
1274
1277}
1278
@ IN_MILLISECONDS
Definition Common.h:125
DBCStorage< SpellShapeshiftFormEntry > sSpellShapeshiftFormStore(SpellShapeshiftFormfmt)
DBCStorage< gtOCTHpPerStaminaEntry > sGtOCTHpPerStaminaStore(GtOCTHpPerStaminafmt)
DBCStorage< ChrClassesEntry > sChrClassesStore(ChrClassesEntryfmt)
std::int32_t int32
Definition Define.h:73
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
std::int8_t int8
Definition Define.h:75
std::uint16_t uint16
Definition Define.h:78
@ TYPEID_PLAYER
Definition Object.h:55
RuneType
Definition Player.h:485
@ NUM_RUNE_TYPES
Definition Player.h:490
#define MAX_RUNES
Definition Player.h:476
@ SPEC_DRUID_BALANCE
@ SPEC_DRUID_RESTORATION
@ SPEC_SHAMAN_ELEMENTAL
@ SPEC_SHAMAN_RESTORATION
@ SPEC_PALADIN_HOLY
#define MAX_STATS
Powers
@ MAX_POWERS
@ POWER_MANA
SpellSchools
@ SPELL_SCHOOL_SHADOW
@ SPELL_SCHOOL_NORMAL
@ SPELL_SCHOOL_NATURE
@ SPELL_SCHOOL_FROST
@ SPELL_SCHOOL_FIRE
@ SPELL_SCHOOL_HOLY
@ CLASS_WARLOCK
@ CLASS_MAGE
#define MAX_CLASSES
Stats
@ STAT_SPIRIT
@ STAT_INTELLECT
@ STAT_AGILITY
@ STAT_STRENGTH
@ STAT_STAMINA
#define MAX_SPELL_SCHOOL
SpellSchoolMask
@ SPELL_SCHOOL_MASK_ALL
@ SPELL_AURA_MOD_ATTACKSPEED
@ SPELL_AURA_MOD_PARRY_PERCENT
@ SPELL_AURA_MOD_RATING_FROM_STAT
@ SPELL_AURA_MOD_SPELL_HIT_CHANCE
@ SPELL_AURA_MOD_EXPERTISE
@ SPELL_AURA_MOD_POWER_REGEN
@ SPELL_AURA_OVERRIDE_AP_BY_SPELL_POWER_PCT
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE
@ SPELL_AURA_MOD_RATING
@ SPELL_AURA_MOD_HIT_CHANCE
@ SPELL_AURA_MOD_DODGE_PERCENT
@ SPELL_AURA_MOD_MANA_REGEN_INTERRUPT
@ SPELL_AURA_MASTERY
@ SPELL_AURA_MOD_CRIT_PCT
@ SPELL_AURA_OVERRIDE_SPELL_POWER_BY_AP_PCT
@ SPELL_AURA_MOD_POWER_REGEN_PERCENT
@ SPELL_AURA_MOD_DAMAGE_DONE
@ SPELL_AURA_MOD_BLOCK_PERCENT
#define ENTRY_FELGUARD
#define ENTRY_FIRE_ELEMENTAL
#define ENTRY_BLOODWORM
#define ENTRY_VOIDWALKER
#define ENTRY_FELHUNTER
const float m_diminishing_k[MAX_CLASSES]
#define ENTRY_TREANT
bool _ModifyUInt32(bool apply, uint32 &baseValue, int32 &amount)
#define ENTRY_WATER_ELEMENTAL
#define ENTRY_SUCCUBUS
#define ENTRY_IMP
@ PCT_MOD
Definition Unit.h:497
WeaponAttackType
Definition Unit.h:572
UnitMods
Definition Unit.h:439
@ UNIT_MOD_DAMAGE_OFFHAND
Definition Unit.h:473
@ UNIT_MOD_ARMOR
Definition Unit.h:463
@ UNIT_MOD_ATTACK_POWER
Definition Unit.h:470
@ UNIT_MOD_RESISTANCE_START
Definition Unit.h:479
@ UNIT_MOD_HEALTH
Definition Unit.h:445
@ UNIT_MOD_DAMAGE_RANGED
Definition Unit.h:474
@ UNIT_MOD_POWER_START
Definition Unit.h:481
@ UNIT_MOD_DAMAGE_MAINHAND
Definition Unit.h:472
@ UNIT_MOD_ATTACK_POWER_RANGED
Definition Unit.h:471
#define BASE_ATTACK_TIME
Definition Unit.h:157
#define MAX_COMBAT_RATING
Definition Unit.h:610
BaseModGroup
Definition Unit.h:486
@ OFFHAND_CRIT_PERCENTAGE
Definition Unit.h:489
@ CRIT_PERCENTAGE
Definition Unit.h:487
@ RANGED_CRIT_PERCENTAGE
Definition Unit.h:488
@ BASE_VALUE
Definition Unit.h:384
@ TOTAL_VALUE
Definition Unit.h:386
@ TOTAL_PCT
Definition Unit.h:387
@ BASE_PCT
Definition Unit.h:385
CombatRating
Definition Unit.h:580
@ CR_CRIT_SPELL
Definition Unit.h:591
@ CR_ARMOR_PENETRATION
Definition Unit.h:605
@ CR_PVP_POWER
Definition Unit.h:607
@ CR_EXPERTISE
Definition Unit.h:604
@ CR_HIT_MELEE
Definition Unit.h:586
@ CR_HIT_SPELL
Definition Unit.h:588
@ CR_HIT_RANGED
Definition Unit.h:587
@ CR_CRIT_MELEE
Definition Unit.h:589
@ CR_CRIT_RANGED
Definition Unit.h:590
@ CR_MASTERY
Definition Unit.h:606
@ FORM_CAT
Definition Unit.h:208
@ FORM_BEAR
Definition Unit.h:212
#define BASE_MAXDAMAGE
Definition Unit.h:156
#define BASE_MINDAMAGE
Definition Unit.h:155
@ UNIT_FIELD_RANGED_ATTACK_POWER
@ UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER
@ UNIT_FIELD_RANGED_ATTACK_POWER_MOD_POS
@ UNIT_FIELD_MAX_RANGED_DAMAGE
@ UNIT_FIELD_ATTACK_POWER_MOD_POS
@ UNIT_FIELD_ATTACK_POWER_MULTIPLIER
@ UNIT_FIELD_ATTACK_POWER
@ UNIT_FIELD_MIN_DAMAGE
@ UNIT_FIELD_MAX_OFF_HAND_DAMAGE
@ UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER
@ UNIT_FIELD_MIN_RANGED_DAMAGE
@ UNIT_FIELD_MIN_OFF_HAND_DAMAGE
@ UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER
@ UNIT_FIELD_MAX_DAMAGE
EPlayerFields
@ PLAYER_FIELD_OFFHAND_CRIT_PERCENTAGE
@ PLAYER_FIELD_MOD_DAMAGE_DONE_POS
@ PLAYER_FIELD_PVP_POWER_HEALING
@ PLAYER_FIELD_OVERRIDE_APBY_SPELL_POWER_PERCENT
@ PLAYER_FIELD_DODGE_PERCENTAGE
@ PLAYER_FIELD_OFFHAND_EXPERTISE
@ PLAYER_FIELD_PET_SPELL_POWER
@ PLAYER_FIELD_MOD_TARGET_RESISTANCE
@ PLAYER_FIELD_RANGED_CRIT_PERCENTAGE
@ PLAYER_FIELD_PARRY_PERCENTAGE
@ PLAYER_FIELD_COMBAT_RATINGS
@ PLAYER_FIELD_MASTERY
@ PLAYER_FIELD_RUNE_REGEN
@ PLAYER_FIELD_PVP_POWER_DAMAGE
@ PLAYER_FIELD_RANGED_EXPERTISE
@ PLAYER_FIELD_CRIT_PERCENTAGE
@ PLAYER_FIELD_MOD_HEALING_DONE_POS
@ PLAYER_FIELD_SPELL_CRIT_PERCENTAGE
@ PLAYER_FIELD_BLOCK_PERCENTAGE
@ PLAYER_FIELD_MAINHAND_EXPERTISE
@ PLAYER_FIELD_MOD_DAMAGE_DONE_NEG
T AddPct(T &base, U pct)
Definition Util.h:109
T CalculatePct(T base, U pct)
Definition Util.h:103
bool UpdateAllStats() OVERRIDE
void UpdateMaxHealth() OVERRIDE
void UpdateDamagePhysical(WeaponAttackType attType) OVERRIDE
void UpdateMaxPower(Powers power) OVERRIDE
CreatureTemplate const * GetCreatureTemplate() const
Definition Creature.h:524
bool UpdateStats(Stats stat) OVERRIDE
void UpdateResistances(uint32 school) OVERRIDE
void UpdateAttackPowerAndDamage(bool ranged=false) OVERRIDE
void UpdateArmor() OVERRIDE
void UpdateMaxPower(Powers power) OVERRIDE
bool UpdateStats(Stats stat) OVERRIDE
bool UpdateAllStats() OVERRIDE
void SetBonusDamage(int32 damage)
int32 m_bonusSpellDamage
void UpdateArmor() OVERRIDE
float m_statFromOwner[MAX_STATS]
void UpdateMaxHealth() OVERRIDE
void UpdateResistances(uint32 school) OVERRIDE
void UpdateDamagePhysical(WeaponAttackType attType) OVERRIDE
void UpdateAttackPowerAndDamage(bool ranged=false) OVERRIDE
Definition Item.h:202
bool IsFitToSpellRequirements(SpellInfo const *spellInfo) const
Definition Item.cpp:820
Unit * GetOwner() const
bool IsSpiritWolf() const
Unit *const m_owner
bool IsWhiteTiger() const
bool IsPetGhoul() const
int32 GetInt32Value(uint16 index) const
Definition Object.cpp:319
void SetInt32Value(uint16 index, int32 value)
Definition Object.cpp:1021
uint32 GetUInt32Value(uint16 index) const
Definition Object.cpp:325
void ApplyModInt32Value(uint16 index, int32 val, bool apply)
Definition Object.cpp:1231
TypeID GetTypeId() const
Definition Object.h:131
void ApplyModUInt32Value(uint16 index, int32 val, bool apply)
Definition Object.cpp:1222
float GetFloatValue(uint16 index) const
Definition Object.cpp:337
uint32 GetEntry() const
Definition Object.h:125
void SetFloatValue(uint16 index, float value)
Definition Object.cpp:1141
void SetStatFloatValue(uint16 index, float value)
Definition Object.cpp:1206
void SetUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:1038
void SetStatInt32Value(uint16 index, int32 value)
Definition Object.cpp:1214
Definition Pet.h:28
void UpdateParryPercentage()
void UpdateMastery()
void UpdateAllSpellCritChances()
void UpdateArmorPenetration(int32 amount)
float GetMeleeCritFromAgility()
Definition Player.cpp:5820
void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float &min_damage, float &max_damage)
void UpdateRuneRegen(RuneType rune)
void UpdateDamagePhysical(WeaponAttackType attType) override
float GetHealthBonusFromStamina()
void UpdateDodgePercentage()
float GetTotalPercentageModValue(BaseModGroup modGroup) const
Definition Player.h:2637
void UpdateMaxPower(Powers power) override
bool CanParry() const
Definition Player.h:2611
void ApplyRatingMod(CombatRating cr, int32 value, bool apply)
Definition Player.cpp:5966
void UpdateCritPercentage(WeaponAttackType attType)
uint32 GetTalentSpecialization(uint8 spec) const
Definition Player.h:2075
float GetRatingBonusValue(CombatRating cr) const
Definition Player.cpp:5924
void SetBaseModValue(BaseModGroup modGroup, BaseModType modType, float value)
Definition Player.h:2630
bool CanBlock() const
Definition Player.h:2613
void GetDodgeFromAgility(float &diminishing, float &nondiminishing)
Definition Player.cpp:5836
void UpdateBlockPercentage()
void ApplySpellPenetrationBonus(int32 amount, bool apply)
float GetManaSpecializationMultiplier()
void UpdateArmor() override
void UpdatePvpPower()
void UpdateManaRegen()
void RecalculateRating(CombatRating cr)
Definition Player.h:2352
Pet * GetPet() const
Definition Player.cpp:15640
bool UpdateStats(Stats stat) override
void _RemoveAllItemMods()
Definition Player.cpp:9171
void _ApplyAllItemMods()
Definition Player.cpp:9216
void UpdateSpellHitChances()
void UpdateExpertise(WeaponAttackType attType)
void _ApplyAllStatBonuses()
void ApplyManaRegenBonus(int32 amount, bool apply)
void UpdateResistances(uint32 school) override
void UpdateSpellDamageAndHealingBonus()
uint32 m_baseSpellPower
Definition Player.h:3414
void UpdateMaxHealth() override
void UpdateMeleeHitChances()
float GetSpellCritFromIntellect()
Definition Player.cpp:5892
void UpdateAllRunesRegen()
uint8 GetActiveSpec() const
Definition Player.h:2077
uint32 m_baseHealthRegen
Definition Player.h:3416
void UpdateRangedHitChances()
uint32 m_baseManaRegen
Definition Player.h:3415
void UpdateAllRatings()
Definition Player.cpp:6088
void ApplySpellPowerBonus(int32 amount, bool apply)
void UpdateAllCritPercentages()
uint32 GetRuneBaseCooldown(uint8 index) const
Definition Player.h:3069
bool UpdateAllStats() override
Item * GetWeaponForAttack(WeaponAttackType attackType, bool useable=false) const
void UpdateTalentSpecializationManaBonus()
void _RemoveAllStatBonuses()
int32 m_spellPenetrationItemMod
Definition Player.h:3417
void ApplyHealthRegenBonus(int32 amount, bool apply)
float OCTRegenMPPerSpirit()
Definition Player.cpp:5948
RuneType GetBaseRune(uint8 index) const
Definition Player.h:3057
void UpdateAttackPowerAndDamage(bool ranged=false) override
uint32 GetRuneTypeBaseCooldown(RuneType runeType) const
Definition Player.cpp:20513
void UpdateSpellCritChance(uint32 school)
Definition Unit.h:1367
bool IsHunterPet() const
Definition Unit.h:1515
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
Definition Unit.h:2243
void SetStat(Stats stat, int32 val)
Definition Unit.h:1577
float GetTotalAuraModValue(UnitMods unitMod) const
float GetTotalStatValue(Stats stat) const
Definition Unit.cpp:5041
void ApplyStatBuffMod(Stats stat, float val, bool apply)
Definition Unit.cpp:1597
ShapeshiftForm GetShapeshiftForm() const
Definition Unit.h:2377
bool haveOffhandWeapon() const
Definition Unit.cpp:350
bool IsPet() const
Definition Unit.h:1511
float GetTotalAuraMultiplierByMiscValue(AuraType auratype, int32 misc_value) const
bool CanDualWield() const
Definition Unit.h:1437
uint8 getClass() const
Definition Unit.h:1543
float m_modRangedHitChance
Definition Unit.h:2388
int32 GetMaxPower(Powers power) const
Definition Unit.cpp:5246
uint16 GetMaxSkillValueForLevel(Unit const *target=NULL) const
Definition Unit.h:1757
void _ApplyAllAuraStatMods()
bool CanUseAttackType(WeaponAttackType attacktype) const
Definition Unit.cpp:744
void SetResistance(SpellSchools school, int32 val)
Definition Unit.h:1595
float GetModifierValue(UnitMods unitMod, UnitModifierType modifierType) const
Definition Unit.cpp:5027
float GetWeaponDamageRange(WeaponAttackType attType, WeaponDamageRange type) const
Definition Unit.cpp:5136
uint32 GetCreateHealth() const
Definition Unit.h:2321
bool HasAuraType(AuraType auraType) const
float m_modMeleeHitChance
Definition Unit.h:2387
void _RemoveAllAuraStatMods()
uint32 GetAttackTime(WeaponAttackType att) const
Definition Unit.cpp:4122
int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask) const
Definition Unit.cpp:3365
float GetAPMultiplier(WeaponAttackType attType, bool normalized)
float GetCreateStat(Stats stat) const
Definition Unit.h:2343
void SetArmor(int32 val)
Definition Unit.h:1585
void SetModifierValue(UnitMods unitMod, UnitModifierType modifierType, float value)
Definition Unit.h:2400
bool IsInFeralForm() const
Definition Unit.cpp:4936
int32 GetCreatePowers(Powers power) const
Definition Unit.cpp:5359
void SetCanModifyStats(bool modifyStats)
Definition Unit.h:2414
int32 GetTotalAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
float GetStat(Stats stat) const
Definition Unit.h:1573
void SetMaxPower(Powers power, int32 val)
Definition Unit.cpp:5317
Powers getPowerType() const
Definition Unit.h:1651
void SetMaxHealth(uint32 val)
Definition Unit.cpp:5206
int32 GetTotalAuraModifier(AuraType auratype) const
uint8 getLevel() const
Definition Unit.h:1528
std::list< AuraEffect * > AuraEffectList
Definition Unit.h:1383
float m_modSpellHitChance
Definition Unit.h:2389
Guardian * GetGuardianPet() const
Definition Unit.cpp:2390
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask) const
Definition Unit.cpp:3055
float GetTotalAttackPowerValue(WeaponAttackType attType) const
Definition Unit.cpp:5118
#define sWorld
Definition World.h:910
@ CONFIG_STATS_LIMITS_ENABLE
Definition World.h:164
@ CONFIG_STATS_LIMITS_PARRY
Definition World.h:191
@ CONFIG_STATS_LIMITS_DODGE
Definition World.h:190
@ CONFIG_STATS_LIMITS_CRIT
Definition World.h:193
@ CONFIG_STATS_LIMITS_BLOCK
Definition World.h:192
uint32 RAPPerAgility
uint32 APPerAgility
uint32 APPerStrenth
float dmg_multiplier
Definition Creature.h:90
uint32 attackpower
Definition Creature.h:89
uint32 flags1