mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Core/AreaTriggers: Fixed areatrigger spline duration calculation
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user