diff options
| author | Shauren <shauren.trinity@gmail.com> | 2022-11-05 01:06:10 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2022-11-05 01:06:10 +0100 |
| commit | 6856b248836205f3567d27848541859b93d93469 (patch) | |
| tree | 732608ced7c343c9e115ce6c381b7a39437f2faf /src | |
| parent | 5a270a8217632f8b9d6a9192dc644686d37d1df5 (diff) | |
Core/AreaTriggers: Implemented new areatrigger type: bounded plane
Diffstat (limited to 'src')
4 files changed, 40 insertions, 11 deletions
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp index 1abd77ffb7c..9e293f9a31e 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp @@ -380,6 +380,9 @@ void AreaTrigger::UpdateTargetList() case AREATRIGGER_TYPE_DISK: SearchUnitInDisk(targetList); break; + case AREATRIGGER_TYPE_BOUNDED_PLANE: + SearchUnitInBoundedPlane(targetList); + break; default: break; } @@ -490,6 +493,20 @@ void AreaTrigger::SearchUnitInDisk(std::vector<Unit*>& targetList) }), targetList.end()); } +void AreaTrigger::SearchUnitInBoundedPlane(std::vector<Unit*>& targetList) +{ + SearchUnits(targetList, GetMaxSearchRadius(), false); + + Position const& boxCenter = GetPosition(); + float extentsX = _shape.BoxDatas.Extents[0]; + float extentsY = _shape.BoxDatas.Extents[1]; + + targetList.erase(std::remove_if(targetList.begin(), targetList.end(), [boxCenter, extentsX, extentsY](Unit const* unit) -> bool + { + return !unit->IsWithinBox(boxCenter, extentsX, extentsY, MAP_SIZE); + }), targetList.end()); +} + void AreaTrigger::HandleUnitEnterExit(std::vector<Unit*> const& newTargetList) { GuidUnorderedSet exitUnits(std::move(_insideUnits)); diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.h b/src/server/game/Entities/AreaTrigger/AreaTrigger.h index 73037a2b64d..34058e2533e 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.h +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.h @@ -141,6 +141,7 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge void SearchUnitInPolygon(std::vector<Unit*>& targetList); void SearchUnitInCylinder(std::vector<Unit*>& targetList); void SearchUnitInDisk(std::vector<Unit*>& targetList); + void SearchUnitInBoundedPlane(std::vector<Unit*>& targetList); bool CheckIsInPolygon2D(Position const* pos) const; void HandleUnitEnterExit(std::vector<Unit*> const& targetList); diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp index 322a0bf44d6..f89535f638b 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp @@ -44,6 +44,8 @@ float AreaTriggerShapeInfo::GetMaxSearchRadius() const return std::max(CylinderDatas.Radius, CylinderDatas.RadiusTarget); case AREATRIGGER_TYPE_DISK: return std::max(DiskDatas.OuterRadius, DiskDatas.OuterRadiusTarget); + case AREATRIGGER_TYPE_BOUNDED_PLANE: + return std::sqrt(BoundedPlaneDatas.Extents[0] * BoundedPlaneDatas.Extents[0] / 4 + BoundedPlaneDatas.Extents[1] * BoundedPlaneDatas.Extents[1] / 4); default: break; } diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h index 46e79be387f..5ae1f7fba25 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h +++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h @@ -45,12 +45,13 @@ enum AreaTriggerFlags enum AreaTriggerTypes { - AREATRIGGER_TYPE_SPHERE = 0, - AREATRIGGER_TYPE_BOX = 1, - AREATRIGGER_TYPE_UNK = 2, - AREATRIGGER_TYPE_POLYGON = 3, - AREATRIGGER_TYPE_CYLINDER = 4, - AREATRIGGER_TYPE_DISK = 5, + AREATRIGGER_TYPE_SPHERE = 0, + AREATRIGGER_TYPE_BOX = 1, + AREATRIGGER_TYPE_UNK = 2, + AREATRIGGER_TYPE_POLYGON = 3, + AREATRIGGER_TYPE_CYLINDER = 4, + AREATRIGGER_TYPE_DISK = 5, + AREATRIGGER_TYPE_BOUNDED_PLANE = 6, AREATRIGGER_TYPE_MAX }; @@ -120,11 +121,12 @@ struct AreaTriggerShapeInfo { AreaTriggerShapeInfo(); - bool IsSphere() const { return Type == AREATRIGGER_TYPE_SPHERE; } - bool IsBox() const { return Type == AREATRIGGER_TYPE_BOX; } - bool IsPolygon() const { return Type == AREATRIGGER_TYPE_POLYGON; } - bool IsCylinder() const { return Type == AREATRIGGER_TYPE_CYLINDER; } - bool IsDisk() const { return Type == AREATRIGGER_TYPE_DISK; } + bool IsSphere() const { return Type == AREATRIGGER_TYPE_SPHERE; } + bool IsBox() const { return Type == AREATRIGGER_TYPE_BOX; } + bool IsPolygon() const { return Type == AREATRIGGER_TYPE_POLYGON; } + bool IsCylinder() const { return Type == AREATRIGGER_TYPE_CYLINDER; } + bool IsDisk() const { return Type == AREATRIGGER_TYPE_DISK; } + bool IsBoudedPlane() const { return Type == AREATRIGGER_TYPE_BOUNDED_PLANE; } float GetMaxSearchRadius() const; AreaTriggerTypes Type; @@ -180,6 +182,13 @@ struct AreaTriggerShapeInfo float LocationZOffset; float LocationZOffsetTarget; } DiskDatas; + + // AREATRIGGER_TYPE_BOUNDED_PLANE + struct + { + float Extents[2]; + float ExtentsTarget[2]; + } BoundedPlaneDatas; }; }; |
