aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp49
-rw-r--r--src/server/game/Entities/Unit/Unit.h1
-rw-r--r--src/server/game/Movement/Spline/MoveSpline.cpp9
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInit.cpp31
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInit.h4
-rw-r--r--src/server/game/Movement/Spline/MovementPacketBuilder.cpp14
-rw-r--r--src/server/game/Movement/Spline/MovementPacketBuilder.h12
-rw-r--r--src/server/game/Movement/Spline/MovementUtil.cpp2
8 files changed, 89 insertions, 33 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index b9b4b7ebd83..2cb767a6b4d 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -385,8 +385,6 @@ void Unit::MonsterMoveWithSpeed(float x, float y, float z, float speed, bool gen
void Unit::UpdateSplineMovement(uint32 t_diff)
{
- uint32 const positionUpdateDelay = 400;
-
if (movespline->Finalized())
return;
@@ -398,27 +396,32 @@ void Unit::UpdateSplineMovement(uint32 t_diff)
m_movesplineTimer.Update(t_diff);
if (m_movesplineTimer.Passed() || arrived)
- {
- m_movesplineTimer.Reset(positionUpdateDelay);
- Movement::Location loc = movespline->ComputePosition();
+ UpdateSplinePosition();
+}
- if (HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT))
- {
- Position& pos = m_movementInfo.transport.pos;
- pos.m_positionX = loc.x;
- pos.m_positionY = loc.y;
- pos.m_positionZ = loc.z;
- pos.m_orientation = loc.orientation;
+void Unit::UpdateSplinePosition()
+{
+ static uint32 const positionUpdateDelay = 400;
- if (TransportBase* transport = GetDirectTransport())
- transport->CalculatePassengerPosition(loc.x, loc.y, loc.z, &loc.orientation);
- }
+ m_movesplineTimer.Reset(positionUpdateDelay);
+ Movement::Location loc = movespline->ComputePosition();
- if (HasUnitState(UNIT_STATE_CANNOT_TURN))
- loc.orientation = GetOrientation();
+ if (HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT))
+ {
+ Position& pos = m_movementInfo.transport.pos;
+ pos.m_positionX = loc.x;
+ pos.m_positionY = loc.y;
+ pos.m_positionZ = loc.z;
+ pos.m_orientation = loc.orientation;
- UpdatePosition(loc.x, loc.y, loc.z, loc.orientation);
+ if (TransportBase* transport = GetDirectTransport())
+ transport->CalculatePassengerPosition(loc.x, loc.y, loc.z, &loc.orientation);
}
+
+ if (HasUnitState(UNIT_STATE_CANNOT_TURN))
+ loc.orientation = GetOrientation();
+
+ UpdatePosition(loc.x, loc.y, loc.z, loc.orientation);
}
void Unit::DisableSpline()
@@ -14413,14 +14416,14 @@ void Unit::StopMoving()
{
ClearUnitState(UNIT_STATE_MOVING);
- // not need send any packets if not in world
- if (!IsInWorld())
+ // not need send any packets if not in world or not moving
+ if (!IsInWorld() || movespline->Finalized())
return;
+ // Update position now since Stop does not start a new movement that can be updated later
+ UpdateSplinePosition();
Movement::MoveSplineInit init(this);
- init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZMinusOffset(), false);
- init.SetFacing(GetOrientation());
- init.Launch();
+ init.Stop();
}
void Unit::SendMovementFlagUpdate(bool self /* = false */)
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index f8d5964beca..4091ea15662 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -2214,6 +2214,7 @@ class Unit : public WorldObject
bool HandleAuraRaidProcFromCharge(AuraEffect* triggeredByAura);
void UpdateSplineMovement(uint32 t_diff);
+ void UpdateSplinePosition();
// player or player's pet
float GetCombatRatingReduction(CombatRating cr) const;
diff --git a/src/server/game/Movement/Spline/MoveSpline.cpp b/src/server/game/Movement/Spline/MoveSpline.cpp
index 2835f4421b2..7291c6849c5 100644
--- a/src/server/game/Movement/Spline/MoveSpline.cpp
+++ b/src/server/game/Movement/Spline/MoveSpline.cpp
@@ -165,6 +165,13 @@ void MoveSpline::Initialize(MoveSplineInitArgs const& args)
vertical_acceleration = 0.f;
effect_start_time = 0;
+ // Check if its a stop spline
+ if (args.flags.done)
+ {
+ spline.clear();
+ return;
+ }
+
init_spline(args);
// init parabolic / animation
@@ -259,7 +266,7 @@ MoveSpline::UpdateResult MoveSpline::_updateState(int32& ms_time_diff)
{
point_Idx = spline.first();
time_passed = time_passed % Duration();
- result = Result_NextSegment;
+ result = Result_NextCycle;
}
else
{
diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp
index 4209b9dd202..f6ef219522c 100644
--- a/src/server/game/Movement/Spline/MoveSplineInit.cpp
+++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp
@@ -109,13 +109,14 @@ namespace Movement
if (!args.Validate(unit))
return 0;
- unit->m_movementInfo.SetMovementFlags((MovementFlags)moveFlags);
+ unit->m_movementInfo.SetMovementFlags(moveFlags);
move_spline.Initialize(args);
- WorldPacket data(!transport ? SMSG_MONSTER_MOVE : SMSG_MONSTER_MOVE_TRANSPORT, 64);
+ WorldPacket data(SMSG_MONSTER_MOVE, 64);
data.append(unit->GetPackGUID());
if (transport)
{
+ data.SetOpcode(SMSG_MONSTER_MOVE_TRANSPORT);
data.appendPackGUID(unit->GetTransGUID());
data << int8(unit->GetTransSeat());
}
@@ -126,6 +127,32 @@ namespace Movement
return move_spline.Duration();
}
+ void MoveSplineInit::Stop()
+ {
+ MoveSpline& move_spline = *unit->movespline;
+
+ // No need to stop if we are not moving
+ if (move_spline.Finalized())
+ return;
+
+ Location loc = move_spline.ComputePosition();
+ args.flags = MoveSplineFlag::Done;
+ unit->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_SPLINE_ENABLED);
+ move_spline.Initialize(args);
+
+ WorldPacket data(SMSG_MONSTER_MOVE, 64);
+ data.append(unit->GetPackGUID());
+ if (unit->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) && unit->GetTransGUID())
+ {
+ data.SetOpcode(SMSG_MONSTER_MOVE_TRANSPORT);
+ data.appendPackGUID(unit->GetTransGUID());
+ data << int8(unit->GetTransSeat());
+ }
+
+ PacketBuilder::WriteStopMovement(loc, args.splineId, data);
+ unit->SendMessageToSet(&data, true);
+ }
+
MoveSplineInit::MoveSplineInit(Unit* m) : unit(m)
{
args.splineId = splineIdGen.NewId();
diff --git a/src/server/game/Movement/Spline/MoveSplineInit.h b/src/server/game/Movement/Spline/MoveSplineInit.h
index 7b0527bb3a0..a94c84d92f3 100644
--- a/src/server/game/Movement/Spline/MoveSplineInit.h
+++ b/src/server/game/Movement/Spline/MoveSplineInit.h
@@ -59,6 +59,10 @@ namespace Movement
*/
int32 Launch();
+ /* Final pass of initialization that stops movement.
+ */
+ void Stop();
+
/* Adds movement by parabolic trajectory
* @param amplitude - the maximum height of parabola, value could be negative and positive
* @param start_time - delay between movement starting time and beginning to move by parabolic trajectory
diff --git a/src/server/game/Movement/Spline/MovementPacketBuilder.cpp b/src/server/game/Movement/Spline/MovementPacketBuilder.cpp
index 29d1bb50a8f..ae62dc8b447 100644
--- a/src/server/game/Movement/Spline/MovementPacketBuilder.cpp
+++ b/src/server/game/Movement/Spline/MovementPacketBuilder.cpp
@@ -19,7 +19,7 @@
#include "MovementPacketBuilder.h"
#include "MoveSpline.h"
-#include "WorldPacket.h"
+#include "ByteBuffer.h"
namespace Movement
{
@@ -42,7 +42,7 @@ namespace Movement
MonsterMoveFacingAngle = 4
};
- void PacketBuilder::WriteCommonMonsterMovePart(const MoveSpline& move_spline, WorldPacket& data)
+ void PacketBuilder::WriteCommonMonsterMovePart(const MoveSpline& move_spline, ByteBuffer& data)
{
MoveSplineFlag splineflags = move_spline.splineflags;
@@ -88,6 +88,14 @@ namespace Movement
}
}
+ void PacketBuilder::WriteStopMovement(Vector3 const& pos, uint32 splineId, ByteBuffer& data)
+ {
+ data << uint8(0); // sets/unsets MOVEMENTFLAG2_UNK7 (0x40)
+ data << pos;
+ data << splineId;
+ data << uint8(MonsterMoveStop);
+ }
+
void WriteLinearPath(const Spline<int32>& spline, ByteBuffer& data)
{
uint32 last_idx = spline.getPointCount() - 3;
@@ -123,7 +131,7 @@ namespace Movement
data.append<Vector3>(&spline.getPoint(1), count);
}
- void PacketBuilder::WriteMonsterMove(const MoveSpline& move_spline, WorldPacket& data)
+ void PacketBuilder::WriteMonsterMove(const MoveSpline& move_spline, ByteBuffer& data)
{
WriteCommonMonsterMovePart(move_spline, data);
diff --git a/src/server/game/Movement/Spline/MovementPacketBuilder.h b/src/server/game/Movement/Spline/MovementPacketBuilder.h
index b502e203656..3f89fecdd18 100644
--- a/src/server/game/Movement/Spline/MovementPacketBuilder.h
+++ b/src/server/game/Movement/Spline/MovementPacketBuilder.h
@@ -21,17 +21,23 @@
#define TRINITYSERVER_PACKET_BUILDER_H
class ByteBuffer;
-class WorldPacket;
+namespace G3D
+{
+ class Vector3;
+}
namespace Movement
{
+ using G3D::Vector3;
+
class MoveSpline;
class PacketBuilder
{
- static void WriteCommonMonsterMovePart(const MoveSpline& mov, WorldPacket& data);
+ static void WriteCommonMonsterMovePart(const MoveSpline& mov, ByteBuffer& data);
public:
- static void WriteMonsterMove(const MoveSpline& mov, WorldPacket& data);
+ static void WriteMonsterMove(const MoveSpline& mov, ByteBuffer& data);
+ static void WriteStopMovement(Vector3 const& loc, uint32 splineId, ByteBuffer& data);
static void WriteCreate(const MoveSpline& mov, ByteBuffer& data);
};
}
diff --git a/src/server/game/Movement/Spline/MovementUtil.cpp b/src/server/game/Movement/Spline/MovementUtil.cpp
index f68a776d485..375859263ab 100644
--- a/src/server/game/Movement/Spline/MovementUtil.cpp
+++ b/src/server/game/Movement/Spline/MovementUtil.cpp
@@ -77,7 +77,7 @@ namespace Movement
{
result = termVel * (t_passed - terminal_time) +
start_velocity * terminal_time +
- gravity * terminal_time * terminal_time*0.5f;
+ gravity * terminal_time * terminal_time * 0.5f;
}
else
result = t_passed * (start_velocity + t_passed * gravity * 0.5f);