aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorQAston <none@none>2010-08-28 23:01:04 +0200
committerQAston <none@none>2010-08-28 23:01:04 +0200
commit511e8c5acf18063233d2130aed54e7798d8511cb (patch)
treede2818575d25fbd00cad9b5afab2170091a75264 /src
parent2bfaeaeabe01c07eff2044c2103d0ffee1423937 (diff)
*Make EffectHealMechanical, EffectHealPct, EffectHealMaxHealth and EffectHealthLeech to use proc system for their dmg/heal (thanks kiper for research)
*Fix some spells with EffectHealMaxHealth with effect value set to 0. *Fix a typo. --HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Spells/SpellEffects.cpp71
1 files changed, 24 insertions, 47 deletions
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index e6d5f4771ff..0100fd7a6f9 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -2356,7 +2356,6 @@ void Spell::EffectPowerDrain(SpellEffIndex effIndex)
int32 power = damage;
if (powerType == POWER_MANA)
power -= unitTarget->GetSpellCritDamageReduction(power);
- power = std::min(0, power);
int32 newDamage = -(unitTarget->ModifyPower(powerType, -int32(power)));
@@ -2416,7 +2415,6 @@ void Spell::EffectPowerBurn(SpellEffIndex effIndex)
// resilience reduce mana draining effect at spell crit damage reduction (added in 2.4)
if (powerType == POWER_MANA)
power -= unitTarget->GetSpellCritDamageReduction(power);
- power = std::min(0, power);
int32 newDamage = -(unitTarget->ModifyPower(powerType, -power));
@@ -2551,43 +2549,30 @@ void Spell::SpellDamageHeal(SpellEffIndex /*effIndex*/)
void Spell::EffectHealPct(SpellEffIndex /*effIndex*/)
{
- if (unitTarget && unitTarget->isAlive() && damage >= 0)
- {
- // Try to get original caster
- Unit *caster = m_originalCasterGUID ? m_originalCaster : m_caster;
-
- // Skip if m_originalCaster not available
- if (!caster)
- return;
+ if (!unitTarget || !unitTarget->isAlive() || damage < 0)
+ return;
- // Rune Tap - Party
- if (m_spellInfo->Id == 59754 && unitTarget == m_caster)
- return;
+ // Skip if m_originalCaster not available
+ if (!m_originalCaster)
+ return;
- uint32 addhealth = caster->SpellHealingBonus(unitTarget, m_spellInfo, unitTarget->CountPctFromMaxHealth(damage), HEAL);
- //if (Player *modOwner = m_caster->GetSpellModOwner())
- // modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_DAMAGE, addhealth, this);
+ // Rune Tap - Party
+ if (m_spellInfo->Id == 59754 && unitTarget == m_caster)
+ return;
- int32 gain = caster->HealBySpell(unitTarget, m_spellInfo, addhealth);
- unitTarget->getHostileRefManager().threatAssist(m_caster, float(gain) * 0.5f, m_spellInfo);
- }
+ m_healing += m_originalCaster->SpellHealingBonus(unitTarget, m_spellInfo, unitTarget->CountPctFromMaxHealth(damage), HEAL);
}
void Spell::EffectHealMechanical(SpellEffIndex /*effIndex*/)
{
- // Mechanic creature type should be correctly checked by targetCreatureType field
- if (unitTarget && unitTarget->isAlive() && damage >= 0)
- {
- // Try to get original caster
- Unit *caster = m_originalCasterGUID ? m_originalCaster : m_caster;
+ if (!unitTarget || !unitTarget->isAlive() || damage < 0)
+ return;
- // Skip if m_originalCaster not available
- if (!caster)
- return;
+ // Skip if m_originalCaster not available
+ if (!m_originalCaster)
+ return;
- uint32 addhealth = caster->SpellHealingBonus(unitTarget, m_spellInfo, uint32(damage), HEAL);
- caster->HealBySpell(unitTarget, m_spellInfo, addhealth);
- }
+ m_healing += m_originalCaster->SpellHealingBonus(unitTarget, m_spellInfo, uint32(damage), HEAL);
}
void Spell::EffectHealthLeech(SpellEffIndex effIndex)
@@ -2600,11 +2585,7 @@ void Spell::EffectHealthLeech(SpellEffIndex effIndex)
float healMultiplier = SpellMgr::CalculateSpellEffectValueMultiplier(m_spellInfo, effIndex, m_originalCaster, this);
int32 newDamage = int32(damage * healMultiplier);
-
- uint32 curHealth = unitTarget->GetHealth();
- newDamage = m_caster->SpellNonMeleeDamageLog(unitTarget, m_spellInfo->Id, newDamage);
- if (int32(curHealth) < newDamage)
- newDamage = curHealth;
+ m_damage += newDamage;
if (m_caster->isAlive())
{
@@ -4433,37 +4414,33 @@ void Spell::EffectThreat(SpellEffIndex /*effIndex*/)
void Spell::EffectHealMaxHealth(SpellEffIndex /*effIndex*/)
{
- if (!unitTarget)
- return;
- if (!unitTarget->isAlive())
+ if (!unitTarget || !unitTarget->isAlive())
return;
int32 addhealth;
if (m_spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN) // Lay on Hands
{
- if (m_caster && m_caster->GetGUID() == unitTarget->GetGUID())
+ if (m_caster->GetGUID() == unitTarget->GetGUID())
{
m_caster->CastSpell(m_caster, 25771, true); // Forbearance
m_caster->CastSpell(m_caster, 61988, true); // Immune shield marker (serverside)
m_caster->CastSpell(m_caster, 61987, true); // Avenging Wrath marker
}
+ }
+ // damage == 0 - heal for caster max health
+ if (damage == 0)
addhealth = m_caster->GetMaxHealth();
- }
else
addhealth = unitTarget->GetMaxHealth() - unitTarget->GetHealth();
+
if (m_originalCaster)
- {
- addhealth=m_originalCaster->SpellHealingBonus(unitTarget,m_spellInfo, addhealth, HEAL);
- m_originalCaster->HealBySpell(unitTarget, m_spellInfo, addhealth);
- }
+ m_healing += m_originalCaster->SpellHealingBonus(unitTarget,m_spellInfo, addhealth, HEAL);
}
void Spell::EffectInterruptCast(SpellEffIndex effIndex)
{
- if (!unitTarget)
- return;
- if (!unitTarget->isAlive())
+ if (!unitTarget || !unitTarget->isAlive())
return;
// TODO: not all spells that used this effect apply cooldown at school spells