diff options
author | Shauren <shauren.trinity@gmail.com> | 2019-09-08 12:19:16 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2019-09-08 12:19:16 +0200 |
commit | cbe294c20d05732443eb7576e739a8dac8baa15b (patch) | |
tree | bff5af2a8e821c56ca9bc1bd2b7d4e28771ca596 | |
parent | 63c2c82c803a83ce119db7d7c67eadbd864d35bb (diff) |
Core/Movement: Fixed gravity type movement force direction sent in CreateObject
-rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MovementPackets.cpp | 47 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MovementPackets.h | 2 |
3 files changed, 42 insertions, 9 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index a2b5da60d1c..f7451b8297e 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -383,7 +383,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags) const if (MovementForces const* movementForces = unit->GetMovementForces()) for (MovementForce const& force : *movementForces->GetForces()) - *data << force; + WorldPackets::Movement::CommonMovement::WriteMovementForceWithDirection(force, *data, unit); if (HasSpline) WorldPackets::Movement::CommonMovement::WriteCreateObjectSplineDataBlock(*unit->movespline, *data); diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index 943d312dffb..40a394b3a0e 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -383,6 +383,44 @@ void WorldPackets::Movement::CommonMovement::WriteCreateObjectAreaTriggerSpline( data.append<G3D::Vector3>(spline.getPoints().data(), spline.getPoints().size()); } +void WorldPackets::Movement::CommonMovement::WriteMovementForceWithDirection(MovementForce const& movementForce, ByteBuffer& data, Position const* objectPosition /*= nullptr*/) +{ + data << movementForce.ID; + data << movementForce.Origin; + if (movementForce.Type == 1 && objectPosition) // gravity + { + TaggedPosition<Position::XYZ> direction; + if (movementForce.Magnitude != 0.0f) + { + Position tmp(movementForce.Origin.Pos.GetPositionX() - objectPosition->GetPositionX(), + movementForce.Origin.Pos.GetPositionY() - objectPosition->GetPositionY(), + movementForce.Origin.Pos.GetPositionZ() - objectPosition->GetPositionZ()); + float lengthSquared = tmp.GetExactDistSq(0.0f, 0.0f, 0.0f); + if (lengthSquared > 0.0f) + { + float mult = 1.0f / std::sqrtf(lengthSquared) * movementForce.Magnitude; + tmp.m_positionX *= mult; + tmp.m_positionY *= mult; + tmp.m_positionZ *= mult; + float minLengthSquared = (tmp.GetPositionX() * tmp.GetPositionX() * 0.04f) + + (tmp.GetPositionY() * tmp.GetPositionY() * 0.04f) + + (tmp.GetPositionZ() * tmp.GetPositionZ() * 0.04f); + if (lengthSquared > minLengthSquared) + direction = tmp; + } + } + + data << direction; + } + else + data << movementForce.Direction; + + data << uint32(movementForce.TransportID); + data << float(movementForce.Magnitude); + data.WriteBits(movementForce.Type, 2); + data.FlushBits(); +} + void WorldPackets::Movement::MonsterMove::InitializeSplineData(::Movement::MoveSpline const& moveSpline) { SplineData.ID = moveSpline.m_Id; @@ -581,14 +619,7 @@ WorldPacket const* WorldPackets::Movement::MoveTeleport::Write() ByteBuffer& operator<<(ByteBuffer& data, MovementForce const& movementForce) { - data << movementForce.ID; - data << movementForce.Origin; - data << movementForce.Direction; - data << movementForce.TransportID; - data << movementForce.Magnitude; - data.WriteBits(movementForce.Type, 2); - data.FlushBits(); - + WorldPackets::Movement::CommonMovement::WriteMovementForceWithDirection(movementForce, data); return data; } diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h index 47197949c55..34278d63b25 100644 --- a/src/server/game/Server/Packets/MovementPackets.h +++ b/src/server/game/Server/Packets/MovementPackets.h @@ -128,6 +128,8 @@ namespace WorldPackets public: static void WriteCreateObjectSplineDataBlock(::Movement::MoveSpline const& moveSpline, ByteBuffer& data); static void WriteCreateObjectAreaTriggerSpline(::Movement::Spline<int32> const& spline, ByteBuffer& data); + + static void WriteMovementForceWithDirection(MovementForce const& movementForce, ByteBuffer& data, Position const* objectPosition = nullptr); }; class MonsterMove final : public ServerPacket |