64 if (spellProto->
Id == 12721)
70 return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype);
73 float DoneTotalMod = 1.0f;
74 float ApCoeffMod = 1.0f;
85 for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
87 if (spellProto->
EquippedItemClass == -1 && (*i)->GetSpellInfo()->EquippedItemClass != -1)
92 if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
93 AddPct(DoneTotalMod, (*i)->GetAmount());
95 AddPct(DoneTotalMod, (*i)->GetAmount());
96 else if (
ToPlayer() &&
ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
97 AddPct(DoneTotalMod, (*i)->GetAmount());
106 for (AuraEffectList::const_iterator i = mDamageDoneVersus.begin(); i != mDamageDoneVersus.end(); ++i)
107 if (creatureTypeMask &
uint32((*i)->GetMiscValue()))
108 AddPct(DoneTotalMod, (*i)->GetAmount());
112 for (AuraEffectList::const_iterator i = mDamageDoneVersusAurastate.begin(); i != mDamageDoneVersusAurastate.end(); ++i)
114 AddPct(DoneTotalMod, (*i)->GetAmount());
122 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
124 if (!(*i)->IsAffectingSpell(spellProto))
127 switch ((*i)->GetMiscValue())
132 AddPct(DoneTotalMod, (*i)->GetAmount());
145 DoneTotalMod *= 2.0f;
153 for (AuraEffectList::const_iterator i = mDumyAuras.begin(); i != mDumyAuras.end(); ++i)
155 if ((*i)->GetSpellInfo()->SpellIconID == 2215)
157 AddPct(DoneTotalMod, (*i)->GetAmount());
171 AddPct(DoneTotalMod, aurEff->GetAmount());
180 for (AuraEffectList::const_iterator i = mDumyAuras.begin(); i != mDumyAuras.end(); ++i)
181 if ((*i)->GetSpellInfo()->SpellIconID == 3173)
183 AddPct(DoneTotalMod, (*i)->GetAmount());
194 AddPct(DoneTotalMod, 30 * count);
203 DoneAdvertisedBenefit += ((
Guardian*)
this)->GetBonusDamage();
210 if (damagetype ==
DOT)
229 DoneTotal +=
int32(bonus->
ap_bonus * stack * ApCoeffMod * APbonus);
234 if (DoneAdvertisedBenefit)
236 if (!bonus || coeff < 0)
247 DoneTotal +=
int32(DoneAdvertisedBenefit * coeff * factorMod);
250 float tmpDamage = (
int32(pdamage) + DoneTotal) * DoneTotalMod;
255 return uint32(std::max(tmpDamage, 0.0f));
263 int32 TakenTotal = 0;
264 float TakenTotalMod = 1.0f;
265 float TakenTotalCasterMod = 0.0f;
269 for (AuraEffectList::const_iterator i = IgnoreResistAuras.begin(); i != IgnoreResistAuras.end(); ++i)
272 TakenTotalCasterMod += (float((*i)->GetAmount()));
281 for (AuraEffectList::const_iterator i = mDummyAuras.begin(); i != mDummyAuras.end(); ++i)
283 switch ((*i)->GetSpellInfo()->SpellIconID)
291 AddPct(TakenTotalMod, (*i)->GetAmount());
299 for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i)
300 if ((*i)->GetCasterGUID() == caster->
GetGUID() && (*i)->IsAffectingSpell(spellProto))
301 AddPct(TakenTotalMod, (*i)->GetAmount());
307 for (AuraEffectList::const_iterator i = mDamageDoneMechanic.begin(); i != mDamageDoneMechanic.end(); ++i)
308 if (mechanicMask &
uint32(1 << ((*i)->GetMiscValue())))
309 AddPct(TakenTotalMod, (*i)->GetAmount());
321 if (TakenAdvertisedBenefit)
323 if (!bonus || coeff < 0)
334 TakenTotal +=
int32(TakenAdvertisedBenefit * coeff * factorMod);
337 float tmpDamage = 0.0f;
339 if (TakenTotalCasterMod)
343 if (TakenTotalMod < 1)
344 tmpDamage = ((float(
CalculatePct(pdamage, TakenTotalCasterMod) + TakenTotal) * TakenTotalMod) +
CalculatePct(pdamage, TakenTotalCasterMod));
346 tmpDamage = ((float(
CalculatePct(pdamage, TakenTotalCasterMod) + TakenTotal) +
CalculatePct(pdamage, TakenTotalCasterMod)) * TakenTotalMod);
348 else if (TakenTotalMod < 1)
349 tmpDamage = ((
CalculatePct(
float(pdamage) + TakenTotal, TakenTotalCasterMod) * TakenTotalMod) +
CalculatePct(
float(pdamage) + TakenTotal, TakenTotalCasterMod));
352 tmpDamage = (float(pdamage) + TakenTotal) * TakenTotalMod;
354 return uint32(std::max(tmpDamage, 0.0f));
362 return owner->SpellHealingBonusDone(victim, spellProto, healamount, damagetype, stack);
368 float DoneTotalMod = 1.0f;
373 for (AuraEffectList::const_iterator i = mHealingDonePct.begin(); i != mHealingDonePct.end(); ++i)
374 AddPct(DoneTotalMod, (*i)->GetAmount());
379 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
381 if (!(*i)->IsAffectingSpell(spellProto))
383 switch ((*i)->GetMiscValue())
387 int32 stepPercent = (*i)->GetAmount();
388 int32 modPercent = 0;
390 for (AuraApplicationMap::const_iterator itr = victimAuras.begin(); itr != victimAuras.end(); ++itr)
392 Aura const* aura = itr->second->GetBase();
401 AddPct(DoneTotalMod, modPercent);
415 float factorMod = 1.0f;
418 if (damagetype ==
DOT)
441 if (DoneAdvertisedBenefit)
443 if (!bonus || coeff < 0)
455 DoneTotal +=
int32(DoneAdvertisedBenefit * coeff * factorMod);
473 float heal = float(
int32(healamount) + DoneTotal) * DoneTotalMod;
478 return uint32(std::max(heal, 0.0f));
483 float TakenTotalMod = 1.0f;
488 AddPct(TakenTotalMod, minval);
492 AddPct(TakenTotalMod, maxval);
496 AddPct(TakenTotalMod, Tenacity->GetAmount());
499 int32 TakenTotal = 0;
510 TakenTotalMod *= 1.2f;
516 float factorMod = 1.0f;
524 healamount =
uint32(std::max((
float(healamount) * TakenTotalMod), 0.0f));
530 if (TakenAdvertisedBenefit)
532 if (!bonus || coeff < 0)
543 TakenTotal +=
int32(TakenAdvertisedBenefit * coeff * factorMod);
546 if (damagetype ==
DOT)
551 TakenTotalMod *= (100.0f + val_hot) / 100.0f;
555 for (AuraEffectList::const_iterator i = mHealingGet.begin(); i != mHealingGet.end(); ++i)
556 if (caster->
GetGUID() == (*i)->GetCasterGUID() && (*i)->IsAffectingSpell(spellProto))
557 AddPct(TakenTotalMod, (*i)->GetAmount());
573 float heal = float(
int32(healamount) + TakenTotal) * TakenTotalMod;
575 return uint32(std::max(heal, 0.0f));
580 if (!victim || pdamage == 0)
586 int32 DoneFlatBenefit = 0;
590 for (AuraEffectList::const_iterator i = mDamageDoneCreature.begin(); i != mDamageDoneCreature.end(); ++i)
591 if (creatureTypeMask &
uint32((*i)->GetMiscValue()))
592 DoneFlatBenefit += (*i)->GetAmount();
606 for (AuraEffectList::const_iterator i = mCreatureAttackPower.begin(); i != mCreatureAttackPower.end(); ++i)
607 if (creatureTypeMask &
uint32((*i)->GetMiscValue()))
608 APbonus += (*i)->GetAmount();
616 for (AuraEffectList::const_iterator i = mCreatureAttackPower.begin(); i != mCreatureAttackPower.end(); ++i)
617 if (creatureTypeMask &
uint32((*i)->GetMiscValue()))
618 APbonus += (*i)->GetAmount();
623 bool normalized =
false;
635 float DoneTotalMod = 1.0f;
642 for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
646 if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
647 AddPct(DoneTotalMod, (*i)->GetAmount());
649 AddPct(DoneTotalMod, (*i)->GetAmount());
650 else if (
ToPlayer() &&
ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
651 AddPct(DoneTotalMod, (*i)->GetAmount());
657 for (AuraEffectList::const_iterator i = mDamageDoneVersus.begin(); i != mDamageDoneVersus.end(); ++i)
658 if (creatureTypeMask &
uint32((*i)->GetMiscValue()))
659 AddPct(DoneTotalMod, (*i)->GetAmount());
663 for (AuraEffectList::const_iterator i = mDamageDoneVersusAurastate.begin(); i != mDamageDoneVersusAurastate.end(); ++i)
665 AddPct(DoneTotalMod, (*i)->GetAmount());
671 float tmpDamage = float(
int32(pdamage) + DoneFlatBenefit) * DoneTotalMod;
679 return uint32(std::max(tmpDamage, 0.0f));
687 int32 TakenFlatBenefit = 0;
688 float TakenTotalCasterMod = 0.0f;
693 for (AuraEffectList::const_iterator i = IgnoreResistAuras.begin(); i != IgnoreResistAuras.end(); ++i)
695 if ((*i)->GetMiscValue() & attackSchoolMask)
696 TakenTotalCasterMod += (float((*i)->GetAmount()));
701 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
703 TakenFlatBenefit += (*i)->GetAmount();
711 float TakenTotalMod = 1.0f;
721 for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i)
722 if ((*i)->GetCasterGUID() == attacker->
GetGUID() && (*i)->IsAffectingSpell(spellProto))
723 AddPct(TakenTotalMod, (*i)->GetAmount());
735 for (AuraEffectList::const_iterator i = mDamageDoneMechanic.begin(); i != mDamageDoneMechanic.end(); ++i)
736 if (mechanicMask &
uint32(1 << ((*i)->GetMiscValue())))
737 AddPct(TakenTotalMod, (*i)->GetAmount());
743 for (AuraEffectList::const_iterator i = mDummyAuras.begin(); i != mDummyAuras.end(); ++i)
745 switch ((*i)->GetSpellInfo()->SpellIconID)
754 AddPct(TakenTotalMod, std::max(mod,
float((*i)->GetAmount())));
763 for (AuraEffectList::const_iterator i = mModMeleeDamageTakenPercent.begin(); i != mModMeleeDamageTakenPercent.end(); ++i)
764 AddPct(TakenTotalMod, (*i)->GetAmount());
769 for (AuraEffectList::const_iterator i = mModRangedDamageTakenPercent.begin(); i != mModRangedDamageTakenPercent.end(); ++i)
770 AddPct(TakenTotalMod, (*i)->GetAmount());
773 float tmpDamage = 0.0f;
775 if (TakenTotalCasterMod)
777 if (TakenFlatBenefit < 0)
779 if (TakenTotalMod < 1)
780 tmpDamage = ((float(
CalculatePct(pdamage, TakenTotalCasterMod) + TakenFlatBenefit) * TakenTotalMod) +
CalculatePct(pdamage, TakenTotalCasterMod));
782 tmpDamage = ((float(
CalculatePct(pdamage, TakenTotalCasterMod) + TakenFlatBenefit) +
CalculatePct(pdamage, TakenTotalCasterMod)) * TakenTotalMod);
784 else if (TakenTotalMod < 1)
785 tmpDamage = ((
CalculatePct(
float(pdamage) + TakenFlatBenefit, TakenTotalCasterMod) * TakenTotalMod) +
CalculatePct(
float(pdamage) + TakenFlatBenefit, TakenTotalCasterMod));
788 tmpDamage = (float(pdamage) + TakenFlatBenefit) * TakenTotalMod;
791 return uint32(std::max(tmpDamage, 0.0f));
#define MAX_SPELL_EFFECTS
@ ITEM_SUBCLASS_WEAPON_DAGGER
@ SPELL_EFFECT_HEALTH_LEECH
@ SPELL_EFFECT_NORMALIZED_WEAPON_DMG
@ SPELL_DAMAGE_CLASS_NONE
@ SPELL_DAMAGE_CLASS_MELEE
@ SPELL_ATTR6_NO_DONE_PCT_DAMAGE_MODS
@ SPELL_ATTR3_NO_DONE_BONUS
@ SPELL_ATTR5_SPECIAL_ITEM_CLASS_CHECK
@ SPELL_SCHOOL_MASK_NORMAL
@ SPELL_SCHOOL_MASK_ARCANE
@ SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS
@ SPELL_AURA_PERIODIC_DAMAGE
@ SPELL_AURA_MOD_IGNORE_TARGET_RESIST
@ SPELL_AURA_MOD_DAMAGE_DONE_VERSUS
@ SPELL_AURA_PERIODIC_HEALTH_FUNNEL
@ SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS
@ SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN
@ SPELL_AURA_MOD_HEALING_DONE_PERCENT
@ SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS
@ SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS
@ SPELL_AURA_PERIODIC_HEAL
@ SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
@ SPELL_AURA_MOD_HEALING_RECEIVED
@ SPELL_AURA_MOD_HEALING_PCT
@ SPELL_AURA_MOD_DAMAGE_PERCENT_DONE
@ SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN
@ SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT
@ SPELL_AURA_MOD_DAMAGE_TAKEN
@ SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE
@ SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS
@ SPELL_AURA_MOD_DAMAGE_DONE_FOR_MECHANIC
@ SPELL_AURA_MOD_DAMAGE_DONE_CREATURE
@ SPELL_AURA_PERIODIC_LEECH
@ SPELL_AURA_MOD_DAMAGE_FROM_CASTER
@ SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT
@ SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT
@ SPELL_AURA_OVERRIDE_CLASS_SCRIPTS
@ SPELLMOD_BONUS_MULTIPLIER
@ CR_RESILIENCE_PLAYER_DAMAGE_TAKEN
T CalculatePct(T base, U pct)
uint64 GetCasterGUID() const
uint8 GetStackAmount() const
SpellInfo const * GetSpellInfo() const
float GetSpellDamageMod(int32 Rank) const
ItemTemplate const * GetTemplate() const
float GetRatingBonusValue(CombatRating cr) const
Item * GetWeaponForAttack(WeaponAttackType attackType, bool useable=false) const
SpellEffectInfo Effects[MAX_SPELL_EFFECTS]
SpellSchoolMask GetSchoolMask() const
uint32 GetAllEffectsMechanicMask() const
bool IsRangedWeaponSpell() const
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=NULL, Unit const *Caster=NULL) const
Player * GetSpellModOwner() const
std::multimap< uint32, AuraApplication * > AuraApplicationMap
float CalculateDefaultCoefficient(SpellInfo const *spellInfo, DamageEffectType damagetype) const
uint32 SpellHealingBonusDone(Unit *victim, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack=1) const
uint32 MeleeDamageBonusTaken(Unit *attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto=NULL)
bool HasAuraWithMechanic(uint32 mechanicMask) const
int32 GetTotalAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
bool HasAura(uint32 spellId, uint64 casterGUID=0, uint64 itemCasterGUID=0, uint32 reqEffMask=0) const
uint32 SpellHealingBonusTaken(Unit *caster, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack=1) const
int32 SpellBaseDamageBonusTaken(SpellSchoolMask schoolMask) const
int32 GetMaxPositiveAuraModifier(AuraType auratype) const
uint32 MeleeDamageBonusDone(Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto=NULL)
uint32 GetAttackTime(WeaponAttackType att) const
uint32 SpellDamageBonusDone(Unit *victim, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1) const
AuraEffect * GetAuraEffect(uint32 spellId, uint8 effIndex, uint64 casterGUID=0) const
int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask) const
float GetAPMultiplier(WeaponAttackType attType, bool normalized)
int32 GetMaxNegativeAuraModifier(AuraType auratype) const
int32 GetTotalAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
uint32 SpellDamageBonusTaken(Unit *caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1) const
uint32 HasUnitTypeMask(uint32 mask) const
uint64 GetOwnerGUID() const
float GetTotalAuraMultiplierByMiscMask(AuraType auratype, uint32 misc_mask) const
virtual SpellSchoolMask GetMeleeDamageSchoolMask() const
int32 GetTotalAuraModifier(AuraType auratype) const
uint32 GetCreatureTypeMask() const
AuraApplicationMap & GetAppliedAuras()
std::list< AuraEffect * > AuraEffectList
int32 SpellBaseHealingBonusTaken(SpellSchoolMask schoolMask) const
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask) const
float CalculateLevelPenalty(SpellInfo const *spellProto) const
float GetTotalAttackPowerValue(WeaponAttackType attType) const
uint32 GetDoTsByCaster(uint64 casterGUID) const