From 81c6f3ff9b48c65a120ef247ecef10c1e8d5e896 Mon Sep 17 00:00:00 2001 From: NoFantasy Date: Sat, 6 Mar 2010 16:34:38 +0100 Subject: [PATCH] [9533] Use selected target for target mode 38/46 when provided. For cases where provided target is not valid (or not provided), normal closest in range will be used. Signed-off-by: NoFantasy --- src/game/Spell.cpp | 42 +++++++++++++++++++++++++++++++--------- src/shared/revision_nr.h | 2 +- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 4386f153d..9194ff0c5 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -4362,24 +4362,48 @@ SpellCastResult Spell::CheckCast(bool strict) { Creature *p_Creature = NULL; - CellPair p(MaNGOS::ComputeCellPair(m_caster->GetPositionX(), m_caster->GetPositionY())); - Cell cell(p); - cell.data.Part.reserved = ALL_DISTRICT; - cell.SetNoCreate(); + // check if explicit target is provided and check it up against database valid target entry/state + if (Unit* pTarget = m_targets.getUnitTarget()) + { + if (pTarget->GetTypeId() == TYPEID_UNIT && pTarget->GetEntry() == i_spellST->second.targetEntry) + { + if (i_spellST->second.type == SPELL_TARGET_TYPE_DEAD && pTarget->isDead()) + { + if (pTarget->IsWithinDistInMap(m_caster, range)) + p_Creature = (Creature*)pTarget; + } + else if (i_spellST->second.type == SPELL_TARGET_TYPE_CREATURE && pTarget->isAlive()) + { + if (pTarget->IsWithinDistInMap(m_caster, range)) + p_Creature = (Creature*)pTarget; + } + } + } - MaNGOS::NearestCreatureEntryWithLiveStateInObjectRangeCheck u_check(*m_caster, i_spellST->second.targetEntry, i_spellST->second.type != SPELL_TARGET_TYPE_DEAD, range); - MaNGOS::CreatureLastSearcher searcher(m_caster, p_Creature, u_check); + // no target provided or it was not valid, so use closest in range + if (!p_Creature) + { + CellPair p(MaNGOS::ComputeCellPair(m_caster->GetPositionX(), m_caster->GetPositionY())); + Cell cell(p); + cell.data.Part.reserved = ALL_DISTRICT; + cell.SetNoCreate(); - TypeContainerVisitor, GridTypeMapContainer > grid_creature_searcher(searcher); + MaNGOS::NearestCreatureEntryWithLiveStateInObjectRangeCheck u_check(*m_caster, i_spellST->second.targetEntry, i_spellST->second.type != SPELL_TARGET_TYPE_DEAD, range); + MaNGOS::CreatureLastSearcher searcher(m_caster, p_Creature, u_check); - cell.Visit(p, grid_creature_searcher, *m_caster->GetMap(), *m_caster, range); + TypeContainerVisitor, GridTypeMapContainer > grid_creature_searcher(searcher); + + cell.Visit(p, grid_creature_searcher, *m_caster->GetMap(), *m_caster, range); + + range = u_check.GetLastRange(); + } if (p_Creature) { creatureScriptTarget = p_Creature; goScriptTarget = NULL; - range = u_check.GetLastRange(); } + break; } } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 40a2967b1..85af1699b 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 "9532" + #define REVISION_NR "9533" #endif // __REVISION_NR_H__