aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/AreaTrigger
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-02-24 23:16:55 +0100
committerShauren <shauren.trinity@gmail.com>2022-02-24 23:16:55 +0100
commit9f30afe3528441571f89cb2e1775c756774fa0cd (patch)
tree389fbe1f77dced54fa1aeb475584951f34ff9cfe /src/server/game/Entities/AreaTrigger
parentf96c8cc39ba15d7c9f0784428b9bbcbca4665370 (diff)
Core/PacketIO: Updated packet structures to 9.2.0
Diffstat (limited to 'src/server/game/Entities/AreaTrigger')
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.cpp18
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.h1
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp4
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h19
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;
};
};