From 037840d5ba10d80c2131ef50a34027fd743b7165 Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Fri, 13 Mar 2009 19:18:10 +0300 Subject: [PATCH] [7451] Implement correct work SPELL_AURA_PERIODIC_MANA_LEECH for percent mana cost spells. This is fix work of spell 3034 and 5138. --- src/game/SpellAuras.cpp | 29 ++++++++++++++++++++--------- src/shared/revision_nr.h | 2 +- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index 8e4c19084..478c1ae93 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -5919,6 +5919,15 @@ void Aura::PeriodicTick() } case SPELL_AURA_PERIODIC_MANA_LEECH: { + if(m_modifier.m_miscvalue < 0 || m_modifier.m_miscvalue >= MAX_POWERS) + return; + + Powers power = Powers(m_modifier.m_miscvalue); + + // power type might have changed between aura applying and tick (druid's shapeshift) + if(m_target->getPowerType() != power) + return; + Unit *pCaster = GetCaster(); if(!pCaster) return; @@ -5937,18 +5946,20 @@ void Aura::PeriodicTick() // ignore non positive values (can be result apply spellmods to aura damage uint32 pdamage = m_modifier.m_amount > 0 ? m_modifier.m_amount : 0; + // Special case: draining x% of mana (up to a maximum of 2*x% of the caster's maximum mana) + // It's mana percent cost spells, m_modifier.m_amount is percent drain from target + if (m_spellProto->ManaCostPercentage) + { + // max value + uint32 maxmana = pCaster->GetMaxPower(power) * pdamage * 2 / 100; + pdamage = m_target->GetMaxPower(power) * pdamage / 100; + if(pdamage > maxmana) + pdamage = maxmana; + } + sLog.outDetail("PeriodicTick: %u (TypeId: %u) power leech of %u (TypeId: %u) for %u dmg inflicted by %u", GUID_LOPART(GetCasterGUID()), GuidHigh2TypeId(GUID_HIPART(GetCasterGUID())), m_target->GetGUIDLow(), m_target->GetTypeId(), pdamage, GetId()); - if(m_modifier.m_miscvalue < 0 || m_modifier.m_miscvalue >= MAX_POWERS) - break; - - Powers power = Powers(m_modifier.m_miscvalue); - - // power type might have changed between aura applying and tick (druid's shapeshift) - if(m_target->getPowerType() != power) - break; - int32 drain_amount = m_target->GetPower(power) > pdamage ? pdamage : m_target->GetPower(power); // resilience reduce mana draining effect at spell crit damage reduction (added in 2.4) diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 342ea9b0f..7349eca03 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7450" + #define REVISION_NR "7451" #endif // __REVISION_NR_H__