aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2014-06-09 21:08:19 +0200
committerShauren <shauren.trinity@gmail.com>2014-06-09 21:08:19 +0200
commitf81635ebe516633d7cd1d45ef905b5b60958779d (patch)
tree7e61585d3a911f8cdfff9aaf8a48eccd6a49d4e9 /src
parente5bd194bf8fe9f4bf956353649f02eb5aba24944 (diff)
Core/Vehicles: Fixed channeled spells being interrupted for passengers when vehicle moves
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp4
-rw-r--r--src/server/game/Handlers/MovementHandler.cpp17
2 files changed, 17 insertions, 4 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index b5ea898dc00..2b6cb9dd8ba 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -17079,12 +17079,14 @@ bool Unit::UpdatePosition(float x, float y, float z, float orientation, bool tel
bool turn = (GetOrientation() != orientation);
bool relocated = (teleport || GetPositionX() != x || GetPositionY() != y || GetPositionZ() != z);
+ // TODO: Check if orientation transport offset changed instead of only global orientation
if (turn)
RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TURNING);
if (relocated)
{
- RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_MOVE);
+ if (!GetVehicle())
+ RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_MOVE);
// move and update visible state if need
if (GetTypeId() == TYPEID_PLAYER)
diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp
index 5fc6ada6fb2..cef414163bd 100644
--- a/src/server/game/Handlers/MovementHandler.cpp
+++ b/src/server/game/Handlers/MovementHandler.cpp
@@ -30,6 +30,7 @@
#include "WaypointMovementGenerator.h"
#include "InstanceSaveMgr.h"
#include "ObjectMgr.h"
+#include "Vehicle.h"
#define MOVEMENT_PACKET_TIME_DELAY 0
@@ -370,10 +371,20 @@ void WorldSession::HandleMovementOpcodes(WorldPacket& recvData)
mover->m_movementInfo = movementInfo;
- // this is almost never true (not sure why it is sometimes, but it is), normally use mover->IsVehicle()
- if (mover->GetVehicle())
+ // Some vehicles allow the passenger to turn by himself
+ if (Vehicle* vehicle = mover->GetVehicle())
{
- mover->SetOrientation(movementInfo.pos.GetOrientation());
+ if (VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(mover))
+ {
+ if (seat->m_flags & VEHICLE_SEAT_FLAG_ALLOW_TURNING)
+ {
+ if (movementInfo.pos.GetOrientation() != mover->GetOrientation())
+ {
+ mover->SetOrientation(movementInfo.pos.GetOrientation());
+ mover->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TURNING);
+ }
+ }
+ }
return;
}