diff options
author | Shauren <shauren.trinity@gmail.com> | 2025-07-04 23:56:22 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2025-07-04 23:56:22 +0200 |
commit | 21712f475383f6f3fae107706f5de5195f75b760 (patch) | |
tree | c0b7bd51c779282376f453390a851a246c102452 | |
parent | a8e6866a027c5078662fb407c1bc647e0ebe6ce3 (diff) |
Core/Objects: Add missing grid workers
-rw-r--r-- | src/server/game/Grids/Notifiers/GridNotifiers.h | 194 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 15 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_warlock.cpp | 3 |
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" |