diff options
| author | QAston <none@none> | 2010-08-18 15:04:00 +0200 |
|---|---|---|
| committer | QAston <none@none> | 2010-08-18 15:04:00 +0200 |
| commit | 5e78e222c1d6277d438df64eb8d3840f89d88d22 (patch) | |
| tree | 8b5ec158f13415a21b0e737371220c48c8e765c7 /src/server/game/Spells/Spell.cpp | |
| parent | 9d45f295930b2ddcc481ff56926903317cd59a89 (diff) | |
Core/Spells: Implement TARGET_DEST_CHANNEL_CASTER(106) and TARGET_GAMEOBJECT_AREA_PATH(108). Rename TARGET_UNIT_CHANNEL to TARGET_UNIT_CHANNEL_TARGET, TARGET_DEST_CHANNEL to TARGET_DEST_CHANNEL_TARGET
--HG--
branch : trunk
Diffstat (limited to 'src/server/game/Spells/Spell.cpp')
| -rw-r--r-- | src/server/game/Spells/Spell.cpp | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index f65f7e5bb78..6c5726092cb 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -164,6 +164,14 @@ void SpellCastTargets::setDst(WorldObject &wObj) m_targetMask |= TARGET_FLAG_DEST_LOCATION; } +void SpellCastTargets::setDst(SpellCastTargets &spellTargets) +{ + m_dstTransGUID = spellTargets.m_dstTransGUID; + m_dstTransOffset.Relocate(spellTargets.m_dstTransOffset); + m_dstPos.Relocate(spellTargets.m_dstPos); + m_targetMask |= TARGET_FLAG_DEST_LOCATION; +} + void SpellCastTargets::modDst(Position &pos) { ASSERT(m_targetMask & TARGET_FLAG_DEST_LOCATION); @@ -2329,21 +2337,24 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) switch (cur) { - case TARGET_UNIT_CHANNEL: - // in some cases unittarget is invalid and crash. do not know why it happens. + case TARGET_UNIT_CHANNEL_TARGET: + // unit target may be no longer avalible - teleported out of map for example if (Unit* target = Unit::GetUnit(*m_caster, m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->m_targets.getUnitTargetGUID())) AddUnitTarget(target, i); else sLog.outError("SPELL: cannot find channel spell target for spell ID %u", m_spellInfo->Id); break; - case TARGET_DEST_CHANNEL: + case TARGET_DEST_CHANNEL_TARGET: if (m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->m_targets.HasDst()) - m_targets = m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->m_targets; + m_targets.setDst(m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->m_targets); else if (Unit* target = Unit::GetUnit(*m_caster, m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->m_targets.getUnitTargetGUID())) m_targets.setDst(*target); else sLog.outError("SPELL: cannot find channel spell destination for spell ID %u", m_spellInfo->Id); break; + case TARGET_DEST_CHANNEL_CASTER: + m_targets.setDst(*m_originalCaster->GetCurrentSpell(CURRENT_CHANNELED_SPELL)->GetCaster()); + break; } break; } @@ -2455,6 +2466,7 @@ void Spell::SelectEffectTargets(uint32 i, uint32 cur) break; case TARGET_GAMEOBJECT_AREA_SRC: case TARGET_GAMEOBJECT_AREA_DST: + case TARGET_GAMEOBJECT_AREA_PATH: radius = GetSpellRadius(m_spellInfo, i, true); targetType = SPELL_TARGETS_GO; break; |
