aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.cpp59
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.h11
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp13
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h25
-rw-r--r--src/server/game/Globals/AreaTriggerDataStore.cpp47
5 files changed, 68 insertions, 87 deletions
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
index f4a556df130..50edf530586 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
+++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
@@ -176,8 +176,7 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti
if (IsServerSide())
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::DecalPropertiesID), 24); // Blue decal, for .debug areatrigger visibility
- AreaTriggerScaleCurveTemplate const extraScaleCurve = IsStaticSpawn() ? AreaTriggerScaleCurveTemplate() : *GetCreateProperties()->ExtraScale;
- SetScaleCurve(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ExtraScaleCurve), extraScaleCurve);
+ SetScaleCurve(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ExtraScaleCurve), 1.0f);
if (caster)
{
@@ -188,7 +187,7 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti
modOwner->GetSpellModValues(spellInfo, SpellModOp::Radius, spell, *m_areaTriggerData->BoundsRadius2D, &flat, &multiplier);
if (multiplier != 1.0f)
{
- AreaTriggerScaleCurveTemplate overrideScale;
+ ScaleCurveData overrideScale;
overrideScale.Curve = multiplier;
SetScaleCurve(areaTriggerData.ModifyValue(&UF::AreaTriggerData::OverrideScaleCurve), overrideScale);
}
@@ -243,22 +242,25 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti
UpdateShape();
- if (GetCreateProperties()->OrbitInfo)
+ std::visit([&]<typename MovementType>(MovementType const& movement)
{
- AreaTriggerOrbitInfo orbit = *GetCreateProperties()->OrbitInfo;
- if (target && HasAreaTriggerFlag(AreaTriggerFieldFlags::Attached))
- orbit.PathTarget = target->GetGUID();
- else
- orbit.Center = pos;
+ if constexpr (std::is_same_v<MovementType, AreaTriggerOrbitInfo>)
+ {
+ AreaTriggerOrbitInfo orbit = movement;
+ if (target && HasAreaTriggerFlag(AreaTriggerFieldFlags::Attached))
+ orbit.PathTarget = target->GetGUID();
+ else
+ orbit.Center = pos;
- InitOrbit(orbit, GetCreateProperties()->Speed);
- }
- else if (GetCreateProperties()->HasSplines())
- {
- InitSplineOffsets(GetCreateProperties()->SplinePoints);
- }
- else
- SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::PathType), int32(AreaTriggerPathType::None));
+ this->InitOrbit(orbit, GetCreateProperties()->Speed);
+ }
+ else if constexpr (std::is_same_v<MovementType, AreaTriggerCreateProperties::SplineInfo>)
+ this->InitSplineOffsets(movement);
+ else if constexpr (std::is_same_v<MovementType, std::monostate>)
+ this->SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::PathType), int32(AreaTriggerPathType::None));
+ else
+ static_assert(Trinity::dependant_false_v<MovementType>, "Unsupported movement type");
+ }, GetCreateProperties()->Movement);
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::Facing), _stationaryPosition.GetOrientation());
@@ -551,7 +553,7 @@ float AreaTrigger::GetScaleCurveValue(UF::ScaleCurve const& scaleCurve, uint32 t
void AreaTrigger::SetScaleCurve(UF::MutableFieldReference<UF::ScaleCurve, false> scaleCurveMutator, float constantValue)
{
- AreaTriggerScaleCurveTemplate curveTemplate;
+ ScaleCurveData curveTemplate;
curveTemplate.Curve = constantValue;
SetScaleCurve(scaleCurveMutator, curveTemplate);
}
@@ -559,13 +561,10 @@ void AreaTrigger::SetScaleCurve(UF::MutableFieldReference<UF::ScaleCurve, false>
void AreaTrigger::SetScaleCurve(UF::MutableFieldReference<UF::ScaleCurve, false> scaleCurveMutator, std::array<DBCPosition2D, 2> const& points,
Optional<uint32> startTimeOffset, CurveInterpolationMode interpolation)
{
- AreaTriggerScaleCurvePointsTemplate curve;
- curve.Mode = interpolation;
- curve.Points = points;
-
- AreaTriggerScaleCurveTemplate curveTemplate;
+ ScaleCurveData curveTemplate;
curveTemplate.StartTimeOffset = startTimeOffset.value_or(GetTimeSinceCreated());
- curveTemplate.Curve = curve;
+ curveTemplate.Mode = interpolation;
+ curveTemplate.Curve = points;
SetScaleCurve(scaleCurveMutator, curveTemplate);
}
@@ -575,7 +574,7 @@ void AreaTrigger::ClearScaleCurve(UF::MutableFieldReference<UF::ScaleCurve, fals
SetScaleCurve(scaleCurveMutator, {});
}
-void AreaTrigger::SetScaleCurve(UF::MutableFieldReference<UF::ScaleCurve, false> scaleCurveMutator, Optional<AreaTriggerScaleCurveTemplate> const& curve)
+void AreaTrigger::SetScaleCurve(UF::MutableFieldReference<UF::ScaleCurve, false> scaleCurveMutator, Optional<ScaleCurveData> const& curve)
{
if (!curve)
{
@@ -602,10 +601,10 @@ void AreaTrigger::SetScaleCurve(UF::MutableFieldReference<UF::ScaleCurve, false>
for (std::size_t i = 0; i < UF::size<decltype(UF::ScaleCurve::Points)>(); ++i)
SetUpdateFieldValue(scaleCurveMutator.ModifyValue(&UF::ScaleCurve::Points, i), point);
}
- else if (AreaTriggerScaleCurvePointsTemplate const* curvePoints = std::get_if<AreaTriggerScaleCurvePointsTemplate>(&curve->Curve))
+ else if (ScaleCurveData::Points const* curvePoints = std::get_if<ScaleCurveData::Points>(&curve->Curve))
{
- CurveInterpolationMode mode = curvePoints->Mode;
- if (curvePoints->Points[1].X < curvePoints->Points[0].X)
+ CurveInterpolationMode mode = curve->Mode;
+ if ((*curvePoints)[1].X < (*curvePoints)[0].X)
mode = CurveInterpolationMode::Constant;
switch (mode)
@@ -631,9 +630,9 @@ void AreaTrigger::SetScaleCurve(UF::MutableFieldReference<UF::ScaleCurve, false>
uint32 packedCurve = (uint32(mode) << 1) | (pointCount << 24);
SetUpdateFieldValue(scaleCurveMutator.ModifyValue(&UF::ScaleCurve::ParameterCurve), packedCurve);
- for (std::size_t i = 0; i < curvePoints->Points.size(); ++i)
+ for (std::size_t i = 0; i < curvePoints->size(); ++i)
{
- point.Relocate(curvePoints->Points[i].X, curvePoints->Points[i].Y);
+ point.Relocate((*curvePoints)[i].X, (*curvePoints)[i].Y);
SetUpdateFieldValue(scaleCurveMutator.ModifyValue(&UF::ScaleCurve::Points, i), point);
}
}
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.h b/src/server/game/Entities/AreaTrigger/AreaTrigger.h
index bdde5676866..a28cf2d0cfe 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTrigger.h
+++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.h
@@ -203,13 +203,22 @@ class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<Area
float GetProgress() const;
+ struct ScaleCurveData
+ {
+ uint32 StartTimeOffset = 0;
+ CurveInterpolationMode Mode = CurveInterpolationMode::Linear;
+
+ using Points = std::array<DBCPosition2D, 2>;
+ std::variant<float, Points> Curve;
+ };
+
float GetScaleCurveProgress(UF::ScaleCurve const& scaleCurve, uint32 timeTo) const;
float GetScaleCurveValueAtProgress(UF::ScaleCurve const& scaleCurve, float x) const;
float GetScaleCurveValue(UF::ScaleCurve const& scaleCurve, uint32 timeTo) const;
void SetScaleCurve(UF::MutableFieldReference<UF::ScaleCurve, false> scaleCurveMutator, float constantValue);
void SetScaleCurve(UF::MutableFieldReference<UF::ScaleCurve, false> scaleCurveMutator, std::array<DBCPosition2D, 2> const& points, Optional<uint32> startTimeOffset, CurveInterpolationMode interpolation);
void ClearScaleCurve(UF::MutableFieldReference<UF::ScaleCurve, false> scaleCurveMutator);
- void SetScaleCurve(UF::MutableFieldReference<UF::ScaleCurve, false> scaleCurveMutator, Optional<AreaTriggerScaleCurveTemplate> const& curve);
+ void SetScaleCurve(UF::MutableFieldReference<UF::ScaleCurve, false> scaleCurveMutator, Optional<ScaleCurveData> const& curve);
void UpdateTargetList();
void SearchUnits(std::vector<Unit*>& targetList, float radius, bool check3D);
diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp
index aa7d6d2c930..4f4a078c78a 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp
+++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp
@@ -20,14 +20,6 @@
#include <cstring>
#include <cmath>
-AreaTriggerScaleCurvePointsTemplate::AreaTriggerScaleCurvePointsTemplate() : Mode(CurveInterpolationMode::Linear), Points()
-{
-}
-
-AreaTriggerScaleCurveTemplate::AreaTriggerScaleCurveTemplate() : StartTimeOffset(0), Curve(1.0f)
-{
-}
-
AreaTriggerShapeInfo::AreaTriggerShapeInfo()
{
Type = AreaTriggerShapeType::Max;
@@ -77,8 +69,3 @@ AreaTriggerTemplate::~AreaTriggerTemplate() = default;
AreaTriggerCreateProperties::AreaTriggerCreateProperties() = default;
AreaTriggerCreateProperties::~AreaTriggerCreateProperties() = default;
-
-bool AreaTriggerCreateProperties::HasSplines() const
-{
- return SplinePoints.size() >= 2;
-}
diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h
index 74ce4e2be79..d6a10f50364 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h
+++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h
@@ -93,22 +93,6 @@ struct AreaTriggerAction
AreaTriggerActionUserTypes TargetType;
};
-struct AreaTriggerScaleCurvePointsTemplate
-{
- AreaTriggerScaleCurvePointsTemplate();
-
- CurveInterpolationMode Mode;
- std::array<DBCPosition2D, 2> Points;
-};
-
-struct AreaTriggerScaleCurveTemplate
-{
- AreaTriggerScaleCurveTemplate();
-
- uint32 StartTimeOffset;
- std::variant<float, AreaTriggerScaleCurvePointsTemplate> Curve;
-};
-
struct AreaTriggerShapeInfo
{
AreaTriggerShapeInfo();
@@ -219,8 +203,6 @@ public:
AreaTriggerCreateProperties();
~AreaTriggerCreateProperties();
- bool HasSplines() const;
-
AreaTriggerCreatePropertiesId Id = { .Id = 0, .IsCustom = false };
AreaTriggerTemplate const* Template = nullptr;
EnumFlag<AreaTriggerCreatePropertiesFlag> Flags = AreaTriggerCreatePropertiesFlag::None;
@@ -239,14 +221,11 @@ public:
uint32 TimeToTargetScale = 0;
- Optional<AreaTriggerScaleCurveTemplate> OverrideScale;
- Optional<AreaTriggerScaleCurveTemplate> ExtraScale = Optional<AreaTriggerScaleCurveTemplate>(std::in_place);
-
AreaTriggerShapeInfo Shape;
float Speed = 1.0f;
- std::vector<Position> SplinePoints;
- Optional<AreaTriggerOrbitInfo> OrbitInfo;
+ using SplineInfo = std::vector<Position>;
+ std::variant<std::monostate, SplineInfo, AreaTriggerOrbitInfo> Movement;
uint32 ScriptId = 0;
};
diff --git a/src/server/game/Globals/AreaTriggerDataStore.cpp b/src/server/game/Globals/AreaTriggerDataStore.cpp
index a9ed6d056f9..d5c19690afb 100644
--- a/src/server/game/Globals/AreaTriggerDataStore.cpp
+++ b/src/server/game/Globals/AreaTriggerDataStore.cpp
@@ -25,6 +25,7 @@
#include "ObjectMgr.h"
#include "SpellMgr.h"
#include "Timer.h"
+#include "Types.h"
#include <cmath>
template <>
@@ -204,7 +205,7 @@ void AreaTriggerDataStore::LoadAreaTriggerTemplates()
#define VALIDATE_AND_SET_CURVE(Curve, Value) \
createProperties.Curve = Value; \
- if (createProperties.Curve && !sCurveStore.LookupEntry(createProperties.Curve)) \
+ if (createProperties.Curve && !sCurveStore.HasRecord(createProperties.Curve)) \
{ \
TC_LOG_ERROR("sql.sql", "Table `areatrigger_create_properties` has listed AreaTrigger (Id: {}, IsCustom: {}) for AreaTriggerCreatePropertiesId (Id: {}, IsCustom: {}) with invalid " #Curve " ({}), set to 0!", \
areaTriggerId.Id, uint32(areaTriggerId.IsCustom), createPropertiesId.Id, uint32(createPropertiesId.IsCustom), createProperties.Curve); \
@@ -261,7 +262,8 @@ void AreaTriggerDataStore::LoadAreaTriggerTemplates()
createProperties.Shape.PolygonVerticesTarget.clear();
}
- createProperties.SplinePoints = std::move(splinesByCreateProperties[createProperties.Id]);
+ if (std::vector<Position>* spline = Trinity::Containers::MapGetValuePtr(splinesByCreateProperties, createProperties.Id))
+ createProperties.Movement = std::move(*spline);
_areaTriggerCreateProperties[createProperties.Id] = createProperties;
}
@@ -287,17 +289,17 @@ void AreaTriggerDataStore::LoadAreaTriggerTemplates()
continue;
}
- createProperties->OrbitInfo.emplace();
+ AreaTriggerOrbitInfo& orbit = createProperties->Movement.emplace<AreaTriggerOrbitInfo>();
- createProperties->OrbitInfo->ExtraTimeForBlending = circularMovementInfoFields[2].GetInt32();
+ orbit.ExtraTimeForBlending = circularMovementInfoFields[2].GetInt32();
#define VALIDATE_AND_SET_FLOAT(Float, Value) \
- createProperties->OrbitInfo->Float = Value; \
- if (!std::isfinite(createProperties->OrbitInfo->Float)) \
+ orbit.Float = Value; \
+ if (!std::isfinite(orbit.Float)) \
{ \
TC_LOG_ERROR("sql.sql", "Table `areatrigger_create_properties_orbit` has listed areatrigger (AreaTriggerCreatePropertiesId: {}, IsCustom: {}) with invalid " #Float " ({}), set to 0!", \
- createPropertiesId.Id, uint32(createPropertiesId.IsCustom), createProperties->OrbitInfo->Float); \
- createProperties->OrbitInfo->Float = 0.0f; \
+ createPropertiesId.Id, uint32(createPropertiesId.IsCustom), orbit.Float); \
+ orbit.Float = 0.0f; \
}
VALIDATE_AND_SET_FLOAT(Radius, circularMovementInfoFields[3].GetFloat());
@@ -307,8 +309,8 @@ void AreaTriggerDataStore::LoadAreaTriggerTemplates()
#undef VALIDATE_AND_SET_FLOAT
- createProperties->OrbitInfo->CounterClockwise = circularMovementInfoFields[7].GetBool();
- createProperties->OrbitInfo->CanLoop = circularMovementInfoFields[8].GetBool();
+ orbit.CounterClockwise = circularMovementInfoFields[7].GetBool();
+ orbit.CanLoop = circularMovementInfoFields[8].GetBool();
}
while (circularMovementInfos->NextRow());
}
@@ -368,17 +370,22 @@ void AreaTriggerDataStore::LoadAreaTriggerSpawns()
continue;
}
- if (createProperties->OrbitInfo)
+ if (!std::holds_alternative<std::monostate>(createProperties->Movement))
{
- TC_LOG_ERROR("sql.sql", "Table `areatrigger` has listed AreaTriggerCreatePropertiesId (Id: {}, IsCustom: {}) with orbit info",
- createPropertiesId.Id, uint32(createPropertiesId.IsCustom));
- continue;
- }
-
- if (createProperties->HasSplines())
- {
- TC_LOG_ERROR("sql.sql", "Table `areatrigger` has listed AreaTriggerCreatePropertiesId (Id: {}, IsCustom: {}) with splines",
- createPropertiesId.Id, uint32(createPropertiesId.IsCustom));
+ std::string_view movementType = std::visit([&]<typename MovementType>(MovementType const&)
+ {
+ if constexpr (std::is_same_v<MovementType, AreaTriggerCreateProperties::SplineInfo>)
+ return "spline"sv;
+ else if constexpr (std::is_same_v<MovementType, AreaTriggerOrbitInfo>)
+ return "orbit"sv;
+ else if constexpr (std::is_same_v<MovementType, std::monostate>)
+ return ""sv;
+ else
+ static_assert(Trinity::dependant_false_v<MovementType>, "Unsupported movement type");
+ }, createProperties->Movement);
+
+ TC_LOG_ERROR("sql.sql", "Table `areatrigger` has listed AreaTriggerCreatePropertiesId (Id: {}, IsCustom: {}) with {}",
+ createPropertiesId.Id, uint32(createPropertiesId.IsCustom), movementType);
continue;
}