aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2019-09-08 12:19:16 +0200
committerShauren <shauren.trinity@gmail.com>2019-09-08 12:19:16 +0200
commitcbe294c20d05732443eb7576e739a8dac8baa15b (patch)
treebff5af2a8e821c56ca9bc1bd2b7d4e28771ca596
parent63c2c82c803a83ce119db7d7c67eadbd864d35bb (diff)
Core/Movement: Fixed gravity type movement force direction sent in CreateObject
-rw-r--r--src/server/game/Entities/Object/Object.cpp2
-rw-r--r--src/server/game/Server/Packets/MovementPackets.cpp47
-rw-r--r--src/server/game/Server/Packets/MovementPackets.h2
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