diff options
author | Traesh <Traesh@users.noreply.github.com> | 2023-07-18 18:42:57 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-18 18:42:57 +0200 |
commit | 5be076b2400364c5fc2b293032ad92f1d955ec1f (patch) | |
tree | 9b8e8b30027b18d11826c381513848cf685354c3 | |
parent | 7d8bc543f9277bec3db12ecde9b9025211ed1994 (diff) |
Core/AreaTriggers: Handle AREATRIGGER_FLAG_HAS_DYNAMIC_SHAPE for disks (#29156)
-rw-r--r-- | src/server/game/Entities/AreaTrigger/AreaTrigger.cpp | 19 | ||||
-rw-r--r-- | src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h | 2 |
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 |