[9896] Cleanup spell bonus coeff use code

* Avoid coeff calculation if target value is 0.0f
* Avoid use spell_bonus_data coeffs for creature damage.

Signed-off-by: VladimirMangos <vladimir@getmangos.com>
This commit is contained in:
nos4r2zod 2010-05-15 07:44:37 +04:00 committed by VladimirMangos
parent e880e7d236
commit b2b8ca1d70
2 changed files with 81 additions and 119 deletions

View file

@ -9153,35 +9153,31 @@ uint32 Unit::SpellDamageBonusDone(Unit *pVictim, SpellEntry const *spellProto, u
if (GetTypeId() == TYPEID_UNIT && ((Creature*)this)->isPet())
DoneAdvertisedBenefit += ((Pet*)this)->GetBonusDamage();
if (DoneAdvertisedBenefit)
{
float LvlPenalty = CalculateLevelPenalty(spellProto);
// Spellmod SpellDamage
float SpellModSpellDamage = 100.0f;
if(Player* modOwner = GetSpellModOwner())
modOwner->ApplySpellMod(spellProto->Id,SPELLMOD_SPELL_BONUS_DAMAGE,SpellModSpellDamage);
SpellModSpellDamage /= 100.0f;
// Check for table values
if (SpellBonusEntry const* bonus = sSpellMgr.GetSpellBonusData(spellProto->Id))
{
// Distribute Damage over multiple effects, reduce by AoE
float coeff;
if (damagetype == DOT)
coeff = bonus->dot_damage * LvlPenalty;
else
coeff = bonus->direct_damage * LvlPenalty;
// Not apply this to creature casted spells
if (GetTypeId()==TYPEID_UNIT && !((Creature*)this)->isPet())
coeff = 1.0f;
// Check for table values
else if (SpellBonusEntry const* bonus = sSpellMgr.GetSpellBonusData(spellProto->Id))
{
coeff = damagetype == DOT ? bonus->dot_damage : bonus->direct_damage;
if (bonus->ap_bonus)
DoneTotal += int32(bonus->ap_bonus * GetTotalAttackPowerValue(BASE_ATTACK));
DoneTotal += int32(DoneAdvertisedBenefit * coeff * SpellModSpellDamage);
}
// Default calculation
else if (DoneAdvertisedBenefit)
{
// Distribute Damage over multiple effects, reduce by AoE
// Not apply this to creature casted spells
float coeff;
if (GetTypeId()==TYPEID_UNIT && !((Creature*)this)->isPet())
coeff = 1.0f;
else
coeff = CalculateDefaultCoefficient(spellProto, damagetype);
@ -9252,27 +9248,20 @@ uint32 Unit::SpellDamageBonusTaken(Unit *pCaster, SpellEntry const *spellProto,
// Taken fixed damage bonus auras
int32 TakenAdvertisedBenefit = SpellBaseDamageBonusTaken(GetSpellSchoolMask(spellProto));
if (TakenAdvertisedBenefit)
{
float LvlPenalty = pCaster->CalculateLevelPenalty(spellProto);
// Check for table values
if (SpellBonusEntry const* bonus = sSpellMgr.GetSpellBonusData(spellProto->Id))
{
float coeff;
if (damagetype == DOT)
coeff = bonus->dot_damage * LvlPenalty;
else
coeff = bonus->direct_damage * LvlPenalty;
TakenTotal += int32(TakenAdvertisedBenefit * coeff);
}
// Default calculation
else if (TakenAdvertisedBenefit)
{
// Distribute Damage over multiple effects, reduce by AoE
// Not apply this to creature casted spells
float coeff;
// Not apply this to creature casted spells
if (pCaster->GetTypeId()==TYPEID_UNIT && !((Creature*)pCaster)->isPet())
coeff = 1.0f;
// Check for table values
else if (SpellBonusEntry const* bonus = sSpellMgr.GetSpellBonusData(spellProto->Id))
coeff = damagetype == DOT ? bonus->dot_damage : bonus->direct_damage;
// Default calculation
else
coeff = CalculateDefaultCoefficient(spellProto, damagetype);
@ -9677,40 +9666,35 @@ uint32 Unit::SpellHealingBonusDone(Unit *pVictim, SpellEntry const *spellProto,
// Done fixed damage bonus auras
int32 DoneAdvertisedBenefit = SpellBaseHealingBonusDone(GetSpellSchoolMask(spellProto));
if (DoneAdvertisedBenefit)
{
float LvlPenalty = CalculateLevelPenalty(spellProto);
// Spellmod SpellDamage
float SpellModSpellDamage = 100.0f;
if(Player* modOwner = GetSpellModOwner())
modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_SPELL_BONUS_DAMAGE, SpellModSpellDamage);
SpellModSpellDamage /= 100.0f;
// Check for table values
SpellBonusEntry const* bonus = sSpellMgr.GetSpellBonusData(spellProto->Id);
if (bonus)
{
// Distribute Damage over multiple effects, reduce by AoE
float coeff;
if (damagetype == DOT)
coeff = bonus->dot_damage * LvlPenalty;
else
coeff = bonus->direct_damage * LvlPenalty;
// Not apply this to creature casted spells
if (GetTypeId()==TYPEID_UNIT && !((Creature*)this)->isPet())
coeff = 1.0f;
// Check for table values
else if (SpellBonusEntry const* bonus = sSpellMgr.GetSpellBonusData(spellProto->Id))
{
coeff = damagetype == DOT ? bonus->dot_damage : bonus->direct_damage;
if (bonus->ap_bonus)
DoneTotal += int32(bonus->ap_bonus * GetTotalAttackPowerValue(BASE_ATTACK));
DoneTotal += int32(DoneAdvertisedBenefit * coeff * SpellModSpellDamage);
}
// Default calculation
else if (DoneAdvertisedBenefit)
{
// Distribute Damage over multiple effects, reduce by AoE
// Not apply this to creature casted spells
float coeff;
if (GetTypeId()==TYPEID_UNIT && !((Creature*)this)->isPet())
coeff = 1.0f;
else
coeff = CalculateDefaultCoefficient(spellProto, damagetype);
coeff = CalculateDefaultCoefficient(spellProto, damagetype) * 1.88f;
DoneTotal += int32(DoneAdvertisedBenefit * coeff * LvlPenalty * SpellModSpellDamage * 1.88f);
DoneTotal += int32(DoneAdvertisedBenefit * coeff * LvlPenalty * SpellModSpellDamage);
}
// use float as more appropriate for negative values and percent applying
@ -9753,32 +9737,24 @@ uint32 Unit::SpellHealingBonusTaken(Unit *pCaster, SpellEntry const *spellProto,
// Taken fixed damage bonus auras
int32 TakenAdvertisedBenefit = SpellBaseHealingBonusTaken(GetSpellSchoolMask(spellProto));
if (TakenAdvertisedBenefit)
{
float LvlPenalty = pCaster->CalculateLevelPenalty(spellProto);
// Check for table values
SpellBonusEntry const* bonus = sSpellMgr.GetSpellBonusData(spellProto->Id);
if (bonus)
{
float coeff;
if (damagetype == DOT)
coeff = bonus->dot_damage * LvlPenalty;
else
coeff = bonus->direct_damage * LvlPenalty;
TakenTotal += int32(TakenAdvertisedBenefit * coeff);
}
// Default calculation
else if (TakenAdvertisedBenefit)
{
// Distribute Damage over multiple effects, reduce by AoE
// Not apply this to creature casted spells
float coeff;
// Not apply this to creature casted spells
if (GetTypeId()==TYPEID_UNIT && !((Creature*)this)->isPet())
coeff = 1.0f;
// Check for table values
else if (SpellBonusEntry const* bonus = sSpellMgr.GetSpellBonusData(spellProto->Id))
coeff = damagetype == DOT ? bonus->dot_damage : bonus->direct_damage;
// Default calculation
else
coeff = CalculateDefaultCoefficient(spellProto, damagetype);
coeff = CalculateDefaultCoefficient(spellProto, damagetype) * 1.88f;
TakenTotal += int32(TakenAdvertisedBenefit * coeff * LvlPenalty * 1.88f);
TakenTotal += int32(TakenAdvertisedBenefit * coeff * LvlPenalty);
}
AuraList const& mHealingGet= GetAurasByType(SPELL_AURA_MOD_HEALING_RECEIVED);
@ -10160,34 +10136,26 @@ uint32 Unit::MeleeDamageBonusDone(Unit *pVictim, uint32 pdamage,WeaponAttackType
{
float LvlPenalty = CalculateLevelPenalty(spellProto);
// Distribute Damage over multiple effects, reduce by AoE
float coeff = 0.0f;
// Not apply this to creature casted spells
if (GetTypeId()==TYPEID_UNIT && !((Creature*)this)->isPet())
coeff = 1.0f;
// Check for table values
if (SpellBonusEntry const* bonus = sSpellMgr.GetSpellBonusData(spellProto->Id))
else if (SpellBonusEntry const* bonus = sSpellMgr.GetSpellBonusData(spellProto->Id))
{
float coeff;
if (damagetype == DOT)
coeff = bonus->dot_damage * LvlPenalty;
else
coeff = bonus->direct_damage * LvlPenalty;
coeff = damagetype == DOT ? bonus->dot_damage : bonus->direct_damage;
if (bonus->ap_bonus)
DoneFlat += bonus->ap_bonus * (GetTotalAttackPowerValue(BASE_ATTACK) + APbonus);
DoneFlat *= coeff;
}
// Default calculation
else if (DoneFlat)
{
// Distribute Damage over multiple effects, reduce by AoE
// Not apply this to creature casted spells
float coeff;
if (GetTypeId()==TYPEID_UNIT && !((Creature*)this)->isPet())
coeff = 1.0f;
else
coeff = CalculateDefaultCoefficient(spellProto, damagetype);
DoneFlat *= coeff * LvlPenalty;
}
}
// weapon damage based spells
else if( APbonus || DoneFlat )
{
@ -10309,29 +10277,23 @@ uint32 Unit::MeleeDamageBonusTaken(Unit *pCaster, uint32 pdamage,WeaponAttackTyp
// scaling of non weapon based spells
if (!isWeaponDamageBasedSpell)
{
if (TakenFlat)
{
float LvlPenalty = pCaster->CalculateLevelPenalty(spellProto);
// Check for table values
if (SpellBonusEntry const* bonus = sSpellMgr.GetSpellBonusData(spellProto->Id))
{
float coeff;
if (damagetype == DOT)
coeff = bonus->dot_damage * LvlPenalty;
else
coeff = bonus->direct_damage * LvlPenalty;
TakenFlat *= coeff;
}
// Default calculation
else if (TakenFlat)
{
// Distribute Damage over multiple effects, reduce by AoE
// Not apply this to creature casted spells
float coeff;
// Not apply this to creature casted spells
if (pCaster->GetTypeId()==TYPEID_UNIT && !((Creature*)pCaster)->isPet())
coeff = 1.0f;
else
// Check for table values
else if (SpellBonusEntry const* bonus = sSpellMgr.GetSpellBonusData(spellProto->Id))
coeff = damagetype == DOT ? bonus->dot_damage : bonus->direct_damage;
// Default calculation
else if (TakenFlat)
coeff = CalculateDefaultCoefficient(spellProto, damagetype);
TakenFlat *= coeff * LvlPenalty;

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__
#define __REVISION_NR_H__
#define REVISION_NR "9895"
#define REVISION_NR "9896"
#endif // __REVISION_NR_H__