Core/Objects: Unify GameObjectSearcher, UnitSearcher, CreatureSearcher and PlayerSearcher classes into one common implementation

This commit is contained in:
Shauren
2023-05-28 16:54:23 +02:00
parent 261eb201bf
commit 526b16fea4
3 changed files with 160 additions and 382 deletions

View File

@@ -312,11 +312,11 @@ namespace Trinity
{
uint32 i_mapTypeMask;
PhaseShift const* i_phaseShift;
Check &i_check;
Check& i_check;
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) { }
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<class T>
void Visit(GridRefManager<T>&);
@@ -326,22 +326,22 @@ namespace Trinity
struct WorldObjectSearcher : WorldObjectSearcherBase<Check, SearcherFirstObjectResult<WorldObject*>>
{
WorldObjectSearcher(WorldObject const* searcher, WorldObject*& result, Check& check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL)
: WorldObjectSearcherBase<Check, SearcherFirstObjectResult<WorldObject*>>(searcher, result, check, mapTypeMask) { }
: WorldObjectSearcherBase<Check, SearcherFirstObjectResult<WorldObject*>>(&searcher->GetPhaseShift(), 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)
: WorldObjectSearcherBase<Check, SearcherLastObjectResult<WorldObject*>>(searcher, result, check, mapTypeMask) { }
WorldObjectLastSearcher(WorldObject const* searcher, WorldObject*& result, Check& check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL)
: WorldObjectSearcherBase<Check, SearcherLastObjectResult<WorldObject*>>(&searcher->GetPhaseShift(), result, check, mapTypeMask) { }
};
template<class Check>
struct WorldObjectListSearcher : WorldObjectSearcherBase<Check, SearcherContainerResult<WorldObject*>>
{
template<typename Container>
WorldObjectListSearcher(WorldObject const* searcher, Container& container, Check & check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL)
: WorldObjectSearcherBase<Check, SearcherContainerResult<WorldObject*>>(searcher, container, check, mapTypeMask) { }
WorldObjectListSearcher(WorldObject const* searcher, Container& container, Check& check, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL)
: WorldObjectSearcherBase<Check, SearcherContainerResult<WorldObject*>>(&searcher->GetPhaseShift(), container, check, mapTypeMask) { }
};
template<class Do>
@@ -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<class T>
void Visit(GridRefManager<T>& m)
{
if (!(i_mapTypeMask & GRID_MAP_TYPE_MASK_GAMEOBJECT))
if (!(i_mapTypeMask & GridMapTypeMaskForType<T>::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<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { }
};
// Gameobject searchers
template<class Check>
struct GameObjectSearcher
template<class Check, class Result>
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<typename Container>
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<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { }
};
template<class Check>
struct GameObjectSearcher : GameObjectSearcherBase<Check, SearcherFirstObjectResult<GameObject*>>
{
GameObjectSearcher(WorldObject const* searcher, GameObject*& result, Check& check)
: GameObjectSearcherBase<Check, SearcherFirstObjectResult<GameObject*>>(&searcher->GetPhaseShift(), result, check) { }
};
// Last accepted by Check GO if any (Check can change requirements at each call)
template<class Check>
struct GameObjectLastSearcher
struct GameObjectLastSearcher : GameObjectSearcherBase<Check, SearcherLastObjectResult<GameObject*>>
{
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<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { }
GameObjectLastSearcher(WorldObject const* searcher, GameObject*& result, Check& check)
: GameObjectSearcherBase<Check, SearcherLastObjectResult<GameObject*>>(&searcher->GetPhaseShift(), result, check) { }
};
template<class Check>
struct GameObjectListSearcher : SearcherContainerResult<GameObject*>
struct GameObjectListSearcher : GameObjectSearcherBase<Check, SearcherContainerResult<GameObject*>>
{
PhaseShift const* i_phaseShift;
Check& i_check;
template<typename Container>
GameObjectListSearcher(WorldObject const* searcher, Container& container, Check & check)
: SearcherContainerResult<GameObject*>(container),
i_phaseShift(&searcher->GetPhaseShift()), i_check(check) { }
void Visit(GameObjectMapType &m);
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { }
GameObjectListSearcher(WorldObject const* searcher, Container& container, Check& check)
: GameObjectSearcherBase<Check, SearcherContainerResult<GameObject*>>(&searcher->GetPhaseShift(), container, check) { }
};
template<class Functor>
@@ -499,107 +427,90 @@ namespace Trinity
// Unit searchers
// First accepted by Check Unit if any
template<class Check>
struct UnitSearcher
template<class Check, class Result>
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<typename Container>
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<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { }
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED>&) { }
private:
template<class T> void VisitImpl(GridRefManager<T>& m);
};
// First accepted by Check Unit if any
template<class Check>
struct UnitSearcher : UnitSearcherBase<Check, SearcherFirstObjectResult<Unit*>>
{
UnitSearcher(WorldObject const* searcher, Unit*& result, Check& check)
: UnitSearcherBase<Check, SearcherFirstObjectResult<Unit*>>(&searcher->GetPhaseShift(), result, check) { }
};
// Last accepted by Check Unit if any (Check can change requirements at each call)
template<class Check>
struct UnitLastSearcher
struct UnitLastSearcher : UnitSearcherBase<Check, SearcherLastObjectResult<Unit*>>
{
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<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { }
UnitLastSearcher(WorldObject const* searcher, Unit*& result, Check& check)
: UnitSearcherBase<Check, SearcherLastObjectResult<Unit*>>(&searcher->GetPhaseShift(), result, check) { }
};
// All accepted by Check units if any
template<class Check>
struct UnitListSearcher : SearcherContainerResult<Unit*>
struct UnitListSearcher : UnitSearcherBase<Check, SearcherContainerResult<Unit*>>
{
PhaseShift const* i_phaseShift;
Check& i_check;
template<typename Container>
UnitListSearcher(WorldObject const* searcher, Container& container, Check& check)
: SearcherContainerResult<Unit*>(container),
i_phaseShift(&searcher->GetPhaseShift()), i_check(check) { }
void Visit(PlayerMapType &m);
void Visit(CreatureMapType &m);
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { }
: UnitSearcherBase<Check, SearcherContainerResult<Unit*>>(&searcher->GetPhaseShift(), container, check) { }
};
// Creature searchers
template<class Check>
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<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { }
};
// Last accepted by Check Creature if any (Check can change requirements at each call)
template<class Check>
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<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { }
};
template<class Check>
struct CreatureListSearcher : SearcherContainerResult<Creature*>
template<class Check, class Result>
struct CreatureSearcherBase : Result
{
PhaseShift const* i_phaseShift;
Check& i_check;
template<typename Container>
CreatureListSearcher(WorldObject const* searcher, Container& container, Check & check)
: SearcherContainerResult<Creature*>(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<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { }
};
template<class Check>
struct CreatureSearcher : CreatureSearcherBase<Check, SearcherFirstObjectResult<Creature*>>
{
CreatureSearcher(WorldObject const* searcher, Creature*& result, Check& check)
: CreatureSearcherBase<Check, SearcherFirstObjectResult<Creature*>>(&searcher->GetPhaseShift(), result, check) { }
};
// Last accepted by Check Creature if any (Check can change requirements at each call)
template<class Check>
struct CreatureLastSearcher : CreatureSearcherBase<Check, SearcherLastObjectResult<Creature*>>
{
CreatureLastSearcher(WorldObject const* searcher, Creature*& result, Check& check)
: CreatureSearcherBase<Check, SearcherLastObjectResult<Creature*>>(&searcher->GetPhaseShift(), result, check) { }
};
template<class Check>
struct CreatureListSearcher : CreatureSearcherBase<Check, SearcherContainerResult<Creature*>>
{
template<typename Container>
CreatureListSearcher(WorldObject const* searcher, Container& container, Check & check)
: CreatureSearcherBase<Check, SearcherContainerResult<Creature*>>(&searcher->GetPhaseShift(), container, check) { }
};
template<class Do>
struct CreatureWorker
{
@@ -621,58 +532,47 @@ namespace Trinity
// Player searchers
template<class Check>
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<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { }
};
template<class Check>
struct PlayerListSearcher : SearcherContainerResult<Player*>
template<class Check, class Result>
struct PlayerSearcherBase : Result
{
PhaseShift const* i_phaseShift;
Check& i_check;
template<typename Container>
PlayerListSearcher(WorldObject const* searcher, Container& container, Check & check)
: SearcherContainerResult<Player*>(container),
i_phaseShift(&searcher->GetPhaseShift()), i_check(check) { }
template<typename Container>
PlayerListSearcher(PhaseShift const& phaseShift, Container& container, Check & check)
: SearcherContainerResult<Player*>(container),
i_phaseShift(&phaseShift), i_check(check) { }
void Visit(PlayerMapType &m);
template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { }
};
template<class Check>
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<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { }
};
template<class Check>
struct PlayerSearcher : PlayerSearcherBase<Check, SearcherFirstObjectResult<Player*>>
{
PlayerSearcher(WorldObject const* searcher, Player*& result, Check& check)
: PlayerSearcherBase<Check, SearcherFirstObjectResult<Player*>>(&searcher->GetPhaseShift(), result, check) { }
};
template<class Check>
struct PlayerLastSearcher : PlayerSearcherBase<Check, SearcherLastObjectResult<Player*>>
{
PlayerLastSearcher(WorldObject const* searcher, Player*& result, Check& check)
: PlayerSearcherBase<Check, SearcherLastObjectResult<Player*>>(&searcher->GetPhaseShift(), result, check) { }
};
template<class Check>
struct PlayerListSearcher : PlayerSearcherBase<Check, SearcherContainerResult<Player*>>
{
template<typename Container>
PlayerListSearcher(WorldObject const* searcher, Container& container, Check& check)
: PlayerSearcherBase<Check, SearcherContainerResult<Player*>>(&searcher->GetPhaseShift(), container, check) { }
template<typename Container>
PlayerListSearcher(PhaseShift const& phaseShift, Container& container, Check& check)
: PlayerSearcherBase<Check, SearcherContainerResult<Player*>>(phaseShift, container, check) { }
};
template<class Do>
struct PlayerWorker
{

View File

@@ -190,11 +190,11 @@ void Trinity::WorldObjectSearcherBase<Check, Result>::Visit(GridRefManager<T>& m
if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return)
return;
for (auto itr = m.begin(); itr != m.end(); ++itr)
for (GridReference<T> 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<Check, Result>::Visit(GridRefManager<T>& m
// Gameobject searchers
template<class Check>
void Trinity::GameObjectSearcher<Check>::Visit(GameObjectMapType &m)
template <class Check, class Result>
void Trinity::GameObjectSearcherBase<Check, Result>::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<GameObject> 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<class Check>
void Trinity::GameObjectLastSearcher<Check>::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<class Check>
void Trinity::GameObjectListSearcher<Check>::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<class Check>
void Trinity::UnitSearcher<Check>::Visit(CreatureMapType &m)
template <class Check, class Result>
template <class T>
void Trinity::UnitSearcherBase<Check, Result>::VisitImpl(GridRefManager<T>& m)
{
// already found
if (i_object)
if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return)
return;
for (CreatureMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
for (GridReference<T> 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<class Check>
void Trinity::UnitSearcher<Check>::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<class Check>
void Trinity::UnitLastSearcher<Check>::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<class Check>
void Trinity::UnitLastSearcher<Check>::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<class Check>
void Trinity::UnitListSearcher<Check>::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<class Check>
void Trinity::UnitListSearcher<Check>::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<class Check>
void Trinity::CreatureSearcher<Check>::Visit(CreatureMapType &m)
template <class Check, class Result>
void Trinity::CreatureSearcherBase<Check, Result>::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<Creature> 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<class Check>
void Trinity::CreatureLastSearcher<Check>::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<class Check>
void Trinity::CreatureListSearcher<Check>::Visit(CreatureMapType &m)
template <class Check, class Result>
void Trinity::PlayerSearcherBase<Check, Result>::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<class Check>
void Trinity::PlayerListSearcher<Check>::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<class Check>
void Trinity::PlayerSearcher<Check>::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<Player> 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<class Check>
void Trinity::PlayerLastSearcher<Check>::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<typename Localizer>
void Trinity::LocalizedDo<Localizer>::operator()(Player const* p)
{

View File

@@ -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"