diff options
author | Shauren <shauren.trinity@gmail.com> | 2025-09-11 19:23:54 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2025-09-11 19:23:54 +0200 |
commit | b6acd368e0bca632d8742c9b5d0ef7f385cf1318 (patch) | |
tree | 3bc9f2915fe49398c38b81882409f4aec29c7a7d /src/server | |
parent | 4453b8867df6a6a41fb4eca0604a10b548553dcd (diff) |
Core/AreaTriggers: Remove unused fields from AreaTriggerCreateProperties and merge movement data into a variant
Diffstat (limited to 'src/server')
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; } |