Core/AreaTriggers: Fixed areatrigger spline duration calculation

This commit is contained in:
Shauren
2025-05-29 12:53:58 +02:00
parent a37133e18f
commit 5e8adaabcc
4 changed files with 11 additions and 11 deletions

View File

@@ -347,7 +347,7 @@ void AreaTrigger::Update(uint32 diff)
{
float orientation = sDB2Manager.GetCurveValueAt(createProperties->FacingCurveId, GetProgress());
if (!GetCreateProperties() || !GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAbsoluteOrientation))
orientation += GetStationaryO();
orientation += _stationaryPosition.GetOrientation();
SetOrientation(orientation);
}
@@ -1094,8 +1094,8 @@ void AreaTrigger::InitSplines(std::vector<G3D::Vector3> const& splinePoints, Opt
_movementTime = 0;
std::unique_ptr<Movement::Spline<int32>> spline = std::make_unique<::Movement::Spline<int32>>();
spline->init_spline(splinePoints.data(), splinePoints.size(), ::Movement::SplineBase::ModeLinear, GetStationaryO());
std::unique_ptr<Movement::Spline<float>> spline = std::make_unique<::Movement::Spline<float>>();
spline->init_spline(splinePoints.data(), splinePoints.size(), ::Movement::SplineBase::ModeLinear, _stationaryPosition.GetOrientation());
spline->initLengths();
float speed = overrideSpeed.value_or(GetCreateProperties()->Speed);
@@ -1131,7 +1131,7 @@ void AreaTrigger::InitSplines(std::vector<G3D::Vector3> const& splinePoints, Opt
bool AreaTrigger::HasSplines() const
{
return std::holds_alternative<std::unique_ptr<::Movement::Spline<int32>>>(_movement);
return std::holds_alternative<std::unique_ptr<::Movement::Spline<float>>>(_movement);
}
void AreaTrigger::InitOrbit(AreaTriggerOrbitInfo const& orbit, Optional<float> overrideSpeed)
@@ -1259,7 +1259,7 @@ void AreaTrigger::UpdateSplinePosition(uint32 diff)
_movementTime += diff;
Movement::Spline<int32>& spline = *std::get<std::unique_ptr<::Movement::Spline<int32>>>(_movement);
Movement::Spline<float>& spline = **std::get_if<std::unique_ptr<::Movement::Spline<float>>>(&_movement);
if (_movementTime >= GetTimeToTarget())
{
@@ -1302,7 +1302,7 @@ void AreaTrigger::UpdateSplinePosition(uint32 diff)
G3D::Vector3 currentPosition;
spline.evaluate_percent(lastPositionIndex, percentFromLastPoint, currentPosition);
float orientation = GetStationaryO();
float orientation = _stationaryPosition.GetOrientation();
if (createProperties && createProperties->FacingCurveId)
orientation += sDB2Manager.GetCurveValueAt(createProperties->FacingCurveId, GetProgress());
@@ -1341,7 +1341,7 @@ void AreaTrigger::UpdateOverridePosition()
{
orientation = sDB2Manager.GetCurveValueAt(createProperties->FacingCurveId, GetProgress());
if (!GetCreateProperties() || !GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAbsoluteOrientation))
orientation += GetStationaryO();
orientation += _stationaryPosition.GetOrientation();
}
}

View File

@@ -155,7 +155,7 @@ class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<Area
void InitSplineOffsets(std::vector<Position> const& offsets, Optional<float> overrideSpeed = {});
void InitSplines(std::vector<G3D::Vector3> const& splinePoints, Optional<float> overrideSpeed = {});
bool HasSplines() const;
::Movement::Spline<int32> const& GetSpline() const { return *std::get<std::unique_ptr<::Movement::Spline<int32>>>(_movement); }
::Movement::Spline<float> const& GetSpline() const { return *std::get<std::unique_ptr<::Movement::Spline<float>>>(_movement); }
uint32 GetElapsedTimeForMovement() const { return GetTimeSinceCreated(); } /// @todo: research the right value, in sniffs both timers are nearly identical
void InitOrbit(AreaTriggerOrbitInfo const& orbit, Optional<float> overrideSpeed = {});
@@ -223,7 +223,7 @@ class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<Area
Position _rollPitchYaw;
Position _targetRollPitchYaw;
std::vector<Position> _polygonVertices;
std::variant<std::monostate, std::unique_ptr<::Movement::Spline<int32>>, std::unique_ptr<AreaTriggerOrbitInfo>> _movement;
std::variant<std::monostate, std::unique_ptr<::Movement::Spline<float>>, std::unique_ptr<AreaTriggerOrbitInfo>> _movement;
bool _reachedDestination;
int32 _lastSplineIndex;

View File

@@ -513,7 +513,7 @@ void CommonMovement::WriteCreateObjectSplineDataBlock(::Movement::MoveSpline con
}
}
void CommonMovement::WriteCreateObjectAreaTriggerSpline(::Movement::Spline<int32> const& spline, ByteBuffer& data)
void CommonMovement::WriteCreateObjectAreaTriggerSpline(::Movement::Spline<float> const& spline, ByteBuffer& data)
{
data << BitsSize<16>(spline.getPoints());
data.append(reinterpret_cast<float const*>(spline.getPoints().data()), spline.getPoints().size() * 3);

View File

@@ -148,7 +148,7 @@ namespace WorldPackets
{
public:
static void WriteCreateObjectSplineDataBlock(::Movement::MoveSpline const& moveSpline, ByteBuffer& data);
static void WriteCreateObjectAreaTriggerSpline(::Movement::Spline<int32> const& spline, ByteBuffer& data);
static void WriteCreateObjectAreaTriggerSpline(::Movement::Spline<float> const& spline, ByteBuffer& data);
static void WriteMovementForceWithDirection(MovementForce const& movementForce, ByteBuffer& data, Position const* objectPosition = nullptr);
};