aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/AreaTrigger
diff options
context:
space:
mode:
authorTraesh <Traesh@users.noreply.github.com>2021-09-12 17:50:13 +0200
committerGitHub <noreply@github.com>2021-09-12 17:50:13 +0200
commitc60cb7bab1e85fcc33be2f6bb0178adc0216c867 (patch)
treed256397298a1c3dccb6cd8bb9ee1fcd9f0e04a17 /src/server/game/Entities/AreaTrigger
parentd9c0c062a4c684cc31408c384c513afe002999fa (diff)
Core/AreaTrigger Switch polygon vertices from Template to SpellMisc (#26827)
Diffstat (limited to 'src/server/game/Entities/AreaTrigger')
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.cpp21
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.h2
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp26
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h8
4 files changed, 37 insertions, 20 deletions
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
index 046d194efb0..870bf676b7a 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
+++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
@@ -38,7 +38,7 @@
#include "Unit.h"
#include "UpdateData.h"
-AreaTrigger::AreaTrigger() : WorldObject(false), MapObject(), _aurEff(nullptr),
+AreaTrigger::AreaTrigger() : WorldObject(false), MapObject(), _aurEff(nullptr), _maxSearchRadius(0.0f),
_duration(0), _totalDuration(0), _timeSinceCreated(0), _previousCheckOrientation(std::numeric_limits<float>::infinity()),
_isRemoved(false), _reachedDestination(true), _lastSplineIndex(0), _movementTime(0),
_areaTriggerMiscTemplate(nullptr), _areaTriggerTemplate(nullptr)
@@ -113,6 +113,11 @@ bool AreaTrigger::Create(uint32 spellMiscId, Unit* caster, Unit* target, SpellIn
SetObjectScale(1.0f);
+ if (GetTemplate()->IsPolygon())
+ _maxSearchRadius = GetMiscTemplate()->GetPolygonMaxSearchRadius();
+ else
+ _maxSearchRadius = GetTemplate()->MaxSearchRadius;
+
auto areaTriggerData = m_values.ModifyValue(&AreaTrigger::m_areaTriggerData);
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::Caster), caster->GetGUID());
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::CreatingEffectGUID), castId);
@@ -122,7 +127,7 @@ bool AreaTrigger::Create(uint32 spellMiscId, Unit* caster, Unit* target, SpellIn
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellVisual).ModifyValue(&UF::SpellCastVisual::SpellXSpellVisualID), spellVisual.SpellXSpellVisualID);
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellVisual).ModifyValue(&UF::SpellCastVisual::ScriptVisualID), spellVisual.ScriptVisualID);
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::TimeToTargetScale), GetMiscTemplate()->TimeToTargetScale != 0 ? GetMiscTemplate()->TimeToTargetScale : *m_areaTriggerData->Duration);
- SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::BoundsRadius2D), GetTemplate()->MaxSearchRadius);
+ SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::BoundsRadius2D), GetMaxSearchRadius());
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::DecalPropertiesID), GetMiscTemplate()->DecalPropertiesId);
if (GetMiscTemplate()->ExtraScale.Data.Structured.StartTimeOffset)
@@ -360,12 +365,12 @@ void AreaTrigger::SearchUnits(std::vector<Unit*>& targetList, float radius, bool
if (IsServerSide())
{
Trinity::PlayerListSearcher<Trinity::AnyUnitInObjectRangeCheck> searcher(this, targetList, check);
- Cell::VisitWorldObjects(this, searcher, GetTemplate()->MaxSearchRadius);
+ Cell::VisitWorldObjects(this, searcher, GetMaxSearchRadius());
}
else
{
Trinity::UnitListSearcher<Trinity::AnyUnitInObjectRangeCheck> searcher(this, targetList, check);
- Cell::VisitAllObjects(this, searcher, GetTemplate()->MaxSearchRadius);
+ Cell::VisitAllObjects(this, searcher, GetMaxSearchRadius());
}
}
@@ -387,7 +392,7 @@ void AreaTrigger::SearchUnitInSphere(std::vector<Unit*>& targetList)
void AreaTrigger::SearchUnitInBox(std::vector<Unit*>& targetList)
{
- SearchUnits(targetList, GetTemplate()->MaxSearchRadius, false);
+ SearchUnits(targetList, GetMaxSearchRadius(), false);
Position const& boxCenter = GetPosition();
float extentsX = GetTemplate()->BoxDatas.Extents[0];
@@ -402,7 +407,7 @@ void AreaTrigger::SearchUnitInBox(std::vector<Unit*>& targetList)
void AreaTrigger::SearchUnitInPolygon(std::vector<Unit*>& targetList)
{
- SearchUnits(targetList, GetTemplate()->MaxSearchRadius, false);
+ SearchUnits(targetList, GetMaxSearchRadius(), false);
float height = GetTemplate()->PolygonDatas.Height;
float minZ = GetPositionZ() - height;
@@ -418,7 +423,7 @@ void AreaTrigger::SearchUnitInPolygon(std::vector<Unit*>& targetList)
void AreaTrigger::SearchUnitInCylinder(std::vector<Unit*>& targetList)
{
- SearchUnits(targetList, GetTemplate()->MaxSearchRadius, false);
+ SearchUnits(targetList, GetMaxSearchRadius(), false);
float height = GetTemplate()->CylinderDatas.Height;
float minZ = GetPositionZ() - height;
@@ -516,7 +521,7 @@ void AreaTrigger::UpdatePolygonOrientation()
if (G3D::fuzzyEq(_previousCheckOrientation, newOrientation))
return;
- _polygonVertices.assign(GetTemplate()->PolygonVertices.begin(), GetTemplate()->PolygonVertices.end());
+ _polygonVertices.assign(GetMiscTemplate()->PolygonVertices.begin(), GetMiscTemplate()->PolygonVertices.end());
float angleSin = std::sin(newOrientation);
float angleCos = std::cos(newOrientation);
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.h b/src/server/game/Entities/AreaTrigger/AreaTrigger.h
index e00f8842ea6..5e60736be94 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTrigger.h
+++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.h
@@ -99,6 +99,7 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge
uint32 GetFaction() const override;
+ float GetMaxSearchRadius() const { return _maxSearchRadius; }
Position const& GetRollPitchYaw() const { return _rollPitchYaw; }
Position const& GetTargetRollPitchYaw() const { return _targetRollPitchYaw; }
void InitSplineOffsets(std::vector<Position> const& offsets, uint32 timeToTarget);
@@ -144,6 +145,7 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge
AuraEffect const* _aurEff;
+ float _maxSearchRadius;
int32 _duration;
int32 _totalDuration;
uint32 _timeSinceCreated;
diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp
index 22f51434f7e..4095037dece 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp
+++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp
@@ -56,20 +56,12 @@ void AreaTriggerTemplate::InitMaxSearchRadius()
MaxSearchRadius = std::sqrt(BoxDatas.Extents[0] * BoxDatas.Extents[0] / 4 + BoxDatas.Extents[1] * BoxDatas.Extents[1] / 4);
break;
}
+ // Polygon is SpellMisc based, can't init MaxSearchRadius
case AREATRIGGER_TYPE_POLYGON:
{
if (PolygonDatas.Height <= 0.0f)
PolygonDatas.Height = 1.0f;
- Position center(0.0f, 0.0f);
- for (TaggedPosition<Position::XY> const& vertice : PolygonVertices)
- {
- float pointDist = center.GetExactDist2d(vertice);
-
- if (pointDist > MaxSearchRadius)
- MaxSearchRadius = pointDist;
- }
-
break;
}
case AREATRIGGER_TYPE_CYLINDER:
@@ -118,3 +110,19 @@ bool AreaTriggerMiscTemplate::HasSplines() const
{
return SplinePoints.size() >= 2;
}
+
+float AreaTriggerMiscTemplate::GetPolygonMaxSearchRadius() const
+{
+ Position center(0.0f, 0.0f);
+ float maxSearchRadius = 0.0f;
+
+ for (TaggedPosition<Position::XY> const& vertice : PolygonVertices)
+ {
+ float pointDist = center.GetExactDist2d(vertice);
+
+ if (pointDist > maxSearchRadius)
+ maxSearchRadius = pointDist;
+ }
+
+ return maxSearchRadius;
+}
diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h
index 389f0e73b89..9de9356f273 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h
+++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h
@@ -150,8 +150,6 @@ public:
uint32 Flags;
uint32 ScriptId;
float MaxSearchRadius;
- std::vector<TaggedPosition<Position::XY>> PolygonVertices;
- std::vector<TaggedPosition<Position::XY>> PolygonVerticesTarget;
std::vector<AreaTriggerAction> Actions;
union
@@ -201,7 +199,8 @@ public:
AreaTriggerMiscTemplate();
~AreaTriggerMiscTemplate();
- bool HasSplines() const;
+ bool HasSplines() const;
+ float GetPolygonMaxSearchRadius() const;
uint32 MiscId;
uint32 AreaTriggerEntry;
@@ -224,6 +223,9 @@ public:
AreaTriggerOrbitInfo OrbitInfo;
AreaTriggerTemplate const* Template;
+
+ std::vector<TaggedPosition<Position::XY>> PolygonVertices;
+ std::vector<TaggedPosition<Position::XY>> PolygonVerticesTarget;
std::vector<Position> SplinePoints;
};