From 7f62463f368a0f6e910fcf7513b33b77e6d416b9 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Tue, 4 Jan 2022 15:04:49 +0100 Subject: [PATCH] Core/Movement: no longer blindy rely on ack messages to change movementstatus values as the client can and will sometimes ignore packets such as when receiving movement packets while not being sent out via update object (changing maps via teleport) --- src/server/game/Entities/Player/Player.cpp | 15 ++++++++------- src/server/game/Entities/Unit/Unit.cpp | 4 ++++ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index a265f31b7a..0975fcc162 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -25987,8 +25987,8 @@ bool Player::SetDisableGravity(bool disable, bool /*packetOnly = false*/, bool / if (IsMovedByClient() && IsInWorld()) MovementPacketSender::SendMovementFlagChangeToMover(this, MOVEMENTFLAG_DISABLE_GRAVITY, disable); - else - Unit::SetDisableGravity(disable, false, false); + + Unit::SetDisableGravity(disable, false, false); return true; } @@ -26000,8 +26000,8 @@ bool Player::SetCanFly(bool enable, bool /*packetOnly = false*/) if (IsMovedByClient() && IsInWorld()) MovementPacketSender::SendMovementFlagChangeToMover(this, MOVEMENTFLAG_CAN_FLY, enable); - else - Unit::SetCanFly(enable); + + Unit::SetCanFly(enable); return true; } @@ -26013,15 +26013,16 @@ bool Player::SetCanTransitionBetweenSwimAndFly(bool enable) if (IsMovedByClient() && IsInWorld()) MovementPacketSender::SendMovementFlagChangeToMover(this, MOVEMENTFLAG2_CAN_SWIM_TO_FLY_TRANS, enable); - else - Unit::SetCanTransitionBetweenSwimAndFly(enable); + + Unit::SetCanTransitionBetweenSwimAndFly(enable); return true; } void Player::SendMovementSetCollisionHeight(float height, UpdateCollisionHeightReason reason) { - MovementPacketSender::SendHeightChangeToMover(this, height, reason); + if (IsMovedByClient() && IsInWorld()) + MovementPacketSender::SendHeightChangeToMover(this, height, reason); } void Player::ResetAchievements() diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 4c158c28a5..dee8759d4c 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -9075,9 +9075,13 @@ void Unit::SetSpeedRate(UnitMoveType mtype, float rate) if (m_speed_rate[mtype] == rate) return; + float newSpeedFlat = rate * (IsControlledByPlayer() ? playerBaseMoveSpeed[mtype] : baseMoveSpeed[mtype]); if (IsMovedByClient() && IsInWorld()) + { MovementPacketSender::SendSpeedChangeToMover(this, mtype, newSpeedFlat); + SetSpeedRateReal(mtype, rate); + } else if (IsMovedByClient() && !IsInWorld()) // (1) SetSpeedRateReal(mtype, rate); else // <=> if(!IsMovedByPlayer())