diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Grids/Notifiers/GridNotifiers.h | 65 | ||||
-rw-r--r-- | src/server/game/Grids/Notifiers/GridNotifiersImpl.h | 23 |
2 files changed, 88 insertions, 0 deletions
diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index f9296b908b7..8ef47641635 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -621,6 +621,46 @@ namespace Trinity template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED> &) { } }; + // AreaTrigger searchers + template<class Check, class Result> + struct AreaTriggerSearcherBase : Result + { + PhaseShift const* i_phaseShift; + Check& i_check; + + template<typename Container> + AreaTriggerSearcherBase(PhaseShift const* phaseShift, Container& result, Check& check) + : Result(result), i_phaseShift(phaseShift), i_check(check) { + } + + void Visit(AreaTriggerMapType& m); + + template<class NOT_INTERESTED> void Visit(GridRefManager<NOT_INTERESTED>&) {} + }; + + template<class Check> + struct AreaTriggerSearcher : AreaTriggerSearcherBase<Check, SearcherFirstObjectResult<AreaTrigger*>> + { + AreaTriggerSearcher(WorldObject const* searcher, AreaTrigger*& result, Check& check) + : AreaTriggerSearcherBase<Check, SearcherFirstObjectResult<AreaTrigger*>>(&searcher->GetPhaseShift(), result, check) {} + }; + + // Last accepted by Check GO if any (Check can change requirements at each call) + template<class Check> + struct AreaTriggerLastSearcher : AreaTriggerSearcherBase<Check, SearcherLastObjectResult<AreaTrigger*>> + { + AreaTriggerLastSearcher(WorldObject const* searcher, AreaTrigger*& result, Check& check) + : AreaTriggerSearcherBase<Check, SearcherLastObjectResult<AreaTrigger*>>(&searcher->GetPhaseShift(), result, check) {} + }; + + template<class Check> + struct AreaTriggerListSearcher : AreaTriggerSearcherBase<Check, SearcherContainerResult<AreaTrigger*>> + { + template<typename Container> + AreaTriggerListSearcher(WorldObject const* searcher, Container& container, Check& check) + : AreaTriggerSearcherBase<Check, SearcherContainerResult<AreaTrigger*>>(&searcher->GetPhaseShift(), container, check) {} + }; + // CHECKS && DO classes // CHECK modifiers @@ -1796,6 +1836,31 @@ namespace Trinity uint32 _entry; }; + class NearestAreaTriggerEntryInObjectRangeCheck + { + public: + NearestAreaTriggerEntryInObjectRangeCheck(WorldObject const& obj, uint32 entry, float range, bool spawnedOnly = false) : i_obj(obj), i_entry(entry), i_range(range), i_spawnedOnly(spawnedOnly) { } + + bool operator()(AreaTrigger const* at) + { + if ((!i_spawnedOnly || at->IsStaticSpawn()) && at->GetEntry() == i_entry && at->GetGUID() != i_obj.GetGUID() && i_obj.IsWithinDist(at, i_range)) + { + i_range = i_obj.GetDistance(at); + return true; + } + return false; + } + + private: + WorldObject const& i_obj; + uint32 i_entry; + float i_range; + bool i_spawnedOnly; + + // prevent clone this object + NearestAreaTriggerEntryInObjectRangeCheck(NearestGameObjectEntryInObjectRangeCheck const&) = delete; + }; + // Player checks and do // Prepare using Builder localized packets with caching and send to player diff --git a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h index e3da1f69e82..536777d7647 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h +++ b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h @@ -295,6 +295,29 @@ void Trinity::PlayerSearcherBase<Check, Result>::Visit(PlayerMapType& m) } } +// AreaTrigger searchers + +template <class Check, class Result> +void Trinity::AreaTriggerSearcherBase<Check, Result>::Visit(AreaTriggerMapType& m) +{ + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) + return; + + for (GridReference<AreaTrigger> const& ref : m) + { + if (!ref.GetSource()->InSamePhase(*i_phaseShift)) + continue; + + if (i_check(ref.GetSource())) + { + this->Insert(ref.GetSource()); + + if (this->ShouldContinue() == WorldObjectSearcherContinuation::Return) + return; + } + } +} + template<typename Localizer> void Trinity::LocalizedDo<Localizer>::operator()(Player const* p) { |