diff options
Diffstat (limited to 'src/server/game/Spells/Spell.cpp')
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index af9ad32490f..7de3b7a38d1 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -507,7 +507,7 @@ m_caster(Caster), m_spellValue(new SpellValue(m_spellInfo)) m_casttime = 0; // setup to correct value in Spell::prepare, don't must be used before. m_timer = 0; // will set to castime in prepare - m_needAliveTargetMask = 0; + m_channelTargetEffectMask = 0; // determine reflection m_canReflect = false; @@ -789,7 +789,7 @@ void Spell::SelectSpellTargets() { if (ihit->effectMask & mask) { - m_needAliveTargetMask |= mask; + m_channelTargetEffectMask |= mask; break; } } @@ -1682,19 +1682,19 @@ void Spell::DoAllEffectOnTarget(ItemTargetInfo *target) bool Spell::UpdateChanneledTargetList() { // Not need check return true - if (m_needAliveTargetMask == 0) + if (m_channelTargetEffectMask == 0) return true; - uint8 needAliveTargetMask = m_needAliveTargetMask; - uint8 needAuraMask = 0; + uint8 channelTargetEffectMask = m_channelTargetEffectMask; + uint8 channelAuraMask = 0; for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) if (m_spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AURA) - needAuraMask |= 1<<i; + channelAuraMask |= 1<<i; - needAuraMask &= needAliveTargetMask; + channelAuraMask &= channelTargetEffectMask; float range = 0; - if (needAuraMask) + if (channelAuraMask) { range = GetSpellMaxRange(m_spellInfo, IsPositiveSpell(m_spellInfo->Id)); if (Player * modOwner = m_caster->GetSpellModOwner()) @@ -1703,13 +1703,16 @@ bool Spell::UpdateChanneledTargetList() for (std::list<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit) { - if (ihit->missCondition == SPELL_MISS_NONE && (needAliveTargetMask & ihit->effectMask)) + if (ihit->missCondition == SPELL_MISS_NONE && (channelTargetEffectMask & ihit->effectMask)) { Unit *unit = m_caster->GetGUID() == ihit->targetGUID ? m_caster : ObjectAccessor::GetUnit(*m_caster, ihit->targetGUID); - if (unit && unit->isAlive()) + if (!unit) + continue; + + if (IsValidDeadOrAliveTarget(unit)) { - if (needAuraMask & ihit->effectMask) + if (channelAuraMask & ihit->effectMask) { if (AuraApplication * aurApp = unit->GetAuraApplication(m_spellInfo->Id, m_originalCasterGUID)) { @@ -1724,13 +1727,13 @@ bool Spell::UpdateChanneledTargetList() continue; } - needAliveTargetMask &= ~ihit->effectMask; // remove from need alive mask effect that have alive target + channelTargetEffectMask &= ~ihit->effectMask; // remove from need alive mask effect that have alive target } } } // is all effects from m_needAliveTargetMask have alive targets - return needAliveTargetMask == 0; + return channelTargetEffectMask == 0; } // Helper for Chain Healing @@ -4092,7 +4095,7 @@ void Spell::WriteSpellGoTargets(WorldPacket * data) if ((*ihit).missCondition == SPELL_MISS_NONE) // Add only hits { *data << uint64(ihit->targetGUID); - m_needAliveTargetMask |=ihit->effectMask; + m_channelTargetEffectMask |=ihit->effectMask; } } @@ -4112,7 +4115,7 @@ void Spell::WriteSpellGoTargets(WorldPacket * data) } // Reset m_needAliveTargetMask for non channeled spell if (!IsChanneledSpell(m_spellInfo)) - m_needAliveTargetMask = 0; + m_channelTargetEffectMask = 0; } void Spell::SendLogExecute() @@ -6915,6 +6918,15 @@ bool Spell::IsValidSingleTargetSpell(Unit const* target) const return true; } +bool Spell::IsValidDeadOrAliveTarget(Unit const* target) const +{ + if (target->isAlive()) + return !IsRequiringDeadTargetSpell(m_spellInfo); + if (IsAllowingDeadTargetSpell(m_spellInfo)) + return true; + return false; +} + void Spell::CalculateDamageDoneForAllTargets() { float multiplier[MAX_SPELL_EFFECTS]; |