aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorModoX <moardox@gmail.com>2025-02-06 18:57:16 +0100
committerOvahlord <dreadkiller@gmx.de>2025-02-08 22:05:34 +0100
commitf5cf251dede854de8da2e73fe5fed994c18c616d (patch)
tree2c490484d83bd4f484185d562022e2a5e3ad6547
parent4d0439ca1beed71271f0e486506fb89b9c4ca5dc (diff)
Core/GridNotifiers: Added areatrigger searchers and NearestAreaTriggerEntryInObjectRangeCheck
(cherry picked from commit 8b7dce6521323e788ebf28297ec941a6f9bf876f)
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiers.h65
-rw-r--r--src/server/game/Grids/Notifiers/GridNotifiersImpl.h23
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)
{