diff options
author | Shauren <shauren.trinity@gmail.com> | 2023-05-28 16:07:34 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2023-05-28 16:07:34 +0200 |
commit | 261eb201bf107cef441d9b075e8f23bf0edfbaf0 (patch) | |
tree | 5047ccc234f313ddb5072d426b2802dfe52c909b /src | |
parent | 3790c1e3dad36727279b22a33eea8e27418c4283 (diff) |
Core/Objects: Unify WorldObjectSearcher classes into one common implementation
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Grids/Notifiers/GridNotifiers.h | 149 | ||||
-rw-r--r-- | src/server/game/Grids/Notifiers/GridNotifiersImpl.h | 396 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 7 |
3 files changed, 102 insertions, 450 deletions
diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index c345d1d07e7..b26aa977c24 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -33,6 +33,18 @@ namespace Trinity { + template<typename ObjectType> + struct GridMapTypeMaskForType : std::integral_constant<GridMapTypeMask, GridMapTypeMask(0)> { }; + + template<> struct GridMapTypeMaskForType<Corpse> : std::integral_constant<GridMapTypeMask, GRID_MAP_TYPE_MASK_CORPSE> { }; + template<> struct GridMapTypeMaskForType<Creature> : std::integral_constant<GridMapTypeMask, GRID_MAP_TYPE_MASK_CREATURE> { }; + template<> struct GridMapTypeMaskForType<DynamicObject> : std::integral_constant<GridMapTypeMask, GRID_MAP_TYPE_MASK_DYNAMICOBJECT> { }; + template<> struct GridMapTypeMaskForType<GameObject> : std::integral_constant<GridMapTypeMask, GRID_MAP_TYPE_MASK_GAMEOBJECT> { }; + template<> struct GridMapTypeMaskForType<Player> : std::integral_constant<GridMapTypeMask, GRID_MAP_TYPE_MASK_PLAYER> { }; + template<> struct GridMapTypeMaskForType<AreaTrigger> : std::integral_constant<GridMapTypeMask, GRID_MAP_TYPE_MASK_AREATRIGGER> { }; + template<> struct GridMapTypeMaskForType<SceneObject> : std::integral_constant<GridMapTypeMask, GRID_MAP_TYPE_MASK_SCENEOBJECT> { }; + template<> struct GridMapTypeMaskForType<Conversation> : std::integral_constant<GridMapTypeMask, GRID_MAP_TYPE_MASK_CONVERSATION> { }; + struct TC_GAME_API VisibleNotifier { Player &i_player; @@ -220,10 +232,53 @@ namespace Trinity // SEARCHERS & LIST SEARCHERS & WORKERS // WorldObject searchers & workers + enum class WorldObjectSearcherContinuation + { + Continue, + Return + }; + + template<typename Type> + class SearcherFirstObjectResult + { + Type& result; + + protected: + explicit SearcherFirstObjectResult(Type& ref_) : result(ref_) { } + + WorldObjectSearcherContinuation ShouldContinue() const + { + return result ? WorldObjectSearcherContinuation::Return : WorldObjectSearcherContinuation::Continue; + } + + void Insert(Type object) + { + result = object; + } + }; + + template<typename Type> + class SearcherLastObjectResult + { + Type& result; + + protected: + explicit SearcherLastObjectResult(Type& ref_) : result(ref_) { } + + WorldObjectSearcherContinuation ShouldContinue() const + { + return WorldObjectSearcherContinuation::Continue; + } + + void Insert(Type object) + { + result = object; + } + }; // Generic base class to insert elements into arbitrary containers using push_back template<typename Type> - class ContainerInserter + class SearcherContainerResult { using InserterType = void(*)(void*, Type&&); @@ -232,7 +287,7 @@ namespace Trinity protected: template<typename T> - ContainerInserter(T& ref_) : ref(&ref_) + explicit SearcherContainerResult(T& ref_) : ref(&ref_) { inserter = [](void* containerRaw, Type&& object) { @@ -241,80 +296,52 @@ namespace Trinity }; } + WorldObjectSearcherContinuation ShouldContinue() const + { + return WorldObjectSearcherContinuation::Continue; + } + void Insert(Type object) { inserter(ref, std::move(object)); } }; - template<class Check> - struct WorldObjectSearcher + template<class Check, class Result> + struct WorldObjectSearcherBase : Result { uint32 i_mapTypeMask; PhaseShift const* i_phaseShift; - WorldObject* &i_object; Check &i_check; - WorldObjectSearcher(WorldObject const* searcher, WorldObject* & result, Check& check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) - : i_mapTypeMask(mapTypeMask), i_phaseShift(&searcher->GetPhaseShift()), i_object(result), i_check(check) { } - - void Visit(GameObjectMapType &m); - void Visit(PlayerMapType &m); - void Visit(CreatureMapType &m); - void Visit(CorpseMapType &m); - void Visit(DynamicObjectMapType &m); - void Visit(AreaTriggerMapType &m); - void Visit(SceneObjectMapType &m); - void Visit(ConversationMapType &m); + template<typename Container> + WorldObjectSearcherBase(WorldObject const* searcher, Container& result, Check& check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) + : Result(result), i_mapTypeMask(mapTypeMask), i_phaseShift(&searcher->GetPhaseShift()), i_check(check) { } - template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { } + template<class T> + void Visit(GridRefManager<T>&); }; template<class Check> - struct WorldObjectLastSearcher + struct WorldObjectSearcher : WorldObjectSearcherBase<Check, SearcherFirstObjectResult<WorldObject*>> { - uint32 i_mapTypeMask; - PhaseShift const* i_phaseShift; - WorldObject* &i_object; - Check &i_check; + WorldObjectSearcher(WorldObject const* searcher, WorldObject*& result, Check& check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) + : WorldObjectSearcherBase<Check, SearcherFirstObjectResult<WorldObject*>>(searcher, result, check, mapTypeMask) { } + }; + template<class Check> + struct WorldObjectLastSearcher : WorldObjectSearcherBase<Check, SearcherLastObjectResult<WorldObject*>> + { WorldObjectLastSearcher(WorldObject const* searcher, WorldObject* & result, Check& check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) - : i_mapTypeMask(mapTypeMask), i_phaseShift(&searcher->GetPhaseShift()), i_object(result), i_check(check) { } - - void Visit(GameObjectMapType &m); - void Visit(PlayerMapType &m); - void Visit(CreatureMapType &m); - void Visit(CorpseMapType &m); - void Visit(DynamicObjectMapType &m); - void Visit(AreaTriggerMapType &m); - void Visit(SceneObjectMapType &m); - void Visit(ConversationMapType &m); - - template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { } + : WorldObjectSearcherBase<Check, SearcherLastObjectResult<WorldObject*>>(searcher, result, check, mapTypeMask) { } }; template<class Check> - struct WorldObjectListSearcher : ContainerInserter<WorldObject*> + struct WorldObjectListSearcher : WorldObjectSearcherBase<Check, SearcherContainerResult<WorldObject*>> { - uint32 i_mapTypeMask; - PhaseShift const* i_phaseShift; - Check& i_check; - template<typename Container> WorldObjectListSearcher(WorldObject const* searcher, Container& container, Check & check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) - : ContainerInserter<WorldObject*>(container), - i_mapTypeMask(mapTypeMask), i_phaseShift(&searcher->GetPhaseShift()), i_check(check) { } - - void Visit(PlayerMapType &m); - void Visit(CreatureMapType &m); - void Visit(CorpseMapType &m); - void Visit(GameObjectMapType &m); - void Visit(DynamicObjectMapType &m); - void Visit(AreaTriggerMapType &m); - void Visit(SceneObjectMapType &m); - void Visit(ConversationMapType &m); - - template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { } + : WorldObjectSearcherBase<Check, SearcherContainerResult<WorldObject*>>(searcher, container, check, mapTypeMask) { } }; template<class Do> @@ -435,14 +462,14 @@ namespace Trinity }; template<class Check> - struct GameObjectListSearcher : ContainerInserter<GameObject*> + struct GameObjectListSearcher : SearcherContainerResult<GameObject*> { PhaseShift const* i_phaseShift; Check& i_check; template<typename Container> GameObjectListSearcher(WorldObject const* searcher, Container& container, Check & check) - : ContainerInserter<GameObject*>(container), + : SearcherContainerResult<GameObject*>(container), i_phaseShift(&searcher->GetPhaseShift()), i_check(check) { } void Visit(GameObjectMapType &m); @@ -508,14 +535,14 @@ namespace Trinity // All accepted by Check units if any template<class Check> - struct UnitListSearcher : ContainerInserter<Unit*> + struct UnitListSearcher : SearcherContainerResult<Unit*> { PhaseShift const* i_phaseShift; Check& i_check; template<typename Container> UnitListSearcher(WorldObject const* searcher, Container& container, Check& check) - : ContainerInserter<Unit*>(container), + : SearcherContainerResult<Unit*>(container), i_phaseShift(&searcher->GetPhaseShift()), i_check(check) { } void Visit(PlayerMapType &m); @@ -558,14 +585,14 @@ namespace Trinity }; template<class Check> - struct CreatureListSearcher : ContainerInserter<Creature*> + struct CreatureListSearcher : SearcherContainerResult<Creature*> { PhaseShift const* i_phaseShift; Check& i_check; template<typename Container> CreatureListSearcher(WorldObject const* searcher, Container& container, Check & check) - : ContainerInserter<Creature*>(container), + : SearcherContainerResult<Creature*>(container), i_phaseShift(&searcher->GetPhaseShift()), i_check(check) { } void Visit(CreatureMapType &m); @@ -610,19 +637,19 @@ namespace Trinity }; template<class Check> - struct PlayerListSearcher : ContainerInserter<Player*> + struct PlayerListSearcher : SearcherContainerResult<Player*> { PhaseShift const* i_phaseShift; Check& i_check; template<typename Container> PlayerListSearcher(WorldObject const* searcher, Container& container, Check & check) - : ContainerInserter<Player*>(container), + : SearcherContainerResult<Player*>(container), i_phaseShift(&searcher->GetPhaseShift()), i_check(check) { } template<typename Container> PlayerListSearcher(PhaseShift const& phaseShift, Container& container, Check & check) - : ContainerInserter<Player*>(container), + : SearcherContainerResult<Player*>(container), i_phaseShift(&phaseShift), i_check(check) { } void Visit(PlayerMapType &m); diff --git a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h index e0965427763..405a6d89e62 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h +++ b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h @@ -180,406 +180,28 @@ void Trinity::MessageDistDelivererToHostile<PacketSender>::Visit(DynamicObjectMa // WorldObject searchers & workers -template<class Check> -void Trinity::WorldObjectSearcher<Check>::Visit(GameObjectMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_GAMEOBJECT)) - return; - - // already found - if (i_object) - return; - - for (GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(*i_phaseShift)) - continue; - - if (i_check(itr->GetSource())) - { - i_object = itr->GetSource(); - return; - } - } -} - -template<class Check> -void Trinity::WorldObjectSearcher<Check>::Visit(PlayerMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_PLAYER)) - return; - - // already found - if (i_object) - return; - - for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(*i_phaseShift)) - continue; - - if (i_check(itr->GetSource())) - { - i_object = itr->GetSource(); - return; - } - } -} - -template<class Check> -void Trinity::WorldObjectSearcher<Check>::Visit(CreatureMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_CREATURE)) - return; - - // already found - if (i_object) - return; - - for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(*i_phaseShift)) - continue; - - if (i_check(itr->GetSource())) - { - i_object = itr->GetSource(); - return; - } - } -} - -template<class Check> -void Trinity::WorldObjectSearcher<Check>::Visit(CorpseMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_CORPSE)) - return; - - // already found - if (i_object) - return; - - for (CorpseMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(*i_phaseShift)) - continue; - - if (i_check(itr->GetSource())) - { - i_object = itr->GetSource(); - return; - } - } -} - -template<class Check> -void Trinity::WorldObjectSearcher<Check>::Visit(DynamicObjectMapType &m) +template <class Check, class Result> +template <class T> +void Trinity::WorldObjectSearcherBase<Check, Result>::Visit(GridRefManager<T>& m) { - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_DYNAMICOBJECT)) + if (!(i_mapTypeMask & GridMapTypeMaskForType<T>::value)) return; - // already found - if (i_object) + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) return; - for (DynamicObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) + for (auto itr = m.begin(); itr != m.end(); ++itr) { - if (!itr->GetSource()->InSamePhase(*i_phaseShift)) - continue; - if (i_check(itr->GetSource())) { - i_object = itr->GetSource(); - return; - } - } -} - -template<class Check> -void Trinity::WorldObjectSearcher<Check>::Visit(AreaTriggerMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_AREATRIGGER)) - return; - - // already found - if (i_object) - return; - - for (AreaTriggerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(*i_phaseShift)) - continue; + this->Insert(itr->GetSource()); - if (i_check(itr->GetSource())) - { - i_object = itr->GetSource(); - return; + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) + return; } } } -template<class Check> -void Trinity::WorldObjectSearcher<Check>::Visit(SceneObjectMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_SCENEOBJECT)) - return; - - // already found - if (i_object) - return; - - for (SceneObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(*i_phaseShift)) - continue; - - if (i_check(itr->GetSource())) - { - i_object = itr->GetSource(); - return; - } - } -} - -template<class Check> -void Trinity::WorldObjectSearcher<Check>::Visit(ConversationMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_CONVERSATION)) - return; - - // already found - if (i_object) - return; - - for (ConversationMapType::iterator itr = m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(*i_phaseShift)) - continue; - - if (i_check(itr->GetSource())) - { - i_object = itr->GetSource(); - return; - } - } -} - -template<class Check> -void Trinity::WorldObjectLastSearcher<Check>::Visit(GameObjectMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_GAMEOBJECT)) - return; - - for (GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(*i_phaseShift)) - continue; - - if (i_check(itr->GetSource())) - i_object = itr->GetSource(); - } -} - -template<class Check> -void Trinity::WorldObjectLastSearcher<Check>::Visit(PlayerMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_PLAYER)) - return; - - for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(*i_phaseShift)) - continue; - - if (i_check(itr->GetSource())) - i_object = itr->GetSource(); - } -} - -template<class Check> -void Trinity::WorldObjectLastSearcher<Check>::Visit(CreatureMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_CREATURE)) - return; - - for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(*i_phaseShift)) - continue; - - if (i_check(itr->GetSource())) - i_object = itr->GetSource(); - } -} - -template<class Check> -void Trinity::WorldObjectLastSearcher<Check>::Visit(CorpseMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_CORPSE)) - return; - - for (CorpseMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(*i_phaseShift)) - continue; - - if (i_check(itr->GetSource())) - i_object = itr->GetSource(); - } -} - -template<class Check> -void Trinity::WorldObjectLastSearcher<Check>::Visit(DynamicObjectMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_DYNAMICOBJECT)) - return; - - for (DynamicObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(*i_phaseShift)) - continue; - - if (i_check(itr->GetSource())) - i_object = itr->GetSource(); - } -} - -template<class Check> -void Trinity::WorldObjectLastSearcher<Check>::Visit(AreaTriggerMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_AREATRIGGER)) - return; - - for (AreaTriggerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(*i_phaseShift)) - continue; - - if (i_check(itr->GetSource())) - i_object = itr->GetSource(); - } -} - -template<class Check> -void Trinity::WorldObjectLastSearcher<Check>::Visit(SceneObjectMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_SCENEOBJECT)) - return; - - for (SceneObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(*i_phaseShift)) - continue; - - if (i_check(itr->GetSource())) - i_object = itr->GetSource(); - } -} - -template<class Check> -void Trinity::WorldObjectLastSearcher<Check>::Visit(ConversationMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_CONVERSATION)) - return; - - for (ConversationMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(*i_phaseShift)) - continue; - - if (i_check(itr->GetSource())) - i_object = itr->GetSource(); - } -} - -template<class Check> -void Trinity::WorldObjectListSearcher<Check>::Visit(PlayerMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_PLAYER)) - return; - - for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} - -template<class Check> -void Trinity::WorldObjectListSearcher<Check>::Visit(CreatureMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_CREATURE)) - return; - - for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} - -template<class Check> -void Trinity::WorldObjectListSearcher<Check>::Visit(CorpseMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_CORPSE)) - return; - - for (CorpseMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} - -template<class Check> -void Trinity::WorldObjectListSearcher<Check>::Visit(GameObjectMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_GAMEOBJECT)) - return; - - for (GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} - -template<class Check> -void Trinity::WorldObjectListSearcher<Check>::Visit(DynamicObjectMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_DYNAMICOBJECT)) - return; - - for (DynamicObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} - -template<class Check> -void Trinity::WorldObjectListSearcher<Check>::Visit(AreaTriggerMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_AREATRIGGER)) - return; - - for (AreaTriggerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} - -template<class Check> -void Trinity::WorldObjectListSearcher<Check>::Visit(SceneObjectMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_SCENEOBJECT)) - return; - - for (SceneObjectMapType::iterator itr = m.begin(); itr != m.end(); ++itr) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} - -template<class Check> -void Trinity::WorldObjectListSearcher<Check>::Visit(ConversationMapType &m) -{ - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_CONVERSATION)) - return; - - for (ConversationMapType::iterator itr = m.begin(); itr != m.end(); ++itr) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} - // Gameobject searchers template<class Check> diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index b45ce4a5fa8..859ce65149e 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -2146,9 +2146,11 @@ WorldObject* Spell::SearchNearbyTarget(float range, SpellTargetObjectTypes objec uint32 containerTypeMask = GetSearcherTypeMask(objectType, condList); if (!containerTypeMask) return nullptr; + Trinity::WorldObjectSpellNearbyTargetCheck check(range, m_caster, m_spellInfo, selectionType, condList, objectType); Trinity::WorldObjectLastSearcher<Trinity::WorldObjectSpellNearbyTargetCheck> searcher(m_caster, target, check, containerTypeMask); - SearchTargets<Trinity::WorldObjectLastSearcher<Trinity::WorldObjectSpellNearbyTargetCheck> > (searcher, containerTypeMask, m_caster, m_caster, range); + searcher.i_phaseShift = &PhasingHandler::GetAlwaysVisiblePhaseShift(); + SearchTargets<Trinity::WorldObjectLastSearcher<Trinity::WorldObjectSpellNearbyTargetCheck>>(searcher, containerTypeMask, m_caster, m_caster, range); return target; } @@ -2161,7 +2163,8 @@ void Spell::SearchAreaTargets(std::list<WorldObject*>& targets, float range, Pos float extraSearchRadius = range > 0.0f ? EXTRA_CELL_SEARCH_RADIUS : 0.0f; Trinity::WorldObjectSpellAreaTargetCheck check(range, position, m_caster, referer, m_spellInfo, selectionType, condList, objectType); Trinity::WorldObjectListSearcher<Trinity::WorldObjectSpellAreaTargetCheck> searcher(m_caster, targets, check, containerTypeMask); - SearchTargets<Trinity::WorldObjectListSearcher<Trinity::WorldObjectSpellAreaTargetCheck> > (searcher, containerTypeMask, m_caster, position, range + extraSearchRadius); + searcher.i_phaseShift = &PhasingHandler::GetAlwaysVisiblePhaseShift(); + SearchTargets<Trinity::WorldObjectListSearcher<Trinity::WorldObjectSpellAreaTargetCheck>>(searcher, containerTypeMask, m_caster, position, range + extraSearchRadius); } void Spell::SearchChainTargets(std::list<WorldObject*>& targets, uint32 chainTargets, WorldObject* target, SpellTargetObjectTypes objectType, SpellTargetCheckTypes selectType, SpellEffectInfo const& spellEffectInfo, bool isChainHeal) |