aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-07-04 23:56:22 +0200
committerShauren <shauren.trinity@gmail.com>2025-07-04 23:56:22 +0200
commit21712f475383f6f3fae107706f5de5195f75b760 (patch)
treec0b7bd51c779282376f453390a851a246c102452
parenta8e6866a027c5078662fb407c1bc647e0ebe6ce3 (diff)
Core/Objects: Add missing grid workers
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiers.h194
-rw-r--r--src/server/game/Spells/SpellEffects.cpp15
-rw-r--r--src/server/scripts/Spells/spell_warlock.cpp3
3 files changed, 129 insertions, 83 deletions
diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h
index 342afe3ea67..497db5d219a 100644
--- a/src/server/game/Grids/Notifiers/GridNotifiers.h
+++ b/src/server/game/Grids/Notifiers/GridNotifiers.h
@@ -381,6 +381,42 @@ namespace Trinity
void VisitImpl(GridRefManager<T>&);
};
+ template<class Work, class MapTypeMaskCheck = DynamicGridMapTypeMaskCheck>
+ struct WorldObjectWorkerBase
+ {
+ MapTypeMaskCheck i_mapTypeMask;
+ PhaseShift const* i_phaseShift;
+ Work& i_work;
+
+ template<class T>
+ void Visit(GridRefManager<T> const& m)
+ {
+ if constexpr (MapTypeMaskCheck::IsStatic)
+ {
+ if constexpr (MapTypeMaskCheck::Includes(GridMapTypeMaskForType<T>::value))
+ VisitImpl(m);
+ }
+ else
+ {
+ if (i_mapTypeMask.Includes(GridMapTypeMaskForType<T>::value))
+ VisitImpl(m);
+ }
+ }
+
+ protected:
+ WorldObjectWorkerBase(PhaseShift const& phaseShift, Work& work, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL)
+ : i_mapTypeMask(mapTypeMask), i_phaseShift(&phaseShift), i_work(work) { }
+
+ private:
+ template<class T>
+ inline void VisitImpl(GridRefManager<T> const& m)
+ {
+ for (GridReference<T> const& ref : m)
+ if (ref.GetSource()->InSamePhase(*i_phaseShift))
+ this->i_work(ref.GetSource());
+ }
+ };
+
template<class Check>
struct WorldObjectSearcher : WorldObjectSearcherBase<Check, SearcherFirstObjectResult<WorldObject*>>
{
@@ -413,25 +449,20 @@ namespace Trinity
: WorldObjectListSearcher(searcher->GetPhaseShift(), container, check, mapTypeMask) { }
};
- template<class Do>
- struct WorldObjectWorker
- {
- uint32 i_mapTypeMask;
- PhaseShift const* i_phaseShift;
- Do const& i_do;
+ template<class Check, typename Container>
+ WorldObjectListSearcher(PhaseShift const&, Container&, Check const&) -> WorldObjectListSearcher<Check const>;
- WorldObjectWorker(WorldObject const* searcher, Do const& _do, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL)
- : i_mapTypeMask(mapTypeMask), i_phaseShift(&searcher->GetPhaseShift()), i_do(_do) { }
+ template<class Check, typename Container>
+ WorldObjectListSearcher(WorldObject const*, Container&, Check const&) -> WorldObjectListSearcher<Check const>;
- template<class T>
- void Visit(GridRefManager<T>& m)
- {
- if (!(i_mapTypeMask & GridMapTypeMaskForType<T>::value))
- return;
- for (auto itr = m.begin(); itr != m.end(); ++itr)
- if (itr->GetSource()->InSamePhase(*i_phaseShift))
- i_do(itr->GetSource());
- }
+ template<class Work>
+ struct WorldObjectWorker : WorldObjectWorkerBase<Work>
+ {
+ WorldObjectWorker(PhaseShift const& phaseShift, Work& work, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL)
+ : WorldObjectWorkerBase<Work>(phaseShift, work, mapTypeMask) { }
+
+ WorldObjectWorker(WorldObject const* searcher, Work& work, uint32 mapTypeMask = GRID_MAP_TYPE_MASK_ALL)
+ : WorldObjectWorker(searcher->GetPhaseShift(), work, mapTypeMask) { }
};
// Gameobject searchers
@@ -477,24 +508,20 @@ namespace Trinity
: GameObjectListSearcher(searcher->GetPhaseShift(), container, check) { }
};
- template<class Functor>
- struct GameObjectWorker
- {
- GameObjectWorker(WorldObject const* searcher, Functor& func)
- : _func(func), _phaseShift(&searcher->GetPhaseShift()) { }
+ template<class Check, typename Container>
+ GameObjectListSearcher(PhaseShift const&, Container&, Check const&) -> GameObjectListSearcher<Check const>;
- void Visit(GameObjectMapType& m)
- {
- for (GameObjectMapType::iterator itr = m.begin(); itr != m.end(); ++itr)
- if (itr->GetSource()->InSamePhase(*_phaseShift))
- _func(itr->GetSource());
- }
+ template<class Check, typename Container>
+ GameObjectListSearcher(WorldObject const*, Container&, Check const&) -> GameObjectListSearcher<Check const>;
- template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { }
+ template<class Work>
+ struct GameObjectWorker : WorldObjectWorkerBase<Work, StaticGridMapTypeMaskCheck<GRID_MAP_TYPE_MASK_GAMEOBJECT>>
+ {
+ GameObjectWorker(PhaseShift const& phaseShift, Work& work)
+ : WorldObjectWorkerBase<Work, StaticGridMapTypeMaskCheck<GRID_MAP_TYPE_MASK_GAMEOBJECT>>(phaseShift, work) { }
- private:
- Functor& _func;
- PhaseShift const* _phaseShift;
+ GameObjectWorker(WorldObject const* searcher, Work& work)
+ : GameObjectWorker(searcher->GetPhaseShift(), work) { }
};
// Unit searchers
@@ -542,6 +569,16 @@ namespace Trinity
: UnitListSearcher(searcher->GetPhaseShift(), container, check) { }
};
+ template<class Work>
+ struct UnitWorker : WorldObjectWorkerBase<Work, StaticGridMapTypeMaskCheck<GRID_MAP_TYPE_MASK_CREATURE | GRID_MAP_TYPE_MASK_PLAYER>>
+ {
+ UnitWorker(PhaseShift const& phaseShift, Work& work)
+ : WorldObjectWorkerBase<Work, StaticGridMapTypeMaskCheck<GRID_MAP_TYPE_MASK_CREATURE | GRID_MAP_TYPE_MASK_PLAYER>>(phaseShift, work) { }
+
+ UnitWorker(WorldObject const* searcher, Work& work)
+ : UnitWorker(searcher->GetPhaseShift(), work) { }
+ };
+
// Creature searchers
template<class Check, class Result>
@@ -585,23 +622,14 @@ namespace Trinity
: CreatureListSearcher(searcher->GetPhaseShift(), container, check) { }
};
- template<class Do>
- struct CreatureWorker
+ template<class Work>
+ struct CreatureWorker : WorldObjectWorkerBase<Work, StaticGridMapTypeMaskCheck<GRID_MAP_TYPE_MASK_CREATURE>>
{
- PhaseShift const* i_phaseShift;
- Do& i_do;
-
- CreatureWorker(WorldObject const* searcher, Do& _do)
- : i_phaseShift(&searcher->GetPhaseShift()), i_do(_do) { }
+ CreatureWorker(PhaseShift const& phaseShift, Work& work)
+ : WorldObjectWorkerBase<Work, StaticGridMapTypeMaskCheck<GRID_MAP_TYPE_MASK_CREATURE>>(phaseShift, work) { }
- void Visit(CreatureMapType &m)
- {
- for (CreatureMapType::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> &) { }
+ CreatureWorker(WorldObject const* searcher, Work& work)
+ : CreatureWorker(searcher->GetPhaseShift(), work) { }
};
// Player searchers
@@ -646,43 +674,34 @@ namespace Trinity
: PlayerListSearcher(searcher->GetPhaseShift(), container, check) { }
};
- template<class Do>
- struct PlayerWorker
+ template<class Work>
+ struct PlayerWorker : WorldObjectWorkerBase<Work, StaticGridMapTypeMaskCheck<GRID_MAP_TYPE_MASK_PLAYER>>
{
- PhaseShift const* i_phaseShift;
- Do& i_do;
+ PlayerWorker(PhaseShift const& phaseShift, Work& work)
+ : WorldObjectWorkerBase<Work, StaticGridMapTypeMaskCheck<GRID_MAP_TYPE_MASK_PLAYER>>(phaseShift, work) { }
- PlayerWorker(WorldObject const* searcher, Do& _do)
- : i_phaseShift(&searcher->GetPhaseShift()), i_do(_do) { }
-
- void Visit(PlayerMapType &m)
- {
- for (PlayerMapType::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> &) { }
+ PlayerWorker(WorldObject const* searcher, Work& work)
+ : PlayerWorker(searcher->GetPhaseShift(), work) { }
};
- template<class Do>
+ template<class Work>
struct PlayerDistWorker
{
WorldObject const* i_searcher;
float i_dist;
- Do& i_do;
+ Work& i_work;
- PlayerDistWorker(WorldObject const* searcher, float _dist, Do& _do)
- : i_searcher(searcher), i_dist(_dist), i_do(_do) { }
+ PlayerDistWorker(WorldObject const* searcher, float _dist, Work& _do)
+ : i_searcher(searcher), i_dist(_dist), i_work(_do) { }
- void Visit(PlayerMapType &m)
+ void Visit(PlayerMapType const& m) const
{
- for (PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr)
- if (itr->GetSource()->InSamePhase(i_searcher) && itr->GetSource()->IsWithinDist(i_searcher, i_dist))
- i_do(itr->GetSource());
+ for (GridReference<Player> const& ref : m)
+ if (ref.GetSource()->InSamePhase(i_searcher) && ref.GetSource()->IsWithinDist(i_searcher, i_dist))
+ i_work(ref.GetSource());
}
- template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { }
+ template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> const&) const { }
};
// AreaTrigger searchers
@@ -726,6 +745,16 @@ namespace Trinity
: AreaTriggerListSearcher(searcher->GetPhaseShift(), container, check) { }
};
+ template<class Work>
+ struct AreaTriggerWorker : WorldObjectWorkerBase<Work, StaticGridMapTypeMaskCheck<GRID_MAP_TYPE_MASK_AREATRIGGER>>
+ {
+ AreaTriggerWorker(PhaseShift const& phaseShift, Work& work)
+ : WorldObjectWorkerBase<Work, StaticGridMapTypeMaskCheck<GRID_MAP_TYPE_MASK_AREATRIGGER>>(phaseShift, work) { }
+
+ AreaTriggerWorker(WorldObject const* searcher, Work& work)
+ : AreaTriggerWorker(searcher->GetPhaseShift(), work) { }
+ };
+
// SceneObject searchers
template<class Check, class Result>
struct SceneObjectSearcherBase : WorldObjectSearcherBase<Check, Result, StaticGridMapTypeMaskCheck<GRID_MAP_TYPE_MASK_SCENEOBJECT>>
@@ -767,6 +796,16 @@ namespace Trinity
: SceneObjectListSearcher(searcher->GetPhaseShift(), container, check) { }
};
+ template<class Work>
+ struct SceneObjectWorker : WorldObjectWorkerBase<Work, StaticGridMapTypeMaskCheck<GRID_MAP_TYPE_MASK_SCENEOBJECT>>
+ {
+ SceneObjectWorker(PhaseShift const& phaseShift, Work& work)
+ : WorldObjectWorkerBase<Work, StaticGridMapTypeMaskCheck<GRID_MAP_TYPE_MASK_SCENEOBJECT>>(phaseShift, work) { }
+
+ SceneObjectWorker(WorldObject const* searcher, Work& work)
+ : SceneObjectWorker(searcher->GetPhaseShift(), work) { }
+ };
+
// Conversation searchers
template<class Check, class Result>
struct ConversationSearcherBase : WorldObjectSearcherBase<Check, Result, StaticGridMapTypeMaskCheck<GRID_MAP_TYPE_MASK_CONVERSATION>>
@@ -808,6 +847,16 @@ namespace Trinity
: ConversationListSearcher(searcher->GetPhaseShift(), container, check) { }
};
+ template<class Work>
+ struct ConversationWorker : WorldObjectWorkerBase<Work, StaticGridMapTypeMaskCheck<GRID_MAP_TYPE_MASK_CONVERSATION>>
+ {
+ ConversationWorker(PhaseShift const& phaseShift, Work& work)
+ : WorldObjectWorkerBase<Work, StaticGridMapTypeMaskCheck<GRID_MAP_TYPE_MASK_CONVERSATION>>(phaseShift, work) { }
+
+ ConversationWorker(WorldObject const* searcher, Work& work)
+ : ConversationWorker(searcher->GetPhaseShift(), work) { }
+ };
+
// CHECKS && DO classes
// CHECK modifiers
@@ -883,8 +932,7 @@ namespace Trinity
RespawnDo() { }
void operator()(Creature* u) const { u->Respawn(); }
void operator()(GameObject* u) const { u->Respawn(); }
- void operator()(WorldObject*) const { }
- void operator()(Corpse*) const { }
+ void operator()(WorldObject const*) const { }
};
// GameObject checks
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 97abfb4fa26..32de2d2f393 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -5465,16 +5465,13 @@ void Spell::EffectCancelConversation()
if (!unitTarget)
return;
- std::vector<WorldObject*> objs;
- Trinity::ObjectEntryAndPrivateOwnerIfExistsCheck check(unitTarget->GetGUID(), effectInfo->MiscValue);
- Trinity::ConversationListSearcher checker(unitTarget, objs, check);
- Cell::VisitGridObjects(unitTarget, checker, 100.0f);
-
- for (WorldObject* obj : objs)
+ auto work = [check = Trinity::ObjectEntryAndPrivateOwnerIfExistsCheck(unitTarget->GetGUID(), effectInfo->MiscValue)](Conversation* conversation)
{
- if (Conversation* convo = obj->ToConversation())
- convo->Remove();
- }
+ if (check(conversation))
+ conversation->Remove();
+ };
+ Trinity::ConversationWorker worker(unitTarget, work);
+ Cell::VisitGridObjects(unitTarget, worker, 100.0f);
}
void Spell::EffectAddGarrisonFollower()
diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp
index 5a4c66db974..589e862dd60 100644
--- a/src/server/scripts/Spells/spell_warlock.cpp
+++ b/src/server/scripts/Spells/spell_warlock.cpp
@@ -24,10 +24,11 @@
#include "ScriptMgr.h"
#include "AreaTrigger.h"
#include "AreaTriggerAI.h"
+#include "CellImpl.h"
#include "Containers.h"
#include "Creature.h"
#include "GameObject.h"
-#include "GridNotifiers.h"
+#include "GridNotifiersImpl.h"
#include "ObjectAccessor.h"
#include "Pet.h"
#include "Player.h"