diff options
author | megamage <none@none> | 2009-04-23 00:12:29 -0500 |
---|---|---|
committer | megamage <none@none> | 2009-04-23 00:12:29 -0500 |
commit | bce871f253d65da99f298c7eaf798b61c8c31369 (patch) | |
tree | b39c1e74cd31a49186b0b272509d905f8fb50b81 /src/game/MovementHandler.cpp | |
parent | f5fff5b186cffe7de4853897ba95cd8d08038d56 (diff) |
*Fix a client crash caused by transport.
--HG--
branch : trunk
Diffstat (limited to 'src/game/MovementHandler.cpp')
-rw-r--r-- | src/game/MovementHandler.cpp | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp index cf312ad3513..d018adb7e2e 100644 --- a/src/game/MovementHandler.cpp +++ b/src/game/MovementHandler.cpp @@ -261,6 +261,9 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) } } } + + if(!mover->GetTransport() || !mover->m_Vehicle) + movementInfo.flags &= ~MOVEMENTFLAG_ONTRANSPORT; } else if (plMover && plMover->m_transport) // if we were on a transport, leave { @@ -293,11 +296,12 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) data.append(recv_data.contents(), recv_data.size()); GetPlayer()->SendMessageToSet(&data, false); + mover->m_movementInfo = movementInfo; + mover->SetUnitMovementFlags(movementInfo.flags); + if(plMover) // nothing is charmed, or player charmed { plMover->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o); - plMover->m_movementInfo = movementInfo; - plMover->SetUnitMovementFlags(movementInfo.flags); plMover->UpdateFallInformationIfNeed(movementInfo,recv_data.GetOpcode()); if(plMover->isMovingOrTurning()) @@ -493,20 +497,29 @@ void WorldSession::HandleChangeSeatsOnControlledVehicle(WorldPacket &recv_data) if(!recv_data.readPackGUID(guid)) return; - Vehicle *vehicle = ObjectAccessor::GetVehicle(guid); + Vehicle *vehicle = guid ? ObjectAccessor::GetVehicle(guid) : GetPlayer()->m_Vehicle; if(!vehicle) return; int8 seatNum; recv_data >> seatNum; - if(vehicle == GetPlayer()->m_Vehicle && seatNum == GetPlayer()->GetTransSeat()) - return; - - if(!vehicle->HasEmptySeat(seatNum)) + if(!guid) + { + seatNum = vehicle->GetNextEmptySeat(GetPlayer()->GetTransSeat(), seatNum > 0); + if(seatNum < 0) + return; + } + else if(!vehicle->HasEmptySeat(seatNum)) return; GetPlayer()->m_Vehicle->RemovePassenger(GetPlayer()); - GetPlayer()->m_Vehicle = vehicle; + if(GetPlayer()->m_Vehicle != vehicle) + { + GetPlayer()->m_Vehicle = vehicle; + GetPlayer()->SetClientControl(vehicle, 1); + WorldPacket data(SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, 0); + GetPlayer()->GetSession()->SendPacket(&data); + } if(!vehicle->AddPassenger(GetPlayer(), seatNum)) assert(false); } |