Core/Spell:
* Fix Spells with DmgClass SPELL_DAMAGE_CLASS_NONE * Fix SPELL_AURA_PERIODIC_HEAL calculation * Fix Swiftmend heal calculation * Fix some codestyle
This commit is contained in:
@@ -11201,12 +11201,12 @@ uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, ui
|
|||||||
if (Unit* owner = GetOwner())
|
if (Unit* owner = GetOwner())
|
||||||
return owner->SpellHealingBonusDone(victim, spellProto, healamount, damagetype, stack);
|
return owner->SpellHealingBonusDone(victim, spellProto, healamount, damagetype, stack);
|
||||||
|
|
||||||
// no bonus for heal potions/bandages
|
// No bonus healing for potion spells
|
||||||
if (spellProto->SpellFamilyName == SPELLFAMILY_POTION)
|
if (spellProto->SpellFamilyName == SPELLFAMILY_POTION)
|
||||||
return healamount;
|
return healamount;
|
||||||
|
|
||||||
float DoneTotalMod = 1.0f;
|
float DoneTotalMod = 1.0f;
|
||||||
int32 DoneTotal = 0;
|
int32 DoneTotal = 0;
|
||||||
|
|
||||||
// Healing done percent
|
// Healing done percent
|
||||||
AuraEffectList const& mHealingDonePct = GetAuraEffectsByType(SPELL_AURA_MOD_HEALING_DONE_PERCENT);
|
AuraEffectList const& mHealingDonePct = GetAuraEffectsByType(SPELL_AURA_MOD_HEALING_DONE_PERCENT);
|
||||||
@@ -11270,7 +11270,7 @@ uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, ui
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Done fixed damage bonus auras
|
// Done fixed damage bonus auras
|
||||||
int32 DoneAdvertisedBenefit = SpellBaseHealingBonusDone(spellProto->GetSchoolMask());
|
int32 DoneAdvertisedBenefit = SpellBaseHealingBonusDone(spellProto->GetSchoolMask());
|
||||||
|
|
||||||
// Check for table values
|
// Check for table values
|
||||||
SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
|
SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
|
||||||
@@ -11283,16 +11283,22 @@ uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, ui
|
|||||||
coeff = bonus->dot_damage;
|
coeff = bonus->dot_damage;
|
||||||
if (bonus->ap_dot_bonus > 0)
|
if (bonus->ap_dot_bonus > 0)
|
||||||
DoneTotal += int32(bonus->ap_dot_bonus * stack * GetTotalAttackPowerValue(
|
DoneTotal += int32(bonus->ap_dot_bonus * stack * GetTotalAttackPowerValue(
|
||||||
(spellProto->IsRangedWeaponSpell() && spellProto->DmgClass !=SPELL_DAMAGE_CLASS_MELEE)? RANGED_ATTACK : BASE_ATTACK));
|
(spellProto->IsRangedWeaponSpell() && spellProto->DmgClass !=SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
coeff = bonus->direct_damage;
|
coeff = bonus->direct_damage;
|
||||||
if (bonus->ap_bonus > 0)
|
if (bonus->ap_bonus > 0)
|
||||||
DoneTotal += int32(bonus->ap_bonus * stack * GetTotalAttackPowerValue(
|
DoneTotal += int32(bonus->ap_bonus * stack * GetTotalAttackPowerValue(
|
||||||
(spellProto->IsRangedWeaponSpell() && spellProto->DmgClass !=SPELL_DAMAGE_CLASS_MELEE)? RANGED_ATTACK : BASE_ATTACK));
|
(spellProto->IsRangedWeaponSpell() && spellProto->DmgClass !=SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default
|
||||||
|
if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
|
||||||
|
return healamount < 0 ? 0 : healamount;
|
||||||
|
}
|
||||||
|
|
||||||
// Default calculation
|
// Default calculation
|
||||||
if (DoneAdvertisedBenefit)
|
if (DoneAdvertisedBenefit)
|
||||||
@@ -11320,11 +11326,11 @@ uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, ui
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Earthliving - 0.45% of normal hot coeff
|
// Earthliving - 0.45% of normal hot coeff
|
||||||
if (spellProto->SpellFamilyName == SPELLFAMILY_SHAMAN && spellProto->SpellFamilyFlags[1] & 0x80000)
|
if (spellProto->SpellFamilyName == SPELLFAMILY_SHAMAN && spellProto->SpellFamilyFlags[1] & 0x80000)
|
||||||
factorMod *= 0.45f;
|
factorMod *= 0.45f;
|
||||||
|
|
||||||
DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod);
|
DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -11339,7 +11345,7 @@ uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, ui
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
|
if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
|
||||||
DoneTotal = 0;
|
DoneTotal = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// use float as more appropriate for negative values and percent applying
|
// use float as more appropriate for negative values and percent applying
|
||||||
@@ -11351,16 +11357,16 @@ uint32 Unit::SpellHealingBonusDone(Unit* victim, SpellInfo const* spellProto, ui
|
|||||||
return uint32(std::max(heal, 0.0f));
|
return uint32(std::max(heal, 0.0f));
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 Unit::SpellHealingBonusTaken(Unit* caster, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack)
|
uint32 Unit::SpellHealingBonusTaken(Unit* caster, SpellInfo const* spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack)
|
||||||
{
|
{
|
||||||
float TakenTotalMod = 1.0f;
|
float TakenTotalMod = 1.0f;
|
||||||
|
|
||||||
// Healing taken percent
|
// Healing taken percent
|
||||||
float minval = (float)GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HEALING_PCT);
|
float minval = float(GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HEALING_PCT));
|
||||||
if (minval)
|
if (minval)
|
||||||
AddPctF(TakenTotalMod, minval);
|
AddPctF(TakenTotalMod, minval);
|
||||||
|
|
||||||
float maxval = (float)GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HEALING_PCT);
|
float maxval = float(GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HEALING_PCT));
|
||||||
if (maxval)
|
if (maxval)
|
||||||
AddPctF(TakenTotalMod, maxval);
|
AddPctF(TakenTotalMod, maxval);
|
||||||
|
|
||||||
@@ -11369,7 +11375,7 @@ uint32 Unit::SpellHealingBonusTaken(Unit* caster, SpellInfo const *spellProto, u
|
|||||||
AddPctN(TakenTotalMod, Tenacity->GetAmount());
|
AddPctN(TakenTotalMod, Tenacity->GetAmount());
|
||||||
|
|
||||||
// Healing Done
|
// Healing Done
|
||||||
int32 TakenTotal = 0;
|
int32 TakenTotal = 0;
|
||||||
|
|
||||||
// Taken fixed damage bonus auras
|
// Taken fixed damage bonus auras
|
||||||
int32 TakenAdvertisedBenefit = SpellBaseHealingBonusTaken(spellProto->GetSchoolMask());
|
int32 TakenAdvertisedBenefit = SpellBaseHealingBonusTaken(spellProto->GetSchoolMask());
|
||||||
@@ -11386,11 +11392,11 @@ uint32 Unit::SpellHealingBonusTaken(Unit* caster, SpellInfo const *spellProto, u
|
|||||||
if (damagetype == DOT)
|
if (damagetype == DOT)
|
||||||
{
|
{
|
||||||
// Healing over time taken percent
|
// Healing over time taken percent
|
||||||
float minval_hot = (float)GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HOT_PCT);
|
float minval_hot = float(GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HOT_PCT));
|
||||||
if (minval_hot)
|
if (minval_hot)
|
||||||
AddPctF(TakenTotalMod, minval_hot);
|
AddPctF(TakenTotalMod, minval_hot);
|
||||||
|
|
||||||
float maxval_hot = (float)GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HOT_PCT);
|
float maxval_hot = float(GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HOT_PCT));
|
||||||
if (maxval_hot)
|
if (maxval_hot)
|
||||||
AddPctF(TakenTotalMod, maxval_hot);
|
AddPctF(TakenTotalMod, maxval_hot);
|
||||||
}
|
}
|
||||||
@@ -11401,6 +11407,12 @@ uint32 Unit::SpellHealingBonusTaken(Unit* caster, SpellInfo const *spellProto, u
|
|||||||
float factorMod = 1.0f;
|
float factorMod = 1.0f;
|
||||||
if (bonus)
|
if (bonus)
|
||||||
coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage;
|
coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default
|
||||||
|
if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
|
||||||
|
return healamount < 0 ? 0 : healamount;
|
||||||
|
}
|
||||||
|
|
||||||
// Default calculation
|
// Default calculation
|
||||||
if (TakenAdvertisedBenefit)
|
if (TakenAdvertisedBenefit)
|
||||||
@@ -11439,7 +11451,7 @@ uint32 Unit::SpellHealingBonusTaken(Unit* caster, SpellInfo const *spellProto, u
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
|
if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
|
||||||
TakenTotal = 0;
|
TakenTotal = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
float heal = (int32(healamount) + TakenTotal) * TakenTotalMod;
|
float heal = (int32(healamount) + TakenTotal) * TakenTotalMod;
|
||||||
|
|||||||
@@ -6457,7 +6457,7 @@ void AuraEffect::HandlePeriodicHealAurasTick(Unit* target, Unit* caster) const
|
|||||||
damage += addition;
|
damage += addition;
|
||||||
}
|
}
|
||||||
|
|
||||||
damage = caster->SpellDamageBonusDone(target, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount());
|
damage = caster->SpellHealingBonusDone(target, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount());
|
||||||
damage = target->SpellHealingBonusTaken(caster, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount());
|
damage = target->SpellHealingBonusTaken(caster, GetSpellInfo(), damage, DOT, GetBase()->GetStackAmount());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1560,10 +1560,7 @@ void Spell::EffectHeal(SpellEffIndex /*effIndex*/)
|
|||||||
|
|
||||||
int32 tickheal = targetAura->GetAmount();
|
int32 tickheal = targetAura->GetAmount();
|
||||||
if (Unit* auraCaster = targetAura->GetCaster())
|
if (Unit* auraCaster = targetAura->GetCaster())
|
||||||
{
|
|
||||||
tickheal = auraCaster->SpellHealingBonusDone(unitTarget, targetAura->GetSpellInfo(), tickheal, DOT);
|
tickheal = auraCaster->SpellHealingBonusDone(unitTarget, targetAura->GetSpellInfo(), tickheal, DOT);
|
||||||
tickheal = unitTarget->SpellHealingBonusTaken(auraCaster, targetAura->GetSpellInfo(), tickheal, DOT);
|
|
||||||
}
|
|
||||||
//int32 tickheal = targetAura->GetSpellInfo()->EffectBasePoints[idx] + 1;
|
//int32 tickheal = targetAura->GetSpellInfo()->EffectBasePoints[idx] + 1;
|
||||||
//It is said that talent bonus should not be included
|
//It is said that talent bonus should not be included
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user