Core/PacketIO: Remove duplicated areatrigger spline packet writer

This commit is contained in:
Shauren
2025-06-04 20:59:46 +02:00
parent 2f7fa781dd
commit dc10ac722f
7 changed files with 35 additions and 61 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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();

View File

@@ -17,20 +17,22 @@
#include "AreaTriggerPackets.h"
#include "PacketOperators.h"
#include "Spline.h"
namespace WorldPackets::AreaTrigger
{
void WriteAreaTriggerSpline(ByteBuffer& data, uint32 timeToTarget, uint32 elapsedTimeForMovement, ::Movement::Spline<float> const& areaTriggerSpline)
{
data << uint32(timeToTarget);
data << uint32(elapsedTimeForMovement);
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)
{
data << uint32(areaTriggerSpline.TimeToTarget);
data << uint32(areaTriggerSpline.ElapsedTimeForMovement);
data << BitsSize<16>(areaTriggerSpline.Points);
data.FlushBits();
for (TaggedPosition<Position::XYZ> const& point : areaTriggerSpline.Points)
data << point;
WriteAreaTriggerSpline(data, areaTriggerSpline.TimeToTarget, areaTriggerSpline.ElapsedTimeForMovement, *areaTriggerSpline.Points);
return data;
}

View File

@@ -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);
}
}

View File

@@ -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;

View File

@@ -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);
};