diff options
author | ModoX <moardox@gmail.com> | 2025-02-06 18:57:16 +0100 |
---|---|---|
committer | Ovahlord <dreadkiller@gmx.de> | 2025-02-08 22:05:34 +0100 |
commit | f5cf251dede854de8da2e73fe5fed994c18c616d (patch) | |
tree | 2c490484d83bd4f484185d562022e2a5e3ad6547 | |
parent | 4d0439ca1beed71271f0e486506fb89b9c4ca5dc (diff) |
Core/GridNotifiers: Added areatrigger searchers and NearestAreaTriggerEntryInObjectRangeCheck
(cherry picked from commit 8b7dce6521323e788ebf28297ec941a6f9bf876f)
-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) { |