aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.cpp29
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.h10
-rw-r--r--src/server/game/Entities/Object/Object.cpp19
-rw-r--r--src/server/game/Server/Packets/AreaTriggerPackets.cpp18
-rw-r--r--src/server/game/Server/Packets/AreaTriggerPackets.h9
-rw-r--r--src/server/game/Server/Packets/MovementPackets.cpp6
-rw-r--r--src/server/game/Server/Packets/MovementPackets.h3
7 files changed, 34 insertions, 60 deletions
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
index 90874333897..e1f85a2b285 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
+++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
@@ -318,7 +318,7 @@ void AreaTrigger::Update(uint32 diff)
}
else if (HasOrbit())
{
- UpdateOrbitPosition(diff);
+ UpdateOrbitPosition(*std::get<std::unique_ptr<AreaTriggerOrbitInfo>>(_movement), diff);
}
else if (GetCreateProperties() && GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAttached))
{
@@ -337,7 +337,7 @@ void AreaTrigger::Update(uint32 diff)
}
else if (HasSplines())
{
- UpdateSplinePosition(diff);
+ UpdateSplinePosition(*std::get<std::unique_ptr<::Movement::Spline<float>>>(_movement), diff);
}
else
{
@@ -882,11 +882,6 @@ void AreaTrigger::HandleUnitEnterExit(std::vector<Unit*> const& newTargetList)
std::ranges::count_if(_insideUnits, [](ObjectGuid const& guid) { return guid.IsPlayer(); }));
}
-AreaTriggerTemplate const* AreaTrigger::GetTemplate() const
-{
- return _areaTriggerTemplate;
-}
-
uint32 AreaTrigger::GetScriptId() const
{
if (_spawnId)
@@ -1119,8 +1114,7 @@ void AreaTrigger::InitSplines(std::vector<G3D::Vector3> const& splinePoints, Opt
reshape.AreaTriggerSpline.emplace();
reshape.AreaTriggerSpline->ElapsedTimeForMovement = GetElapsedTimeForMovement();
reshape.AreaTriggerSpline->TimeToTarget = timeToTarget;
- for (G3D::Vector3 const& vec : spline->getPoints())
- reshape.AreaTriggerSpline->Points.emplace_back(vec.x, vec.y, vec.z);
+ reshape.AreaTriggerSpline->Points = spline.get();
SendMessageToSet(reshape.Write(), true);
}
@@ -1129,11 +1123,6 @@ void AreaTrigger::InitSplines(std::vector<G3D::Vector3> const& splinePoints, Opt
_movement = std::move(spline);
}
-bool AreaTrigger::HasSplines() const
-{
- return std::holds_alternative<std::unique_ptr<::Movement::Spline<float>>>(_movement);
-}
-
void AreaTrigger::InitOrbit(AreaTriggerOrbitInfo const& orbit, Optional<float> overrideSpeed)
{
// Circular movement requires either a center position or an attached unit
@@ -1165,11 +1154,6 @@ void AreaTrigger::InitOrbit(AreaTriggerOrbitInfo const& orbit, Optional<float> o
_movement = std::move(movementOrbit);
}
-bool AreaTrigger::HasOrbit() const
-{
- return std::holds_alternative<std::unique_ptr<AreaTriggerOrbitInfo>>(_movement);
-}
-
Position const* AreaTrigger::GetOrbitCenterPosition() const
{
if (!HasOrbit())
@@ -1236,9 +1220,8 @@ Position AreaTrigger::CalculateOrbitPosition() const
return { x, y, z, orientation };
}
-void AreaTrigger::UpdateOrbitPosition(uint32 /*diff*/)
+void AreaTrigger::UpdateOrbitPosition(AreaTriggerOrbitInfo& orbit, uint32 /*diff*/)
{
- AreaTriggerOrbitInfo& orbit = *std::get<std::unique_ptr<AreaTriggerOrbitInfo>>(_movement);
if (orbit.StartDelay > GetElapsedTimeForMovement())
return;
@@ -1252,15 +1235,13 @@ void AreaTrigger::UpdateOrbitPosition(uint32 /*diff*/)
#endif
}
-void AreaTrigger::UpdateSplinePosition(uint32 diff)
+void AreaTrigger::UpdateSplinePosition(Movement::Spline<float>& spline, uint32 diff)
{
if (_reachedDestination)
return;
_movementTime += diff;
- Movement::Spline<float>& spline = **std::get_if<std::unique_ptr<::Movement::Spline<float>>>(&_movement);
-
if (_movementTime >= GetTimeToTarget())
{
_reachedDestination = true;
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.h b/src/server/game/Entities/AreaTrigger/AreaTrigger.h
index fc42273f5d2..9e3c0d776ba 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTrigger.h
+++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.h
@@ -137,7 +137,7 @@ class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<Area
GuidUnorderedSet const& GetInsideUnits() const { return _insideUnits; }
AreaTriggerCreateProperties const* GetCreateProperties() const { return _areaTriggerCreateProperties; }
- AreaTriggerTemplate const* GetTemplate() const;
+ AreaTriggerTemplate const* GetTemplate() const { return _areaTriggerTemplate; }
uint32 GetScriptId() const;
ObjectGuid GetCreatorGUID() const override { return GetCasterGuid(); }
@@ -154,12 +154,12 @@ class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<Area
Position const& GetTargetRollPitchYaw() const { return _targetRollPitchYaw; }
void InitSplineOffsets(std::vector<Position> const& offsets, Optional<float> overrideSpeed = {});
void InitSplines(std::vector<G3D::Vector3> const& splinePoints, Optional<float> overrideSpeed = {});
- bool HasSplines() const;
+ bool HasSplines() const { return std::holds_alternative<std::unique_ptr<::Movement::Spline<float>>>(_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 = {});
- bool HasOrbit() const;
+ bool HasOrbit() const { return std::holds_alternative<std::unique_ptr<AreaTriggerOrbitInfo>>(_movement); }
AreaTriggerOrbitInfo const& GetOrbit() const { return *std::get<std::unique_ptr<AreaTriggerOrbitInfo>>(_movement); }
bool HasOverridePosition() const;
@@ -197,8 +197,8 @@ class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<Area
void UndoActions(Unit* unit);
void UpdatePolygonVertices();
- void UpdateOrbitPosition(uint32 diff);
- void UpdateSplinePosition(uint32 diff);
+ void UpdateOrbitPosition(AreaTriggerOrbitInfo& orbit, uint32 diff);
+ void UpdateSplinePosition(Movement::Spline<float>& spline, uint32 diff);
void UpdateOverridePosition();
Position const* GetOrbitCenterPosition() const;
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index fa03ea214e4..26e3c8585f3 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -506,7 +506,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe
if (flags.AreaTrigger)
{
- AreaTrigger const* areaTrigger = ToAreaTrigger();
+ AreaTrigger const* areaTrigger = static_cast<AreaTrigger const*>(this);
AreaTriggerCreateProperties const* createProperties = areaTrigger->GetCreateProperties();
AreaTriggerShapeInfo const& shape = areaTrigger->GetShape();
@@ -586,8 +586,6 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe
bool hasMorphCurveID = createProperties && createProperties->MorphCurveId != 0;
bool hasFacingCurveID = createProperties && createProperties->FacingCurveId != 0;
bool hasMoveCurveID = createProperties && createProperties->MoveCurveId != 0;
- bool hasAreaTriggerSpline = areaTrigger->HasSplines();
- bool hasOrbit = areaTrigger->HasOrbit();
bool hasMovementScript = false;
bool hasPositionalSoundKitID= false;
@@ -604,19 +602,14 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe
data->WriteBit(hasFacingCurveID);
data->WriteBit(hasMoveCurveID);
data->WriteBit(hasPositionalSoundKitID);
- data->WriteBit(hasAreaTriggerSpline);
- data->WriteBit(hasOrbit);
+ data->WriteBit(areaTrigger->HasSplines());
+ data->WriteBit(areaTrigger->HasOrbit());
data->WriteBit(hasMovementScript);
data->FlushBits();
- if (hasAreaTriggerSpline)
- {
- *data << uint32(areaTrigger->GetTimeToTarget());
- *data << uint32(areaTrigger->GetElapsedTimeForMovement());
-
- WorldPackets::Movement::CommonMovement::WriteCreateObjectAreaTriggerSpline(areaTrigger->GetSpline(), *data);
- }
+ if (areaTrigger->HasSplines())
+ WorldPackets::AreaTrigger::WriteAreaTriggerSpline(*data, areaTrigger->GetTimeToTarget(), areaTrigger->GetElapsedTimeForMovement(), areaTrigger->GetSpline());
if (hasTargetRollPitchYaw)
*data << areaTrigger->GetTargetRollPitchYaw().PositionXYZStream();
@@ -639,7 +632,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe
//if (hasMovementScript)
// *data << *areaTrigger->GetMovementScript(); // AreaTriggerMovementScriptInfo
- if (hasOrbit)
+ if (areaTrigger->HasOrbit())
{
using WorldPackets::AreaTrigger::operator<<;
*data << areaTrigger->GetOrbit();
diff --git a/src/server/game/Server/Packets/AreaTriggerPackets.cpp b/src/server/game/Server/Packets/AreaTriggerPackets.cpp
index fd783bbe177..22a86f84e3b 100644
--- a/src/server/game/Server/Packets/AreaTriggerPackets.cpp
+++ b/src/server/game/Server/Packets/AreaTriggerPackets.cpp
@@ -17,20 +17,22 @@
#include "AreaTriggerPackets.h"
#include "PacketOperators.h"
+#include "Spline.h"
namespace WorldPackets::AreaTrigger
{
-ByteBuffer& operator<<(ByteBuffer& data, AreaTriggerSplineInfo const& areaTriggerSpline)
+void WriteAreaTriggerSpline(ByteBuffer& data, uint32 timeToTarget, uint32 elapsedTimeForMovement, ::Movement::Spline<float> const& areaTriggerSpline)
{
- data << uint32(areaTriggerSpline.TimeToTarget);
- data << uint32(areaTriggerSpline.ElapsedTimeForMovement);
-
- data << BitsSize<16>(areaTriggerSpline.Points);
- data.FlushBits();
+ data << uint32(timeToTarget);
+ data << uint32(elapsedTimeForMovement);
- for (TaggedPosition<Position::XYZ> const& point : areaTriggerSpline.Points)
- data << point;
+ data << BitsSize<16>(areaTriggerSpline.getPoints());
+ data.append(reinterpret_cast<float const*>(areaTriggerSpline.getPoints().data()), areaTriggerSpline.getPoints().size() * 3);
+}
+ByteBuffer& operator<<(ByteBuffer& data, AreaTriggerSplineInfo const& areaTriggerSpline)
+{
+ WriteAreaTriggerSpline(data, areaTriggerSpline.TimeToTarget, areaTriggerSpline.ElapsedTimeForMovement, *areaTriggerSpline.Points);
return data;
}
diff --git a/src/server/game/Server/Packets/AreaTriggerPackets.h b/src/server/game/Server/Packets/AreaTriggerPackets.h
index 3c770295a81..f402e0d2256 100644
--- a/src/server/game/Server/Packets/AreaTriggerPackets.h
+++ b/src/server/game/Server/Packets/AreaTriggerPackets.h
@@ -23,6 +23,12 @@
#include "ObjectGuid.h"
#include "Optional.h"
+namespace Movement
+{
+template<class index_type>
+class Spline;
+}
+
namespace WorldPackets
{
namespace AreaTrigger
@@ -31,7 +37,7 @@ namespace WorldPackets
{
uint32 TimeToTarget = 0;
uint32 ElapsedTimeForMovement = 0;
- std::vector<TaggedPosition<Position::XYZ>> Points;
+ ::Movement::Spline<float>* Points = nullptr;
};
struct AreaTriggerMovementScriptInfo
@@ -96,6 +102,7 @@ namespace WorldPackets
uint32 SpellVisualID = 0;
};
+ void WriteAreaTriggerSpline(ByteBuffer& data, uint32 timeToTarget, uint32 elapsedTimeForMovement, ::Movement::Spline<float> const& areaTriggerSpline);
ByteBuffer& operator<<(ByteBuffer& data, AreaTriggerOrbitInfo const& areaTriggerCircularMovement);
}
}
diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp
index ac5413d59f2..356e1c4c409 100644
--- a/src/server/game/Server/Packets/MovementPackets.cpp
+++ b/src/server/game/Server/Packets/MovementPackets.cpp
@@ -513,12 +513,6 @@ void CommonMovement::WriteCreateObjectSplineDataBlock(::Movement::MoveSpline con
}
}
-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);
-}
-
void CommonMovement::WriteMovementForceWithDirection(MovementForce const& movementForce, ByteBuffer& data, Position const* objectPosition /*= nullptr*/)
{
data << movementForce.ID;
diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h
index 020305d0b49..a6f628184d2 100644
--- a/src/server/game/Server/Packets/MovementPackets.h
+++ b/src/server/game/Server/Packets/MovementPackets.h
@@ -25,8 +25,6 @@
namespace Movement
{
- template<class index_type>
- class Spline;
class MoveSpline;
}
@@ -148,7 +146,6 @@ namespace WorldPackets
{
public:
static void WriteCreateObjectSplineDataBlock(::Movement::MoveSpline const& moveSpline, ByteBuffer& data);
- static void WriteCreateObjectAreaTriggerSpline(::Movement::Spline<float> const& spline, ByteBuffer& data);
static void WriteMovementForceWithDirection(MovementForce const& movementForce, ByteBuffer& data, Position const* objectPosition = nullptr);
};