aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.cpp17
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.h1
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp2
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h31
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;
};
};