diff options
| author | Shauren <shauren.trinity@gmail.com> | 2022-02-24 23:16:55 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2022-02-24 23:16:55 +0100 |
| commit | 9f30afe3528441571f89cb2e1775c756774fa0cd (patch) | |
| tree | 389fbe1f77dced54fa1aeb475584951f34ff9cfe /src/server/game/Entities/AreaTrigger | |
| parent | f96c8cc39ba15d7c9f0784428b9bbcbca4665370 (diff) | |
Core/PacketIO: Updated packet structures to 9.2.0
Diffstat (limited to 'src/server/game/Entities/AreaTrigger')
4 files changed, 39 insertions, 3 deletions
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp index cd39c461f29..84d0a97af0b 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp @@ -374,6 +374,9 @@ void AreaTrigger::UpdateTargetList() case AREATRIGGER_TYPE_CYLINDER: SearchUnitInCylinder(targetList); break; + case AREATRIGGER_TYPE_DISK: + SearchUnitInDisk(targetList); + break; default: break; } @@ -469,6 +472,21 @@ void AreaTrigger::SearchUnitInCylinder(std::vector<Unit*>& targetList) }), targetList.end()); } +void AreaTrigger::SearchUnitInDisk(std::vector<Unit*>& targetList) +{ + SearchUnits(targetList, GetMaxSearchRadius(), false); + + float innerRadius = _shape.DiskDatas.InnerRadius; + float height = _shape.DiskDatas.Height; + 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; + }), 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 3ba82809ec3..ba5aaf7f69f 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.h +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.h @@ -128,6 +128,7 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge void SearchUnitInBox(std::vector<Unit*>& targetList); void SearchUnitInPolygon(std::vector<Unit*>& targetList); void SearchUnitInCylinder(std::vector<Unit*>& targetList); + void SearchUnitInDisk(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 c0a623a4b52..322a0bf44d6 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp @@ -41,7 +41,9 @@ float AreaTriggerShapeInfo::GetMaxSearchRadius() const case AREATRIGGER_TYPE_BOX: return std::sqrt(BoxDatas.Extents[0] * BoxDatas.Extents[0] / 4 + BoxDatas.Extents[1] * BoxDatas.Extents[1] / 4); case AREATRIGGER_TYPE_CYLINDER: - return CylinderDatas.Radius; + return std::max(CylinderDatas.Radius, CylinderDatas.RadiusTarget); + case AREATRIGGER_TYPE_DISK: + return std::max(DiskDatas.OuterRadius, DiskDatas.OuterRadiusTarget); default: break; } diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h index 0eb87f833d1..46e79be387f 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h +++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h @@ -24,7 +24,7 @@ #include "SpawnData.h" #include <vector> -#define MAX_AREATRIGGER_ENTITY_DATA 6 +#define MAX_AREATRIGGER_ENTITY_DATA 8 #define MAX_AREATRIGGER_SCALE 7 enum AreaTriggerFlags @@ -50,7 +50,8 @@ enum AreaTriggerTypes AREATRIGGER_TYPE_UNK = 2, AREATRIGGER_TYPE_POLYGON = 3, AREATRIGGER_TYPE_CYLINDER = 4, - AREATRIGGER_TYPE_MAX = 5 + AREATRIGGER_TYPE_DISK = 5, + AREATRIGGER_TYPE_MAX }; enum AreaTriggerActionTypes @@ -123,6 +124,7 @@ struct AreaTriggerShapeInfo 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; } float GetMaxSearchRadius() const; AreaTriggerTypes Type; @@ -165,6 +167,19 @@ struct AreaTriggerShapeInfo float LocationZOffset; float LocationZOffsetTarget; } CylinderDatas; + + // AREATRIGGER_TYPE_DISK + struct + { + float InnerRadius; + float InnerRadiusTarget; + float OuterRadius; + float OuterRadiusTarget; + float Height; + float HeightTarget; + float LocationZOffset; + float LocationZOffsetTarget; + } DiskDatas; }; }; |
