diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/AreaTrigger/AreaTrigger.cpp | 29 | ||||
-rw-r--r-- | src/server/game/Entities/AreaTrigger/AreaTrigger.h | 10 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 19 | ||||
-rw-r--r-- | src/server/game/Server/Packets/AreaTriggerPackets.cpp | 18 | ||||
-rw-r--r-- | src/server/game/Server/Packets/AreaTriggerPackets.h | 9 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MovementPackets.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MovementPackets.h | 3 |
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); }; |