From dc10ac722f5e059852785372f9ff91e205d730ce Mon Sep 17 00:00:00 2001 From: Shauren Date: Wed, 4 Jun 2025 20:59:46 +0200 Subject: Core/PacketIO: Remove duplicated areatrigger spline packet writer --- .../game/Entities/AreaTrigger/AreaTrigger.cpp | 29 ++++------------------ src/server/game/Entities/AreaTrigger/AreaTrigger.h | 10 ++++---- src/server/game/Entities/Object/Object.cpp | 19 +++++--------- .../game/Server/Packets/AreaTriggerPackets.cpp | 18 ++++++++------ .../game/Server/Packets/AreaTriggerPackets.h | 9 ++++++- src/server/game/Server/Packets/MovementPackets.cpp | 6 ----- src/server/game/Server/Packets/MovementPackets.h | 3 --- 7 files changed, 34 insertions(+), 60 deletions(-) (limited to 'src/server') 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>(_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>>(_movement), diff); } else { @@ -882,11 +882,6 @@ void AreaTrigger::HandleUnitEnterExit(std::vector 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 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 const& splinePoints, Opt _movement = std::move(spline); } -bool AreaTrigger::HasSplines() const -{ - return std::holds_alternative>>(_movement); -} - void AreaTrigger::InitOrbit(AreaTriggerOrbitInfo const& orbit, Optional overrideSpeed) { // Circular movement requires either a center position or an attached unit @@ -1165,11 +1154,6 @@ void AreaTrigger::InitOrbit(AreaTriggerOrbitInfo const& orbit, Optional o _movement = std::move(movementOrbit); } -bool AreaTrigger::HasOrbit() const -{ - return std::holds_alternative>(_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>(_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& spline, uint32 diff) { if (_reachedDestination) return; _movementTime += diff; - Movement::Spline& spline = **std::get_if>>(&_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 const& offsets, Optional overrideSpeed = {}); void InitSplines(std::vector const& splinePoints, Optional overrideSpeed = {}); - bool HasSplines() const; + bool HasSplines() const { return std::holds_alternative>>(_movement); } ::Movement::Spline const& GetSpline() const { return *std::get>>(_movement); } uint32 GetElapsedTimeForMovement() const { return GetTimeSinceCreated(); } /// @todo: research the right value, in sniffs both timers are nearly identical void InitOrbit(AreaTriggerOrbitInfo const& orbit, Optional overrideSpeed = {}); - bool HasOrbit() const; + bool HasOrbit() const { return std::holds_alternative>(_movement); } AreaTriggerOrbitInfo const& GetOrbit() const { return *std::get>(_movement); } bool HasOverridePosition() const; @@ -197,8 +197,8 @@ class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject& 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(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 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 const& point : areaTriggerSpline.Points) - data << point; + data << BitsSize<16>(areaTriggerSpline.getPoints()); + data.append(reinterpret_cast(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 Spline; +} + namespace WorldPackets { namespace AreaTrigger @@ -31,7 +37,7 @@ namespace WorldPackets { uint32 TimeToTarget = 0; uint32 ElapsedTimeForMovement = 0; - std::vector> Points; + ::Movement::Spline* Points = nullptr; }; struct AreaTriggerMovementScriptInfo @@ -96,6 +102,7 @@ namespace WorldPackets uint32 SpellVisualID = 0; }; + void WriteAreaTriggerSpline(ByteBuffer& data, uint32 timeToTarget, uint32 elapsedTimeForMovement, ::Movement::Spline 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 const& spline, ByteBuffer& data) -{ - data << BitsSize<16>(spline.getPoints()); - data.append(reinterpret_cast(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 Spline; class MoveSpline; } @@ -148,7 +146,6 @@ namespace WorldPackets { public: static void WriteCreateObjectSplineDataBlock(::Movement::MoveSpline const& moveSpline, ByteBuffer& data); - static void WriteCreateObjectAreaTriggerSpline(::Movement::Spline const& spline, ByteBuffer& data); static void WriteMovementForceWithDirection(MovementForce const& movementForce, ByteBuffer& data, Position const* objectPosition = nullptr); }; -- cgit v1.2.3