aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTraesh <Traesh@users.noreply.github.com>2023-07-18 18:42:57 +0200
committerGitHub <noreply@github.com>2023-07-18 18:42:57 +0200
commit5be076b2400364c5fc2b293032ad92f1d955ec1f (patch)
tree9b8e8b30027b18d11826c381513848cf685354c3 /src
parent7d8bc543f9277bec3db12ecde9b9025211ed1994 (diff)
Core/AreaTriggers: Handle AREATRIGGER_FLAG_HAS_DYNAMIC_SHAPE for disks (#29156)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.cpp19
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h2
2 files changed, 17 insertions, 4 deletions
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
index 8bf33886a55..fb5e3f67e49 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
+++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
@@ -562,16 +562,29 @@ void AreaTrigger::SearchUnitInCylinder(std::vector<Unit*>& targetList)
void AreaTrigger::SearchUnitInDisk(std::vector<Unit*>& targetList)
{
- SearchUnits(targetList, GetMaxSearchRadius(), false);
-
float innerRadius = _shape.DiskDatas.InnerRadius;
+ float outerRadius = _shape.DiskDatas.OuterRadius;
float height = _shape.DiskDatas.Height;
+
+ if (GetTemplate() && GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_DYNAMIC_SHAPE))
+ {
+ float progress = GetProgress();
+ if (GetCreateProperties()->MorphCurveId)
+ progress = sDB2Manager.GetCurveValueAt(GetCreateProperties()->MorphCurveId, progress);
+
+ innerRadius = G3D::lerp(_shape.DiskDatas.InnerRadius, _shape.DiskDatas.InnerRadiusTarget, progress);
+ outerRadius = G3D::lerp(_shape.DiskDatas.OuterRadius, _shape.DiskDatas.OuterRadiusTarget, progress);
+ height = G3D::lerp(_shape.DiskDatas.Height, _shape.DiskDatas.HeightTarget, progress);
+ }
+
+ SearchUnits(targetList, outerRadius, false);
+
float minZ = GetPositionZ() - height;
float maxZ = GetPositionZ() + height;
targetList.erase(std::remove_if(targetList.begin(), targetList.end(), [this, innerRadius, minZ, maxZ](Unit const* unit) -> bool
{
- return unit->IsInDist2d(this, innerRadius) || unit->GetPositionZ() < minZ || unit->GetPositionZ() > maxZ;
+ return unit->IsInDist2d(this, innerRadius) || unit->GetPositionZ() < minZ || unit->GetPositionZ() > maxZ;
}), targetList.end());
}
diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h
index 8485944a4fa..fdccc07a420 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h
+++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h
@@ -31,7 +31,7 @@
enum AreaTriggerFlags
{
AREATRIGGER_FLAG_HAS_ABSOLUTE_ORIENTATION = 0x00001, // NYI
- AREATRIGGER_FLAG_HAS_DYNAMIC_SHAPE = 0x00002, // Implemented for Spheres
+ AREATRIGGER_FLAG_HAS_DYNAMIC_SHAPE = 0x00002, // Implemented for Spheres & Disks
AREATRIGGER_FLAG_HAS_ATTACHED = 0x00004,
AREATRIGGER_FLAG_HAS_FACE_MOVEMENT_DIR = 0x00008,
AREATRIGGER_FLAG_HAS_FOLLOWS_TERRAIN = 0x00010, // NYI