diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/AreaTrigger/AreaTrigger.cpp | 58 | ||||
-rw-r--r-- | src/server/game/Entities/AreaTrigger/AreaTrigger.h | 11 |
2 files changed, 38 insertions, 31 deletions
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp index 2e9d2a2daf9..7d170c5da91 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp @@ -329,7 +329,7 @@ float AreaTrigger::GetProgress() const void AreaTrigger::UpdateTargetList() { - std::list<Unit*> targetList; + std::vector<Unit*> targetList; switch (GetTemplate()->Type) { @@ -352,7 +352,22 @@ void AreaTrigger::UpdateTargetList() HandleUnitEnterExit(targetList); } -void AreaTrigger::SearchUnitInSphere(std::list<Unit*>& targetList) +void AreaTrigger::SearchUnits(std::vector<Unit*>& targetList, float radius, bool check3D) +{ + Trinity::AnyUnitInObjectRangeCheck check(this, radius, check3D); + if (IsServerSide()) + { + Trinity::PlayerListSearcher<Trinity::AnyUnitInObjectRangeCheck> searcher(this, targetList, check); + Cell::VisitWorldObjects(this, searcher, GetTemplate()->MaxSearchRadius); + } + else + { + Trinity::UnitListSearcher<Trinity::AnyUnitInObjectRangeCheck> searcher(this, targetList, check); + Cell::VisitAllObjects(this, searcher, GetTemplate()->MaxSearchRadius); + } +} + +void AreaTrigger::SearchUnitInSphere(std::vector<Unit*>& targetList) { float radius = GetTemplate()->SphereDatas.Radius; if (GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_DYNAMIC_SHAPE)) @@ -365,20 +380,16 @@ void AreaTrigger::SearchUnitInSphere(std::list<Unit*>& targetList) } } - Trinity::AnyUnitInObjectRangeCheck check(this, radius); - Trinity::UnitListSearcher<Trinity::AnyUnitInObjectRangeCheck> searcher(this, targetList, check); - Cell::VisitAllObjects(this, searcher, GetTemplate()->MaxSearchRadius); + SearchUnits(targetList, radius, true); } -void AreaTrigger::SearchUnitInBox(std::list<Unit*>& targetList) +void AreaTrigger::SearchUnitInBox(std::vector<Unit*>& targetList) { float extentsX = GetTemplate()->BoxDatas.Extents[0]; float extentsY = GetTemplate()->BoxDatas.Extents[1]; float extentsZ = GetTemplate()->BoxDatas.Extents[2]; - Trinity::AnyUnitInObjectRangeCheck check(this, GetTemplate()->MaxSearchRadius, false); - Trinity::UnitListSearcher<Trinity::AnyUnitInObjectRangeCheck> searcher(this, targetList, check); - Cell::VisitAllObjects(this, searcher, GetTemplate()->MaxSearchRadius); + SearchUnits(targetList, GetTemplate()->MaxSearchRadius, false); float halfExtentsX = extentsX / 2.0f; float halfExtentsY = extentsY / 2.0f; @@ -395,51 +406,46 @@ void AreaTrigger::SearchUnitInBox(std::list<Unit*>& targetList) G3D::AABox const box({ minX, minY, minZ }, { maxX, maxY, maxZ }); - targetList.remove_if([&box](Unit* unit) -> bool + targetList.erase(std::remove_if(targetList.begin(), targetList.end(), [&box](Unit* unit) -> bool { return !box.contains({ unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ() }); - }); + }), targetList.end()); } -void AreaTrigger::SearchUnitInPolygon(std::list<Unit*>& targetList) +void AreaTrigger::SearchUnitInPolygon(std::vector<Unit*>& targetList) { - Trinity::AnyUnitInObjectRangeCheck check(this, GetTemplate()->MaxSearchRadius, false); - Trinity::UnitListSearcher<Trinity::AnyUnitInObjectRangeCheck> searcher(this, targetList, check); - Cell::VisitAllObjects(this, searcher, GetTemplate()->MaxSearchRadius); + SearchUnits(targetList, GetTemplate()->MaxSearchRadius, false); float height = GetTemplate()->PolygonDatas.Height; float minZ = GetPositionZ() - height; float maxZ = GetPositionZ() + height; - targetList.remove_if([this, minZ, maxZ](Unit* unit) -> bool + targetList.erase(std::remove_if(targetList.begin(), targetList.end(), [this, minZ, maxZ](Unit* unit) -> bool { return !CheckIsInPolygon2D(unit) || unit->GetPositionZ() < minZ || unit->GetPositionZ() > maxZ; - }); + }), targetList.end()); } -void AreaTrigger::SearchUnitInCylinder(std::list<Unit*>& targetList) +void AreaTrigger::SearchUnitInCylinder(std::vector<Unit*>& targetList) { - Trinity::AnyUnitInObjectRangeCheck check(this, GetTemplate()->MaxSearchRadius, false); - Trinity::UnitListSearcher<Trinity::AnyUnitInObjectRangeCheck> searcher(this, targetList, check); - Cell::VisitAllObjects(this, searcher, GetTemplate()->MaxSearchRadius); + SearchUnits(targetList, GetTemplate()->MaxSearchRadius, false); float height = GetTemplate()->CylinderDatas.Height; float minZ = GetPositionZ() - height; float maxZ = GetPositionZ() + height; - targetList.remove_if([minZ, maxZ](Unit* unit) -> bool + targetList.erase(std::remove_if(targetList.begin(), targetList.end(), [minZ, maxZ](Unit* unit) -> bool { return unit->GetPositionZ() < minZ || unit->GetPositionZ() > maxZ; - }); + }), targetList.end()); } -void AreaTrigger::HandleUnitEnterExit(std::list<Unit*> const& newTargetList) +void AreaTrigger::HandleUnitEnterExit(std::vector<Unit*> const& newTargetList) { - GuidUnorderedSet exitUnits = _insideUnits; - _insideUnits.clear(); + GuidUnorderedSet exitUnits(std::move(_insideUnits)); std::vector<Unit*> enteringUnits; diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.h b/src/server/game/Entities/AreaTrigger/AreaTrigger.h index ec70245d0c4..f0f41a44f09 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.h +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.h @@ -118,12 +118,13 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge float GetProgress() const; void UpdateTargetList(); - void SearchUnitInSphere(std::list<Unit*>& targetList); - void SearchUnitInBox(std::list<Unit*>& targetList); - void SearchUnitInPolygon(std::list<Unit*>& targetList); - void SearchUnitInCylinder(std::list<Unit*>& targetList); + void SearchUnits(std::vector<Unit*>& targetList, float radius, bool check3D); + void SearchUnitInSphere(std::vector<Unit*>& targetList); + void SearchUnitInBox(std::vector<Unit*>& targetList); + void SearchUnitInPolygon(std::vector<Unit*>& targetList); + void SearchUnitInCylinder(std::vector<Unit*>& targetList); bool CheckIsInPolygon2D(Position const* pos) const; - void HandleUnitEnterExit(std::list<Unit*> const& targetList); + void HandleUnitEnterExit(std::vector<Unit*> const& targetList); void DoActions(Unit* unit); void UndoActions(Unit* unit); |