aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2023-10-02 00:48:09 +0200
committerShauren <shauren.trinity@gmail.com>2023-10-02 00:48:09 +0200
commit9c0bfc7c8c8af8d13378231b4b45c97f91c64a37 (patch)
treee75e890b979824ce75cb7d511dd4d0292f361f89 /src
parentc676d1477239aec4d0b235a410e5627a7070a86e (diff)
Core/AreaTriggers: Add missing null checks for serverside areatriggers
Closes #29346
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.cpp96
1 files changed, 56 insertions, 40 deletions
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
index 8ceeab3b22e..0af01e062a7 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
+++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
@@ -340,8 +340,9 @@ void AreaTrigger::Update(uint32 diff)
if (Unit* target = GetTarget())
{
float orientation = 0.0f;
- if (GetCreateProperties()->FacingCurveId)
- orientation = sDB2Manager.GetCurveValueAt(GetCreateProperties()->FacingCurveId, GetProgress());
+ if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties())
+ if (createProperties->FacingCurveId)
+ orientation = sDB2Manager.GetCurveValueAt(createProperties->FacingCurveId, GetProgress());
if (!GetTemplate() || !GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ABSOLUTE_ORIENTATION))
orientation += target->GetOrientation();
@@ -355,13 +356,16 @@ void AreaTrigger::Update(uint32 diff)
}
else
{
- if (GetCreateProperties()->FacingCurveId)
+ if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties())
{
- float orientation = sDB2Manager.GetCurveValueAt(GetCreateProperties()->FacingCurveId, GetProgress());
- if (!GetTemplate() || !GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ABSOLUTE_ORIENTATION))
- orientation += GetStationaryO();
+ if (createProperties->FacingCurveId)
+ {
+ float orientation = sDB2Manager.GetCurveValueAt(createProperties->FacingCurveId, GetProgress());
+ if (!GetTemplate() || !GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ABSOLUTE_ORIENTATION))
+ orientation += GetStationaryO();
- SetOrientation(orientation);
+ SetOrientation(orientation);
+ }
}
UpdateShape();
@@ -668,8 +672,9 @@ void AreaTrigger::SearchUnits(std::vector<Unit*>& targetList, float radius, bool
void AreaTrigger::SearchUnitInSphere(std::vector<Unit*>& targetList)
{
float progress = GetProgress();
- if (GetCreateProperties()->MorphCurveId)
- progress = sDB2Manager.GetCurveValueAt(GetCreateProperties()->MorphCurveId, progress);
+ if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties())
+ if (createProperties->MorphCurveId)
+ progress = sDB2Manager.GetCurveValueAt(createProperties->MorphCurveId, progress);
float scale = CalcCurrentScale();
float radius = G3D::lerp(_shape.SphereDatas.Radius, _shape.SphereDatas.RadiusTarget, progress) * scale;
@@ -680,8 +685,9 @@ void AreaTrigger::SearchUnitInSphere(std::vector<Unit*>& targetList)
void AreaTrigger::SearchUnitInBox(std::vector<Unit*>& targetList)
{
float progress = GetProgress();
- if (GetCreateProperties()->MorphCurveId)
- progress = sDB2Manager.GetCurveValueAt(GetCreateProperties()->MorphCurveId, progress);
+ if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties())
+ if (createProperties->MorphCurveId)
+ progress = sDB2Manager.GetCurveValueAt(createProperties->MorphCurveId, progress);
float scale = CalcCurrentScale();
float extentsX = G3D::lerp(_shape.BoxDatas.Extents[0], _shape.BoxDatas.ExtentsTarget[0], progress) * scale;
@@ -701,8 +707,9 @@ void AreaTrigger::SearchUnitInBox(std::vector<Unit*>& targetList)
void AreaTrigger::SearchUnitInPolygon(std::vector<Unit*>& targetList)
{
float progress = GetProgress();
- if (GetCreateProperties()->MorphCurveId)
- progress = sDB2Manager.GetCurveValueAt(GetCreateProperties()->MorphCurveId, progress);
+ if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties())
+ if (createProperties->MorphCurveId)
+ progress = sDB2Manager.GetCurveValueAt(createProperties->MorphCurveId, progress);
float height = G3D::lerp(_shape.PolygonDatas.Height, _shape.PolygonDatas.HeightTarget, progress);
float minZ = GetPositionZ() - height;
@@ -721,8 +728,9 @@ void AreaTrigger::SearchUnitInPolygon(std::vector<Unit*>& targetList)
void AreaTrigger::SearchUnitInCylinder(std::vector<Unit*>& targetList)
{
float progress = GetProgress();
- if (GetCreateProperties()->MorphCurveId)
- progress = sDB2Manager.GetCurveValueAt(GetCreateProperties()->MorphCurveId, progress);
+ if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties())
+ if (createProperties->MorphCurveId)
+ progress = sDB2Manager.GetCurveValueAt(createProperties->MorphCurveId, progress);
float scale = CalcCurrentScale();
float radius = G3D::lerp(_shape.CylinderDatas.Radius, _shape.CylinderDatas.RadiusTarget, progress) * scale;
@@ -745,8 +753,9 @@ void AreaTrigger::SearchUnitInCylinder(std::vector<Unit*>& targetList)
void AreaTrigger::SearchUnitInDisk(std::vector<Unit*>& targetList)
{
float progress = GetProgress();
- if (GetCreateProperties()->MorphCurveId)
- progress = sDB2Manager.GetCurveValueAt(GetCreateProperties()->MorphCurveId, progress);
+ if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties())
+ if (createProperties->MorphCurveId)
+ progress = sDB2Manager.GetCurveValueAt(createProperties->MorphCurveId, progress);
float scale = CalcCurrentScale();
float innerRadius = G3D::lerp(_shape.DiskDatas.InnerRadius, _shape.DiskDatas.InnerRadiusTarget, progress) * scale;
@@ -769,8 +778,9 @@ void AreaTrigger::SearchUnitInDisk(std::vector<Unit*>& targetList)
void AreaTrigger::SearchUnitInBoundedPlane(std::vector<Unit*>& targetList)
{
float progress = GetProgress();
- if (GetCreateProperties()->MorphCurveId)
- progress = sDB2Manager.GetCurveValueAt(GetCreateProperties()->MorphCurveId, progress);
+ if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties())
+ if (createProperties->MorphCurveId)
+ progress = sDB2Manager.GetCurveValueAt(createProperties->MorphCurveId, progress);
float scale = CalcCurrentScale();
float extentsX = G3D::lerp(_shape.BoundedPlaneDatas.Extents[0], _shape.BoundedPlaneDatas.ExtentsTarget[0], progress) * scale;
@@ -849,8 +859,8 @@ uint32 AreaTrigger::GetScriptId() const
if (_spawnId)
return ASSERT_NOTNULL(sAreaTriggerDataStore->GetAreaTriggerSpawn(_spawnId))->scriptId;
- if (GetCreateProperties())
- return GetCreateProperties()->ScriptId;
+ if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties())
+ return createProperties->ScriptId;
return 0;
}
@@ -880,23 +890,24 @@ float AreaTrigger::GetMaxSearchRadius() const
void AreaTrigger::UpdatePolygonVertices()
{
+ AreaTriggerCreateProperties const* createProperties = GetCreateProperties();
float newOrientation = GetOrientation();
// No need to recalculate, orientation didn't change
- if (G3D::fuzzyEq(_verticesUpdatePreviousOrientation, newOrientation) && GetCreateProperties()->PolygonVerticesTarget.empty())
+ if (G3D::fuzzyEq(_verticesUpdatePreviousOrientation, newOrientation) && (!createProperties || createProperties->PolygonVerticesTarget.empty()))
return;
- _polygonVertices.assign(GetCreateProperties()->PolygonVertices.begin(), GetCreateProperties()->PolygonVertices.end());
- if (!GetCreateProperties()->PolygonVerticesTarget.empty())
+ _polygonVertices.assign(createProperties->PolygonVertices.begin(), createProperties->PolygonVertices.end());
+ if (!createProperties->PolygonVerticesTarget.empty())
{
float progress = GetProgress();
- if (GetCreateProperties()->MorphCurveId)
- progress = sDB2Manager.GetCurveValueAt(GetCreateProperties()->MorphCurveId, progress);
+ if (createProperties->MorphCurveId)
+ progress = sDB2Manager.GetCurveValueAt(createProperties->MorphCurveId, progress);
for (std::size_t i = 0; i < _polygonVertices.size(); ++i)
{
Position& vertex = _polygonVertices[i];
- Position const& vertexTarget = GetCreateProperties()->PolygonVerticesTarget[i].Pos;
+ Position const& vertexTarget = createProperties->PolygonVerticesTarget[i].Pos;
vertex.m_positionX = G3D::lerp(vertex.GetPositionX(), vertexTarget.GetPositionX(), progress);
vertex.m_positionY = G3D::lerp(vertex.GetPositionY(), vertexTarget.GetPositionY(), progress);
@@ -1206,12 +1217,13 @@ Position AreaTrigger::CalculateOrbitPosition() const
if (!centerPos)
return GetPosition();
+ AreaTriggerCreateProperties const* createProperties = GetCreateProperties();
AreaTriggerOrbitInfo const& cmi = *_orbitInfo;
// AreaTrigger make exactly "Duration / TimeToTarget" loops during his life time
float pathProgress = float(cmi.ElapsedTimeForMovement) / float(cmi.TimeToTarget);
- if (GetCreateProperties()->MoveCurveId)
- pathProgress = sDB2Manager.GetCurveValueAt(GetCreateProperties()->MoveCurveId, pathProgress);
+ if (createProperties && createProperties->MoveCurveId)
+ pathProgress = sDB2Manager.GetCurveValueAt(createProperties->MoveCurveId, pathProgress);
// We already made one circle and can't loop
if (!cmi.CanLoop)
@@ -1237,8 +1249,8 @@ Position AreaTrigger::CalculateOrbitPosition() const
float z = centerPos->GetPositionZ() + cmi.ZOffset;
float orientation = 0.0f;
- if (GetCreateProperties()->FacingCurveId)
- orientation = sDB2Manager.GetCurveValueAt(GetCreateProperties()->FacingCurveId, GetProgress());
+ if (createProperties && createProperties->FacingCurveId)
+ orientation = sDB2Manager.GetCurveValueAt(createProperties->FacingCurveId, GetProgress());
if (!GetTemplate() || !GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ABSOLUTE_ORIENTATION))
{
@@ -1292,13 +1304,14 @@ void AreaTrigger::UpdateSplinePosition(uint32 diff)
if (currentTimePercent <= 0.f)
return;
- if (GetCreateProperties()->MoveCurveId)
+ AreaTriggerCreateProperties const* createProperties = GetCreateProperties();
+ if (createProperties && createProperties->MoveCurveId)
{
- float progress = sDB2Manager.GetCurveValueAt(GetCreateProperties()->MoveCurveId, currentTimePercent);
+ float progress = sDB2Manager.GetCurveValueAt(createProperties->MoveCurveId, currentTimePercent);
if (progress < 0.f || progress > 1.f)
{
TC_LOG_ERROR("entities.areatrigger", "AreaTrigger (Id: {}, AreaTriggerCreatePropertiesId: {}) has wrong progress ({}) caused by curve calculation (MoveCurveId: {})",
- GetEntry(), GetCreateProperties()->Id, progress, GetCreateProperties()->MoveCurveId);
+ GetEntry(), createProperties->Id, progress, createProperties->MoveCurveId);
}
else
currentTimePercent = progress;
@@ -1312,8 +1325,8 @@ void AreaTrigger::UpdateSplinePosition(uint32 diff)
_spline->evaluate_percent(lastPositionIndex, percentFromLastPoint, currentPosition);
float orientation = GetStationaryO();
- if (GetCreateProperties()->FacingCurveId)
- orientation += sDB2Manager.GetCurveValueAt(GetCreateProperties()->FacingCurveId, GetProgress());
+ if (createProperties && createProperties->FacingCurveId)
+ orientation += sDB2Manager.GetCurveValueAt(createProperties->FacingCurveId, GetProgress());
if (GetTemplate() && !GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ABSOLUTE_ORIENTATION) && GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_FACE_MOVEMENT_DIR))
{
@@ -1344,11 +1357,14 @@ void AreaTrigger::UpdateOverridePosition()
float z = GetScaleCurveValueAtProgress(*m_areaTriggerData->OverrideMoveCurveZ, progress);
float orientation = GetOrientation();
- if (GetCreateProperties()->FacingCurveId)
+ if (AreaTriggerCreateProperties const* createProperties = GetCreateProperties())
{
- orientation = sDB2Manager.GetCurveValueAt(GetCreateProperties()->FacingCurveId, GetProgress());
- if (!GetTemplate() || !GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ABSOLUTE_ORIENTATION))
- orientation += GetStationaryO();
+ if (createProperties->FacingCurveId)
+ {
+ orientation = sDB2Manager.GetCurveValueAt(createProperties->FacingCurveId, GetProgress());
+ if (!GetTemplate() || !GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ABSOLUTE_ORIENTATION))
+ orientation += GetStationaryO();
+ }
}
GetMap()->AreaTriggerRelocation(this, x, y, z, orientation);