Core/AreaTriggers: Use Optional<bool> for speedIsTime argument in movement functions

This commit is contained in:
Shauren
2025-09-13 12:14:39 +02:00
parent 90f74f48fe
commit dcf9fc5ae5
2 changed files with 14 additions and 10 deletions

View File

@@ -252,10 +252,10 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti
else
orbit.Center = pos;
this->InitOrbit(orbit, {}, GetCreateProperties()->SpeedIsTime);
this->InitOrbit(orbit);
}
else if constexpr (std::is_same_v<MovementType, AreaTriggerCreateProperties::SplineInfo>)
this->InitSplineOffsets(movement, {}, GetCreateProperties()->SpeedIsTime);
this->InitSplineOffsets(movement);
else if constexpr (std::is_same_v<MovementType, std::monostate>)
this->SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::PathType), int32(AreaTriggerPathType::None));
else
@@ -1195,7 +1195,7 @@ void AreaTrigger::UndoActions(Unit* unit)
}
}
void AreaTrigger::InitSplineOffsets(std::vector<Position> const& offsets, Optional<float> overrideSpeed /*= {}*/, bool speedIsTimeInSeconds /*= false*/)
void AreaTrigger::InitSplineOffsets(std::vector<Position> const& offsets, Optional<float> overrideSpeed /*= {}*/, Optional<bool> speedIsTimeInSeconds /*= {}*/)
{
float angleSin = std::sin(GetOrientation());
float angleCos = std::cos(GetOrientation());
@@ -1217,7 +1217,7 @@ void AreaTrigger::InitSplineOffsets(std::vector<Position> const& offsets, Option
InitSplines(rotatedPoints, overrideSpeed, speedIsTimeInSeconds);
}
void AreaTrigger::InitSplines(std::vector<G3D::Vector3> const& splinePoints, Optional<float> overrideSpeed /*= {}*/, bool speedIsTimeInSeconds /*= false*/)
void AreaTrigger::InitSplines(std::vector<G3D::Vector3> const& splinePoints, Optional<float> overrideSpeed /*= {}*/, Optional<bool> speedIsTimeInSeconds /*= {}*/)
{
if (splinePoints.size() < 2)
return;
@@ -1230,7 +1230,9 @@ void AreaTrigger::InitSplines(std::vector<G3D::Vector3> const& splinePoints, Opt
if (speed <= 0.0f)
speed = 1.0f;
uint32 timeToTarget = (speedIsTimeInSeconds ? speed : spline->length() / speed) * static_cast<float>(IN_MILLISECONDS);
uint32 timeToTarget = (speedIsTimeInSeconds.value_or(GetCreateProperties()->SpeedIsTime)
? speed
: spline->length() / speed) * static_cast<float>(IN_MILLISECONDS);
auto areaTriggerData = m_values.ModifyValue(&AreaTrigger::m_areaTriggerData);
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::TimeToTarget), timeToTarget);
@@ -1256,7 +1258,7 @@ uint32 AreaTrigger::GetElapsedTimeForMovement() const
return 0;
}
void AreaTrigger::InitOrbit(AreaTriggerOrbitInfo const& orbit, Optional<float> overrideSpeed /*= {}*/, bool speedIsTimeInSeconds /*= false*/)
void AreaTrigger::InitOrbit(AreaTriggerOrbitInfo const& orbit, Optional<float> overrideSpeed /*= {}*/, Optional<bool> speedIsTimeInSeconds /*= {}*/)
{
// Circular movement requires either a center position or an attached unit
ASSERT(orbit.Center.has_value() || orbit.PathTarget.has_value());
@@ -1265,7 +1267,9 @@ void AreaTrigger::InitOrbit(AreaTriggerOrbitInfo const& orbit, Optional<float> o
if (speed <= 0.0f)
speed = 1.0f;
uint32 timeToTarget = (speedIsTimeInSeconds ? speed : static_cast<uint32>(orbit.Radius * 2.0f * static_cast<float>(M_PI) / speed)) * static_cast<float>(IN_MILLISECONDS);
uint32 timeToTarget = (speedIsTimeInSeconds.value_or(GetCreateProperties()->SpeedIsTime)
? speed
: static_cast<uint32>(orbit.Radius * 2.0f * static_cast<float>(M_PI) / speed)) * static_cast<float>(IN_MILLISECONDS);
auto areaTriggerData = m_values.ModifyValue(&AreaTrigger::m_areaTriggerData);
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::TimeToTarget), timeToTarget);

View File

@@ -180,13 +180,13 @@ class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<Area
void SetShape(AreaTriggerShapeInfo const& shape);
float GetMaxSearchRadius() const;
void InitSplineOffsets(std::vector<Position> const& offsets, Optional<float> overrideSpeed = {}, bool speedIsTimeInSeconds = false);
void InitSplines(std::vector<G3D::Vector3> const& splinePoints, Optional<float> overrideSpeed = {}, bool speedIsTimeInSeconds = false);
void InitSplineOffsets(std::vector<Position> const& offsets, Optional<float> overrideSpeed = {}, Optional<bool> speedIsTimeInSeconds = {});
void InitSplines(std::vector<G3D::Vector3> const& splinePoints, Optional<float> overrideSpeed = {}, Optional<bool> speedIsTimeInSeconds = {});
bool HasSplines() const { return _spline != nullptr; }
::Movement::Spline<float> const& GetSpline() const { return *_spline; }
uint32 GetElapsedTimeForMovement() const;
void InitOrbit(AreaTriggerOrbitInfo const& orbit, Optional<float> overrideSpeed = {}, bool speedIsTimeInSeconds = false);
void InitOrbit(AreaTriggerOrbitInfo const& orbit, Optional<float> overrideSpeed = {}, Optional<bool> speedIsTimeInSeconds = {});
bool HasOrbit() const { return m_areaTriggerData->PathData.Is<UF::AreaTriggerOrbit>(); }
UF::AreaTriggerOrbit const& GetOrbit() const { return *m_areaTriggerData->PathData.Get<UF::AreaTriggerOrbit>(); }