From 7b3f163ef6bc0ce5d717522251f4e24774075640 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Tue, 4 Jan 2022 12:59:55 +0100 Subject: [PATCH] Core/Movement: no longer override a player's movementInfo with the info returned from dismissing controlled vehicles as these do not belong to him. This fixes players getting stuck in a disable gravity state when exiting vehicle seats that have disabled a player's gravity --- src/server/game/Entities/Player/Player.cpp | 6 +++--- src/server/game/Handlers/VehicleHandler.cpp | 11 ++++++++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index c8664ff459a..a265f31b7af 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -25987,7 +25987,7 @@ bool Player::SetDisableGravity(bool disable, bool /*packetOnly = false*/, bool / if (IsMovedByClient() && IsInWorld()) MovementPacketSender::SendMovementFlagChangeToMover(this, MOVEMENTFLAG_DISABLE_GRAVITY, disable); - else if (IsMovedByClient() && !IsInWorld()) // (1) + else Unit::SetDisableGravity(disable, false, false); return true; @@ -26000,7 +26000,7 @@ bool Player::SetCanFly(bool enable, bool /*packetOnly = false*/) if (IsMovedByClient() && IsInWorld()) MovementPacketSender::SendMovementFlagChangeToMover(this, MOVEMENTFLAG_CAN_FLY, enable); - else if (IsMovedByClient() && !IsInWorld()) // (1) + else Unit::SetCanFly(enable); return true; @@ -26013,7 +26013,7 @@ bool Player::SetCanTransitionBetweenSwimAndFly(bool enable) if (IsMovedByClient() && IsInWorld()) MovementPacketSender::SendMovementFlagChangeToMover(this, MOVEMENTFLAG2_CAN_SWIM_TO_FLY_TRANS, enable); - else if (IsMovedByClient() && !IsInWorld()) // (1) + else Unit::SetCanTransitionBetweenSwimAndFly(enable); return true; diff --git a/src/server/game/Handlers/VehicleHandler.cpp b/src/server/game/Handlers/VehicleHandler.cpp index c29f1ea815a..848cfb64031 100644 --- a/src/server/game/Handlers/VehicleHandler.cpp +++ b/src/server/game/Handlers/VehicleHandler.cpp @@ -38,10 +38,15 @@ void WorldSession::HandleDismissControlledVehicle(WorldPacket &recvData) return; } - MovementInfo mi; - _player->ReadMovementInfo(recvData, &mi); + MovementInfo movementInfo; + _player->ReadMovementInfo(recvData, &movementInfo); - _player->m_movementInfo = mi; + if (movementInfo.guid != vehicleGUID) + { + TC_LOG_ERROR("network", "Player %s tried to dismiss a controlled vehicle (%s) that he has no control over. Possible cheater or malformed packet.", + GetPlayer()->GetGUID().GetCounter(), movementInfo.guid.ToString().c_str()); + return; + } _player->ExitVehicle(); }