Core/GridNotifiers: Added areatrigger searchers and NearestAreaTriggerEntryInObjectRangeCheck

(cherry picked from commit 8b7dce6521)
This commit is contained in:
ModoX
2025-02-06 18:57:16 +01:00
committed by Ovahlord
parent 4d0439ca1b
commit f5cf251ded
2 changed files with 88 additions and 0 deletions

View File

@@ -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

View File

@@ -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)
{