From 526b16fea41fb69a302fdebe8a727e175949f04b Mon Sep 17 00:00:00 2001 From: Shauren Date: Sun, 28 May 2023 16:54:23 +0200 Subject: [PATCH] Core/Objects: Unify GameObjectSearcher, UnitSearcher, CreatureSearcher and PlayerSearcher classes into one common implementation --- .../game/Grids/Notifiers/GridNotifiers.h | 328 ++++++------------ .../game/Grids/Notifiers/GridNotifiersImpl.h | 213 +++--------- src/server/game/Spells/Spell.cpp | 1 + 3 files changed, 160 insertions(+), 382 deletions(-) diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index b26aa977c24..ae156bca5de 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -312,11 +312,11 @@ namespace Trinity { uint32 i_mapTypeMask; PhaseShift const* i_phaseShift; - Check &i_check; + Check& i_check; template - 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) { } + WorldObjectSearcherBase(PhaseShift const* phaseShift, Container& result, Check& check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) + : Result(result), i_mapTypeMask(mapTypeMask), i_phaseShift(phaseShift), i_check(check) { } template void Visit(GridRefManager&); @@ -326,22 +326,22 @@ namespace Trinity struct WorldObjectSearcher : WorldObjectSearcherBase> { WorldObjectSearcher(WorldObject const* searcher, WorldObject*& result, Check& check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) - : WorldObjectSearcherBase>(searcher, result, check, mapTypeMask) { } + : WorldObjectSearcherBase>(&searcher->GetPhaseShift(), result, check, mapTypeMask) { } }; template struct WorldObjectLastSearcher : WorldObjectSearcherBase> { - WorldObjectLastSearcher(WorldObject const* searcher, WorldObject* & result, Check& check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) - : WorldObjectSearcherBase>(searcher, result, check, mapTypeMask) { } + WorldObjectLastSearcher(WorldObject const* searcher, WorldObject*& result, Check& check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) + : WorldObjectSearcherBase>(&searcher->GetPhaseShift(), result, check, mapTypeMask) { } }; template struct WorldObjectListSearcher : WorldObjectSearcherBase> { template - WorldObjectListSearcher(WorldObject const* searcher, Container& container, Check & check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) - : WorldObjectSearcherBase>(searcher, container, check, mapTypeMask) { } + WorldObjectListSearcher(WorldObject const* searcher, Container& container, Check& check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) + : WorldObjectSearcherBase>(&searcher->GetPhaseShift(), container, check, mapTypeMask) { } }; template @@ -354,127 +354,55 @@ namespace Trinity WorldObjectWorker(WorldObject const* searcher, Do const& _do, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL) : i_mapTypeMask(mapTypeMask), i_phaseShift(&searcher->GetPhaseShift()), i_do(_do) { } - void Visit(GameObjectMapType &m) + template + void Visit(GridRefManager& m) { - if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_GAMEOBJECT)) + if (!(i_mapTypeMask & GridMapTypeMaskForType::value)) return; - for (GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) + for (auto itr = m.begin(); itr != m.end(); ++itr) if (itr->GetSource()->InSamePhase(*i_phaseShift)) i_do(itr->GetSource()); } - - void 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)) - i_do(itr->GetSource()); - } - void 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)) - i_do(itr->GetSource()); - } - - void 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)) - i_do(itr->GetSource()); - } - - void 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)) - i_do(itr->GetSource()); - } - - void 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)) - i_do(itr->GetSource()); - } - - void 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)) - i_do(itr->GetSource()); - } - - void 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)) - i_do(itr->GetSource()); - } - - template void Visit(GridRefManager &) { } }; // Gameobject searchers - template - struct GameObjectSearcher + template + struct GameObjectSearcherBase : Result { PhaseShift const* i_phaseShift; - GameObject* &i_object; Check &i_check; - GameObjectSearcher(WorldObject const* searcher, GameObject* & result, Check& check) - : i_phaseShift(&searcher->GetPhaseShift()), i_object(result), i_check(check) { } + template + GameObjectSearcherBase(PhaseShift const* phaseShift, Container& result, Check& check) + : Result(result), i_phaseShift(phaseShift), i_check(check) { } - void Visit(GameObjectMapType &m); + void Visit(GameObjectMapType& m); template void Visit(GridRefManager &) { } }; + template + struct GameObjectSearcher : GameObjectSearcherBase> + { + GameObjectSearcher(WorldObject const* searcher, GameObject*& result, Check& check) + : GameObjectSearcherBase>(&searcher->GetPhaseShift(), result, check) { } + }; + // Last accepted by Check GO if any (Check can change requirements at each call) template - struct GameObjectLastSearcher + struct GameObjectLastSearcher : GameObjectSearcherBase> { - PhaseShift const* i_phaseShift; - GameObject* &i_object; - Check& i_check; - - GameObjectLastSearcher(WorldObject const* searcher, GameObject* & result, Check& check) - : i_phaseShift(&searcher->GetPhaseShift()), i_object(result), i_check(check) { } - - void Visit(GameObjectMapType &m); - - template void Visit(GridRefManager &) { } + GameObjectLastSearcher(WorldObject const* searcher, GameObject*& result, Check& check) + : GameObjectSearcherBase>(&searcher->GetPhaseShift(), result, check) { } }; template - struct GameObjectListSearcher : SearcherContainerResult + struct GameObjectListSearcher : GameObjectSearcherBase> { - PhaseShift const* i_phaseShift; - Check& i_check; - template - GameObjectListSearcher(WorldObject const* searcher, Container& container, Check & check) - : SearcherContainerResult(container), - i_phaseShift(&searcher->GetPhaseShift()), i_check(check) { } - - void Visit(GameObjectMapType &m); - - template void Visit(GridRefManager &) { } + GameObjectListSearcher(WorldObject const* searcher, Container& container, Check& check) + : GameObjectSearcherBase>(&searcher->GetPhaseShift(), container, check) { } }; template @@ -499,107 +427,90 @@ namespace Trinity // Unit searchers - // First accepted by Check Unit if any - template - struct UnitSearcher + template + struct UnitSearcherBase : Result { PhaseShift const* i_phaseShift; - Unit* &i_object; - Check & i_check; + Check& i_check; - UnitSearcher(WorldObject const* searcher, Unit* & result, Check & check) - : i_phaseShift(&searcher->GetPhaseShift()), i_object(result), i_check(check) { } + template + UnitSearcherBase(PhaseShift const* phaseShift, Container& result, Check& check) + : Result(result), i_phaseShift(phaseShift), i_check(check) { } - void Visit(CreatureMapType &m); - void Visit(PlayerMapType &m); + void Visit(CreatureMapType& m) { VisitImpl(m); } + void Visit(PlayerMapType& m) { VisitImpl(m); } - template void Visit(GridRefManager &) { } + template void Visit(GridRefManager&) { } + + private: + template void VisitImpl(GridRefManager& m); + }; + + // First accepted by Check Unit if any + template + struct UnitSearcher : UnitSearcherBase> + { + UnitSearcher(WorldObject const* searcher, Unit*& result, Check& check) + : UnitSearcherBase>(&searcher->GetPhaseShift(), result, check) { } }; // Last accepted by Check Unit if any (Check can change requirements at each call) template - struct UnitLastSearcher + struct UnitLastSearcher : UnitSearcherBase> { - PhaseShift const* i_phaseShift; - Unit* &i_object; - Check & i_check; - - UnitLastSearcher(WorldObject const* searcher, Unit* & result, Check & check) - : i_phaseShift(&searcher->GetPhaseShift()), i_object(result), i_check(check) { } - - void Visit(CreatureMapType &m); - void Visit(PlayerMapType &m); - - template void Visit(GridRefManager &) { } + UnitLastSearcher(WorldObject const* searcher, Unit*& result, Check& check) + : UnitSearcherBase>(&searcher->GetPhaseShift(), result, check) { } }; // All accepted by Check units if any template - struct UnitListSearcher : SearcherContainerResult + struct UnitListSearcher : UnitSearcherBase> { - PhaseShift const* i_phaseShift; - Check& i_check; - template UnitListSearcher(WorldObject const* searcher, Container& container, Check& check) - : SearcherContainerResult(container), - i_phaseShift(&searcher->GetPhaseShift()), i_check(check) { } - - void Visit(PlayerMapType &m); - void Visit(CreatureMapType &m); - - template void Visit(GridRefManager &) { } + : UnitSearcherBase>(&searcher->GetPhaseShift(), container, check) { } }; // Creature searchers - template - struct CreatureSearcher - { - PhaseShift const* i_phaseShift; - Creature* &i_object; - Check & i_check; - - CreatureSearcher(WorldObject const* searcher, Creature* & result, Check & check) - : i_phaseShift(&searcher->GetPhaseShift()), i_object(result), i_check(check) { } - - void Visit(CreatureMapType &m); - - template void Visit(GridRefManager &) { } - }; - - // Last accepted by Check Creature if any (Check can change requirements at each call) - template - struct CreatureLastSearcher - { - PhaseShift const* i_phaseShift; - Creature* &i_object; - Check & i_check; - - CreatureLastSearcher(WorldObject const* searcher, Creature* & result, Check & check) - : i_phaseShift(&searcher->GetPhaseShift()), i_object(result), i_check(check) { } - - void Visit(CreatureMapType &m); - - template void Visit(GridRefManager &) { } - }; - - template - struct CreatureListSearcher : SearcherContainerResult + template + struct CreatureSearcherBase : Result { PhaseShift const* i_phaseShift; Check& i_check; template - CreatureListSearcher(WorldObject const* searcher, Container& container, Check & check) - : SearcherContainerResult(container), - i_phaseShift(&searcher->GetPhaseShift()), i_check(check) { } + CreatureSearcherBase(PhaseShift const* phaseShift, Container& result, Check& check) + : Result(result), i_phaseShift(phaseShift), i_check(check) { } - void Visit(CreatureMapType &m); + void Visit(CreatureMapType& m); template void Visit(GridRefManager &) { } }; + template + struct CreatureSearcher : CreatureSearcherBase> + { + CreatureSearcher(WorldObject const* searcher, Creature*& result, Check& check) + : CreatureSearcherBase>(&searcher->GetPhaseShift(), result, check) { } + }; + + // Last accepted by Check Creature if any (Check can change requirements at each call) + template + struct CreatureLastSearcher : CreatureSearcherBase> + { + CreatureLastSearcher(WorldObject const* searcher, Creature*& result, Check& check) + : CreatureSearcherBase>(&searcher->GetPhaseShift(), result, check) { } + }; + + template + struct CreatureListSearcher : CreatureSearcherBase> + { + template + CreatureListSearcher(WorldObject const* searcher, Container& container, Check & check) + : CreatureSearcherBase>(&searcher->GetPhaseShift(), container, check) { } + }; + template struct CreatureWorker { @@ -621,58 +532,47 @@ namespace Trinity // Player searchers - template - struct PlayerSearcher - { - PhaseShift const* i_phaseShift; - Player* &i_object; - Check & i_check; - - PlayerSearcher(WorldObject const* searcher, Player* & result, Check & check) - : i_phaseShift(&searcher->GetPhaseShift()), i_object(result), i_check(check) { } - - void Visit(PlayerMapType &m); - - template void Visit(GridRefManager &) { } - }; - - template - struct PlayerListSearcher : SearcherContainerResult + template + struct PlayerSearcherBase : Result { PhaseShift const* i_phaseShift; Check& i_check; template - PlayerListSearcher(WorldObject const* searcher, Container& container, Check & check) - : SearcherContainerResult(container), - i_phaseShift(&searcher->GetPhaseShift()), i_check(check) { } - - template - PlayerListSearcher(PhaseShift const& phaseShift, Container& container, Check & check) - : SearcherContainerResult(container), - i_phaseShift(&phaseShift), i_check(check) { } - - void Visit(PlayerMapType &m); - - template void Visit(GridRefManager &) { } - }; - - template - struct PlayerLastSearcher - { - PhaseShift const* i_phaseShift; - Player* &i_object; - Check& i_check; - - PlayerLastSearcher(WorldObject const* searcher, Player*& result, Check& check) : i_phaseShift(&searcher->GetPhaseShift()), i_object(result), i_check(check) - { - } + PlayerSearcherBase(PhaseShift const* phaseShift, Container& result, Check& check) + : Result(result), i_phaseShift(phaseShift), i_check(check) { } void Visit(PlayerMapType& m); template void Visit(GridRefManager &) { } }; + template + struct PlayerSearcher : PlayerSearcherBase> + { + PlayerSearcher(WorldObject const* searcher, Player*& result, Check& check) + : PlayerSearcherBase>(&searcher->GetPhaseShift(), result, check) { } + }; + + template + struct PlayerLastSearcher : PlayerSearcherBase> + { + PlayerLastSearcher(WorldObject const* searcher, Player*& result, Check& check) + : PlayerSearcherBase>(&searcher->GetPhaseShift(), result, check) { } + }; + + template + struct PlayerListSearcher : PlayerSearcherBase> + { + template + PlayerListSearcher(WorldObject const* searcher, Container& container, Check& check) + : PlayerSearcherBase>(&searcher->GetPhaseShift(), container, check) { } + + template + PlayerListSearcher(PhaseShift const& phaseShift, Container& container, Check& check) + : PlayerSearcherBase>(phaseShift, container, check) { } + }; + template struct PlayerWorker { diff --git a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h index 405a6d89e62..e3da1f69e82 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h +++ b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h @@ -190,11 +190,11 @@ void Trinity::WorldObjectSearcherBase::Visit(GridRefManager& m if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) return; - for (auto itr = m.begin(); itr != m.end(); ++itr) + for (GridReference const& ref : m) { - if (i_check(itr->GetSource())) + if (i_check(ref.GetSource())) { - this->Insert(itr->GetSource()); + this->Insert(ref.GetSource()); if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) return; @@ -204,220 +204,97 @@ void Trinity::WorldObjectSearcherBase::Visit(GridRefManager& m // Gameobject searchers -template -void Trinity::GameObjectSearcher::Visit(GameObjectMapType &m) +template +void Trinity::GameObjectSearcherBase::Visit(GameObjectMapType& m) { - // already found - if (i_object) + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) return; - for (GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) + for (GridReference const& ref : m) { - if (!itr->GetSource()->InSamePhase(*i_phaseShift)) + if (!ref.GetSource()->InSamePhase(*i_phaseShift)) continue; - if (i_check(itr->GetSource())) + if (i_check(ref.GetSource())) { - i_object = itr->GetSource(); - return; + this->Insert(ref.GetSource()); + + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) + return; } } } -template -void Trinity::GameObjectLastSearcher::Visit(GameObjectMapType &m) -{ - 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 -void Trinity::GameObjectListSearcher::Visit(GameObjectMapType &m) -{ - for (GameObjectMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->GetSource()->InSamePhase(*i_phaseShift)) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} - // Unit searchers -template -void Trinity::UnitSearcher::Visit(CreatureMapType &m) +template +template +void Trinity::UnitSearcherBase::VisitImpl(GridRefManager& m) { - // already found - if (i_object) + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) return; - for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) + for (GridReference const& ref : m) { - if (!itr->GetSource()->InSamePhase(*i_phaseShift)) + if (!ref.GetSource()->InSamePhase(*i_phaseShift)) continue; - if (i_check(itr->GetSource())) + if (i_check(ref.GetSource())) { - i_object = itr->GetSource(); - return; + this->Insert(ref.GetSource()); + + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) + return; } } } -template -void Trinity::UnitSearcher::Visit(PlayerMapType &m) -{ - // 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 -void Trinity::UnitLastSearcher::Visit(CreatureMapType &m) -{ - 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 -void Trinity::UnitLastSearcher::Visit(PlayerMapType &m) -{ - 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 -void Trinity::UnitListSearcher::Visit(PlayerMapType &m) -{ - for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->GetSource()->InSamePhase(*i_phaseShift)) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} - -template -void Trinity::UnitListSearcher::Visit(CreatureMapType &m) -{ - for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->GetSource()->InSamePhase(*i_phaseShift)) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} - // Creature searchers -template -void Trinity::CreatureSearcher::Visit(CreatureMapType &m) +template +void Trinity::CreatureSearcherBase::Visit(CreatureMapType& m) { - // already found - if (i_object) + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) return; - for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) + for (GridReference const& ref : m) { - if (!itr->GetSource()->InSamePhase(*i_phaseShift)) + if (!ref.GetSource()->InSamePhase(*i_phaseShift)) continue; - if (i_check(itr->GetSource())) + if (i_check(ref.GetSource())) { - i_object = itr->GetSource(); - return; + this->Insert(ref.GetSource()); + + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) + return; } } } -template -void Trinity::CreatureLastSearcher::Visit(CreatureMapType &m) -{ - for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - { - if (!itr->GetSource()->InSamePhase(*i_phaseShift)) - continue; +// Player searchers - if (i_check(itr->GetSource())) - i_object = itr->GetSource(); - } -} - -template -void Trinity::CreatureListSearcher::Visit(CreatureMapType &m) +template +void Trinity::PlayerSearcherBase::Visit(PlayerMapType& m) { - for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->GetSource()->InSamePhase(*i_phaseShift)) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} - -template -void Trinity::PlayerListSearcher::Visit(PlayerMapType &m) -{ - for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) - if (itr->GetSource()->InSamePhase(*i_phaseShift)) - if (i_check(itr->GetSource())) - Insert(itr->GetSource()); -} - -template -void Trinity::PlayerSearcher::Visit(PlayerMapType &m) -{ - // already found - if (i_object) + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) return; - for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) + for (GridReference const& ref : m) { - if (!itr->GetSource()->InSamePhase(*i_phaseShift)) + if (!ref.GetSource()->InSamePhase(*i_phaseShift)) continue; - if (i_check(itr->GetSource())) + if (i_check(ref.GetSource())) { - i_object = itr->GetSource(); - return; + this->Insert(ref.GetSource()); + + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) + return; } } } -template -void Trinity::PlayerLastSearcher::Visit(PlayerMapType& m) -{ - 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 void Trinity::LocalizedDo::operator()(Player const* p) { diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 859ce65149e..2b58cdca83f 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -45,6 +45,7 @@ #include "ObjectMgr.h" #include "PathGenerator.h" #include "Pet.h" +#include "PhasingHandler.h" #include "Player.h" #include "ScriptMgr.h" #include "SharedDefines.h"